32 #ifndef GUM_PARTIAL_INSTANTIATION_PATTERN_ALLOWED 43 # ifdef GUM_MULTI_DIM_PARTIAL_INSTANTIATION_NAME 44 # define GUM_MULTI_DIM_PARTIAL_INSTANTIATION_TYPE GUM_SCALAR 45 template <
typename GUM_SCALAR >
47 const MultiDimArray< GUM_SCALAR >* table,
48 const HashTable< const DiscreteVariable*, Idx >& inst_vars)
53 #ifdef GUM_MULTI_DIM_PARTIAL_INSTANTIATION_POINTER_NAME 54 #define GUM_MULTI_DIM_PARTIAL_INSTANTIATION_TYPE GUM_SCALAR * 55 #define GUM_MULTI_DIM_PARTIAL_INSTANTIATION_POINTER 56 template <
typename GUM_SCALAR>
57 MultiDimArray<GUM_SCALAR*>*
59 const MultiDimArray<GUM_SCALAR*>* table,
60 const HashTable<const DiscreteVariable*, Idx>& inst_vars )
63 #ifdef GUM_MULTI_DIM_PARTIAL_INSTANTIATION_IMPL2ARRAY_NAME 64 #define GUM_MULTI_DIM_PARTIAL_INSTANTIATION_TYPE GUM_SCALAR 65 template <
typename GUM_SCALAR>
66 MultiDimImplementation<GUM_SCALAR>*
68 const MultiDimImplementation<GUM_SCALAR>* ttable,
69 const HashTable<const DiscreteVariable*, Idx>& inst_vars )
72 #ifdef GUM_MULTI_DIM_PARTIAL_INSTANTIATION_POINTER_IMPL2ARRAY_NAME 73 #define GUM_MULTI_DIM_PARTIAL_INSTANTIATION_TYPE GUM_SCALAR * 74 #define GUM_MULTI_DIM_PARTIAL_INSTANTIATION_POINTER 75 template <
typename GUM_SCALAR>
76 MultiDimImplementation<GUM_SCALAR*>*
78 const MultiDimImplementation<GUM_SCALAR*>* ttable,
79 const HashTable<const DiscreteVariable*, Idx>& inst_vars )
85 # ifdef GUM_MULTI_DIM_PARTIAL_INSTANTIATION_IMPL2ARRAY_NAME 86 const MultiDimArray< GUM_SCALAR >* table =
87 reinterpret_cast< const MultiDimArray< GUM_SCALAR >*
>(ttable);
90 # ifdef GUM_MULTI_DIM_PARTIAL_INSTANTIATION_POINTER_IMPL2ARRAY_NAME 91 const MultiDimArray< GUM_SCALAR* >* table =
92 reinterpret_cast< const MultiDimArray< GUM_SCALAR* >*
>(ttable);
95 const Sequence< const DiscreteVariable* >& table_vars =
96 table->variablesSequence();
100 Idx table_alone_offset = 0;
102 HashTable< const DiscreteVariable*, Idx > var1offset(table_vars.size());
104 for (
const auto var : table_vars) {
105 if (inst_vars.exists(var)) table_alone_offset += inst_vars[var] * offset;
107 var1offset.insert(var, offset);
108 offset *= var->domainSize();
118 Sequence< const DiscreteVariable* > result_varSeq;
119 std::vector< Idx > table_and_result_offset;
120 std::vector< Idx > table_and_result_domain;
121 Idx result_domain_size = 1;
122 bool has_before_incr =
true;
123 bool found_inst_var =
false;
125 for (
const auto var : table_vars) {
126 if (!inst_vars.exists(var)) {
127 table_and_result_domain.push_back(var->domainSize());
128 table_and_result_offset.push_back(var1offset[var]);
129 result_domain_size *= var->domainSize();
130 result_varSeq << var;
132 if (found_inst_var) has_before_incr =
false;
134 found_inst_var =
true;
147 std::vector< Idx > table_and_result_value = table_and_result_domain;
148 std::vector< Idx > table_and_result_down = table_and_result_offset;
150 for (
unsigned int i = 0; i < table_and_result_down.size(); ++i) {
151 table_and_result_down[i] *= (table_and_result_domain[i] - 1);
158 MultiDimArray< GUM_MULTI_DIM_PARTIAL_INSTANTIATION_TYPE >* result =
159 new MultiDimArray< GUM_MULTI_DIM_PARTIAL_INSTANTIATION_TYPE >;
160 result->beginMultipleChanges();
162 for (
const auto var : result_varSeq)
165 result->endMultipleChanges();
167 # ifdef GUM_MULTI_DIM_PARTIAL_INSTANTIATION_POINTER 170 const GUM_SCALAR& any_element = *(table->unsafeGet(0));
172 for (
Idx i = 0; i < result_domain_size; ++i) {
173 result->unsafeSet(i,
new GUM_SCALAR(any_element));
181 GUM_MULTI_DIM_PARTIAL_INSTANTIATION_TYPE* ptable =
182 const_cast< GUM_MULTI_DIM_PARTIAL_INSTANTIATION_TYPE*
>(
183 &(table->unsafeGet(table_alone_offset)));
184 GUM_MULTI_DIM_PARTIAL_INSTANTIATION_TYPE* presult =
185 const_cast< GUM_MULTI_DIM_PARTIAL_INSTANTIATION_TYPE*
>(
186 &(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 Header file of gum::Sequence, a class for storing (ordered) sequences of objects. ...
#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
#define GUM_MULTI_DIM_PARTIAL_INSTANTIATION_POINTER_IMPL2ARRAY_NAME
#define GUM_MULTI_DIM_PARTIAL_INSTANTIATION_IMPL2ARRAY_NAME