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 = table->variablesSequence();
73 Idx table_alone_offset = 0;
75 HashTable<
const DiscreteVariable*, Idx > var1offset(table_vars.size());
77 for (
const auto var: table_vars) {
78 if (inst_vars.exists(var)) { table_alone_offset += inst_vars[var] * offset; }
80 var1offset.insert(var, offset);
81 offset *= var->domainSize();
91 Sequence<
const DiscreteVariable* > result_varSeq;
92 std::vector< Idx > table_and_result_offset;
93 std::vector< Idx > table_and_result_domain;
94 Idx result_domain_size = 1;
95 bool has_before_incr =
true;
96 bool found_inst_var =
false;
98 for (
const auto var: table_vars) {
99 if (!inst_vars.exists(var)) {
100 table_and_result_domain.push_back(var->domainSize());
101 table_and_result_offset.push_back(var1offset[var]);
102 result_domain_size *= var->domainSize();
103 result_varSeq << var;
105 if (found_inst_var) has_before_incr =
false;
107 found_inst_var =
true;
120 std::vector< Idx > table_and_result_value = table_and_result_domain;
121 std::vector< Idx > table_and_result_down = table_and_result_offset;
123 for (
unsigned int i = 0; i < table_and_result_down.size(); ++i)
124 table_and_result_down[i] *= (table_and_result_domain[i] - 1);
131 MultiDimArray< GUM_MULTI_DIM_PARTIAL_INSTANTIATION_TYPE >* result
132 =
new MultiDimArray< GUM_MULTI_DIM_PARTIAL_INSTANTIATION_TYPE >;
133 result->beginMultipleChanges();
135 for (
const auto var: result_varSeq)
138 result->endMultipleChanges();
140 # ifdef GUM_MULTI_DIM_PARTIAL_INSTANTIATION_POINTER 143 const Instantiation table_inst(table);
144 const GUM_SCALAR& any_element = *(table->get(table_inst));
146 for (Idx i = 0; i < result_domain_size; ++i) {
147 result->unsafeSet(i,
new GUM_SCALAR(any_element));
155 GUM_MULTI_DIM_PARTIAL_INSTANTIATION_TYPE* presult
156 =
const_cast< GUM_MULTI_DIM_PARTIAL_INSTANTIATION_TYPE* >(&(result->unsafeGet(0)));
157 Instantiation table_inst(table);
158 table_inst += table_alone_offset;
163 if (has_before_incr) {
164 for (Idx i = 0; i < result_domain_size; ++i) {
165 # ifdef GUM_MULTI_DIM_PARTIAL_INSTANTIATION_POINTER 166 **presult = *(table->get(table_inst));
168 *presult = table->get(table_inst);
179 for (Idx j = 0; j < result_domain_size; ++j) {
180 # ifdef GUM_MULTI_DIM_PARTIAL_INSTANTIATION_POINTER 181 **presult = *(table->get(table_inst));
183 *presult = table->get(table_inst);
187 for (
unsigned int k = 0; k < table_and_result_value.size(); ++k) {
188 --table_and_result_value[k];
190 if (table_and_result_value[k]) {
191 table_inst += table_and_result_offset[k];
195 table_and_result_value[k] = table_and_result_domain[k];
196 table_inst -= table_and_result_down[k];
207 # undef GUM_MULTI_DIM_PARTIAL_INSTANTIATION_TYPE 209 # ifdef GUM_MULTI_DIM_PARTIAL_INSTANTIATION_POINTER 210 # undef GUM_MULTI_DIM_PARTIAL_INSTANTIATION_POINTER