30 #include <agrum/tools/multidim/instantiation.h> 33 #ifndef GUM_PARTIAL_INSTANTIATION_PATTERN_ALLOWED 44 # ifdef GUM_MULTI_DIM_PARTIAL_INSTANTIATION_NAME 45 # define GUM_MULTI_DIM_PARTIAL_INSTANTIATION_TYPE GUM_SCALAR 46 template <
typename GUM_SCALAR >
47 MultiDimImplementation< GUM_SCALAR >* GUM_MULTI_DIM_PARTIAL_INSTANTIATION_NAME(
48 const MultiDimImplementation< GUM_SCALAR >* table,
49 const HashTable<
const DiscreteVariable*, Idx >& inst_vars)
54 #ifdef GUM_MULTI_DIM_PARTIAL_INSTANTIATION_POINTER_NAME 55 #define GUM_MULTI_DIM_PARTIAL_INSTANTIATION_TYPE GUM_SCALAR * 56 #define GUM_MULTI_DIM_PARTIAL_INSTANTIATION_POINTER 57 template <
typename GUM_SCALAR>
58 MultiDimImplementation<GUM_SCALAR*>*
59 GUM_MULTI_DIM_PARTIAL_INSTANTIATION_POINTER_NAME(
60 const MultiDimImplementation<GUM_SCALAR*>* table,
61 const HashTable<
const DiscreteVariable*, Idx>& inst_vars )
69 const Sequence<
const DiscreteVariable* >& table_vars
70 = table->variablesSequence();
74 Idx table_alone_offset = 0;
76 HashTable<
const DiscreteVariable*, Idx > var1offset(table_vars.size());
78 for (
const auto var: table_vars) {
79 if (inst_vars.exists(var)) { table_alone_offset += inst_vars[var] * offset; }
81 var1offset.insert(var, offset);
82 offset *= var->domainSize();
92 Sequence<
const DiscreteVariable* > result_varSeq;
93 std::vector< Idx > table_and_result_offset;
94 std::vector< Idx > table_and_result_domain;
95 Idx result_domain_size = 1;
96 bool has_before_incr =
true;
97 bool found_inst_var =
false;
99 for (
const auto var: table_vars) {
100 if (!inst_vars.exists(var)) {
101 table_and_result_domain.push_back(var->domainSize());
102 table_and_result_offset.push_back(var1offset[var]);
103 result_domain_size *= var->domainSize();
104 result_varSeq << var;
106 if (found_inst_var) has_before_incr =
false;
108 found_inst_var =
true;
121 std::vector< Idx > table_and_result_value = table_and_result_domain;
122 std::vector< Idx > table_and_result_down = table_and_result_offset;
124 for (
unsigned int i = 0; i < table_and_result_down.size(); ++i)
125 table_and_result_down[i] *= (table_and_result_domain[i] - 1);
132 MultiDimArray< GUM_MULTI_DIM_PARTIAL_INSTANTIATION_TYPE >* result
133 =
new MultiDimArray< GUM_MULTI_DIM_PARTIAL_INSTANTIATION_TYPE >;
134 result->beginMultipleChanges();
136 for (
const auto var: result_varSeq)
139 result->endMultipleChanges();
141 # ifdef GUM_MULTI_DIM_PARTIAL_INSTANTIATION_POINTER 144 const Instantiation table_inst(table);
145 const GUM_SCALAR& any_element = *(table->get(table_inst));
147 for (Idx i = 0; i < result_domain_size; ++i) {
148 result->unsafeSet(i,
new GUM_SCALAR(any_element));
156 GUM_MULTI_DIM_PARTIAL_INSTANTIATION_TYPE* presult
157 =
const_cast< GUM_MULTI_DIM_PARTIAL_INSTANTIATION_TYPE* >(
158 &(result->unsafeGet(0)));
159 Instantiation table_inst(table);
160 table_inst += table_alone_offset;
165 if (has_before_incr) {
166 for (Idx i = 0; i < result_domain_size; ++i) {
167 # ifdef GUM_MULTI_DIM_PARTIAL_INSTANTIATION_POINTER 168 **presult = *(table->get(table_inst));
170 *presult = table->get(table_inst);
181 for (Idx j = 0; j < result_domain_size; ++j) {
182 # ifdef GUM_MULTI_DIM_PARTIAL_INSTANTIATION_POINTER 183 **presult = *(table->get(table_inst));
185 *presult = table->get(table_inst);
189 for (
unsigned int k = 0; k < table_and_result_value.size(); ++k) {
190 --table_and_result_value[k];
192 if (table_and_result_value[k]) {
193 table_inst += table_and_result_offset[k];
197 table_and_result_value[k] = table_and_result_domain[k];
198 table_inst -= table_and_result_down[k];
209 # undef GUM_MULTI_DIM_PARTIAL_INSTANTIATION_TYPE 211 # ifdef GUM_MULTI_DIM_PARTIAL_INSTANTIATION_POINTER 212 # undef GUM_MULTI_DIM_PARTIAL_INSTANTIATION_POINTER