xref: /aosp_15_r20/external/zucchini/targets_affinity_unittest.cc (revision a03ca8b91e029cd15055c20c78c2e087c84792e4)
1 // 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 
16 namespace zucchini {
17 
TEST(TargetsAffinityTest,AffinityBetween)18 TEST(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,
28                            const std::deque<offset_t>& old_targets,
29                            const std::deque<offset_t>& new_targets) {
30     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 
TEST(TargetsAffinityTest,AssignLabels)76 TEST(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,
84                           const std::deque<offset_t>& old_targets,
85                           const std::deque<offset_t>& new_targets,
86                           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
132