31 #include <agrum/tools/core/sequence.h> 34 #ifndef GUM_PARTIAL_INSTANTIATION_PATTERN_ALLOWED 45 # ifdef GUM_MULTI_DIM_PARTIAL_INSTANTIATION_NAME 46 # define GUM_MULTI_DIM_PARTIAL_INSTANTIATION_TYPE GUM_SCALAR 47 template <
typename GUM_SCALAR >
48 MultiDimArray< GUM_SCALAR >* GUM_MULTI_DIM_PARTIAL_INSTANTIATION_NAME(
49 const MultiDimArray< GUM_SCALAR >* table,
50 const HashTable<
const DiscreteVariable*, Idx >& inst_vars)
55 #ifdef GUM_MULTI_DIM_PARTIAL_INSTANTIATION_POINTER_NAME 56 #define GUM_MULTI_DIM_PARTIAL_INSTANTIATION_TYPE GUM_SCALAR * 57 #define GUM_MULTI_DIM_PARTIAL_INSTANTIATION_POINTER 58 template <
typename GUM_SCALAR>
59 MultiDimArray<GUM_SCALAR*>*
60 GUM_MULTI_DIM_PARTIAL_INSTANTIATION_POINTER_NAME(
61 const MultiDimArray<GUM_SCALAR*>* table,
62 const HashTable<
const DiscreteVariable*, Idx>& inst_vars )
65 #ifdef GUM_MULTI_DIM_PARTIAL_INSTANTIATION_IMPL2ARRAY_NAME 66 #define GUM_MULTI_DIM_PARTIAL_INSTANTIATION_TYPE GUM_SCALAR 67 template <
typename GUM_SCALAR>
68 MultiDimImplementation<GUM_SCALAR>*
69 GUM_MULTI_DIM_PARTIAL_INSTANTIATION_IMPL2ARRAY_NAME(
70 const MultiDimImplementation<GUM_SCALAR>* ttable,
71 const HashTable<
const DiscreteVariable*, Idx>& inst_vars )
74 #ifdef GUM_MULTI_DIM_PARTIAL_INSTANTIATION_POINTER_IMPL2ARRAY_NAME 75 #define GUM_MULTI_DIM_PARTIAL_INSTANTIATION_TYPE GUM_SCALAR * 76 #define GUM_MULTI_DIM_PARTIAL_INSTANTIATION_POINTER 77 template <
typename GUM_SCALAR>
78 MultiDimImplementation<GUM_SCALAR*>*
79 GUM_MULTI_DIM_PARTIAL_INSTANTIATION_POINTER_IMPL2ARRAY_NAME(
80 const MultiDimImplementation<GUM_SCALAR*>* ttable,
81 const HashTable<
const DiscreteVariable*, Idx>& inst_vars )
87 # ifdef GUM_MULTI_DIM_PARTIAL_INSTANTIATION_IMPL2ARRAY_NAME 88 const MultiDimArray< GUM_SCALAR >* table
89 =
reinterpret_cast<
const MultiDimArray< GUM_SCALAR >* >(ttable);
92 # ifdef GUM_MULTI_DIM_PARTIAL_INSTANTIATION_POINTER_IMPL2ARRAY_NAME 93 const MultiDimArray< GUM_SCALAR* >* table
94 =
reinterpret_cast<
const MultiDimArray< GUM_SCALAR* >* >(ttable);
97 const Sequence<
const DiscreteVariable* >& table_vars = table->variablesSequence();
101 Idx table_alone_offset = 0;
103 HashTable<
const DiscreteVariable*, Idx > var1offset(table_vars.size());
105 for (
const auto var: table_vars) {
106 if (inst_vars.exists(var)) table_alone_offset += inst_vars[var] * offset;
108 var1offset.insert(var, offset);
109 offset *= var->domainSize();
119 Sequence<
const DiscreteVariable* > result_varSeq;
120 std::vector< Idx > table_and_result_offset;
121 std::vector< Idx > table_and_result_domain;
122 Idx result_domain_size = 1;
123 bool has_before_incr =
true;
124 bool found_inst_var =
false;
126 for (
const auto var: table_vars) {
127 if (!inst_vars.exists(var)) {
128 table_and_result_domain.push_back(var->domainSize());
129 table_and_result_offset.push_back(var1offset[var]);
130 result_domain_size *= var->domainSize();
131 result_varSeq << var;
133 if (found_inst_var) has_before_incr =
false;
135 found_inst_var =
true;
148 std::vector< Idx > table_and_result_value = table_and_result_domain;
149 std::vector< Idx > table_and_result_down = table_and_result_offset;
151 for (
unsigned int i = 0; i < table_and_result_down.size(); ++i) {
152 table_and_result_down[i] *= (table_and_result_domain[i] - 1);
159 MultiDimArray< GUM_MULTI_DIM_PARTIAL_INSTANTIATION_TYPE >* result
160 =
new MultiDimArray< GUM_MULTI_DIM_PARTIAL_INSTANTIATION_TYPE >;
161 result->beginMultipleChanges();
163 for (
const auto var: result_varSeq)
166 result->endMultipleChanges();
168 # ifdef GUM_MULTI_DIM_PARTIAL_INSTANTIATION_POINTER 171 const GUM_SCALAR& any_element = *(table->unsafeGet(0));
173 for (Idx i = 0; i < result_domain_size; ++i) {
174 result->unsafeSet(i,
new GUM_SCALAR(any_element));
182 GUM_MULTI_DIM_PARTIAL_INSTANTIATION_TYPE* ptable
183 =
const_cast< GUM_MULTI_DIM_PARTIAL_INSTANTIATION_TYPE* >(
184 &(table->unsafeGet(table_alone_offset)));
185 GUM_MULTI_DIM_PARTIAL_INSTANTIATION_TYPE* presult
186 =
const_cast< GUM_MULTI_DIM_PARTIAL_INSTANTIATION_TYPE* >(&(result->unsafeGet(0)));
191 if (has_before_incr) {
192 for (Idx i = 0; i < result_domain_size; ++i) {
193 # ifdef GUM_MULTI_DIM_PARTIAL_INSTANTIATION_POINTER 194 **presult = **ptable;
207 Idx table_offset = 0;
209 for (Idx j = 0; j < result_domain_size; ++j) {
210 # ifdef GUM_MULTI_DIM_PARTIAL_INSTANTIATION_POINTER 211 **presult = *(ptable[table_offset]);
213 *presult = ptable[table_offset];
217 for (
unsigned int k = 0; k < table_and_result_value.size(); ++k) {
218 --table_and_result_value[k];
220 if (table_and_result_value[k]) {
221 table_offset += table_and_result_offset[k];
225 table_and_result_value[k] = table_and_result_domain[k];
226 table_offset -= table_and_result_down[k];
237 # undef GUM_MULTI_DIM_PARTIAL_INSTANTIATION_TYPE 239 # ifdef GUM_MULTI_DIM_PARTIAL_INSTANTIATION_POINTER 240 # undef GUM_MULTI_DIM_PARTIAL_INSTANTIATION_POINTER