31 #ifndef GUM_PARTIAL_INSTANTIATION_PATTERN_ALLOWED 42 # ifdef GUM_MULTI_DIM_PARTIAL_INSTANTIATION_NAME 43 # define GUM_MULTI_DIM_PARTIAL_INSTANTIATION_TYPE GUM_SCALAR 44 template <
typename GUM_SCALAR >
46 const MultiDimImplementation< GUM_SCALAR >* table,
47 const HashTable< const DiscreteVariable*, Idx >& inst_vars)
52 #ifdef GUM_MULTI_DIM_PARTIAL_INSTANTIATION_POINTER_NAME 53 #define GUM_MULTI_DIM_PARTIAL_INSTANTIATION_TYPE GUM_SCALAR * 54 #define GUM_MULTI_DIM_PARTIAL_INSTANTIATION_POINTER 55 template <
typename GUM_SCALAR>
56 MultiDimImplementation<GUM_SCALAR*>*
58 const MultiDimImplementation<GUM_SCALAR*>* table,
59 const HashTable<const DiscreteVariable*, Idx>& inst_vars )
67 const Sequence< const DiscreteVariable* >& table_vars =
68 table->variablesSequence();
72 Idx table_alone_offset = 0;
74 HashTable< const DiscreteVariable*, Idx > var1offset(table_vars.size());
76 for (
const auto var : table_vars) {
77 if (inst_vars.exists(var)) { table_alone_offset += inst_vars[var] * offset; }
79 var1offset.insert(var, offset);
80 offset *= var->domainSize();
90 Sequence< const DiscreteVariable* > result_varSeq;
91 std::vector< Idx > table_and_result_offset;
92 std::vector< Idx > table_and_result_domain;
93 Idx result_domain_size = 1;
94 bool has_before_incr =
true;
95 bool found_inst_var =
false;
97 for (
const auto var : table_vars) {
98 if (!inst_vars.exists(var)) {
99 table_and_result_domain.push_back(var->domainSize());
100 table_and_result_offset.push_back(var1offset[var]);
101 result_domain_size *= var->domainSize();
102 result_varSeq << var;
104 if (found_inst_var) has_before_incr =
false;
106 found_inst_var =
true;
119 std::vector< Idx > table_and_result_value = table_and_result_domain;
120 std::vector< Idx > table_and_result_down = table_and_result_offset;
122 for (
unsigned int i = 0; i < table_and_result_down.size(); ++i)
123 table_and_result_down[i] *= (table_and_result_domain[i] - 1);
130 MultiDimArray< GUM_MULTI_DIM_PARTIAL_INSTANTIATION_TYPE >* result =
131 new MultiDimArray< GUM_MULTI_DIM_PARTIAL_INSTANTIATION_TYPE >;
132 result->beginMultipleChanges();
134 for (
const auto var : result_varSeq)
137 result->endMultipleChanges();
139 # ifdef GUM_MULTI_DIM_PARTIAL_INSTANTIATION_POINTER 142 const Instantiation table_inst(table);
143 const GUM_SCALAR& any_element = *(table->get(table_inst));
145 for (
Idx i = 0; i < result_domain_size; ++i) {
146 result->unsafeSet(i,
new GUM_SCALAR(any_element));
154 GUM_MULTI_DIM_PARTIAL_INSTANTIATION_TYPE* presult =
155 const_cast< GUM_MULTI_DIM_PARTIAL_INSTANTIATION_TYPE*
>(
156 &(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 #define GUM_MULTI_DIM_PARTIAL_INSTANTIATION_NAME
a specialized partial instantiation function for multiDimArrays
#define GUM_MULTI_DIM_PARTIAL_INSTANTIATION_POINTER_NAME
gum is the global namespace for all aGrUM entities
Header files of gum::Instantiation.