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