blob: abcbd3f80bdea3908b49813da3ce204bbefd3d24 [file] [log] [blame]
Samuel Huang06f1ae92018-03-13 18:19:34 +00001// Copyright 2017 The Chromium Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5#include "components/zucchini/targets_affinity.h"
6
7#include <stddef.h>
8#include <stdint.h>
9
10#include <vector>
11
12#include "components/zucchini/equivalence_map.h"
13#include "components/zucchini/image_utils.h"
14#include "testing/gtest/include/gtest/gtest.h"
15
16namespace zucchini {
17
18TEST(TargetsAffinityTest, AffinityBetween) {
19 using AffinityVector = std::vector<std::vector<double>>;
20
21 // A common TargetsAffinity is used across independent tests. This is to
22 // reflect actual usage, in which common TargetsAffinity is used so that
23 // internal buffers get reused.
24 TargetsAffinity targets_affinity;
25
26 auto test_affinity = [&targets_affinity](
27 const EquivalenceMap& equivalence_map,
Etienne Pierre-dorayaff40862021-09-14 17:31:51 +000028 const std::deque<offset_t>& old_targets,
29 const std::deque<offset_t>& new_targets) {
Samuel Huang06f1ae92018-03-13 18:19:34 +000030 targets_affinity.InferFromSimilarities(equivalence_map, old_targets,
31 new_targets);
32 AffinityVector affinities(old_targets.size());
33 for (key_t i = 0; i < old_targets.size(); ++i) {
34 for (key_t j = 0; j < new_targets.size(); ++j) {
35 affinities[i].push_back(targets_affinity.AffinityBetween(i, j));
36 }
37 }
38 return affinities;
39 };
40
41 EXPECT_EQ(AffinityVector({}), test_affinity(EquivalenceMap(), {}, {}));
42 EXPECT_EQ(AffinityVector({}),
43 test_affinity(EquivalenceMap({{{0, 0, 8}, 1.0}}), {}, {}));
44
45 EXPECT_EQ(AffinityVector({{0.0, 0.0}, {0.0, 0.0}}),
46 test_affinity(EquivalenceMap(), {0, 10}, {0, 5}));
47
48 EXPECT_EQ(AffinityVector({{1.0, -1.0}, {-1.0, 0.0}}),
49 test_affinity(EquivalenceMap({{{0, 0, 1}, 1.0}}), {0, 10}, {0, 5}));
50
51 EXPECT_EQ(AffinityVector({{1.0, -1.0}, {-1.0, 0.0}}),
52 test_affinity(EquivalenceMap({{{0, 0, 2}, 1.0}}), {1, 10}, {1, 5}));
53
54 EXPECT_EQ(AffinityVector({{0.0, 0.0}, {0.0, 0.0}}),
55 test_affinity(EquivalenceMap({{{0, 1, 2}, 1.0}}), {1, 10}, {1, 5}));
56
57 EXPECT_EQ(AffinityVector({{1.0, -1.0}, {-1.0, 0.0}}),
58 test_affinity(EquivalenceMap({{{0, 1, 2}, 1.0}}), {0, 10}, {1, 5}));
59
60 EXPECT_EQ(AffinityVector({{2.0, -2.0}, {-2.0, 0.0}}),
61 test_affinity(EquivalenceMap({{{0, 0, 1}, 2.0}}), {0, 10}, {0, 5}));
62
63 EXPECT_EQ(
64 AffinityVector({{1.0, -1.0}, {-1.0, 1.0}, {-1.0, -1.0}}),
65 test_affinity(EquivalenceMap({{{0, 0, 6}, 1.0}}), {0, 5, 10}, {0, 5}));
66
67 EXPECT_EQ(AffinityVector({{-2.0, 2.0}, {1.0, -2.0}, {-1.0, -2.0}}),
68 test_affinity(EquivalenceMap({{{5, 0, 2}, 1.0}, {{0, 5, 2}, 2.0}}),
69 {0, 5, 10}, {0, 5}));
70
71 EXPECT_EQ(AffinityVector({{-2.0, 2.0}, {0.0, -2.0}, {0.0, -2.0}}),
72 test_affinity(EquivalenceMap({{{0, 0, 2}, 1.0}, {{0, 5, 2}, 2.0}}),
73 {0, 5, 10}, {0, 5}));
74}
75
76TEST(TargetsAffinityTest, AssignLabels) {
77 // A common TargetsAffinity is used across independent tests. This is to
78 // reflect actual usage, in which common TargetsAffinity is used so that
79 // internal buffers get reused.
80 TargetsAffinity targets_affinity;
81
82 auto test_labels_assignment =
83 [&targets_affinity](const EquivalenceMap& equivalence_map,
Etienne Pierre-dorayaff40862021-09-14 17:31:51 +000084 const std::deque<offset_t>& old_targets,
85 const std::deque<offset_t>& new_targets,
Samuel Huang06f1ae92018-03-13 18:19:34 +000086 double min_affinity,
87 const std::vector<uint32_t>& expected_old_labels,
88 const std::vector<uint32_t>& expected_new_labels) {
89 targets_affinity.InferFromSimilarities(equivalence_map, old_targets,
90 new_targets);
91 std::vector<uint32_t> old_labels;
92 std::vector<uint32_t> new_labels;
93 size_t bound = targets_affinity.AssignLabels(min_affinity, &old_labels,
94 &new_labels);
95 EXPECT_EQ(expected_old_labels, old_labels);
96 EXPECT_EQ(expected_new_labels, new_labels);
97 return bound;
98 };
99
100 EXPECT_EQ(1U, test_labels_assignment(EquivalenceMap(), {}, {}, 1.0, {}, {}));
101 EXPECT_EQ(1U, test_labels_assignment(EquivalenceMap({{{0, 0, 8}, 1.0}}), {},
102 {}, 1.0, {}, {}));
103
104 EXPECT_EQ(1U, test_labels_assignment(EquivalenceMap(), {0, 10}, {0, 5}, 1.0,
105 {0, 0}, {0, 0}));
106
107 EXPECT_EQ(2U, test_labels_assignment(EquivalenceMap({{{0, 0, 1}, 1.0}}),
108 {0, 10}, {0, 5}, 1.0, {1, 0}, {1, 0}));
109 EXPECT_EQ(1U, test_labels_assignment(EquivalenceMap({{{0, 0, 1}, 0.99}}),
110 {0, 10}, {0, 5}, 1.0, {0, 0}, {0, 0}));
111 EXPECT_EQ(1U, test_labels_assignment(EquivalenceMap({{{0, 0, 1}, 1.0}}),
112 {0, 10}, {0, 5}, 1.01, {0, 0}, {0, 0}));
113 EXPECT_EQ(1U, test_labels_assignment(EquivalenceMap({{{0, 0, 1}, 1.0}}),
114 {0, 10}, {0, 5}, 15.0, {0, 0}, {0, 0}));
115 EXPECT_EQ(2U, test_labels_assignment(EquivalenceMap({{{0, 0, 1}, 15.0}}),
116 {0, 10}, {0, 5}, 15.0, {1, 0}, {1, 0}));
117
118 EXPECT_EQ(2U, test_labels_assignment(EquivalenceMap({{{0, 1, 2}, 1.0}}),
119 {0, 10}, {1, 5}, 1.0, {1, 0}, {1, 0}));
120 EXPECT_EQ(
121 3U, test_labels_assignment(EquivalenceMap({{{0, 0, 6}, 1.0}}), {0, 5, 10},
122 {0, 5}, 1.0, {1, 2, 0}, {1, 2}));
123 EXPECT_EQ(3U, test_labels_assignment(
124 EquivalenceMap({{{5, 0, 2}, 1.0}, {{0, 5, 2}, 2.0}}),
125 {0, 5, 10}, {0, 5}, 1.0, {1, 2, 0}, {2, 1}));
126 EXPECT_EQ(2U, test_labels_assignment(
127 EquivalenceMap({{{0, 0, 2}, 1.0}, {{0, 5, 2}, 2.0}}),
128 {0, 5, 10}, {0, 5}, 1.0, {1, 0, 0}, {0, 1}));
129}
130
131} // namespace zucchini