Belle II Software  release-05-01-25
relations_consolidate.cc
1 #include <framework/dataobjects/EventMetaData.h>
2 #include <framework/dataobjects/ProfileInfo.h>
3 #include <framework/datastore/RelationArray.h>
4 #include <framework/datastore/StoreArray.h>
5 
6 #include <gtest/gtest.h>
7 
8 using namespace std;
9 using namespace Belle2;
10 
11 namespace {
13  class RelationConsolidateTest : public ::testing::Test {
14  protected:
16  void SetUp() override
17  {
18  evtData = new StoreArray<EventMetaData>;
19  profileData = new StoreArray<ProfileInfo>;
20  DataStore::Instance().setInitializeActive(true);
21  evtData->registerInDataStore();
22  profileData->registerInDataStore();
23  evtData->registerRelationTo(*profileData);
24  DataStore::Instance().setInitializeActive(false);
25 
26  for (int i = 0; i < 10; ++i) {
27  evtData->appendNew();
28  profileData->appendNew();
29  }
30 
31  relArray = new RelationArray(*evtData, *profileData);
32  relArray->add(0, 0, 1.0);
33  relArray->add(0, 1, 2.0);
34  relArray->add(0, 1, 3.0);
35  relArray->add(1, 0, 1.0);
36  relArray->add(1, 1, 2.0);
37  relArray->add(1, 2, 3.0);
38  }
39 
41  void TearDown() override
42  {
43  DataStore::Instance().reset();
44  delete evtData;
45  delete profileData;
46  delete relArray;
47  }
48 
49  StoreArray<EventMetaData>* evtData;
50  StoreArray<ProfileInfo>* profileData;
51  RelationArray* relArray;
52  };
53 
55  TEST_F(RelationConsolidateTest, RelationConsolidateDefault)
56  {
57  RelationArray& relation = *relArray;
58  relation.consolidate();
59  ASSERT_EQ(relation.getEntries(), 2);
60  EXPECT_EQ(relation[0].getSize(), 2u);
61  EXPECT_EQ(relation[0].getWeight(0), 1.0);
62  EXPECT_EQ(relation[0].getWeight(1), 5.0);
63  EXPECT_EQ(relation[1].getSize(), 3u);
64  EXPECT_EQ(relation[1].getWeight(0), 1.0);
65  EXPECT_EQ(relation[1].getWeight(1), 2.0);
66  EXPECT_EQ(relation[1].getWeight(2), 3.0);
67 
68  std::map<unsigned int, std::pair<unsigned int, bool> > replace;
69  replace[0] = std::make_pair(1, true);
70  replace[2] = std::make_pair(3, false);
71  RelationArray::ReplaceMap<> replaceMap(replace);
72  relation.consolidate(replaceMap, replaceMap);
73  ASSERT_EQ(relation.getEntries(), 1);
74  EXPECT_EQ(relation[0].getSize(), 2u);
75  EXPECT_EQ(relation[0].getWeight(0), 9.0);
76  EXPECT_EQ(relation[0].getWeight(1), 3.0);
77  EXPECT_EQ(relation[0].getFromIndex(), 1u);
78  EXPECT_EQ(relation[0].getToIndex(0), 1u);
79  EXPECT_EQ(relation[0].getToIndex(1), 3u);
80  }
81 
83  TEST_F(RelationConsolidateTest, RelationConsolidateZero)
84  {
85  RelationArray& relation = *relArray;
86  std::map<unsigned int, std::pair<unsigned int, bool> > replace;
87  replace[0] = std::make_pair(1, true);
88  replace[2] = std::make_pair(3, false);
89  RelationArray::ReplaceMap<> replaceMap(replace);
90  relation.consolidate(replaceMap, replaceMap, RelationArray::c_zeroWeight);
91  ASSERT_EQ(relation.getEntries(), 1);
92  EXPECT_EQ(relation[0].getSize(), 2u);
93  EXPECT_EQ(relation[0].getWeight(0), 2.0);
94  EXPECT_EQ(relation[0].getWeight(1), 3.0);
95  EXPECT_EQ(relation[0].getFromIndex(), 1u);
96  EXPECT_EQ(relation[0].getToIndex(0), 1u);
97  EXPECT_EQ(relation[0].getToIndex(1), 3u);
98 
99  //second run, check that weight of the second element changes to zero and index 3->2
100  std::map<unsigned int, std::pair<unsigned int, bool> > replace2;
101  replace2[3] = std::make_pair(2, true);
102  RelationArray::ReplaceMap<> replaceMap2(replace2);
103  relation.consolidate(replaceMap2, replaceMap2, RelationArray::c_zeroWeight);
104  ASSERT_EQ(relation.getEntries(), 1);
105  EXPECT_EQ(relation[0].getSize(), 2u);
106  EXPECT_EQ(relation[0].getWeight(0), 2.0);
107  EXPECT_EQ(relation[0].getWeight(1), 0.0);
108  EXPECT_EQ(relation[0].getFromIndex(), 1u);
109  EXPECT_EQ(relation[0].getToIndex(0), 1u);
110  EXPECT_EQ(relation[0].getToIndex(1), 2u);
111  }
112 
114  TEST_F(RelationConsolidateTest, RelationConsolidateNegative)
115  {
116  RelationArray& relation = *relArray;
117  std::map<unsigned int, std::pair<unsigned int, bool> > replace;
118  replace[0] = std::make_pair(1, true);
119  replace[2] = std::make_pair(3, false);
120  RelationArray::ReplaceMap<> replaceMap(replace);
121  relation.consolidate(replaceMap, replaceMap, RelationArray::c_negativeWeight);
122  ASSERT_EQ(relation.getEntries(), 1);
123  EXPECT_EQ(relation[0].getSize(), 2u);
124  // resulting weight should be -1 + -2 + -3 + -1 + 2 = -5
125  EXPECT_EQ(relation[0].getWeight(0), -5.0);
126  EXPECT_EQ(relation[0].getWeight(1), 3.0);
127  EXPECT_EQ(relation[0].getFromIndex(), 1u);
128  EXPECT_EQ(relation[0].getToIndex(0), 1u);
129  EXPECT_EQ(relation[0].getToIndex(1), 3u);
130 
131  //Second run, check that the weight for the second element goes to -3.0 but -5 should stay -5
132  std::map<unsigned int, std::pair<unsigned int, bool> > replace2;
133  replace2[1] = std::make_pair(1, true);
134  replace2[3] = std::make_pair(2, true);
135  RelationArray::ReplaceMap<> replaceMap2(replace2);
136  relation.consolidate(replaceMap2, replaceMap2, RelationArray::c_negativeWeight);
137  ASSERT_EQ(relation.getEntries(), 1);
138  EXPECT_EQ(relation[0].getSize(), 2u);
139  EXPECT_EQ(relation[0].getWeight(0), -5.0);
140  EXPECT_EQ(relation[0].getWeight(1), -3.0);
141  EXPECT_EQ(relation[0].getFromIndex(), 1u);
142  EXPECT_EQ(relation[0].getToIndex(0), 1u);
143  EXPECT_EQ(relation[0].getToIndex(1), 2u);
144  }
145 
147  TEST_F(RelationConsolidateTest, RelationConsolidateDelete)
148  {
149  RelationArray& relation = *relArray;
150  std::map<unsigned int, std::pair<unsigned int, bool> > replace;
151  replace[0] = std::make_pair(1, true);
152  replace[2] = std::make_pair(3, false);
153  RelationArray::ReplaceMap<> replaceMap(replace);
154  relation.consolidate(replaceMap, replaceMap, RelationArray::c_deleteElement);
155  ASSERT_EQ(relation.getEntries(), 1);
156  EXPECT_EQ(relation[0].getSize(), 2u);
157  EXPECT_EQ(relation[0].getWeight(0), 2.0);
158  EXPECT_EQ(relation[0].getWeight(1), 3.0);
159  EXPECT_EQ(relation[0].getFromIndex(), 1u);
160  EXPECT_EQ(relation[0].getToIndex(0), 1u);
161  EXPECT_EQ(relation[0].getToIndex(1), 3u);
162 
163  //No let's delete the second element
164  std::map<unsigned int, std::pair<unsigned int, bool> > replace2;
165  replace2[3] = std::make_pair(3, true);
166  RelationArray::ReplaceMap<> replaceMap2(replace2);
167  relation.consolidate(replaceMap2, replaceMap2, RelationArray::c_deleteElement);
168  ASSERT_EQ(relation.getEntries(), 1);
169  EXPECT_EQ(relation[0].getSize(), 1u);
170  EXPECT_EQ(relation[0].getWeight(0), 2.0);
171  EXPECT_EQ(relation[0].getFromIndex(), 1u);
172  EXPECT_EQ(relation[0].getToIndex(0), 1u);
173 
174  //Check that we get an empty relation if we delete the last one
175  std::map<unsigned int, std::pair<unsigned int, bool> > replace3;
176  replace3[1] = std::make_pair(2, true);
177  RelationArray::ReplaceMap<> replaceMap3(replace3);
178  relation.consolidate(replaceMap3, replaceMap3, RelationArray::c_deleteElement);
179  ASSERT_EQ(relation.getEntries(), 0);
180  }
181 
182 } // namespace
Belle2::RelationArray
Low-level class to create/modify relations between StoreArrays.
Definition: RelationArray.h:72
Belle2::StoreArray::registerRelationTo
bool registerRelationTo(const StoreArray< TO > &toArray, DataStore::EDurability durability=DataStore::c_Event, DataStore::EStoreFlags storeFlags=DataStore::c_WriteOut, const std::string &namedRelation="") const
Register a relation to the given StoreArray.
Definition: StoreArray.h:150
Belle2::RelationArray::consolidate
void consolidate()
Consolidate Relation Elements.
Definition: RelationArray.h:341
Belle2
Abstract base class for different kinds of events.
Definition: MillepedeAlgorithm.h:19
Belle2::TEST_F
TEST_F(GlobalLabelTest, LargeNumberOfTimeDependentParameters)
Test large number of time-dep params for registration and retrieval.
Definition: globalLabel.cc:65
Belle2::RelationArray::ReplaceMap
Struct to replace indices based on a map-like container.
Definition: RelationArray.h:114
Belle2::RelationArray::getEntries
int getEntries() const
Get the number of elements.
Definition: RelationArray.h:252
Belle2::StoreArray
Accessor to arrays stored in the data store.
Definition: ECLMatchingPerformanceExpertModule.h:33