mirror of
https://github.com/photoprism/photoprism.git
synced 2026-07-17 16:49:04 +00:00
Split the catch-all values.go into one file per concept, each mirrored by its test: distance.go, norm.go, stats.go, product.go, centroid.go, plus the mean methods folded into mean.go and Copy/Dim/Sum into vector.go. Remove values.go, values_test.go, and values_more_test.go so functionality and tests live where developers expect them. Hoist the two 512-dimensional face embeddings shared by the distance, norm, and cosine tests into fixtures_test.go, removing the previous triplication, and decompose the monolithic TestVector into per-concept tests. Close pre-existing coverage gaps in the integer converters and the GeometricMean/HarmonicMean method wrappers, bringing the package to 100% statement coverage. Pure code movement; no behavior change.
32 lines
549 B
Go
32 lines
549 B
Go
package vector
|
|
|
|
import "math"
|
|
|
|
// Normalize scales the vector to unit length (L2 norm) in place.
|
|
// A zero vector (including an empty one) is left unchanged to avoid
|
|
// a division by zero.
|
|
func (v Vector) Normalize() {
|
|
var sum float64
|
|
|
|
for _, f := range v {
|
|
sum += f * f
|
|
}
|
|
|
|
if sum == 0 {
|
|
return
|
|
}
|
|
|
|
inv := 1 / math.Sqrt(sum)
|
|
|
|
for i := range v {
|
|
v[i] *= inv
|
|
}
|
|
}
|
|
|
|
// Normalized returns an L2-normalized copy of the vector,
|
|
// leaving the receiver unchanged.
|
|
func (v Vector) Normalized() Vector {
|
|
c := v.Copy()
|
|
c.Normalize()
|
|
return c
|
|
}
|