31 #include <agrum/tools/core/sequence.h> 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 >
48 MultiDimArray< GUM_SCALAR >* GUM_MULTI_DIM_PARTIAL_INSTANTIATION_NAME(
49 const MultiDimArray< 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 MultiDimArray<GUM_SCALAR*>*
60 GUM_MULTI_DIM_PARTIAL_INSTANTIATION_POINTER_NAME(
61 const MultiDimArray<GUM_SCALAR*>* table,
62 const HashTable<
const DiscreteVariable*, Idx>& inst_vars )
65 #ifdef GUM_MULTI_DIM_PARTIAL_INSTANTIATION_IMPL2ARRAY_NAME 66 #define GUM_MULTI_DIM_PARTIAL_INSTANTIATION_TYPE GUM_SCALAR 67 template <
typename GUM_SCALAR>
68 MultiDimImplementation<GUM_SCALAR>*
69 GUM_MULTI_DIM_PARTIAL_INSTANTIATION_IMPL2ARRAY_NAME(
70 const MultiDimImplementation<GUM_SCALAR>* ttable,
71 const HashTable<
const DiscreteVariable*, Idx>& inst_vars )
74 #ifdef GUM_MULTI_DIM_PARTIAL_INSTANTIATION_POINTER_IMPL2ARRAY_NAME 75 #define GUM_MULTI_DIM_PARTIAL_INSTANTIATION_TYPE GUM_SCALAR * 76 #define GUM_MULTI_DIM_PARTIAL_INSTANTIATION_POINTER 77 template <
typename GUM_SCALAR>
78 MultiDimImplementation<GUM_SCALAR*>*
79 GUM_MULTI_DIM_PARTIAL_INSTANTIATION_POINTER_IMPL2ARRAY_NAME(
80 const MultiDimImplementation<GUM_SCALAR*>* ttable,
81 const HashTable<
const DiscreteVariable*, Idx>& inst_vars )
87 # ifdef GUM_MULTI_DIM_PARTIAL_INSTANTIATION_IMPL2ARRAY_NAME 88 const MultiDimArray< GUM_SCALAR >* table
89 =
reinterpret_cast<
const MultiDimArray< GUM_SCALAR >* >(ttable);
92 # ifdef GUM_MULTI_DIM_PARTIAL_INSTANTIATION_POINTER_IMPL2ARRAY_NAME 93 const MultiDimArray< GUM_SCALAR* >* table
94 =
reinterpret_cast<
const MultiDimArray< GUM_SCALAR* >* >(ttable);
97 const Sequence<
const DiscreteVariable* >& table_vars
98 = table->variablesSequence();
102 Idx table_alone_offset = 0;
104 HashTable<
const DiscreteVariable*, Idx > var1offset(table_vars.size());
106 for (
const auto var: table_vars) {
107 if (inst_vars.exists(var)) table_alone_offset += inst_vars[var] * offset;
109 var1offset.insert(var, offset);
110 offset *= var->domainSize();
120 Sequence<
const DiscreteVariable* > result_varSeq;
121 std::vector< Idx > table_and_result_offset;
122 std::vector< Idx > table_and_result_domain;
123 Idx result_domain_size = 1;
124 bool has_before_incr =
true;
125 bool found_inst_var =
false;
127 for (
const auto var: table_vars) {
128 if (!inst_vars.exists(var)) {
129 table_and_result_domain.push_back(var->domainSize());
130 table_and_result_offset.push_back(var1offset[var]);
131 result_domain_size *= var->domainSize();
132 result_varSeq << var;
134 if (found_inst_var) has_before_incr =
false;
136 found_inst_var =
true;
149 std::vector< Idx > table_and_result_value = table_and_result_domain;
150 std::vector< Idx > table_and_result_down = table_and_result_offset;
152 for (
unsigned int i = 0; i < table_and_result_down.size(); ++i) {
153 table_and_result_down[i] *= (table_and_result_domain[i] - 1);
160 MultiDimArray< GUM_MULTI_DIM_PARTIAL_INSTANTIATION_TYPE >* result
161 =
new MultiDimArray< GUM_MULTI_DIM_PARTIAL_INSTANTIATION_TYPE >;
162 result->beginMultipleChanges();
164 for (
const auto var: result_varSeq)
167 result->endMultipleChanges();
169 # ifdef GUM_MULTI_DIM_PARTIAL_INSTANTIATION_POINTER 172 const GUM_SCALAR& any_element = *(table->unsafeGet(0));
174 for (Idx i = 0; i < result_domain_size; ++i) {
175 result->unsafeSet(i,
new GUM_SCALAR(any_element));
183 GUM_MULTI_DIM_PARTIAL_INSTANTIATION_TYPE* ptable
184 =
const_cast< GUM_MULTI_DIM_PARTIAL_INSTANTIATION_TYPE* >(
185 &(table->unsafeGet(table_alone_offset)));
186 GUM_MULTI_DIM_PARTIAL_INSTANTIATION_TYPE* presult
187 =
const_cast< GUM_MULTI_DIM_PARTIAL_INSTANTIATION_TYPE* >(
188 &(result->unsafeGet(0)));
193 if (has_before_incr) {
194 for (Idx i = 0; i < result_domain_size; ++i) {
195 # ifdef GUM_MULTI_DIM_PARTIAL_INSTANTIATION_POINTER 196 **presult = **ptable;
209 Idx table_offset = 0;
211 for (Idx j = 0; j < result_domain_size; ++j) {
212 # ifdef GUM_MULTI_DIM_PARTIAL_INSTANTIATION_POINTER 213 **presult = *(ptable[table_offset]);
215 *presult = ptable[table_offset];
219 for (
unsigned int k = 0; k < table_and_result_value.size(); ++k) {
220 --table_and_result_value[k];
222 if (table_and_result_value[k]) {
223 table_offset += table_and_result_offset[k];
227 table_and_result_value[k] = table_and_result_domain[k];
228 table_offset -= table_and_result_down[k];
239 # undef GUM_MULTI_DIM_PARTIAL_INSTANTIATION_TYPE 241 # ifdef GUM_MULTI_DIM_PARTIAL_INSTANTIATION_POINTER 242 # undef GUM_MULTI_DIM_PARTIAL_INSTANTIATION_POINTER