photoprism/pkg/vector/normalize.go
Michael Mayer 03129c9129 Vector: Reorganize package into topic-based files #4669
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.
2026-05-30 09:44:03 +00:00

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
}