1 /**
2  *
3  *   Copyright (c) 2005-2021 by Pierre-Henri WUILLEMIN(_at_LIP6) & Christophe GONZALES(_at_AMU)
4  *   info_at_agrum_dot_org
5  *
6  *  This library is free software: you can redistribute it and/or modify
7  *  it under the terms of the GNU Lesser General Public License as published by
8  *  the Free Software Foundation, either version 3 of the License, or
9  *  (at your option) any later version.
10  *
11  *  This library is distributed in the hope that it will be useful,
12  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
13  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14  *  GNU Lesser General Public License for more details.
15  *
16  *  You should have received a copy of the GNU Lesser General Public License
17  *  along with this library.  If not, see <http://www.gnu.org/licenses/>.
18  *
19  */
20 
21 
22 #include <gumtest/AgrumTestSuite.h>
23 #include <gumtest/testsuite_utils.h>
24 #include <ressources/include/countedAlloc.h>
25 #include <ressources/include/poolAlloc.h>
26 #include <iostream>
27 
28 #include <agrum/tools/core/thread.h>
29 #include <agrum/tools/database/DBTranslator4LabelizedVariable.h>
30 
31 namespace gum_tests {
32 
33   class DBTranslator4LabelizedVariableTestSuite: public CxxTest::TestSuite {
34     public:
test_trans1()35     void test_trans1() {
36       gum::learning::DBTranslator4LabelizedVariable<> translator;
37       TS_ASSERT(translator.isLossless())
38       TS_GUM_ASSERT_THROWS_NOTHING(translator.translate("toto"));
39       TS_ASSERT_EQUALS(translator.translate("toto").discr_val, (std::size_t)0)
40       TS_ASSERT_EQUALS(translator.translate("toto").discr_val, (std::size_t)0)
41 
42       TS_ASSERT_EQUALS(translator.missingValue().discr_val,
43                        std::numeric_limits< std::size_t >::max());
44 
45       TS_GUM_ASSERT_THROWS_NOTHING(translator.translate("titi"));
46       TS_ASSERT_EQUALS(translator.translate("toto").discr_val, (std::size_t)0)
47       TS_ASSERT_EQUALS(translator.translate("titi").discr_val, (std::size_t)1)
48       TS_ASSERT_EQUALS(translator.translateBack(gum::learning::DBTranslatedValue{std::size_t{0}}),
49                        "toto");
50       TS_ASSERT_EQUALS(translator.translateBack(gum::learning::DBTranslatedValue{std::size_t{1}}),
51                        "titi");
52 
53       std::vector< std::string >                      missing{"?", "N/A", "???"};
54       gum::learning::DBTranslator4LabelizedVariable<> translator2(missing);
55       TS_GUM_ASSERT_THROWS_NOTHING(translator2.translate("toto"));
56       TS_GUM_ASSERT_THROWS_NOTHING(translator2.translate("titi"));
57       TS_ASSERT_EQUALS(translator2.translate("toto").discr_val, (std::size_t)0)
58       TS_ASSERT_EQUALS(translator2.translate("titi").discr_val, (std::size_t)1)
59       TS_ASSERT_EQUALS(translator2.translate("N/A").discr_val,
60                        std::numeric_limits< std::size_t >::max());
61       TS_ASSERT_EQUALS(translator2.translate("?").discr_val,
62                        std::numeric_limits< std::size_t >::max());
63       TS_ASSERT_EQUALS(translator2.translate("???").discr_val,
64                        std::numeric_limits< std::size_t >::max());
65       TS_ASSERT_EQUALS(translator2.translate("??").discr_val, (std::size_t)2)
66       TS_ASSERT_EQUALS(translator2.translateBack(gum::learning::DBTranslatedValue{std::size_t{0}}),
67                        "toto");
68       TS_ASSERT_EQUALS(translator2.translateBack(gum::learning::DBTranslatedValue{std::size_t{1}}),
69                        "titi");
70       TS_ASSERT_EQUALS(translator2.translateBack(gum::learning::DBTranslatedValue{std::size_t{2}}),
71                        "??");
72 
73       gum::learning::DBTranslator4LabelizedVariable<> translator3(missing, 3);
74       TS_GUM_ASSERT_THROWS_NOTHING(translator3.translate("toto"));
75       TS_GUM_ASSERT_THROWS_NOTHING(translator3.translate("titi"));
76       TS_ASSERT_EQUALS(translator3.translate("toto").discr_val, (std::size_t)0)
77       TS_ASSERT_EQUALS(translator3.translate("titi").discr_val, (std::size_t)1)
78       TS_ASSERT_EQUALS(translator3.translate("N/A").discr_val,
79                        std::numeric_limits< std::size_t >::max());
80       TS_ASSERT_EQUALS(translator3.translate("?").discr_val,
81                        std::numeric_limits< std::size_t >::max());
82       TS_ASSERT_EQUALS(translator3.translate("???").discr_val,
83                        std::numeric_limits< std::size_t >::max());
84       TS_ASSERT_EQUALS(translator3.translate("??").discr_val, (std::size_t)2)
85       TS_ASSERT_THROWS(translator3.translate("a"), gum::SizeError)
86 
87       TS_ASSERT_EQUALS(translator3.translateBack(gum::learning::DBTranslatedValue{std::size_t{0}}),
88                        "toto");
89       TS_ASSERT_EQUALS(translator3.translateBack(gum::learning::DBTranslatedValue{std::size_t{1}}),
90                        "titi");
91       TS_ASSERT_EQUALS(translator3.translateBack(gum::learning::DBTranslatedValue{std::size_t{2}}),
92                        "??");
93       TS_ASSERT_THROWS(translator3.translateBack(gum::learning::DBTranslatedValue{std::size_t{3}}),
94                        gum::UnknownLabelInDatabase);
95       const std::string back = translator3.translateBack(
96          gum::learning::DBTranslatedValue{std::numeric_limits< std::size_t >::max()});
97       TS_ASSERT(translator3.missingSymbols().exists(back))
98     }
99 
100 
test_trans2()101     void test_trans2() {
102       gum::learning::DBTranslator4LabelizedVariable< DebugCountedAlloc > translator;
103       TS_GUM_ASSERT_THROWS_NOTHING(translator.translate("toto"));
104       TS_ASSERT_EQUALS(translator.translate("toto").discr_val, (std::size_t)0)
105       TS_ASSERT_EQUALS(translator.translate("toto").discr_val, (std::size_t)0)
106 
107       TS_GUM_ASSERT_THROWS_NOTHING(translator.translate("titi"));
108       TS_ASSERT_EQUALS(translator.translate("toto").discr_val, (std::size_t)0)
109       TS_ASSERT_EQUALS(translator.translate("titi").discr_val, (std::size_t)1)
110       TS_ASSERT_EQUALS(translator.translateBack(gum::learning::DBTranslatedValue{std::size_t{0}}),
111                        "toto");
112       TS_ASSERT_EQUALS(translator.translateBack(gum::learning::DBTranslatedValue{std::size_t{1}}),
113                        "titi");
114 
115       std::vector< std::string >                      missing{"?", "N/A", "???"};
116       gum::learning::DBTranslator4LabelizedVariable<> translator2(missing);
117       TS_GUM_ASSERT_THROWS_NOTHING(translator2.translate("toto"));
118       TS_GUM_ASSERT_THROWS_NOTHING(translator2.translate("titi"));
119       TS_ASSERT_EQUALS(translator2.translate("toto").discr_val, (std::size_t)0)
120       TS_ASSERT_EQUALS(translator2.translate("titi").discr_val, (std::size_t)1)
121       TS_ASSERT_EQUALS(translator2.translate("N/A").discr_val,
122                        std::numeric_limits< std::size_t >::max());
123       TS_ASSERT_EQUALS(translator2.translate("?").discr_val,
124                        std::numeric_limits< std::size_t >::max());
125       TS_ASSERT_EQUALS(translator2.translate("???").discr_val,
126                        std::numeric_limits< std::size_t >::max());
127       TS_ASSERT_EQUALS(translator2.translate("??").discr_val, (std::size_t)2)
128 
129       TS_ASSERT_EQUALS(translator2.translateBack(gum::learning::DBTranslatedValue{std::size_t{0}}),
130                        "toto");
131       TS_ASSERT_EQUALS(translator2.translateBack(gum::learning::DBTranslatedValue{std::size_t{1}}),
132                        "titi");
133       TS_ASSERT_EQUALS(translator2.translateBack(gum::learning::DBTranslatedValue{std::size_t{2}}),
134                        "??");
135 
136       gum::learning::DBTranslator4LabelizedVariable< DebugCountedAlloc > translator3(missing, 3);
137       TS_GUM_ASSERT_THROWS_NOTHING(translator3.translate("toto"));
138       TS_GUM_ASSERT_THROWS_NOTHING(translator3.translate("titi"));
139       TS_ASSERT_EQUALS(translator3.translate("toto").discr_val, (std::size_t)0)
140       TS_ASSERT_EQUALS(translator3.translate("titi").discr_val, (std::size_t)1)
141       TS_ASSERT_EQUALS(translator3.translate("N/A").discr_val,
142                        std::numeric_limits< std::size_t >::max());
143       TS_ASSERT_EQUALS(translator3.translate("?").discr_val,
144                        std::numeric_limits< std::size_t >::max());
145       TS_ASSERT_EQUALS(translator3.translate("???").discr_val,
146                        std::numeric_limits< std::size_t >::max());
147       TS_ASSERT_EQUALS(translator3.translate("??").discr_val, (std::size_t)2)
148       TS_ASSERT_THROWS(translator3.translate("a"), gum::SizeError)
149 
150       TS_ASSERT_EQUALS(translator3.translateBack(gum::learning::DBTranslatedValue{std::size_t{0}}),
151                        "toto");
152       TS_ASSERT_EQUALS(translator3.translateBack(gum::learning::DBTranslatedValue{std::size_t{1}}),
153                        "titi");
154       TS_ASSERT_EQUALS(translator3.translateBack(gum::learning::DBTranslatedValue{std::size_t{2}}),
155                        "??");
156       TS_ASSERT_THROWS(translator3.translateBack(gum::learning::DBTranslatedValue{std::size_t{3}}),
157                        gum::UnknownLabelInDatabase);
158       TS_ASSERT(translator3.translateBack(
159                    gum::learning::DBTranslatedValue{std::numeric_limits< std::size_t >::max()})
160                 == "?");
161     }
162 
163 
test_trans3()164     void test_trans3() {
165       gum::LabelizedVariable var("X1", "", 0);
166       var.addLabel("toto");
167       var.addLabel("titi");
168       var.addLabel("tutu");
169 
170       gum::learning::DBTranslator4LabelizedVariable< DebugCountedAlloc > translator(var);
171       TS_GUM_ASSERT_THROWS_NOTHING(translator.translate("toto"));
172       TS_ASSERT_EQUALS(translator.translate("toto").discr_val, (std::size_t)0)
173       TS_ASSERT_EQUALS(translator.translate("toto").discr_val, (std::size_t)0)
174 
175       TS_GUM_ASSERT_THROWS_NOTHING(translator.translate("tutu"));
176       TS_ASSERT_EQUALS(translator.translate("toto").discr_val, (std::size_t)0)
177       TS_ASSERT_EQUALS(translator.translate("tutu").discr_val, (std::size_t)2)
178       TS_ASSERT_EQUALS(translator.translateBack(gum::learning::DBTranslatedValue{std::size_t{0}}),
179                        "toto");
180       TS_ASSERT_EQUALS(translator.translateBack(gum::learning::DBTranslatedValue{std::size_t{1}}),
181                        "titi");
182 
183       std::vector< std::string >                      missing{"?", "N/A", "???"};
184       gum::learning::DBTranslator4LabelizedVariable<> translator2(var, missing);
185       TS_GUM_ASSERT_THROWS_NOTHING(translator2.translate("toto"));
186       TS_GUM_ASSERT_THROWS_NOTHING(translator2.translate("titi"));
187       TS_ASSERT_EQUALS(translator2.translate("toto").discr_val, (std::size_t)0)
188       TS_ASSERT_EQUALS(translator2.translate("titi").discr_val, (std::size_t)1)
189       TS_ASSERT_EQUALS(translator2.translate("N/A").discr_val,
190                        std::numeric_limits< std::size_t >::max());
191       TS_ASSERT_EQUALS(translator2.translate("?").discr_val,
192                        std::numeric_limits< std::size_t >::max());
193       TS_ASSERT_EQUALS(translator2.translate("???").discr_val,
194                        std::numeric_limits< std::size_t >::max());
195       TS_ASSERT_THROWS(translator2.translate("??"), gum::UnknownLabelInDatabase)
196       TS_ASSERT_EQUALS(translator.translateBack(gum::learning::DBTranslatedValue{std::size_t{0}}),
197                        "toto");
198       TS_ASSERT_EQUALS(translator.translateBack(gum::learning::DBTranslatedValue{std::size_t{1}}),
199                        "titi");
200       TS_ASSERT_EQUALS(translator.translateBack(gum::learning::DBTranslatedValue{std::size_t{2}}),
201                        "tutu");
202 
203       gum::learning::DBTranslator4LabelizedVariable< DebugCountedAlloc > translator3(var,
204                                                                                      missing,
205                                                                                      true,
206                                                                                      3);
207       TS_GUM_ASSERT_THROWS_NOTHING(translator3.translate("toto"));
208       TS_GUM_ASSERT_THROWS_NOTHING(translator3.translate("titi"));
209       TS_ASSERT_EQUALS(translator3.translate("toto").discr_val, (std::size_t)0)
210       TS_ASSERT_EQUALS(translator3.translate("titi").discr_val, (std::size_t)1)
211       TS_ASSERT_EQUALS(translator3.translate("N/A").discr_val,
212                        std::numeric_limits< std::size_t >::max());
213       TS_ASSERT_EQUALS(translator3.translate("?").discr_val,
214                        std::numeric_limits< std::size_t >::max());
215       TS_ASSERT_EQUALS(translator3.translate("???").discr_val,
216                        std::numeric_limits< std::size_t >::max());
217       TS_ASSERT_THROWS(translator3.translate("??"), gum::SizeError)
218       TS_ASSERT_THROWS(translator3.translate("a"), gum::SizeError)
219 
220       TS_ASSERT_EQUALS(translator3.translateBack(gum::learning::DBTranslatedValue{std::size_t{0}}),
221                        "toto");
222       TS_ASSERT_EQUALS(translator3.translateBack(gum::learning::DBTranslatedValue{std::size_t{1}}),
223                        "titi");
224       TS_ASSERT_EQUALS(translator3.translateBack(gum::learning::DBTranslatedValue{std::size_t{2}}),
225                        "tutu");
226       TS_ASSERT_THROWS(translator3.translateBack(gum::learning::DBTranslatedValue{std::size_t{3}}),
227                        gum::UnknownLabelInDatabase);
228       TS_ASSERT_EQUALS(translator3.translateBack(gum::learning::DBTranslatedValue{
229                           std::numeric_limits< std::size_t >::max()}),
230                        "?");
231 
232       TS_ASSERT_EQUALS(translator3.domainSize(), (gum::Size)3)
233 
234       TS_ASSERT_THROWS(
235          gum::learning::DBTranslator4LabelizedVariable<> translator4(var, missing, true, 2),
236          gum::SizeError);
237     }
238 
239 
test_trans4()240     void test_trans4() {
241       {
242         gum::LabelizedVariable var("X1", "", 0);
243         var.addLabel("1");
244         var.addLabel("4");
245         var.addLabel("2");
246 
247         gum::learning::DBTranslator4LabelizedVariable< DebugCountedAlloc > translator(var);
248         TS_ASSERT_EQUALS(translator.translate("1").discr_val, (std::size_t)0)
249         TS_ASSERT_EQUALS(translator.translate("4").discr_val, (std::size_t)1)
250         TS_ASSERT_EQUALS(translator.translate("2").discr_val, (std::size_t)2)
251         TS_ASSERT_EQUALS(translator.translateBack(gum::learning::DBTranslatedValue{std::size_t{0}}),
252                          "1");
253         TS_ASSERT_EQUALS(translator.translateBack(gum::learning::DBTranslatedValue{std::size_t{1}}),
254                          "4");
255         TS_ASSERT_EQUALS(translator.translateBack(gum::learning::DBTranslatedValue{std::size_t{2}}),
256                          "2");
257         TS_ASSERT_EQUALS(translator.variable()->toString(), "X1:Labelized(<1,4,2>)")
258 
259         gum::LabelizedVariable var2("X2", "", 0);
260         var2.addLabel("1");
261         var2.addLabel("2");
262         var2.addLabel("4");
263 
264         gum::learning::DBTranslator4LabelizedVariable< DebugCountedAlloc > translator2(var2);
265         TS_ASSERT_EQUALS(translator2.translate("1").discr_val, (std::size_t)0)
266         TS_ASSERT_EQUALS(translator2.translate("2").discr_val, (std::size_t)1)
267         TS_ASSERT_EQUALS(translator2.translate("4").discr_val, (std::size_t)2)
268         TS_ASSERT(translator2.translateBack(gum::learning::DBTranslatedValue{std::size_t{0}})
269                   == "1");
270         TS_ASSERT(translator2.translateBack(gum::learning::DBTranslatedValue{std::size_t{1}})
271                   == "2");
272         TS_ASSERT(translator2.translateBack(gum::learning::DBTranslatedValue{std::size_t{2}})
273                   == "4");
274         TS_ASSERT_EQUALS(translator2.variable()->toString(), "X2:Labelized(<1,2,4>)")
275 
276         gum::learning::DBTranslator4LabelizedVariable< DebugCountedAlloc > translator3(translator);
277         TS_ASSERT_EQUALS(translator3.translate("1").discr_val, (std::size_t)0)
278         TS_ASSERT_EQUALS(translator3.translate("4").discr_val, (std::size_t)1)
279         TS_ASSERT_EQUALS(translator3.translate("2").discr_val, (std::size_t)2)
280         TS_ASSERT(translator3.translateBack(gum::learning::DBTranslatedValue{std::size_t{0}})
281                   == "1");
282         TS_ASSERT(translator3.translateBack(gum::learning::DBTranslatedValue{std::size_t{1}})
283                   == "4");
284         TS_ASSERT(translator3.translateBack(gum::learning::DBTranslatedValue{std::size_t{2}})
285                   == "2");
286         TS_ASSERT_EQUALS(translator3.variable()->toString(), "X1:Labelized(<1,4,2>)")
287 
288         gum::learning::DBTranslator4LabelizedVariable< DebugCountedAlloc > translator4(translator2);
289         TS_ASSERT_EQUALS(translator4.translate("1").discr_val, (std::size_t)0)
290         TS_ASSERT_EQUALS(translator4.translate("2").discr_val, (std::size_t)1)
291         TS_ASSERT_EQUALS(translator4.translate("4").discr_val, (std::size_t)2)
292         TS_ASSERT(translator4.translateBack(gum::learning::DBTranslatedValue{std::size_t{0}})
293                   == "1");
294         TS_ASSERT(translator4.translateBack(gum::learning::DBTranslatedValue{std::size_t{1}})
295                   == "2");
296         TS_ASSERT(translator4.translateBack(gum::learning::DBTranslatedValue{std::size_t{2}})
297                   == "4");
298         TS_ASSERT_EQUALS(translator4.variable()->toString(), "X2:Labelized(<1,2,4>)")
299 
300         gum::learning::DBTranslator4LabelizedVariable< DebugCountedAlloc > translator5(
301            std::move(translator3));
302         TS_ASSERT_EQUALS(translator5.translate("1").discr_val, (std::size_t)0)
303         TS_ASSERT_EQUALS(translator5.translate("4").discr_val, (std::size_t)1)
304         TS_ASSERT_EQUALS(translator5.translate("2").discr_val, (std::size_t)2)
305         TS_ASSERT(translator5.translateBack(gum::learning::DBTranslatedValue{std::size_t{0}})
306                   == "1");
307         TS_ASSERT(translator5.translateBack(gum::learning::DBTranslatedValue{std::size_t{1}})
308                   == "4");
309         TS_ASSERT(translator5.translateBack(gum::learning::DBTranslatedValue{std::size_t{2}})
310                   == "2");
311         TS_ASSERT_EQUALS(translator5.variable()->toString(), "X1:Labelized(<1,4,2>)")
312 
313         gum::learning::DBTranslator4LabelizedVariable< DebugCountedAlloc > translator6(
314            std::move(translator4));
315         TS_ASSERT_EQUALS(translator6.translate("1").discr_val, (std::size_t)0)
316         TS_ASSERT_EQUALS(translator6.translate("2").discr_val, (std::size_t)1)
317         TS_ASSERT_EQUALS(translator6.translate("4").discr_val, (std::size_t)2)
318         TS_ASSERT(translator6.translateBack(gum::learning::DBTranslatedValue{std::size_t{0}})
319                   == "1");
320         TS_ASSERT(translator6.translateBack(gum::learning::DBTranslatedValue{std::size_t{1}})
321                   == "2");
322         TS_ASSERT(translator6.translateBack(gum::learning::DBTranslatedValue{std::size_t{2}})
323                   == "4");
324         TS_ASSERT_EQUALS(translator6.variable()->toString(), "X2:Labelized(<1,2,4>)")
325 
326         gum::learning::DBTranslator4LabelizedVariable< DebugCountedAlloc >* translator7
327            = translator6.clone();
328         TS_ASSERT_EQUALS(translator7->translate("1").discr_val, (std::size_t)0)
329         TS_ASSERT_EQUALS(translator7->translate("2").discr_val, (std::size_t)1)
330         TS_ASSERT_EQUALS(translator7->translate("4").discr_val, (std::size_t)2)
331         TS_ASSERT(translator7->translateBack(gum::learning::DBTranslatedValue{std::size_t{0}})
332                   == "1");
333         TS_ASSERT(translator7->translateBack(gum::learning::DBTranslatedValue{std::size_t{1}})
334                   == "2");
335         TS_ASSERT(translator7->translateBack(gum::learning::DBTranslatedValue{std::size_t{2}})
336                   == "4");
337         TS_ASSERT_EQUALS(translator7->variable()->toString(), "X2:Labelized(<1,2,4>)")
338 
339         DebugCountedAlloc< gum::learning::DBTranslator4LabelizedVariable< DebugCountedAlloc > >
340            allocator(translator7->getAllocator());
341         allocator.destroy(translator7);
342         allocator.deallocate(translator7, 1);
343 
344         translator5 = translator6;
345         TS_ASSERT_EQUALS(translator5.translate("1").discr_val, (std::size_t)0)
346         TS_ASSERT_EQUALS(translator5.translate("2").discr_val, (std::size_t)1)
347         TS_ASSERT_EQUALS(translator5.translate("4").discr_val, (std::size_t)2)
348         TS_ASSERT(translator5.translateBack(gum::learning::DBTranslatedValue{std::size_t{0}})
349                   == "1");
350         TS_ASSERT(translator5.translateBack(gum::learning::DBTranslatedValue{std::size_t{1}})
351                   == "2");
352         TS_ASSERT(translator5.translateBack(gum::learning::DBTranslatedValue{std::size_t{2}})
353                   == "4");
354         TS_ASSERT_EQUALS(translator5.variable()->toString(), "X2:Labelized(<1,2,4>)")
355 
356         translator3 = translator5;
357         TS_ASSERT_EQUALS(translator3.translate("1").discr_val, (std::size_t)0)
358         TS_ASSERT_EQUALS(translator3.translate("2").discr_val, (std::size_t)1)
359         TS_ASSERT_EQUALS(translator3.translate("4").discr_val, (std::size_t)2)
360         TS_ASSERT(translator3.translateBack(gum::learning::DBTranslatedValue{std::size_t{0}})
361                   == "1");
362         TS_ASSERT(translator3.translateBack(gum::learning::DBTranslatedValue{std::size_t{1}})
363                   == "2");
364         TS_ASSERT(translator3.translateBack(gum::learning::DBTranslatedValue{std::size_t{2}})
365                   == "4");
366         TS_ASSERT_EQUALS(translator3.variable()->toString(), "X2:Labelized(<1,2,4>)")
367 
368         translator5 = std::move(translator3);
369         TS_ASSERT_EQUALS(translator5.translate("1").discr_val, (std::size_t)0)
370         TS_ASSERT_EQUALS(translator5.translate("2").discr_val, (std::size_t)1)
371         TS_ASSERT_EQUALS(translator5.translate("4").discr_val, (std::size_t)2)
372         TS_ASSERT(translator5.translateBack(gum::learning::DBTranslatedValue{std::size_t{0}})
373                   == "1");
374         TS_ASSERT(translator5.translateBack(gum::learning::DBTranslatedValue{std::size_t{1}})
375                   == "2");
376         TS_ASSERT(translator5.translateBack(gum::learning::DBTranslatedValue{std::size_t{2}})
377                   == "4");
378         TS_ASSERT_EQUALS(translator5.variable()->toString(), "X2:Labelized(<1,2,4>)")
379       }
380 
381       TS_ASSERT_EQUALS(CountedAlloc::hasMemoryLeak(), false)
382     }
383 
384 
xtest_trans5()385     void xtest_trans5() {
386       gum::LabelizedVariable var("X1", "", 0);
387       var.addLabel("1");
388       var.addLabel("4");
389       var.addLabel("2");
390 
391       LearningAlloc< double > alloc(10000);
392 
393       gum::learning::DBTranslator4LabelizedVariable< LearningAlloc > translator(var,
394                                                                                 false,
395                                                                                 1000,
396                                                                                 alloc);
397 
398       std::cout << alloc.toString() << std::endl;
399       std::cout << translator.getAllocator().toString() << std::endl;
400 
401       TS_ASSERT_EQUALS(translator.translate("1").discr_val, (std::size_t)0)
402       TS_ASSERT_EQUALS(translator.translate("4").discr_val, (std::size_t)1)
403       TS_ASSERT_EQUALS(translator.translate("2").discr_val, (std::size_t)2)
404       TS_ASSERT_EQUALS(translator.translateBack(gum::learning::DBTranslatedValue{std::size_t{0}}),
405                        "1");
406       TS_ASSERT_EQUALS(translator.translateBack(gum::learning::DBTranslatedValue{std::size_t{1}}),
407                        "4");
408       TS_ASSERT_EQUALS(translator.translateBack(gum::learning::DBTranslatedValue{std::size_t{2}}),
409                        "2");
410       TS_ASSERT_EQUALS(translator.variable()->toString(), "X1:Labelized(<1,4,2>)")
411 
412       const auto& allocator = translator.getAllocator();
413       std::cout << (allocator == alloc) << std::endl;
414       std::cout << alloc.toString() << std::endl;
415 
416       gum::LabelizedVariable var2("X2", "", 0);
417       var2.addLabel("1");
418       var2.addLabel("2");
419       var2.addLabel("4");
420 
421       gum::learning::DBTranslator4LabelizedVariable< LearningAlloc > translator2(var2);
422       TS_ASSERT_EQUALS(translator2.translate("1").discr_val, (std::size_t)0)
423       TS_ASSERT_EQUALS(translator2.translate("2").discr_val, (std::size_t)1)
424       TS_ASSERT_EQUALS(translator2.translate("4").discr_val, (std::size_t)2)
425       TS_ASSERT_EQUALS(translator2.translateBack(gum::learning::DBTranslatedValue{std::size_t{0}}),
426                        "1");
427       TS_ASSERT_EQUALS(translator2.translateBack(gum::learning::DBTranslatedValue{std::size_t{1}}),
428                        "2");
429       TS_ASSERT_EQUALS(translator2.translateBack(gum::learning::DBTranslatedValue{std::size_t{2}}),
430                        "4");
431       TS_ASSERT_EQUALS(translator2.variable()->toString(), "X2:Labelized(<1,2,4>)")
432 
433       gum::learning::DBTranslator4LabelizedVariable< LearningAlloc > translator3(translator);
434       TS_ASSERT_EQUALS(translator3.translate("1").discr_val, (std::size_t)0)
435       TS_ASSERT_EQUALS(translator3.translate("4").discr_val, (std::size_t)1)
436       TS_ASSERT_EQUALS(translator3.translate("2").discr_val, (std::size_t)2)
437       TS_ASSERT_EQUALS(translator3.translateBack(gum::learning::DBTranslatedValue{std::size_t{0}}),
438                        "1");
439       TS_ASSERT_EQUALS(translator3.translateBack(gum::learning::DBTranslatedValue{std::size_t{1}}),
440                        "4");
441       TS_ASSERT_EQUALS(translator3.translateBack(gum::learning::DBTranslatedValue{std::size_t{2}}),
442                        "2");
443       TS_ASSERT_EQUALS(translator3.variable()->toString(), "X1:Labelized(<1,4,2>)")
444 
445       gum::learning::DBTranslator4LabelizedVariable< LearningAlloc > translator4(translator2);
446       TS_ASSERT_EQUALS(translator4.translate("1").discr_val, (std::size_t)0)
447       TS_ASSERT_EQUALS(translator4.translate("2").discr_val, (std::size_t)1)
448       TS_ASSERT_EQUALS(translator4.translate("4").discr_val, (std::size_t)2)
449       TS_ASSERT_EQUALS(translator4.translateBack(gum::learning::DBTranslatedValue{std::size_t{0}}),
450                        "1");
451       TS_ASSERT_EQUALS(translator4.translateBack(gum::learning::DBTranslatedValue{std::size_t{1}}),
452                        "2");
453       TS_ASSERT_EQUALS(translator4.translateBack(gum::learning::DBTranslatedValue{std::size_t{2}}),
454                        "4");
455       TS_ASSERT_EQUALS(translator4.variable()->toString(), "X2:Labelized(<1,2,4>)")
456 
457       gum::learning::DBTranslator4LabelizedVariable< LearningAlloc > translator5(
458          std::move(translator3));
459       TS_ASSERT_EQUALS(translator5.translate("1").discr_val, (std::size_t)0)
460       TS_ASSERT_EQUALS(translator5.translate("4").discr_val, (std::size_t)1)
461       TS_ASSERT_EQUALS(translator5.translate("2").discr_val, (std::size_t)2)
462       TS_ASSERT_EQUALS(translator5.translateBack(gum::learning::DBTranslatedValue{std::size_t{0}}),
463                        "1");
464       TS_ASSERT_EQUALS(translator5.translateBack(gum::learning::DBTranslatedValue{std::size_t{1}}),
465                        "4");
466       TS_ASSERT_EQUALS(translator5.translateBack(gum::learning::DBTranslatedValue{std::size_t{2}}),
467                        "2");
468       TS_ASSERT_EQUALS(translator5.variable()->toString(), "X1:Labelized(<1,4,2>)")
469 
470       gum::learning::DBTranslator4LabelizedVariable< LearningAlloc > translator6(
471          std::move(translator4));
472       TS_ASSERT_EQUALS(translator6.translate("1").discr_val, (std::size_t)0)
473       TS_ASSERT_EQUALS(translator6.translate("2").discr_val, (std::size_t)1)
474       TS_ASSERT_EQUALS(translator6.translate("4").discr_val, (std::size_t)2)
475       TS_ASSERT_EQUALS(translator6.translateBack(gum::learning::DBTranslatedValue{std::size_t{0}}),
476                        "1");
477       TS_ASSERT_EQUALS(translator6.translateBack(gum::learning::DBTranslatedValue{std::size_t{1}}),
478                        "2");
479       TS_ASSERT_EQUALS(translator6.translateBack(gum::learning::DBTranslatedValue{std::size_t{2}}),
480                        "4");
481       TS_ASSERT_EQUALS(translator6.variable()->toString(), "X2:Labelized(<1,2,4>)")
482 
483       gum::learning::DBTranslator4LabelizedVariable< LearningAlloc >* translator7
484          = translator6.clone();
485       TS_ASSERT_EQUALS(translator7->translate("1").discr_val, (std::size_t)0)
486       TS_ASSERT_EQUALS(translator7->translate("2").discr_val, (std::size_t)1)
487       TS_ASSERT_EQUALS(translator7->translate("4").discr_val, (std::size_t)2)
488       TS_ASSERT(translator7->translateBack(gum::learning::DBTranslatedValue{std::size_t{0}})
489                 == "1");
490       TS_ASSERT(translator7->translateBack(gum::learning::DBTranslatedValue{std::size_t{1}})
491                 == "2");
492       TS_ASSERT(translator7->translateBack(gum::learning::DBTranslatedValue{std::size_t{2}})
493                 == "4");
494       TS_ASSERT_EQUALS(translator7->variable()->toString(), "X2:Labelized(<1,2,4>)")
495 
496       LearningAlloc< gum::learning::DBTranslator4LabelizedVariable< LearningAlloc > > allocator2(
497          translator7->getAllocator());
498       allocator2.destroy(translator7);
499       allocator2.deallocate(translator7, 1);
500 
501       translator5 = translator6;
502       TS_ASSERT_EQUALS(translator5.translate("1").discr_val, (std::size_t)0)
503       TS_ASSERT_EQUALS(translator5.translate("2").discr_val, (std::size_t)1)
504       TS_ASSERT_EQUALS(translator5.translate("4").discr_val, (std::size_t)2)
505       TS_ASSERT_EQUALS(translator5.translateBack(gum::learning::DBTranslatedValue{std::size_t{0}}),
506                        "1");
507       TS_ASSERT_EQUALS(translator5.translateBack(gum::learning::DBTranslatedValue{std::size_t{1}}),
508                        "2");
509       TS_ASSERT_EQUALS(translator5.translateBack(gum::learning::DBTranslatedValue{std::size_t{2}}),
510                        "4");
511       TS_ASSERT_EQUALS(translator5.variable()->toString(), "X2:Labelized(<1,2,4>)")
512 
513       translator3 = translator5;
514       TS_ASSERT_EQUALS(translator3.translate("1").discr_val, (std::size_t)0)
515       TS_ASSERT_EQUALS(translator3.translate("2").discr_val, (std::size_t)1)
516       TS_ASSERT_EQUALS(translator3.translate("4").discr_val, (std::size_t)2)
517       TS_ASSERT_EQUALS(translator3.translateBack(gum::learning::DBTranslatedValue{std::size_t{0}}),
518                        "1");
519       TS_ASSERT_EQUALS(translator3.translateBack(gum::learning::DBTranslatedValue{std::size_t{1}}),
520                        "2");
521       TS_ASSERT_EQUALS(translator3.translateBack(gum::learning::DBTranslatedValue{std::size_t{2}}),
522                        "4");
523       TS_ASSERT_EQUALS(translator3.variable()->toString(), "X2:Labelized(<1,2,4>)")
524 
525       translator5 = std::move(translator3);
526       TS_ASSERT_EQUALS(translator5.translate("1").discr_val, (std::size_t)0)
527       TS_ASSERT_EQUALS(translator5.translate("2").discr_val, (std::size_t)1)
528       TS_ASSERT_EQUALS(translator5.translate("4").discr_val, (std::size_t)2)
529       TS_ASSERT_EQUALS(translator5.translateBack(gum::learning::DBTranslatedValue{std::size_t{0}}),
530                        "1");
531       TS_ASSERT_EQUALS(translator5.translateBack(gum::learning::DBTranslatedValue{std::size_t{1}}),
532                        "2");
533       TS_ASSERT_EQUALS(translator5.translateBack(gum::learning::DBTranslatedValue{std::size_t{2}}),
534                        "4");
535       TS_ASSERT_EQUALS(translator5.variable()->toString(), "X2:Labelized(<1,2,4>)")
536     }
537 
538 
test_trans6()539     void test_trans6() {
540       gum::LabelizedVariable var("X1", "", 0);
541       var.addLabel("toto");
542       var.addLabel("titi");
543       var.addLabel("???");
544 
545       std::vector< std::string > missing{"?", "N/A", "???"};
546 
547       gum::learning::DBTranslator4LabelizedVariable<> translator(var, missing);
548       TS_ASSERT_EQUALS(translator.translate("toto").discr_val, (std::size_t)0)
549       TS_ASSERT_EQUALS(translator.translate("toto").discr_val, (std::size_t)0)
550       TS_ASSERT_EQUALS(translator.translate("N/A").discr_val,
551                        std::numeric_limits< std::size_t >::max());
552       TS_ASSERT_EQUALS(translator.translate("?").discr_val,
553                        std::numeric_limits< std::size_t >::max());
554       TS_ASSERT_EQUALS(translator.translate("???").discr_val, (std::size_t)2)
555 
556       TS_ASSERT(translator.translateBack(gum::learning::DBTranslatedValue{std::size_t{0}})
557                 == "toto");
558       TS_ASSERT(translator.translateBack(gum::learning::DBTranslatedValue{std::size_t{1}})
559                 == "titi");
560       TS_ASSERT(translator.translateBack(gum::learning::DBTranslatedValue{std::size_t{2}})
561                 == "???");
562     }
563 
test_trans7()564     void test_trans7() {
565       gum::LabelizedVariable var("X1", "", 0);
566       var.addLabel("7");
567       var.addLabel("1");
568       var.addLabel("3");
569 
570       std::vector< std::string > missing{"7", "N/A", "toto"};
571 
572       gum::learning::DBTranslator4LabelizedVariable<> translator(var, missing);
573       TS_ASSERT(translator.needsReordering())
574       TS_ASSERT_EQUALS(translator.domainSize(), (gum::Size)3)
575 
576       TS_ASSERT_EQUALS((translator << "7").discr_val, (std::size_t)0)
577       TS_ASSERT_EQUALS((translator >> gum::learning::DBTranslatedValue{std::size_t{0}}), "7")
578       TS_ASSERT_EQUALS(translator.translateBack(gum::learning::DBTranslatedValue{std::size_t{0}}),
579                        "7");
580       TS_ASSERT_EQUALS(translator.translateBack(gum::learning::DBTranslatedValue{std::size_t{1}}),
581                        "1");
582       TS_ASSERT_EQUALS(translator.translateBack(gum::learning::DBTranslatedValue{std::size_t{2}}),
583                        "3");
584 
585       std::string back = translator.translateBack(
586          gum::learning::DBTranslatedValue{std::numeric_limits< std::size_t >::max()});
587 
588       gum::Set< std::string > missing_kept{"N/A", "toto"};
589       TS_ASSERT(missing_kept.exists(back))
590       TS_ASSERT_EQUALS(translator.missingSymbols(), missing_kept)
591 
592       auto new_order = translator.reorder();
593 
594       TS_ASSERT_EQUALS(new_order[0], (std::size_t)2)
595       TS_ASSERT_EQUALS(new_order[1], (std::size_t)0)
596       TS_ASSERT_EQUALS(new_order[2], (std::size_t)1)
597 
598       TS_ASSERT_EQUALS(translator.translate("7").discr_val, (std::size_t)2)
599       TS_ASSERT_EQUALS(translator.translate("1").discr_val, (std::size_t)0)
600       TS_ASSERT_EQUALS(translator.translate("3").discr_val, (std::size_t)1)
601       TS_ASSERT_EQUALS(translator.translateBack(gum::learning::DBTranslatedValue{std::size_t{0}}),
602                        "1");
603       TS_ASSERT_EQUALS(translator.translateBack(gum::learning::DBTranslatedValue{std::size_t{1}}),
604                        "3");
605       TS_ASSERT_EQUALS(translator.translateBack(gum::learning::DBTranslatedValue{std::size_t{2}}),
606                        "7");
607 
608 
609       gum::LabelizedVariable var2("X2", "", 0);
610       var2.addLabel("1");
611       var2.addLabel("3");
612       var2.addLabel("7");
613 
614       std::vector< std::string > missing2{"7", "N/A", "toto"};
615 
616 
617       gum::learning::DBTranslator4LabelizedVariable<> translator2(var2, missing2);
618       TS_ASSERT_EQUALS(translator2.needsReordering(), false)
619       TS_ASSERT_EQUALS(translator2.domainSize(), (gum::Size)3)
620 
621       TS_ASSERT_EQUALS((translator2 << "7").discr_val, (std::size_t)2)
622       TS_ASSERT_EQUALS((translator2 >> gum::learning::DBTranslatedValue{std::size_t{2}}), "7")
623       TS_ASSERT_EQUALS(translator2.translateBack(gum::learning::DBTranslatedValue{std::size_t{0}}),
624                        "1");
625       TS_ASSERT_EQUALS(translator2.translateBack(gum::learning::DBTranslatedValue{std::size_t{1}}),
626                        "3");
627       TS_ASSERT_EQUALS(translator2.translateBack(gum::learning::DBTranslatedValue{std::size_t{2}}),
628                        "7");
629       back = translator2.translateBack(
630          gum::learning::DBTranslatedValue{std::numeric_limits< std::size_t >::max()});
631       TS_ASSERT(translator2.missingSymbols().exists(back))
632 
633       gum::Set< std::string > missing_kept2{"N/A", "toto"};
634       TS_ASSERT_EQUALS(translator2.missingSymbols(), missing_kept2)
635 
636       auto new_order2 = translator2.reorder();
637       TS_ASSERT_EQUALS(new_order2.size(), (gum::Size)0)
638     }
639   };
640 
641 } /* namespace gum_tests */
642