53#ifndef GUM_PARTIAL_INSTANTIATION_PATTERN_ALLOWED
64# ifdef GUM_MULTI_DIM_PARTIAL_INSTANTIATION_NAME
65# define GUM_MULTI_DIM_PARTIAL_INSTANTIATION_TYPE GUM_SCALAR
67 template <
typename GUM_SCALAR >
75#ifdef GUM_MULTI_DIM_PARTIAL_INSTANTIATION_POINTER_NAME
76#define GUM_MULTI_DIM_PARTIAL_INSTANTIATION_TYPE GUM_SCALAR *
77#define GUM_MULTI_DIM_PARTIAL_INSTANTIATION_POINTER
78 template <
typename GUM_SCALAR>
94 Idx table_alone_offset = 0;
98 for (
const auto var: table_vars) {
99 if (inst_vars.exists(var)) { table_alone_offset += inst_vars[var] * offset; }
101 var1offset.insert(var, offset);
102 offset *= var->domainSize();
113 std::vector< Idx > table_and_result_offset;
114 std::vector< Idx > table_and_result_domain;
115 Idx result_domain_size = 1;
116 bool has_before_incr =
true;
117 bool found_inst_var =
false;
119 for (
const auto var: table_vars) {
120 if (!inst_vars.exists(var)) {
121 table_and_result_domain.push_back(var->domainSize());
122 table_and_result_offset.push_back(var1offset[var]);
123 result_domain_size *= var->domainSize();
124 result_varSeq << var;
126 if (found_inst_var) has_before_incr =
false;
128 found_inst_var =
true;
141 std::vector< Idx > table_and_result_value = table_and_result_domain;
142 std::vector< Idx > table_and_result_down = table_and_result_offset;
144 for (
unsigned int i = 0; i < table_and_result_down.size(); ++i)
145 table_and_result_down[i] *= (table_and_result_domain[i] - 1);
156 for (
const auto var: result_varSeq)
159 result->endMultipleChanges();
161# ifdef GUM_MULTI_DIM_PARTIAL_INSTANTIATION_POINTER
167 for (
const auto var: table->variablesSequence())
168 table_inst.
add(*var);
169 const GUM_SCALAR& any_element = *(table->get(table_inst));
171 for (
Idx i = 0; i < result_domain_size; ++i) {
172 result->unsafeSet(i,
new GUM_SCALAR(any_element));
180 GUM_MULTI_DIM_PARTIAL_INSTANTIATION_TYPE* presult
181 =
const_cast< GUM_MULTI_DIM_PARTIAL_INSTANTIATION_TYPE*
>(&(result->unsafeGet(0)));
185 for (
const auto var: table->variablesSequence())
186 table_inst.
add(*var);
187 table_inst += table_alone_offset;
192 if (has_before_incr) {
193 for (
Idx i = 0; i < result_domain_size; ++i) {
194# ifdef GUM_MULTI_DIM_PARTIAL_INSTANTIATION_POINTER
195 **presult = *(table->get(table_inst));
197 *presult = table->get(table_inst);
208 for (
Idx j = 0; j < result_domain_size; ++j) {
209# ifdef GUM_MULTI_DIM_PARTIAL_INSTANTIATION_POINTER
210 **presult = *(table->get(table_inst));
212 *presult = table->get(table_inst);
216 for (
unsigned int k = 0; k < table_and_result_value.size(); ++k) {
217 --table_and_result_value[k];
219 if (table_and_result_value[k]) {
220 table_inst += table_and_result_offset[k];
224 table_and_result_value[k] = table_and_result_domain[k];
225 table_inst -= table_and_result_down[k];
236# undef GUM_MULTI_DIM_PARTIAL_INSTANTIATION_TYPE
238# ifdef GUM_MULTI_DIM_PARTIAL_INSTANTIATION_POINTER
239# undef GUM_MULTI_DIM_PARTIAL_INSTANTIATION_POINTER
The class for generic Hash Tables.
Class for assigning/browsing values to tuples of discrete variables.
void add(const DiscreteVariable &v) final
Adds a new variable in the Instantiation.
Multidimensional matrix stored as an array in memory.
<agrum/base/multidim/multiDimImplementation.h>
void beginMultipleChanges() override
Call this method before doing important changes in this MultiDimContainer.
The generic class for storing (ordered) sequences of objects.
Size Idx
Type for indexes.
Header files of gum::Instantiation.
gum is the global namespace for all aGrUM entities
#define GUM_MULTI_DIM_PARTIAL_INSTANTIATION_POINTER_NAME
#define GUM_MULTI_DIM_PARTIAL_INSTANTIATION_NAME
a specialized partial instantiation function for multiDimArrays