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 >
49 const MultiDimImplementation< 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 MultiDimImplementation<GUM_SCALAR*>*
61 const MultiDimImplementation<GUM_SCALAR*>* table,
62 const HashTable<const DiscreteVariable*, Idx>& inst_vars )
70 const Sequence< const DiscreteVariable* >& table_vars =
71 table->variablesSequence();
75 Idx table_alone_offset = 0;
77 HashTable< const DiscreteVariable*, Idx > var1offset(table_vars.size());
79 for (
const auto var : table_vars) {
80 if (inst_vars.exists(var)) { table_alone_offset += inst_vars[var] * offset; }
82 var1offset.insert(var, offset);
83 offset *= var->domainSize();
93 Sequence< const DiscreteVariable* > result_varSeq;
94 std::vector< Idx > table_and_result_offset;
95 std::vector< Idx > table_and_result_domain;
96 Idx result_domain_size = 1;
97 bool has_before_incr =
true;
98 bool found_inst_var =
false;
100 for (
const auto var : table_vars) {
101 if (!inst_vars.exists(var)) {
102 table_and_result_domain.push_back(var->domainSize());
103 table_and_result_offset.push_back(var1offset[var]);
104 result_domain_size *= var->domainSize();
105 result_varSeq << var;
107 if (found_inst_var) has_before_incr =
false;
109 found_inst_var =
true;
122 std::vector< Idx > table_and_result_value = table_and_result_domain;
123 std::vector< Idx > table_and_result_down = table_and_result_offset;
125 for (
unsigned int i = 0; i < table_and_result_down.size(); ++i)
126 table_and_result_down[i] *= (table_and_result_domain[i] - 1);
133 MultiDimArray< GUM_MULTI_DIM_PARTIAL_INSTANTIATION_TYPE >* result =
134 new MultiDimArray< GUM_MULTI_DIM_PARTIAL_INSTANTIATION_TYPE >;
135 result->beginMultipleChanges();
137 for (
const auto var : result_varSeq)
140 result->endMultipleChanges();
142 # ifdef GUM_MULTI_DIM_PARTIAL_INSTANTIATION_POINTER 145 const Instantiation table_inst(table);
146 const GUM_SCALAR& any_element = *(table->get(table_inst));
148 for (
Idx i = 0; i < result_domain_size; ++i) {
149 result->unsafeSet(i,
new GUM_SCALAR(any_element));
157 GUM_MULTI_DIM_PARTIAL_INSTANTIATION_TYPE* presult =
158 const_cast< GUM_MULTI_DIM_PARTIAL_INSTANTIATION_TYPE*
>(
159 &(result->unsafeGet(0)));
160 Instantiation table_inst(table);
161 table_inst += table_alone_offset;
166 if (has_before_incr) {
167 for (
Idx i = 0; i < result_domain_size; ++i) {
168 # ifdef GUM_MULTI_DIM_PARTIAL_INSTANTIATION_POINTER 169 **presult = *(table->get(table_inst));
171 *presult = table->get(table_inst);
182 for (
Idx j = 0; j < result_domain_size; ++j) {
183 # ifdef GUM_MULTI_DIM_PARTIAL_INSTANTIATION_POINTER 184 **presult = *(table->get(table_inst));
186 *presult = table->get(table_inst);
190 for (
unsigned int k = 0; k < table_and_result_value.size(); ++k) {
191 --table_and_result_value[k];
193 if (table_and_result_value[k]) {
194 table_inst += table_and_result_offset[k];
198 table_and_result_value[k] = table_and_result_domain[k];
199 table_inst -= table_and_result_down[k];
210 # undef GUM_MULTI_DIM_PARTIAL_INSTANTIATION_TYPE 212 # ifdef GUM_MULTI_DIM_PARTIAL_INSTANTIATION_POINTER 213 # undef GUM_MULTI_DIM_PARTIAL_INSTANTIATION_POINTER #define GUM_MULTI_DIM_PARTIAL_INSTANTIATION_NAME
a specialized partial instantiation function for multiDimArrays
#define GUM_MULTI_DIM_PARTIAL_INSTANTIATION_POINTER_NAME
Copyright 2005-2019 Pierre-Henri WUILLEMIN et Christophe GONZALES (LIP6) {prenom.nom}_at_lip6.fr.
Copyright 2005-2019 Pierre-Henri WUILLEMIN et Christophe GONZALES (LIP6) {prenom.nom}_at_lip6.fr.