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/DBTranslator4RangeVariable.h>
30 
31 namespace gum_tests {
32 
33   class DBTranslator4RangeVariableTestSuite: public CxxTest::TestSuite {
34     public:
test_trans1()35     void test_trans1() {
36       gum::learning::DBTranslator4RangeVariable<> translator;
37       TS_ASSERT(translator.isLossless())
38       TS_GUM_ASSERT_THROWS_NOTHING(translator.translate("3"));
39       TS_ASSERT_EQUALS(translator.translate("3").discr_val, (std::size_t)0)
40       TS_ASSERT_EQUALS(translator.translateBack(gum::learning::DBTranslatedValue{std::size_t{0}}),
41                        "3");
42 
43       TS_ASSERT_EQUALS(translator.missingValue().discr_val,
44                        std::numeric_limits< std::size_t >::max());
45 
46       TS_GUM_ASSERT_THROWS_NOTHING(translator.translate("5"));
47       TS_ASSERT_EQUALS(translator.translate("5").discr_val, (std::size_t)2)
48       TS_ASSERT_EQUALS(translator.translate("4").discr_val, (std::size_t)1)
49       TS_ASSERT_EQUALS(translator.translateBack(gum::learning::DBTranslatedValue{std::size_t{0}}),
50                        "3");
51       TS_ASSERT_EQUALS(translator.translateBack(gum::learning::DBTranslatedValue{std::size_t{1}}),
52                        "4");
53       TS_ASSERT_EQUALS(translator.translateBack(gum::learning::DBTranslatedValue{std::size_t{2}}),
54                        "5");
55 
56       TS_GUM_ASSERT_THROWS_NOTHING(translator.translate("1"));
57       TS_ASSERT_EQUALS(translator.translate("1").discr_val, (std::size_t)3)
58       TS_ASSERT_EQUALS(translator.translate("2").discr_val, (std::size_t)4)
59       TS_ASSERT_EQUALS(translator.translateBack(gum::learning::DBTranslatedValue{std::size_t{3}}),
60                        "1");
61       TS_ASSERT_EQUALS(translator.translateBack(gum::learning::DBTranslatedValue{std::size_t{4}}),
62                        "2");
63 
64       TS_GUM_ASSERT_THROWS_NOTHING(translator.translate("-1"));
65       TS_ASSERT_EQUALS(translator.translate("-1").discr_val, (std::size_t)5)
66       TS_ASSERT_EQUALS(translator.translate("0").discr_val, (std::size_t)6)
67       TS_ASSERT_EQUALS(translator.translate("1").discr_val, (std::size_t)3)
68       TS_ASSERT_EQUALS(translator.translate("2").discr_val, (std::size_t)4)
69       TS_ASSERT_EQUALS(translator.translate("3").discr_val, (std::size_t)0)
70       TS_ASSERT_EQUALS(translator.translate("4").discr_val, (std::size_t)1)
71       TS_ASSERT_EQUALS(translator.translate("5").discr_val, (std::size_t)2)
72       TS_ASSERT_EQUALS(translator.translateBack(gum::learning::DBTranslatedValue{std::size_t{0}}),
73                        "3");
74       TS_ASSERT_EQUALS(translator.translateBack(gum::learning::DBTranslatedValue{std::size_t{1}}),
75                        "4");
76       TS_ASSERT_EQUALS(translator.translateBack(gum::learning::DBTranslatedValue{std::size_t{2}}),
77                        "5");
78       TS_ASSERT_EQUALS(translator.translateBack(gum::learning::DBTranslatedValue{std::size_t{3}}),
79                        "1");
80       TS_ASSERT_EQUALS(translator.translateBack(gum::learning::DBTranslatedValue{std::size_t{4}}),
81                        "2");
82       TS_ASSERT_EQUALS(translator.translateBack(gum::learning::DBTranslatedValue{std::size_t{5}}),
83                        "-1");
84       TS_ASSERT_EQUALS(translator.translateBack(gum::learning::DBTranslatedValue{std::size_t{6}}),
85                        "0");
86 
87       std::vector< std::string > missing{"2", "N/A", "20", "4", "xxx"};
88 
89       gum::learning::DBTranslator4RangeVariable<> translator2(missing);
90       TS_ASSERT_EQUALS(translator2.translate("3").discr_val, (std::size_t)0)
91       TS_ASSERT_EQUALS(translator2.translate("2").discr_val,
92                        std::numeric_limits< std::size_t >::max());
93       TS_ASSERT(translator2.translate("N/A").discr_val
94                 == std::numeric_limits< std::size_t >::max());
95       TS_ASSERT(translator2.translate("xxx").discr_val
96                 == std::numeric_limits< std::size_t >::max());
97       TS_ASSERT_THROWS(translator2.translate("yyy"), gum::TypeError)
98       TS_ASSERT_THROWS(translator2.translate("1"), gum::OperationNotAllowed)
99       TS_ASSERT_EQUALS(translator2.translate("5").discr_val, (std::size_t)2)
100       TS_ASSERT_EQUALS(translator2.translate("4").discr_val, (std::size_t)1)
101       TS_ASSERT_EQUALS(translator2.translateBack(gum::learning::DBTranslatedValue{std::size_t{0}}),
102                        "3");
103       TS_ASSERT_EQUALS(translator2.translateBack(gum::learning::DBTranslatedValue{std::size_t{1}}),
104                        "4");
105       TS_ASSERT_EQUALS(translator2.translateBack(gum::learning::DBTranslatedValue{std::size_t{2}}),
106                        "5");
107 
108       gum::Set< std::string > possible_translated_miss{"N/A", "xxx"};
109       TS_ASSERT(possible_translated_miss.exists(translator2.translateBack(
110          gum::learning::DBTranslatedValue{std::numeric_limits< std::size_t >::max()})));
111       TS_ASSERT_EQUALS(translator2.needsReordering(), false)
112       const auto new_order = translator2.reorder();
113       TS_ASSERT_EQUALS(new_order.size(), (gum::Size)0)
114 
115       gum::RangeVariable                          var("X2", "", 2, 3);
116       gum::learning::DBTranslator4RangeVariable<> translator3(var, missing, true);
117       TS_ASSERT_EQUALS(translator3.translate("2").discr_val, (std::size_t)0)
118       TS_ASSERT_EQUALS(translator3.translate("5").discr_val, (std::size_t)3)
119       TS_ASSERT_EQUALS(translator3.translate("4").discr_val, (std::size_t)2)
120       TS_ASSERT_EQUALS(translator3.translate("0").discr_val, (std::size_t)4)
121       TS_ASSERT_EQUALS(translator3.translate("1").discr_val, (std::size_t)5)
122       TS_ASSERT_EQUALS(translator3.translateBack(gum::learning::DBTranslatedValue{std::size_t{0}}),
123                        "2");
124       TS_ASSERT_EQUALS(translator3.translateBack(gum::learning::DBTranslatedValue{std::size_t{1}}),
125                        "3");
126       TS_ASSERT_EQUALS(translator3.translateBack(gum::learning::DBTranslatedValue{std::size_t{2}}),
127                        "4");
128       TS_ASSERT_EQUALS(translator3.translateBack(gum::learning::DBTranslatedValue{std::size_t{3}}),
129                        "5");
130       TS_ASSERT_EQUALS(translator3.translateBack(gum::learning::DBTranslatedValue{std::size_t{4}}),
131                        "0");
132       TS_ASSERT_EQUALS(translator3.translateBack(gum::learning::DBTranslatedValue{std::size_t{5}}),
133                        "1");
134       TS_ASSERT(translator3.needsReordering())
135       const auto new_order3 = translator3.reorder();
136       TS_ASSERT_EQUALS(new_order3[0], (std::size_t)2)
137       TS_ASSERT_EQUALS(new_order3[1], (std::size_t)3)
138       TS_ASSERT_EQUALS(new_order3[2], (std::size_t)4)
139       TS_ASSERT_EQUALS(new_order3[3], (std::size_t)5)
140       TS_ASSERT_EQUALS(new_order3[4], (std::size_t)0)
141       TS_ASSERT_EQUALS(new_order3[5], (std::size_t)1)
142 
143       TS_ASSERT_EQUALS(translator3.translate("0").discr_val, (std::size_t)0)
144       TS_ASSERT_EQUALS(translator3.translate("1").discr_val, (std::size_t)1)
145       TS_ASSERT_EQUALS(translator3.translate("2").discr_val, (std::size_t)2)
146       TS_ASSERT_EQUALS(translator3.translate("3").discr_val, (std::size_t)3)
147       TS_ASSERT_EQUALS(translator3.translate("4").discr_val, (std::size_t)4)
148       TS_ASSERT_EQUALS(translator3.translate("5").discr_val, (std::size_t)5)
149 
150 
151       std::vector< std::string >                  missing2;
152       gum::learning::DBTranslator4RangeVariable<> translator4(var, missing2, true, 3);
153       TS_ASSERT_EQUALS(translator4.translate("2").discr_val, (std::size_t)0)
154       TS_ASSERT_THROWS(translator4.translate("5"), gum::SizeError)
155       TS_ASSERT_EQUALS(translator4.translate("4").discr_val, (std::size_t)2)
156       TS_ASSERT_THROWS(translator4.translate("0"), gum::SizeError)
157       TS_ASSERT_THROWS(translator4.translate("1"), gum::SizeError)
158       TS_ASSERT_EQUALS(translator4.translateBack(gum::learning::DBTranslatedValue{std::size_t{0}}),
159                        "2");
160       TS_ASSERT_EQUALS(translator4.translateBack(gum::learning::DBTranslatedValue{std::size_t{1}}),
161                        "3");
162       TS_ASSERT_EQUALS(translator4.translateBack(gum::learning::DBTranslatedValue{std::size_t{2}}),
163                        "4");
164       TS_ASSERT_THROWS(translator4.translateBack(gum::learning::DBTranslatedValue{std::size_t{3}}),
165                        gum::UnknownLabelInDatabase);
166     }
167 
168 
test_trans2()169     void test_trans2() {
170       gum::learning::DBTranslator4RangeVariable< DebugCountedAlloc > translator;
171       TS_GUM_ASSERT_THROWS_NOTHING(translator.translate("3"));
172       TS_ASSERT_EQUALS(translator.translate("3").discr_val, (std::size_t)0)
173       TS_ASSERT_EQUALS(translator.translateBack(gum::learning::DBTranslatedValue{std::size_t{0}}),
174                        "3");
175 
176       TS_GUM_ASSERT_THROWS_NOTHING(translator.translate("5"));
177       TS_ASSERT_EQUALS(translator.translate("5").discr_val, (std::size_t)2)
178       TS_ASSERT_EQUALS(translator.translate("4").discr_val, (std::size_t)1)
179       TS_ASSERT_EQUALS(translator.translateBack(gum::learning::DBTranslatedValue{std::size_t{0}}),
180                        "3");
181       TS_ASSERT_EQUALS(translator.translateBack(gum::learning::DBTranslatedValue{std::size_t{1}}),
182                        "4");
183       TS_ASSERT_EQUALS(translator.translateBack(gum::learning::DBTranslatedValue{std::size_t{2}}),
184                        "5");
185 
186       TS_GUM_ASSERT_THROWS_NOTHING(translator.translate("1"));
187       TS_ASSERT_EQUALS(translator.translate("1").discr_val, (std::size_t)3)
188       TS_ASSERT_EQUALS(translator.translate("2").discr_val, (std::size_t)4)
189       TS_ASSERT_EQUALS(translator.translateBack(gum::learning::DBTranslatedValue{std::size_t{3}}),
190                        "1");
191       TS_ASSERT_EQUALS(translator.translateBack(gum::learning::DBTranslatedValue{std::size_t{4}}),
192                        "2");
193 
194       TS_GUM_ASSERT_THROWS_NOTHING(translator.translate("-1"));
195       TS_ASSERT_EQUALS(translator.translate("-1").discr_val, (std::size_t)5)
196       TS_ASSERT_EQUALS(translator.translate("0").discr_val, (std::size_t)6)
197       TS_ASSERT_EQUALS(translator.translate("1").discr_val, (std::size_t)3)
198       TS_ASSERT_EQUALS(translator.translate("2").discr_val, (std::size_t)4)
199       TS_ASSERT_EQUALS(translator.translate("3").discr_val, (std::size_t)0)
200       TS_ASSERT_EQUALS(translator.translate("4").discr_val, (std::size_t)1)
201       TS_ASSERT_EQUALS(translator.translate("5").discr_val, (std::size_t)2)
202       TS_ASSERT_EQUALS(translator.translateBack(gum::learning::DBTranslatedValue{std::size_t{0}}),
203                        "3");
204       TS_ASSERT_EQUALS(translator.translateBack(gum::learning::DBTranslatedValue{std::size_t{1}}),
205                        "4");
206       TS_ASSERT_EQUALS(translator.translateBack(gum::learning::DBTranslatedValue{std::size_t{2}}),
207                        "5");
208       TS_ASSERT_EQUALS(translator.translateBack(gum::learning::DBTranslatedValue{std::size_t{3}}),
209                        "1");
210       TS_ASSERT_EQUALS(translator.translateBack(gum::learning::DBTranslatedValue{std::size_t{4}}),
211                        "2");
212       TS_ASSERT_EQUALS(translator.translateBack(gum::learning::DBTranslatedValue{std::size_t{5}}),
213                        "-1");
214       TS_ASSERT_EQUALS(translator.translateBack(gum::learning::DBTranslatedValue{std::size_t{6}}),
215                        "0");
216 
217       std::vector< std::string > missing{"2", "N/A", "20", "4", "xxx"};
218 
219       gum::learning::DBTranslator4RangeVariable< DebugCountedAlloc > translator2(missing);
220       TS_ASSERT_EQUALS(translator2.translate("3").discr_val, (std::size_t)0)
221       TS_ASSERT_EQUALS(translator2.translate("2").discr_val,
222                        std::numeric_limits< std::size_t >::max());
223       TS_ASSERT(translator2.translate("N/A").discr_val
224                 == std::numeric_limits< std::size_t >::max());
225       TS_ASSERT(translator2.translate("xxx").discr_val
226                 == std::numeric_limits< std::size_t >::max());
227       TS_ASSERT_THROWS(translator2.translate("yyy"), gum::TypeError)
228       TS_ASSERT_THROWS(translator2.translate("1"), gum::OperationNotAllowed)
229       TS_ASSERT_EQUALS(translator2.translate("5").discr_val, (std::size_t)2)
230       TS_ASSERT_EQUALS(translator2.translate("4").discr_val, (std::size_t)1)
231       TS_ASSERT_EQUALS(translator2.translateBack(gum::learning::DBTranslatedValue{std::size_t{0}}),
232                        "3");
233       TS_ASSERT_EQUALS(translator2.translateBack(gum::learning::DBTranslatedValue{std::size_t{1}}),
234                        "4");
235       TS_ASSERT_EQUALS(translator2.translateBack(gum::learning::DBTranslatedValue{std::size_t{2}}),
236                        "5");
237 
238       gum::Set< std::string > possible_translated_miss{"N/A", "xxx"};
239       TS_ASSERT(possible_translated_miss.exists(translator2.translateBack(
240          gum::learning::DBTranslatedValue{std::numeric_limits< std::size_t >::max()})));
241       TS_ASSERT_EQUALS(translator2.needsReordering(), false)
242       const auto new_order = translator2.reorder();
243       TS_ASSERT_EQUALS(new_order.size(), (gum::Size)0)
244 
245       gum::RangeVariable                                             var("X2", "", 2, 3);
246       gum::learning::DBTranslator4RangeVariable< DebugCountedAlloc > translator3(var,
247                                                                                  missing,
248                                                                                  true);
249       TS_ASSERT_EQUALS(translator3.translate("2").discr_val, (std::size_t)0)
250       TS_ASSERT_EQUALS(translator3.translate("5").discr_val, (std::size_t)3)
251       TS_ASSERT_EQUALS(translator3.translate("4").discr_val, (std::size_t)2)
252       TS_ASSERT_EQUALS(translator3.translate("0").discr_val, (std::size_t)4)
253       TS_ASSERT_EQUALS(translator3.translate("1").discr_val, (std::size_t)5)
254       TS_ASSERT_EQUALS(translator3.translateBack(gum::learning::DBTranslatedValue{std::size_t{0}}),
255                        "2");
256       TS_ASSERT_EQUALS(translator3.translateBack(gum::learning::DBTranslatedValue{std::size_t{1}}),
257                        "3");
258       TS_ASSERT_EQUALS(translator3.translateBack(gum::learning::DBTranslatedValue{std::size_t{2}}),
259                        "4");
260       TS_ASSERT_EQUALS(translator3.translateBack(gum::learning::DBTranslatedValue{std::size_t{3}}),
261                        "5");
262       TS_ASSERT_EQUALS(translator3.translateBack(gum::learning::DBTranslatedValue{std::size_t{4}}),
263                        "0");
264       TS_ASSERT_EQUALS(translator3.translateBack(gum::learning::DBTranslatedValue{std::size_t{5}}),
265                        "1");
266       TS_ASSERT(translator3.needsReordering())
267       const auto new_order3 = translator3.reorder();
268       TS_ASSERT_EQUALS(new_order3[0], (std::size_t)2)
269       TS_ASSERT_EQUALS(new_order3[1], (std::size_t)3)
270       TS_ASSERT_EQUALS(new_order3[2], (std::size_t)4)
271       TS_ASSERT_EQUALS(new_order3[3], (std::size_t)5)
272       TS_ASSERT_EQUALS(new_order3[4], (std::size_t)0)
273       TS_ASSERT_EQUALS(new_order3[5], (std::size_t)1)
274 
275       TS_ASSERT_EQUALS(translator3.translate("0").discr_val, (std::size_t)0)
276       TS_ASSERT_EQUALS(translator3.translate("1").discr_val, (std::size_t)1)
277       TS_ASSERT_EQUALS(translator3.translate("2").discr_val, (std::size_t)2)
278       TS_ASSERT_EQUALS(translator3.translate("4").discr_val, (std::size_t)4)
279       TS_ASSERT_EQUALS(translator3.translate("5").discr_val, (std::size_t)5)
280       TS_ASSERT_EQUALS(translator3.translateBack(gum::learning::DBTranslatedValue{std::size_t{0}}),
281                        "0");
282       TS_ASSERT_EQUALS(translator3.translateBack(gum::learning::DBTranslatedValue{std::size_t{1}}),
283                        "1");
284       TS_ASSERT_EQUALS(translator3.translateBack(gum::learning::DBTranslatedValue{std::size_t{2}}),
285                        "2");
286       TS_ASSERT_EQUALS(translator3.translateBack(gum::learning::DBTranslatedValue{std::size_t{3}}),
287                        "3");
288       TS_ASSERT_EQUALS(translator3.translateBack(gum::learning::DBTranslatedValue{std::size_t{4}}),
289                        "4");
290       TS_ASSERT_EQUALS(translator3.translateBack(gum::learning::DBTranslatedValue{std::size_t{5}}),
291                        "5");
292 
293 
294       std::vector< std::string >                                     missing2;
295       gum::learning::DBTranslator4RangeVariable< DebugCountedAlloc > translator4(var,
296                                                                                  missing2,
297                                                                                  true,
298                                                                                  3);
299       TS_ASSERT_EQUALS(translator4.translate("2").discr_val, (std::size_t)0)
300       TS_ASSERT_THROWS(translator4.translate("5"), gum::SizeError)
301       TS_ASSERT_EQUALS(translator4.translate("4").discr_val, (std::size_t)2)
302       TS_ASSERT_THROWS(translator4.translate("0"), gum::SizeError)
303       TS_ASSERT_THROWS(translator4.translate("1"), gum::SizeError)
304       TS_ASSERT_EQUALS(translator4.translateBack(gum::learning::DBTranslatedValue{std::size_t{0}}),
305                        "2");
306       TS_ASSERT_EQUALS(translator4.translateBack(gum::learning::DBTranslatedValue{std::size_t{1}}),
307                        "3");
308       TS_ASSERT_EQUALS(translator4.translateBack(gum::learning::DBTranslatedValue{std::size_t{2}}),
309                        "4");
310       TS_ASSERT_THROWS(translator4.translateBack(gum::learning::DBTranslatedValue{std::size_t{3}}),
311                        gum::UnknownLabelInDatabase);
312     }
313 
314 
test_trans4()315     void test_trans4() {
316       {
317         gum::RangeVariable var("X1", "", 2, 3);
318 
319         std::vector< std::string >                  missing;
320         gum::learning::DBTranslator4RangeVariable<> translator(var, missing, true);
321         TS_ASSERT_EQUALS(translator.translate("2").discr_val, (std::size_t)0)
322         TS_ASSERT_EQUALS(translator.translate("5").discr_val, (std::size_t)3)
323         TS_ASSERT_EQUALS(translator.translate("4").discr_val, (std::size_t)2)
324         TS_ASSERT_EQUALS(translator.translate("0").discr_val, (std::size_t)4)
325         TS_ASSERT_EQUALS(translator.translate("1").discr_val, (std::size_t)5)
326         TS_ASSERT_EQUALS(translator.translateBack(gum::learning::DBTranslatedValue{std::size_t{0}}),
327                          "2");
328         TS_ASSERT_EQUALS(translator.translateBack(gum::learning::DBTranslatedValue{std::size_t{1}}),
329                          "3");
330         TS_ASSERT_EQUALS(translator.translateBack(gum::learning::DBTranslatedValue{std::size_t{2}}),
331                          "4");
332         TS_ASSERT_EQUALS(translator.translateBack(gum::learning::DBTranslatedValue{std::size_t{3}}),
333                          "5");
334         TS_ASSERT_EQUALS(translator.translateBack(gum::learning::DBTranslatedValue{std::size_t{4}}),
335                          "0");
336         TS_ASSERT_EQUALS(translator.translateBack(gum::learning::DBTranslatedValue{std::size_t{5}}),
337                          "1");
338         TS_ASSERT(translator.needsReordering())
339         const auto new_order = translator.reorder();
340         TS_ASSERT_EQUALS(new_order[0], (std::size_t)2)
341         TS_ASSERT_EQUALS(new_order[1], (std::size_t)3)
342         TS_ASSERT_EQUALS(new_order[2], (std::size_t)4)
343         TS_ASSERT_EQUALS(new_order[3], (std::size_t)5)
344         TS_ASSERT_EQUALS(new_order[4], (std::size_t)0)
345         TS_ASSERT_EQUALS(new_order[5], (std::size_t)1)
346         TS_ASSERT_EQUALS(translator.variable()->toString(), "X1:Range([0,5])")
347 
348         gum::learning::DBTranslator4RangeVariable< DebugCountedAlloc > translator2(var,
349                                                                                    missing,
350                                                                                    true);
351         TS_ASSERT_EQUALS(translator2.translate("2").discr_val, (std::size_t)0)
352         TS_ASSERT_EQUALS(translator2.translate("5").discr_val, (std::size_t)3)
353         TS_ASSERT_EQUALS(translator2.translate("4").discr_val, (std::size_t)2)
354         TS_ASSERT_EQUALS(translator2.translate("0").discr_val, (std::size_t)4)
355         TS_ASSERT_EQUALS(translator2.translate("1").discr_val, (std::size_t)5)
356         TS_ASSERT_EQUALS(
357            translator2.translateBack(gum::learning::DBTranslatedValue{std::size_t{0}}),
358            "2");
359         TS_ASSERT_EQUALS(
360            translator2.translateBack(gum::learning::DBTranslatedValue{std::size_t{1}}),
361            "3");
362         TS_ASSERT_EQUALS(
363            translator2.translateBack(gum::learning::DBTranslatedValue{std::size_t{2}}),
364            "4");
365         TS_ASSERT_EQUALS(
366            translator2.translateBack(gum::learning::DBTranslatedValue{std::size_t{3}}),
367            "5");
368         TS_ASSERT_EQUALS(
369            translator2.translateBack(gum::learning::DBTranslatedValue{std::size_t{4}}),
370            "0");
371         TS_ASSERT_EQUALS(
372            translator2.translateBack(gum::learning::DBTranslatedValue{std::size_t{5}}),
373            "1");
374         TS_ASSERT(translator2.needsReordering())
375         const auto new_order2 = translator2.reorder();
376         TS_ASSERT_EQUALS(new_order2[0], (std::size_t)2)
377         TS_ASSERT_EQUALS(new_order2[1], (std::size_t)3)
378         TS_ASSERT_EQUALS(new_order2[2], (std::size_t)4)
379         TS_ASSERT_EQUALS(new_order2[3], (std::size_t)5)
380         TS_ASSERT_EQUALS(new_order2[4], (std::size_t)0)
381         TS_ASSERT_EQUALS(new_order2[5], (std::size_t)1)
382         TS_ASSERT_EQUALS(translator2.variable()->toString(), "X1:Range([0,5])")
383 
384         gum::learning::DBTranslator4RangeVariable<> translator3(
385            translator,
386            std::allocator< gum::learning::DBTranslatedValue >());
387         TS_ASSERT_EQUALS(translator3.translate("0").discr_val, (std::size_t)0)
388         TS_ASSERT_EQUALS(translator3.translate("1").discr_val, (std::size_t)1)
389         TS_ASSERT_EQUALS(translator3.translate("2").discr_val, (std::size_t)2)
390         TS_ASSERT_EQUALS(translator3.translate("4").discr_val, (std::size_t)4)
391         TS_ASSERT_EQUALS(translator3.translate("5").discr_val, (std::size_t)5)
392         TS_ASSERT_EQUALS(
393            translator3.translateBack(gum::learning::DBTranslatedValue{std::size_t{0}}),
394            "0");
395         TS_ASSERT_EQUALS(
396            translator3.translateBack(gum::learning::DBTranslatedValue{std::size_t{1}}),
397            "1");
398         TS_ASSERT_EQUALS(
399            translator3.translateBack(gum::learning::DBTranslatedValue{std::size_t{2}}),
400            "2");
401         TS_ASSERT_EQUALS(
402            translator3.translateBack(gum::learning::DBTranslatedValue{std::size_t{3}}),
403            "3");
404         TS_ASSERT_EQUALS(
405            translator3.translateBack(gum::learning::DBTranslatedValue{std::size_t{4}}),
406            "4");
407         TS_ASSERT_EQUALS(
408            translator3.translateBack(gum::learning::DBTranslatedValue{std::size_t{5}}),
409            "5");
410 
411         gum::learning::DBTranslator4RangeVariable< DebugCountedAlloc > translator4(
412            translator2,
413            DebugCountedAlloc< gum::learning::DBTranslatedValue >());
414         TS_ASSERT_EQUALS(translator4.translate("0").discr_val, (std::size_t)0)
415         TS_ASSERT_EQUALS(translator4.translate("1").discr_val, (std::size_t)1)
416         TS_ASSERT_EQUALS(translator4.translate("2").discr_val, (std::size_t)2)
417         TS_ASSERT_EQUALS(translator4.translate("4").discr_val, (std::size_t)4)
418         TS_ASSERT_EQUALS(translator4.translate("5").discr_val, (std::size_t)5)
419         TS_ASSERT_EQUALS(
420            translator4.translateBack(gum::learning::DBTranslatedValue{std::size_t{0}}),
421            "0");
422         TS_ASSERT_EQUALS(
423            translator4.translateBack(gum::learning::DBTranslatedValue{std::size_t{1}}),
424            "1");
425         TS_ASSERT_EQUALS(
426            translator4.translateBack(gum::learning::DBTranslatedValue{std::size_t{2}}),
427            "2");
428         TS_ASSERT_EQUALS(
429            translator4.translateBack(gum::learning::DBTranslatedValue{std::size_t{3}}),
430            "3");
431         TS_ASSERT_EQUALS(
432            translator4.translateBack(gum::learning::DBTranslatedValue{std::size_t{4}}),
433            "4");
434         TS_ASSERT_EQUALS(
435            translator4.translateBack(gum::learning::DBTranslatedValue{std::size_t{5}}),
436            "5");
437 
438         gum::learning::DBTranslator4RangeVariable<> translator5(std::move(translator3));
439         TS_ASSERT_EQUALS(translator5.translate("0").discr_val, (std::size_t)0)
440         TS_ASSERT_EQUALS(translator5.translate("1").discr_val, (std::size_t)1)
441         TS_ASSERT_EQUALS(translator5.translate("2").discr_val, (std::size_t)2)
442         TS_ASSERT_EQUALS(translator5.translate("4").discr_val, (std::size_t)4)
443         TS_ASSERT_EQUALS(translator5.translate("5").discr_val, (std::size_t)5)
444         TS_ASSERT_EQUALS(
445            translator5.translateBack(gum::learning::DBTranslatedValue{std::size_t{0}}),
446            "0");
447         TS_ASSERT_EQUALS(
448            translator5.translateBack(gum::learning::DBTranslatedValue{std::size_t{1}}),
449            "1");
450         TS_ASSERT_EQUALS(
451            translator5.translateBack(gum::learning::DBTranslatedValue{std::size_t{2}}),
452            "2");
453         TS_ASSERT_EQUALS(
454            translator5.translateBack(gum::learning::DBTranslatedValue{std::size_t{3}}),
455            "3");
456         TS_ASSERT_EQUALS(
457            translator5.translateBack(gum::learning::DBTranslatedValue{std::size_t{4}}),
458            "4");
459         TS_ASSERT_EQUALS(
460            translator5.translateBack(gum::learning::DBTranslatedValue{std::size_t{5}}),
461            "5");
462 
463         gum::learning::DBTranslator4RangeVariable< DebugCountedAlloc > translator6(
464            std::move(translator4));
465         TS_ASSERT_EQUALS(translator6.translate("0").discr_val, (std::size_t)0)
466         TS_ASSERT_EQUALS(translator6.translate("1").discr_val, (std::size_t)1)
467         TS_ASSERT_EQUALS(translator6.translate("2").discr_val, (std::size_t)2)
468         TS_ASSERT_EQUALS(translator6.translate("4").discr_val, (std::size_t)4)
469         TS_ASSERT_EQUALS(translator6.translate("5").discr_val, (std::size_t)5)
470         TS_ASSERT_EQUALS(
471            translator6.translateBack(gum::learning::DBTranslatedValue{std::size_t{0}}),
472            "0");
473         TS_ASSERT_EQUALS(
474            translator6.translateBack(gum::learning::DBTranslatedValue{std::size_t{1}}),
475            "1");
476         TS_ASSERT_EQUALS(
477            translator6.translateBack(gum::learning::DBTranslatedValue{std::size_t{2}}),
478            "2");
479         TS_ASSERT_EQUALS(
480            translator6.translateBack(gum::learning::DBTranslatedValue{std::size_t{3}}),
481            "3");
482         TS_ASSERT_EQUALS(
483            translator6.translateBack(gum::learning::DBTranslatedValue{std::size_t{4}}),
484            "4");
485         TS_ASSERT_EQUALS(
486            translator6.translateBack(gum::learning::DBTranslatedValue{std::size_t{5}}),
487            "5");
488 
489         gum::learning::DBTranslator4RangeVariable< DebugCountedAlloc >* translator7
490            = translator6.clone();
491         TS_ASSERT_EQUALS(translator7->translate("0").discr_val, (std::size_t)0)
492         TS_ASSERT_EQUALS(translator7->translate("1").discr_val, (std::size_t)1)
493         TS_ASSERT_EQUALS(translator7->translate("2").discr_val, (std::size_t)2)
494         TS_ASSERT_EQUALS(translator7->translate("4").discr_val, (std::size_t)4)
495         TS_ASSERT_EQUALS(translator7->translate("5").discr_val, (std::size_t)5)
496         TS_ASSERT_EQUALS(
497            translator7->translateBack(gum::learning::DBTranslatedValue{std::size_t{0}}),
498            "0");
499         TS_ASSERT_EQUALS(
500            translator7->translateBack(gum::learning::DBTranslatedValue{std::size_t{1}}),
501            "1");
502         TS_ASSERT_EQUALS(
503            translator7->translateBack(gum::learning::DBTranslatedValue{std::size_t{2}}),
504            "2");
505         TS_ASSERT_EQUALS(
506            translator7->translateBack(gum::learning::DBTranslatedValue{std::size_t{3}}),
507            "3");
508         TS_ASSERT_EQUALS(
509            translator7->translateBack(gum::learning::DBTranslatedValue{std::size_t{4}}),
510            "4");
511         TS_ASSERT_EQUALS(
512            translator7->translateBack(gum::learning::DBTranslatedValue{std::size_t{5}}),
513            "5");
514 
515         DebugCountedAlloc< gum::learning::DBTranslator4RangeVariable< DebugCountedAlloc > >
516            allocator(translator7->getAllocator());
517         allocator.destroy(translator7);
518         allocator.deallocate(translator7, 1);
519 
520         translator4 = translator6;
521         TS_ASSERT_EQUALS(translator4.translate("0").discr_val, (std::size_t)0)
522         TS_ASSERT_EQUALS(translator4.translate("1").discr_val, (std::size_t)1)
523         TS_ASSERT_EQUALS(translator4.translate("2").discr_val, (std::size_t)2)
524         TS_ASSERT_EQUALS(translator4.translate("4").discr_val, (std::size_t)4)
525         TS_ASSERT_EQUALS(translator4.translate("5").discr_val, (std::size_t)5)
526         TS_ASSERT_EQUALS(
527            translator4.translateBack(gum::learning::DBTranslatedValue{std::size_t{0}}),
528            "0");
529         TS_ASSERT_EQUALS(
530            translator4.translateBack(gum::learning::DBTranslatedValue{std::size_t{1}}),
531            "1");
532         TS_ASSERT_EQUALS(
533            translator4.translateBack(gum::learning::DBTranslatedValue{std::size_t{2}}),
534            "2");
535         TS_ASSERT_EQUALS(
536            translator4.translateBack(gum::learning::DBTranslatedValue{std::size_t{3}}),
537            "3");
538         TS_ASSERT_EQUALS(
539            translator4.translateBack(gum::learning::DBTranslatedValue{std::size_t{4}}),
540            "4");
541         TS_ASSERT_EQUALS(
542            translator4.translateBack(gum::learning::DBTranslatedValue{std::size_t{5}}),
543            "5");
544 
545         translator3 = translator5;
546         TS_ASSERT_EQUALS(translator3.translate("0").discr_val, (std::size_t)0)
547         TS_ASSERT_EQUALS(translator3.translate("1").discr_val, (std::size_t)1)
548         TS_ASSERT_EQUALS(translator3.translate("2").discr_val, (std::size_t)2)
549         TS_ASSERT_EQUALS(translator3.translate("4").discr_val, (std::size_t)4)
550         TS_ASSERT_EQUALS(translator3.translate("5").discr_val, (std::size_t)5)
551         TS_ASSERT_EQUALS(
552            translator3.translateBack(gum::learning::DBTranslatedValue{std::size_t{0}}),
553            "0");
554         TS_ASSERT_EQUALS(
555            translator3.translateBack(gum::learning::DBTranslatedValue{std::size_t{1}}),
556            "1");
557         TS_ASSERT_EQUALS(
558            translator3.translateBack(gum::learning::DBTranslatedValue{std::size_t{2}}),
559            "2");
560         TS_ASSERT_EQUALS(
561            translator3.translateBack(gum::learning::DBTranslatedValue{std::size_t{3}}),
562            "3");
563         TS_ASSERT_EQUALS(
564            translator3.translateBack(gum::learning::DBTranslatedValue{std::size_t{4}}),
565            "4");
566         TS_ASSERT_EQUALS(
567            translator3.translateBack(gum::learning::DBTranslatedValue{std::size_t{5}}),
568            "5");
569 
570         translator5 = std::move(translator3);
571         TS_ASSERT_EQUALS(translator5.translate("0").discr_val, (std::size_t)0)
572         TS_ASSERT_EQUALS(translator5.translate("1").discr_val, (std::size_t)1)
573         TS_ASSERT_EQUALS(translator5.translate("2").discr_val, (std::size_t)2)
574         TS_ASSERT_EQUALS(translator5.translate("4").discr_val, (std::size_t)4)
575         TS_ASSERT_EQUALS(translator5.translate("5").discr_val, (std::size_t)5)
576         TS_ASSERT_EQUALS(
577            translator5.translateBack(gum::learning::DBTranslatedValue{std::size_t{0}}),
578            "0");
579         TS_ASSERT_EQUALS(
580            translator5.translateBack(gum::learning::DBTranslatedValue{std::size_t{1}}),
581            "1");
582         TS_ASSERT_EQUALS(
583            translator5.translateBack(gum::learning::DBTranslatedValue{std::size_t{2}}),
584            "2");
585         TS_ASSERT_EQUALS(
586            translator5.translateBack(gum::learning::DBTranslatedValue{std::size_t{3}}),
587            "3");
588         TS_ASSERT_EQUALS(
589            translator5.translateBack(gum::learning::DBTranslatedValue{std::size_t{4}}),
590            "4");
591         TS_ASSERT_EQUALS(
592            translator5.translateBack(gum::learning::DBTranslatedValue{std::size_t{5}}),
593            "5");
594       }
595 
596       TS_ASSERT_EQUALS(CountedAlloc::hasMemoryLeak(), false)
597     }
598 
599 
xtest_trans5()600     void xtest_trans5() {
601       LearningAlloc< double >                                    alloc(10000);
602       gum::learning::DBTranslator4RangeVariable< LearningAlloc > translator(1000, alloc);
603       TS_GUM_ASSERT_THROWS_NOTHING(translator.translate("3"));
604       TS_ASSERT_EQUALS(translator.translate("3").discr_val, (std::size_t)0)
605       TS_ASSERT_EQUALS(translator.translateBack(gum::learning::DBTranslatedValue{std::size_t{0}}),
606                        "3");
607 
608       TS_GUM_ASSERT_THROWS_NOTHING(translator.translate("5"));
609       TS_ASSERT_EQUALS(translator.translate("5").discr_val, (std::size_t)2)
610       TS_ASSERT_EQUALS(translator.translate("4").discr_val, (std::size_t)1)
611       TS_ASSERT_EQUALS(translator.translateBack(gum::learning::DBTranslatedValue{std::size_t{0}}),
612                        "3");
613       TS_ASSERT_EQUALS(translator.translateBack(gum::learning::DBTranslatedValue{std::size_t{1}}),
614                        "4");
615       TS_ASSERT_EQUALS(translator.translateBack(gum::learning::DBTranslatedValue{std::size_t{2}}),
616                        "5");
617 
618       TS_GUM_ASSERT_THROWS_NOTHING(translator.translate("1"));
619       TS_ASSERT_EQUALS(translator.translate("1").discr_val, (std::size_t)3)
620       TS_ASSERT_EQUALS(translator.translate("2").discr_val, (std::size_t)4)
621       TS_ASSERT_EQUALS(translator.translateBack(gum::learning::DBTranslatedValue{std::size_t{3}}),
622                        "1");
623       TS_ASSERT_EQUALS(translator.translateBack(gum::learning::DBTranslatedValue{std::size_t{4}}),
624                        "2");
625 
626       TS_GUM_ASSERT_THROWS_NOTHING(translator.translate("-1"));
627       TS_ASSERT_EQUALS(translator.translate("-1").discr_val, (std::size_t)5)
628       TS_ASSERT_EQUALS(translator.translate("0").discr_val, (std::size_t)6)
629       TS_ASSERT_EQUALS(translator.translate("1").discr_val, (std::size_t)3)
630       TS_ASSERT_EQUALS(translator.translate("2").discr_val, (std::size_t)4)
631       TS_ASSERT_EQUALS(translator.translate("3").discr_val, (std::size_t)0)
632       TS_ASSERT_EQUALS(translator.translate("4").discr_val, (std::size_t)1)
633       TS_ASSERT_EQUALS(translator.translate("5").discr_val, (std::size_t)2)
634       TS_ASSERT_EQUALS(translator.translateBack(gum::learning::DBTranslatedValue{std::size_t{0}}),
635                        "3");
636       TS_ASSERT_EQUALS(translator.translateBack(gum::learning::DBTranslatedValue{std::size_t{1}}),
637                        "4");
638       TS_ASSERT_EQUALS(translator.translateBack(gum::learning::DBTranslatedValue{std::size_t{2}}),
639                        "5");
640       TS_ASSERT_EQUALS(translator.translateBack(gum::learning::DBTranslatedValue{std::size_t{3}}),
641                        "1");
642       TS_ASSERT_EQUALS(translator.translateBack(gum::learning::DBTranslatedValue{std::size_t{4}}),
643                        "2");
644       TS_ASSERT_EQUALS(translator.translateBack(gum::learning::DBTranslatedValue{std::size_t{5}}),
645                        "-1");
646       TS_ASSERT_EQUALS(translator.translateBack(gum::learning::DBTranslatedValue{std::size_t{6}}),
647                        "0");
648 
649       const auto& allocator = translator.getAllocator();
650       TS_ASSERT_EQUALS(allocator, alloc)
651 
652       std::vector< std::string > missing{"2", "N/A", "20", "4", "xxx"};
653 
654       gum::learning::DBTranslator4RangeVariable< LearningAlloc > translator2(missing);
655       TS_ASSERT_EQUALS(translator2.translate("3").discr_val, (std::size_t)0)
656       TS_ASSERT_EQUALS(translator2.translate("2").discr_val,
657                        std::numeric_limits< std::size_t >::max());
658       TS_ASSERT(translator2.translate("N/A").discr_val
659                 == std::numeric_limits< std::size_t >::max());
660       TS_ASSERT(translator2.translate("xxx").discr_val
661                 == std::numeric_limits< std::size_t >::max());
662       TS_ASSERT_THROWS(translator2.translate("yyy"), gum::TypeError)
663       TS_ASSERT_THROWS(translator2.translate("1"), gum::OperationNotAllowed)
664       TS_ASSERT_EQUALS(translator2.translate("5").discr_val, (std::size_t)2)
665       TS_ASSERT_EQUALS(translator2.translate("4").discr_val, (std::size_t)1)
666       TS_ASSERT_EQUALS(translator2.translateBack(gum::learning::DBTranslatedValue{std::size_t{0}}),
667                        "3");
668       TS_ASSERT_EQUALS(translator2.translateBack(gum::learning::DBTranslatedValue{std::size_t{1}}),
669                        "4");
670       TS_ASSERT_EQUALS(translator2.translateBack(gum::learning::DBTranslatedValue{std::size_t{2}}),
671                        "5");
672 
673       gum::Set< std::string > possible_translated_miss{"N/A", "xxx"};
674       TS_ASSERT(possible_translated_miss.exists(translator2.translateBack(
675          gum::learning::DBTranslatedValue{std::numeric_limits< std::size_t >::max()})));
676       TS_ASSERT_EQUALS(translator2.needsReordering(), false)
677       const auto new_order = translator2.reorder();
678       TS_ASSERT_EQUALS(new_order[0], (std::size_t)0)
679       TS_ASSERT_EQUALS(new_order[1], (std::size_t)1)
680       TS_ASSERT_EQUALS(new_order[2], (std::size_t)2)
681 
682       gum::RangeVariable                                         var("X2", "", 2, 3);
683       gum::learning::DBTranslator4RangeVariable< LearningAlloc > translator3(var, missing, true);
684       TS_ASSERT_EQUALS(translator3.translate("2").discr_val, (std::size_t)0)
685       TS_ASSERT_EQUALS(translator3.translate("5").discr_val, (std::size_t)3)
686       TS_ASSERT_EQUALS(translator3.translate("4").discr_val, (std::size_t)2)
687       TS_ASSERT_EQUALS(translator3.translate("0").discr_val, (std::size_t)4)
688       TS_ASSERT_EQUALS(translator3.translate("1").discr_val, (std::size_t)5)
689       TS_ASSERT_EQUALS(translator3.translateBack(gum::learning::DBTranslatedValue{std::size_t{0}}),
690                        "2");
691       TS_ASSERT_EQUALS(translator3.translateBack(gum::learning::DBTranslatedValue{std::size_t{1}}),
692                        "3");
693       TS_ASSERT_EQUALS(translator3.translateBack(gum::learning::DBTranslatedValue{std::size_t{2}}),
694                        "4");
695       TS_ASSERT_EQUALS(translator3.translateBack(gum::learning::DBTranslatedValue{std::size_t{3}}),
696                        "5");
697       TS_ASSERT_EQUALS(translator3.translateBack(gum::learning::DBTranslatedValue{std::size_t{4}}),
698                        "0");
699       TS_ASSERT_EQUALS(translator3.translateBack(gum::learning::DBTranslatedValue{std::size_t{5}}),
700                        "1");
701       TS_ASSERT(translator3.needsReordering())
702       const auto new_order3 = translator3.reorder();
703       TS_ASSERT_EQUALS(new_order3[0], (std::size_t)2)
704       TS_ASSERT_EQUALS(new_order3[1], (std::size_t)3)
705       TS_ASSERT_EQUALS(new_order3[2], (std::size_t)4)
706       TS_ASSERT_EQUALS(new_order3[3], (std::size_t)5)
707       TS_ASSERT_EQUALS(new_order3[4], (std::size_t)0)
708       TS_ASSERT_EQUALS(new_order3[5], (std::size_t)1)
709 
710       std::vector< std::string >                                 missing2;
711       gum::learning::DBTranslator4RangeVariable< LearningAlloc > translator4(var,
712                                                                              missing2,
713                                                                              true,
714                                                                              3);
715       TS_ASSERT_EQUALS(translator4.translate("2").discr_val, (std::size_t)0)
716       TS_ASSERT_THROWS(translator4.translate("5"), gum::SizeError)
717       TS_ASSERT_EQUALS(translator4.translate("4").discr_val, (std::size_t)2)
718       TS_ASSERT_THROWS(translator4.translate("0"), gum::SizeError)
719       TS_ASSERT_THROWS(translator4.translate("1"), gum::SizeError)
720       TS_ASSERT_EQUALS(translator4.translateBack(gum::learning::DBTranslatedValue{std::size_t{0}}),
721                        "2");
722       TS_ASSERT_EQUALS(translator4.translateBack(gum::learning::DBTranslatedValue{std::size_t{1}}),
723                        "3");
724       TS_ASSERT_EQUALS(translator4.translateBack(gum::learning::DBTranslatedValue{std::size_t{2}}),
725                        "4");
726       TS_ASSERT_THROWS(translator4.translateBack(gum::learning::DBTranslatedValue{std::size_t{3}}),
727                        gum::UnknownLabelInDatabase);
728 
729       translator4 = translator3;
730       TS_ASSERT_EQUALS(translator4.translate("2").discr_val, (std::size_t)0)
731       TS_ASSERT_EQUALS(translator4.translate("5").discr_val, (std::size_t)3)
732       TS_ASSERT_EQUALS(translator4.translate("4").discr_val, (std::size_t)2)
733       TS_ASSERT_EQUALS(translator4.translate("0").discr_val, (std::size_t)4)
734       TS_ASSERT_EQUALS(translator4.translate("1").discr_val, (std::size_t)5)
735 
736       translator4 = std::move(translator3);
737       TS_ASSERT_EQUALS(translator4.translate("2").discr_val, (std::size_t)0)
738       TS_ASSERT_EQUALS(translator4.translate("5").discr_val, (std::size_t)3)
739       TS_ASSERT_EQUALS(translator4.translate("4").discr_val, (std::size_t)2)
740       TS_ASSERT_EQUALS(translator4.translate("0").discr_val, (std::size_t)4)
741       TS_ASSERT_EQUALS(translator4.translate("1").discr_val, (std::size_t)5)
742 
743       gum::learning::DBTranslator4RangeVariable< LearningAlloc > translator5(translator);
744       TS_ASSERT_EQUALS(translator5.translate("-1").discr_val, (std::size_t)5)
745       TS_ASSERT_EQUALS(translator5.translate("0").discr_val, (std::size_t)6)
746       TS_ASSERT_EQUALS(translator5.translate("1").discr_val, (std::size_t)3)
747       TS_ASSERT_EQUALS(translator5.translate("2").discr_val, (std::size_t)4)
748       TS_ASSERT_EQUALS(translator5.translate("3").discr_val, (std::size_t)0)
749       TS_ASSERT_EQUALS(translator5.translate("4").discr_val, (std::size_t)1)
750       TS_ASSERT_EQUALS(translator5.translate("5").discr_val, (std::size_t)2)
751 
752       gum::learning::DBTranslator4RangeVariable< LearningAlloc > translator6(std::move(translator));
753       TS_ASSERT_EQUALS(translator6.translate("-1").discr_val, (std::size_t)5)
754       TS_ASSERT_EQUALS(translator6.translate("0").discr_val, (std::size_t)6)
755       TS_ASSERT_EQUALS(translator6.translate("1").discr_val, (std::size_t)3)
756       TS_ASSERT_EQUALS(translator6.translate("2").discr_val, (std::size_t)4)
757       TS_ASSERT_EQUALS(translator6.translate("3").discr_val, (std::size_t)0)
758       TS_ASSERT_EQUALS(translator6.translate("4").discr_val, (std::size_t)1)
759       TS_ASSERT_EQUALS(translator6.translate("5").discr_val, (std::size_t)2)
760 
761       gum::learning::DBTranslator4RangeVariable< LearningAlloc >* translator7 = translator6.clone();
762       TS_ASSERT_EQUALS(translator7->translate("-1").discr_val, (std::size_t)5)
763       TS_ASSERT_EQUALS(translator7->translate("0").discr_val, (std::size_t)6)
764       TS_ASSERT_EQUALS(translator7->translate("1").discr_val, (std::size_t)3)
765       TS_ASSERT_EQUALS(translator7->translate("2").discr_val, (std::size_t)4)
766       TS_ASSERT_EQUALS(translator7->translate("3").discr_val, (std::size_t)0)
767       TS_ASSERT_EQUALS(translator7->translate("4").discr_val, (std::size_t)1)
768       TS_ASSERT_EQUALS(translator7->translate("5").discr_val, (std::size_t)2)
769 
770       LearningAlloc< gum::learning::DBTranslator4RangeVariable< LearningAlloc > > allocator2(
771          translator7->getAllocator());
772       allocator2.destroy(translator7);
773       allocator2.deallocate(translator7, 1);
774 
775       translator5 = translator6;
776       TS_ASSERT_EQUALS(translator5.translate("-1").discr_val, (std::size_t)5)
777       TS_ASSERT_EQUALS(translator5.translate("0").discr_val, (std::size_t)6)
778       TS_ASSERT_EQUALS(translator5.translate("1").discr_val, (std::size_t)3)
779       TS_ASSERT_EQUALS(translator5.translate("2").discr_val, (std::size_t)4)
780       TS_ASSERT_EQUALS(translator5.translate("3").discr_val, (std::size_t)0)
781       TS_ASSERT_EQUALS(translator5.translate("4").discr_val, (std::size_t)1)
782       TS_ASSERT_EQUALS(translator5.translate("5").discr_val, (std::size_t)2)
783 
784       translator3 = translator5;
785       TS_ASSERT_EQUALS(translator3.translate("-1").discr_val, (std::size_t)5)
786       TS_ASSERT_EQUALS(translator3.translate("0").discr_val, (std::size_t)6)
787       TS_ASSERT_EQUALS(translator3.translate("1").discr_val, (std::size_t)3)
788       TS_ASSERT_EQUALS(translator3.translate("2").discr_val, (std::size_t)4)
789       TS_ASSERT_EQUALS(translator3.translate("3").discr_val, (std::size_t)0)
790       TS_ASSERT_EQUALS(translator3.translate("4").discr_val, (std::size_t)1)
791       TS_ASSERT_EQUALS(translator3.translate("5").discr_val, (std::size_t)2)
792 
793       translator5 = std::move(translator3);
794       TS_ASSERT_EQUALS(translator5.translate("-1").discr_val, (std::size_t)5)
795       TS_ASSERT_EQUALS(translator5.translate("0").discr_val, (std::size_t)6)
796       TS_ASSERT_EQUALS(translator5.translate("1").discr_val, (std::size_t)3)
797       TS_ASSERT_EQUALS(translator5.translate("2").discr_val, (std::size_t)4)
798       TS_ASSERT_EQUALS(translator5.translate("3").discr_val, (std::size_t)0)
799       TS_ASSERT_EQUALS(translator5.translate("4").discr_val, (std::size_t)1)
800       TS_ASSERT_EQUALS(translator5.translate("5").discr_val, (std::size_t)2)
801     }
802 
803 
test_trans6()804     void test_trans6() {
805       gum::RangeVariable         var("X1", "", 2, 4);
806       std::vector< std::string > missing{"N/A", "3", "toto"};
807 
808       gum::learning::DBTranslator4RangeVariable<> translator(var, missing, true);
809       TS_ASSERT_EQUALS(translator.needsReordering(), false)
810       TS_ASSERT_EQUALS(translator.domainSize(), (gum::Size)3)
811 
812       TS_ASSERT_EQUALS((translator << "7").discr_val, (std::size_t)5)
813       TS_ASSERT_EQUALS((translator >> gum::learning::DBTranslatedValue{std::size_t{5}}), "7")
814       TS_ASSERT_EQUALS(translator.translateBack(gum::learning::DBTranslatedValue{std::size_t{0}}),
815                        "2");
816       TS_ASSERT_EQUALS(translator.translateBack(gum::learning::DBTranslatedValue{std::size_t{1}}),
817                        "3");
818       TS_ASSERT_EQUALS(translator.translateBack(gum::learning::DBTranslatedValue{std::size_t{2}}),
819                        "4");
820       TS_ASSERT_EQUALS(translator.translateBack(gum::learning::DBTranslatedValue{std::size_t{3}}),
821                        "5");
822       TS_ASSERT_EQUALS(translator.translateBack(gum::learning::DBTranslatedValue{std::size_t{4}}),
823                        "6");
824       TS_ASSERT_EQUALS(translator.translateBack(gum::learning::DBTranslatedValue{std::size_t{5}}),
825                        "7");
826       TS_ASSERT((translator.translateBack(
827                     gum::learning::DBTranslatedValue{std::numeric_limits< std::size_t >::max()})
828                  == "N/A")
829                 || (translator.translateBack(
830                        gum::learning::DBTranslatedValue{std::numeric_limits< std::size_t >::max()})
831                     == "toto"));
832 
833       gum::Set< std::string > missing_kept{"N/A", "toto"};
834       TS_ASSERT_EQUALS(translator.missingSymbols(), missing_kept)
835     }
836   };
837 
838 } /* namespace gum_tests */
839