1// Copyright ©2016 The Gonum Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style
3// license that can be found in the LICENSE file.
4
5// +build !amd64 noasm appengine safe
6
7package f64
8
9import "math"
10
11// L1Norm is
12//  for _, v := range x {
13//  	sum += math.Abs(v)
14//  }
15//  return sum
16func L1Norm(x []float64) (sum float64) {
17	for _, v := range x {
18		sum += math.Abs(v)
19	}
20	return sum
21}
22
23// L1NormInc is
24//  for i := 0; i < n*incX; i += incX {
25//  	sum += math.Abs(x[i])
26//  }
27//  return sum
28func L1NormInc(x []float64, n, incX int) (sum float64) {
29	for i := 0; i < n*incX; i += incX {
30		sum += math.Abs(x[i])
31	}
32	return sum
33}
34
35// Add is
36//  for i, v := range s {
37//  	dst[i] += v
38//  }
39func Add(dst, s []float64) {
40	for i, v := range s {
41		dst[i] += v
42	}
43}
44
45// AddConst is
46//  for i := range x {
47//  	x[i] += alpha
48//  }
49func AddConst(alpha float64, x []float64) {
50	for i := range x {
51		x[i] += alpha
52	}
53}
54
55// CumSum is
56//  if len(s) == 0 {
57//  	return dst
58//  }
59//  dst[0] = s[0]
60//  for i, v := range s[1:] {
61//  	dst[i+1] = dst[i] + v
62//  }
63//  return dst
64func CumSum(dst, s []float64) []float64 {
65	if len(s) == 0 {
66		return dst
67	}
68	dst[0] = s[0]
69	for i, v := range s[1:] {
70		dst[i+1] = dst[i] + v
71	}
72	return dst
73}
74
75// CumProd is
76//  if len(s) == 0 {
77//  	return dst
78//  }
79//  dst[0] = s[0]
80//  for i, v := range s[1:] {
81//  	dst[i+1] = dst[i] * v
82//  }
83//  return dst
84func CumProd(dst, s []float64) []float64 {
85	if len(s) == 0 {
86		return dst
87	}
88	dst[0] = s[0]
89	for i, v := range s[1:] {
90		dst[i+1] = dst[i] * v
91	}
92	return dst
93}
94
95// Div is
96//  for i, v := range s {
97//  	dst[i] /= v
98//  }
99func Div(dst, s []float64) {
100	for i, v := range s {
101		dst[i] /= v
102	}
103}
104
105// DivTo is
106//  for i, v := range s {
107//  	dst[i] = v / t[i]
108//  }
109//  return dst
110func DivTo(dst, s, t []float64) []float64 {
111	for i, v := range s {
112		dst[i] = v / t[i]
113	}
114	return dst
115}
116
117// L1Dist is
118//  var norm float64
119//  for i, v := range s {
120//  	norm += math.Abs(t[i] - v)
121//  }
122//  return norm
123func L1Dist(s, t []float64) float64 {
124	var norm float64
125	for i, v := range s {
126		norm += math.Abs(t[i] - v)
127	}
128	return norm
129}
130
131// LinfDist is
132//  var norm float64
133//  if len(s) == 0 {
134//  	return 0
135//  }
136//  norm = math.Abs(t[0] - s[0])
137//  for i, v := range s[1:] {
138//  	absDiff := math.Abs(t[i+1] - v)
139//  	if absDiff > norm || math.IsNaN(norm) {
140//  		norm = absDiff
141//  	}
142//  }
143//  return norm
144func LinfDist(s, t []float64) float64 {
145	var norm float64
146	if len(s) == 0 {
147		return 0
148	}
149	norm = math.Abs(t[0] - s[0])
150	for i, v := range s[1:] {
151		absDiff := math.Abs(t[i+1] - v)
152		if absDiff > norm || math.IsNaN(norm) {
153			norm = absDiff
154		}
155	}
156	return norm
157}
158
159// Sum is
160//  var sum float64
161//  for i := range x {
162//      sum += x[i]
163//  }
164func Sum(x []float64) float64 {
165	var sum float64
166	for _, v := range x {
167		sum += v
168	}
169	return sum
170}
171