func diameter(digests []string, diffStore diff.DiffStore) int { // TODO Parallelize. lock := sync.Mutex{} max := 0 wg := sync.WaitGroup{} for { if len(digests) <= 2 { break } wg.Add(1) go func(d1 string, d2 []string) { defer wg.Done() dms, err := diffStore.Get(d1, d2) if err != nil { glog.Errorf("Unable to get diff: %s", err) return } localMax := 0 for _, dm := range dms { if dm.NumDiffPixels > localMax { localMax = dm.NumDiffPixels } } lock.Lock() defer lock.Unlock() if localMax > max { max = localMax } }(digests[0], digests[1:2]) digests = digests[1:] } wg.Wait() return max }
// ClosestDigest returns the closest digest of type 'label' to 'digest', or "" if there aren't any positive digests. // // If no digest of type 'label' is found then Closest.Digest is the empty string. func ClosestDigest(test string, digest string, exp *expstorage.Expectations, tallies tally.Tally, diffStore diff.DiffStore, label types.Label) *Closest { ret := newClosest() unavailableDigests := diffStore.UnavailableDigests() if unavailableDigests[digest] { return ret } selected := []string{} for d, _ := range tallies { if !unavailableDigests[d] && (exp.Classification(test, d) == label) { selected = append(selected, d) } } if len(selected) == 0 { return ret } if diffMetrics, err := diffStore.Get(digest, selected); err != nil { glog.Errorf("ClosestDigest: Failed to get diff: %s", err) return ret } else { for digest, diff := range diffMetrics { if delta := combinedDiffMetric(diff.PixelDiffPercent, diff.MaxRGBADiffs); delta < ret.Diff { ret.Digest = digest ret.Diff = delta ret.DiffPixels = diff.PixelDiffPercent ret.MaxRGBA = diff.MaxRGBADiffs } } return ret } }