32 #ifndef GUM_PROJECTION_PATTERN_ALLOWED 43 # ifdef GUM_MULTI_DIM_PROJECTION_NAME 44 # define GUM_MULTI_DIM_PROJECTION_TYPE GUM_SCALAR 45 template <
typename GUM_SCALAR >
46 MultiDimArray< GUM_SCALAR >* GUM_MULTI_DIM_PROJECTION_NAME(
47 const MultiDimArray< GUM_SCALAR >* table,
48 const Set< const DiscreteVariable* >& del_vars)
53 #ifdef GUM_MULTI_DIM_PROJECTION_POINTER_NAME 54 #define GUM_MULTI_DIM_PROJECTION_TYPE GUM_SCALAR * 55 #define GUM_MULTI_DIM_PROJECTION_POINTER 56 template <
typename GUM_SCALAR>
57 MultiDimArray<GUM_SCALAR*>* GUM_MULTI_DIM_PROJECTION_POINTER_NAME(
58 const MultiDimArray<GUM_SCALAR*>* table,
59 const Set<const DiscreteVariable*>& del_vars )
62 #ifdef GUM_MULTI_DIM_PROJECTION_NAME_F 63 #define GUM_MULTI_DIM_PROJECTION_TYPE GUM_SCALAR 64 template <
typename GUM_SCALAR>
65 MultiDimArray<GUM_SCALAR>* GUM_MULTI_DIM_PROJECTION_NAME_F(
66 const MultiDimArray<GUM_SCALAR>* table,
67 const Set<const DiscreteVariable*>& del_vars,
68 GUM_SCALAR ( *f )(
const GUM_SCALAR&,
const GUM_SCALAR& ) )
71 #ifdef GUM_MULTI_DIM_PROJECTION_POINTER_NAME_F 72 #define GUM_MULTI_DIM_PROJECTION_TYPE GUM_SCALAR * 73 #define GUM_MULTI_DIM_PROJECTION_POINTER 74 template <
typename GUM_SCALAR>
75 MultiDimArray<GUM_SCALAR*>* GUM_MULTI_DIM_PROJECTION_POINTER_NAME_F(
76 const MultiDimArray<GUM_SCALAR*>* table,
77 const Set<const DiscreteVariable*>& del_vars,
78 GUM_SCALAR* ( *f )(
const GUM_SCALAR
const*,
79 const GUM_SCALAR
const* ) )
82 #ifdef GUM_MULTI_DIM_PROJECTION_IMPL2ARRAY_NAME 83 #define GUM_MULTI_DIM_PROJECTION_TYPE GUM_SCALAR 84 template <
typename GUM_SCALAR>
85 MultiDimImplementation<GUM_SCALAR>*
86 GUM_MULTI_DIM_PROJECTION_IMPL2ARRAY_NAME(
87 const MultiDimImplementation<GUM_SCALAR>* ttable,
88 const Set<const DiscreteVariable*>& del_vars )
91 #ifdef GUM_MULTI_DIM_PROJECTION_POINTER_IMPL2ARRAY_NAME 92 #define GUM_MULTI_DIM_PROJECTION_TYPE GUM_SCALAR * 93 #define GUM_MULTI_DIM_PROJECTION_POINTER 94 template <
typename GUM_SCALAR>
95 MultiDimImplementation<GUM_SCALAR*>*
96 GUM_MULTI_DIM_PROJECTION_POINTER_IMPL2ARRAY_NAME(
97 const MultiDimImplementation<GUM_SCALAR*>* ttable,
98 const Set<const DiscreteVariable*>& del_vars )
105 # ifdef GUM_MULTI_DIM_PROJECTION_IMPL2ARRAY_NAME 106 const MultiDimArray< GUM_SCALAR >* table =
107 reinterpret_cast< const MultiDimArray< GUM_SCALAR >*
>(ttable);
110 # ifdef GUM_MULTI_DIM_PROJECTION_POINTER_IMPL2ARRAY_NAME 111 const MultiDimArray< GUM_SCALAR* >* table =
112 reinterpret_cast< const MultiDimArray< GUM_SCALAR* >*
>(ttable);
117 const GUM_SCALAR neutral_element = GUM_MULTI_DIM_PROJECTION_NEUTRAL;
121 const Sequence< const DiscreteVariable* >& table_vars =
122 table->variablesSequence();
123 bool need_swapping = table_vars.size() >= 2 * del_vars.size();
125 if (!need_swapping) {
135 std::vector< Idx > table_and_result_offset;
136 std::vector< Idx > table_and_result_domain;
137 std::vector< Idx > before_incr;
138 unsigned int nb_positive_before_incr = 0;
139 Idx table_alone_domain_size = 1;
140 Idx result_domain_size = 1;
141 Idx table_domain_size = 1;
142 Sequence< const DiscreteVariable* > result_varSeq;
144 Idx tmp_before_incr = 1;
145 bool has_before_incr =
false;
147 for (
const auto var : table_vars) {
148 table_domain_size *= var->domainSize();
150 if (!del_vars.exists(var)) {
151 if (has_before_incr) {
152 before_incr.push_back(tmp_before_incr - 1);
153 has_before_incr =
false;
154 ++nb_positive_before_incr;
156 before_incr.push_back(0);
159 table_and_result_domain.push_back(var->domainSize());
160 table_and_result_offset.push_back(result_domain_size);
161 result_domain_size *= var->domainSize();
163 result_varSeq << var;
165 tmp_before_incr *= var->domainSize();
166 has_before_incr =
true;
167 table_alone_domain_size *= var->domainSize();
171 std::vector< Idx > table_and_result_value = table_and_result_domain;
172 std::vector< Idx > current_incr = before_incr;
173 std::vector< Idx > table_and_result_down = table_and_result_offset;
175 for (
unsigned int i = 0; i < table_and_result_down.size(); ++i) {
176 table_and_result_down[i] *= (table_and_result_domain[i] - 1);
183 MultiDimArray< GUM_MULTI_DIM_PROJECTION_TYPE >* result =
184 new MultiDimArray< GUM_MULTI_DIM_PROJECTION_TYPE >;
186 if (!result_varSeq.size()) {
return result; }
188 result->beginMultipleChanges();
190 for (
const auto var : result_varSeq)
194 # ifdef GUM_MULTI_DIM_PROJECTION_POINTER 195 result->endMultipleChanges();
197 for (
Idx i = 0; i < result_domain_size; ++i) {
198 result->unsafeSet(i,
new GUM_SCALAR(neutral_element));
202 result->endMultipleChanges(neutral_element);
217 GUM_MULTI_DIM_PROJECTION_TYPE* pt =
218 const_cast< GUM_MULTI_DIM_PROJECTION_TYPE*
>(&(table->unsafeGet(0)));
219 GUM_MULTI_DIM_PROJECTION_TYPE* pres =
220 const_cast< GUM_MULTI_DIM_PROJECTION_TYPE*
>(&(result->unsafeGet(0)));
221 GUM_MULTI_DIM_PROJECTION_TYPE* pres_deb = pres;
223 if (!nb_positive_before_incr) {
224 for (
Idx i = 0; i < table_alone_domain_size; ++i) {
225 for (
Idx j = 0; j < result_domain_size; ++j) {
226 # ifdef GUM_MULTI_DIM_PROJECTION_EFFECTIVE_TYPE 227 GUM_MULTI_DIM_PROJECTION(*pres, *pt);
229 # ifdef GUM_MULTI_DIM_PROJECTION_POINTER 230 **pres = GUM_MULTI_DIM_PROJECTION(*pres, *pt);
232 *pres = GUM_MULTI_DIM_PROJECTION(*pres, *pt);
247 Idx result_offset = 0;
249 for (
Idx i = 0; i < table_domain_size; ++i) {
250 # ifdef GUM_MULTI_DIM_PROJECTION_EFFECTIVE_TYPE 251 GUM_MULTI_DIM_PROJECTION(pres[result_offset], *pt);
253 # ifdef GUM_MULTI_DIM_PROJECTION_POINTER 254 *(pres[result_offset]) =
255 GUM_MULTI_DIM_PROJECTION(pres[result_offset], *pt);
257 pres[result_offset] = GUM_MULTI_DIM_PROJECTION(pres[result_offset], *pt);
265 for (
unsigned int k = 0; k < current_incr.size(); ++k) {
267 if (current_incr[k]) {
272 current_incr[k] = before_incr[k];
275 --table_and_result_value[k];
277 if (table_and_result_value[k]) {
278 result_offset += table_and_result_offset[k];
282 table_and_result_value[k] = table_and_result_domain[k];
283 result_offset -= table_and_result_down[k];
300 std::vector< Idx > table_alone_offset;
301 std::vector< Idx > table_alone_domain;
303 Idx table_alone_domain_size = 1;
304 HashTable< const DiscreteVariable*, Idx > var1offset(table_vars.size());
306 for (
const auto var : table_vars) {
307 if (del_vars.exists(var)) {
308 table_alone_domain.push_back(var->domainSize());
309 table_alone_offset.push_back(offset);
310 table_alone_domain_size *= var->domainSize();
313 var1offset.insert(var, offset);
314 offset *= var->domainSize();
317 std::vector< Idx > table_alone_value = table_alone_domain;
318 std::vector< Idx > table_alone_down = table_alone_offset;
320 for (
unsigned int i = 0; i < table_alone_down.size(); ++i)
321 table_alone_down[i] *= (table_alone_domain[i] - 1);
332 Sequence< const DiscreteVariable* > result_varSeq;
333 std::vector< Idx > table_and_result_offset;
334 std::vector< Idx > table_and_result_domain;
335 Idx result_domain_size = 1;
336 bool has_before_incr =
false;
337 bool found_proj_var =
false;
339 for (
const auto var : table_vars) {
340 if (!del_vars.exists(var)) {
341 table_and_result_domain.push_back(var->domainSize());
342 table_and_result_offset.push_back(var1offset[var]);
343 found_proj_var =
true;
344 result_domain_size *= var->domainSize();
345 result_varSeq << var;
347 if (found_proj_var) has_before_incr =
true;
351 std::vector< Idx > table_and_result_value = table_and_result_domain;
352 std::vector< Idx > table_and_result_down = table_and_result_offset;
354 for (
unsigned int i = 0; i < table_and_result_down.size(); ++i) {
355 table_and_result_down[i] *= (table_and_result_domain[i] - 1);
362 MultiDimArray< GUM_MULTI_DIM_PROJECTION_TYPE >* result =
363 new MultiDimArray< GUM_MULTI_DIM_PROJECTION_TYPE >;
364 result->beginMultipleChanges();
366 for (
const auto var : result_varSeq)
369 # ifdef GUM_MULTI_DIM_PROJECTION_POINTER 370 result->endMultipleChanges();
373 for (
Idx i = 0; i < result_domain_size; ++i) {
374 result->unsafeSet(i,
new GUM_SCALAR(neutral_element));
378 result->endMultipleChanges(neutral_element);
393 GUM_MULTI_DIM_PROJECTION_TYPE* pt =
394 const_cast< GUM_MULTI_DIM_PROJECTION_TYPE*
>(&(table->unsafeGet(0)));
395 GUM_MULTI_DIM_PROJECTION_TYPE* pres =
396 const_cast< GUM_MULTI_DIM_PROJECTION_TYPE*
>(&(result->unsafeGet(0)));
400 if (!has_before_incr) {
401 for (
Idx i = 0; i < result_domain_size; ++i) {
402 for (
Idx j = 0; j < table_alone_domain_size; ++j) {
403 # ifdef GUM_MULTI_DIM_PROJECTION_EFFECTIVE_TYPE 404 GUM_MULTI_DIM_PROJECTION(*pres, *pt);
406 # ifdef GUM_MULTI_DIM_PROJECTION_POINTER 407 **pres = GUM_MULTI_DIM_PROJECTION(*pres, *pt);
409 *pres = GUM_MULTI_DIM_PROJECTION(*pres, *pt);
423 Idx table_offset = 0;
425 for (
Idx j = 0; j < result_domain_size; ++j) {
426 for (
Idx i = 0; i < table_alone_domain_size; ++i) {
427 # ifdef GUM_MULTI_DIM_PROJECTION_EFFECTIVE_TYPE 428 GUM_MULTI_DIM_PROJECTION(*pres, pt[table_offset]);
430 # ifdef GUM_MULTI_DIM_PROJECTION_POINTER 431 **pres = GUM_MULTI_DIM_PROJECTION(*pres, pt[table_offset]);
433 *pres = GUM_MULTI_DIM_PROJECTION(*pres, pt[table_offset]);
438 for (
unsigned int k = 0; k < table_alone_value.size(); ++k) {
439 --table_alone_value[k];
441 if (table_alone_value[k]) {
442 table_offset += table_alone_offset[k];
446 table_alone_value[k] = table_alone_domain[k];
447 table_offset -= table_alone_down[k];
452 for (
unsigned int k = 0; k < table_and_result_value.size(); ++k) {
453 --table_and_result_value[k];
455 if (table_and_result_value[k]) {
456 table_offset += table_and_result_offset[k];
460 table_and_result_value[k] = table_and_result_domain[k];
461 table_offset -= table_and_result_down[k];
474 # undef GUM_MULTI_DIM_PROJECTION_TYPE 476 # ifdef GUM_MULTI_DIM_PROJECTION_POINTER 477 # undef GUM_MULTI_DIM_PROJECTION_POINTER Copyright 2005-2019 Pierre-Henri WUILLEMIN et Christophe GONZALES (LIP6) {prenom.nom}_at_lip6.fr.