35 #ifndef GUM_PARTIAL_INSTANTIATION_PATTERN_ALLOWED 46 # ifdef GUM_MULTI_DIM_PARTIAL_INSTANTIATION_NAME 47 # define GUM_MULTI_DIM_PARTIAL_INSTANTIATION_TYPE GUM_SCALAR 48 template <
typename GUM_SCALAR >
50 const MultiDimArray< GUM_SCALAR >* table,
51 const HashTable< const DiscreteVariable*, Idx >& inst_vars)
56 #ifdef GUM_MULTI_DIM_PARTIAL_INSTANTIATION_POINTER_NAME 57 #define GUM_MULTI_DIM_PARTIAL_INSTANTIATION_TYPE GUM_SCALAR * 58 #define GUM_MULTI_DIM_PARTIAL_INSTANTIATION_POINTER 59 template <
typename GUM_SCALAR>
60 MultiDimArray<GUM_SCALAR*>*
62 const MultiDimArray<GUM_SCALAR*>* table,
63 const HashTable<const DiscreteVariable*, Idx>& inst_vars )
66 #ifdef GUM_MULTI_DIM_PARTIAL_INSTANTIATION_IMPL2ARRAY_NAME 67 #define GUM_MULTI_DIM_PARTIAL_INSTANTIATION_TYPE GUM_SCALAR 68 template <
typename GUM_SCALAR>
69 MultiDimImplementation<GUM_SCALAR>*
71 const MultiDimImplementation<GUM_SCALAR>* ttable,
72 const HashTable<const DiscreteVariable*, Idx>& inst_vars )
75 #ifdef GUM_MULTI_DIM_PARTIAL_INSTANTIATION_POINTER_IMPL2ARRAY_NAME 76 #define GUM_MULTI_DIM_PARTIAL_INSTANTIATION_TYPE GUM_SCALAR * 77 #define GUM_MULTI_DIM_PARTIAL_INSTANTIATION_POINTER 78 template <
typename GUM_SCALAR>
79 MultiDimImplementation<GUM_SCALAR*>*
81 const MultiDimImplementation<GUM_SCALAR*>* ttable,
82 const HashTable<const DiscreteVariable*, Idx>& inst_vars )
88 # ifdef GUM_MULTI_DIM_PARTIAL_INSTANTIATION_IMPL2ARRAY_NAME 89 const MultiDimArray< GUM_SCALAR >* table =
90 reinterpret_cast< const MultiDimArray< GUM_SCALAR >*
>(ttable);
93 # ifdef GUM_MULTI_DIM_PARTIAL_INSTANTIATION_POINTER_IMPL2ARRAY_NAME 94 const MultiDimArray< GUM_SCALAR* >* table =
95 reinterpret_cast< const MultiDimArray< GUM_SCALAR* >*
>(ttable);
98 const Sequence< const DiscreteVariable* >& table_vars =
99 table->variablesSequence();
103 Idx table_alone_offset = 0;
105 HashTable< const DiscreteVariable*, Idx > var1offset(table_vars.size());
107 for (
const auto var : table_vars) {
108 if (inst_vars.exists(var)) table_alone_offset += inst_vars[var] * offset;
110 var1offset.insert(var, offset);
111 offset *= var->domainSize();
121 Sequence< const DiscreteVariable* > result_varSeq;
122 std::vector< Idx > table_and_result_offset;
123 std::vector< Idx > table_and_result_domain;
124 Idx result_domain_size = 1;
125 bool has_before_incr =
true;
126 bool found_inst_var =
false;
128 for (
const auto var : table_vars) {
129 if (!inst_vars.exists(var)) {
130 table_and_result_domain.push_back(var->domainSize());
131 table_and_result_offset.push_back(var1offset[var]);
132 result_domain_size *= var->domainSize();
133 result_varSeq << var;
135 if (found_inst_var) has_before_incr =
false;
137 found_inst_var =
true;
150 std::vector< Idx > table_and_result_value = table_and_result_domain;
151 std::vector< Idx > table_and_result_down = table_and_result_offset;
153 for (
unsigned int i = 0; i < table_and_result_down.size(); ++i) {
154 table_and_result_down[i] *= (table_and_result_domain[i] - 1);
161 MultiDimArray< GUM_MULTI_DIM_PARTIAL_INSTANTIATION_TYPE >* result =
162 new MultiDimArray< GUM_MULTI_DIM_PARTIAL_INSTANTIATION_TYPE >;
163 result->beginMultipleChanges();
165 for (
const auto var : result_varSeq)
168 result->endMultipleChanges();
170 # ifdef GUM_MULTI_DIM_PARTIAL_INSTANTIATION_POINTER 173 const GUM_SCALAR& any_element = *(table->unsafeGet(0));
175 for (
Idx i = 0; i < result_domain_size; ++i) {
176 result->unsafeSet(i,
new GUM_SCALAR(any_element));
184 GUM_MULTI_DIM_PARTIAL_INSTANTIATION_TYPE* ptable =
185 const_cast< GUM_MULTI_DIM_PARTIAL_INSTANTIATION_TYPE*
>(
186 &(table->unsafeGet(table_alone_offset)));
187 GUM_MULTI_DIM_PARTIAL_INSTANTIATION_TYPE* presult =
188 const_cast< GUM_MULTI_DIM_PARTIAL_INSTANTIATION_TYPE*
>(
189 &(result->unsafeGet(0)));
194 if (has_before_incr) {
195 for (
Idx i = 0; i < result_domain_size; ++i) {
196 # ifdef GUM_MULTI_DIM_PARTIAL_INSTANTIATION_POINTER 197 **presult = **ptable;
210 Idx table_offset = 0;
212 for (
Idx j = 0; j < result_domain_size; ++j) {
213 # ifdef GUM_MULTI_DIM_PARTIAL_INSTANTIATION_POINTER 214 **presult = *(ptable[table_offset]);
216 *presult = ptable[table_offset];
220 for (
unsigned int k = 0; k < table_and_result_value.size(); ++k) {
221 --table_and_result_value[k];
223 if (table_and_result_value[k]) {
224 table_offset += table_and_result_offset[k];
228 table_and_result_value[k] = table_and_result_domain[k];
229 table_offset -= table_and_result_down[k];
240 # undef GUM_MULTI_DIM_PARTIAL_INSTANTIATION_TYPE 242 # ifdef GUM_MULTI_DIM_PARTIAL_INSTANTIATION_POINTER 243 # undef GUM_MULTI_DIM_PARTIAL_INSTANTIATION_POINTER Copyright 2005-2019 Pierre-Henri WUILLEMIN et Christophe GONZALES (LIP6) {prenom.nom}_at_lip6.fr.
#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.
#define GUM_MULTI_DIM_PARTIAL_INSTANTIATION_POINTER_IMPL2ARRAY_NAME
#define GUM_MULTI_DIM_PARTIAL_INSTANTIATION_IMPL2ARRAY_NAME