aGrUM  0.16.0
completeProjectionPattern4MultiDimArray.h
Go to the documentation of this file.
1 
31 // check if we allowed these patterns to be used
32 #ifndef GUM_COMPLETE_PROJECTION_PATTERN_ALLOWED
33 
34 // #warning To use completeProjectionPattern, you must define
35 // GUM_COMPLETE_PROJECTION_PATTERN_ALLOWED
36 
37 #else
38 namespace gum {
39 
40  // a specialized function for projecting a multiDimArray over all its variables
41 
42 # ifdef GUM_MULTI_DIM_COMPLETE_PROJECTION_NAME
43 # define GUM_MULTI_DIM_COMPLETE_PROJECTION_TYPE GUM_SCALAR
44  template < typename GUM_SCALAR >
45  GUM_SCALAR GUM_MULTI_DIM_COMPLETE_PROJECTION_NAME(
46  const MultiDimArray< GUM_SCALAR >* table, Instantiation* instantiation)
47 # endif
48 
49  // clang-format off
50 
51 #ifdef GUM_MULTI_DIM_COMPLETE_PROJECTION_POINTER_NAME
52 #define GUM_MULTI_DIM_COMPLETE_PROJECTION_TYPE GUM_SCALAR *
53 #define GUM_MULTI_DIM_COMPLETE_PROJECTION_POINTER
54  template <typename GUM_SCALAR>
55  GUM_SCALAR* GUM_MULTI_DIM_COMPLETE_PROJECTION_POINTER_NAME(
56  const MultiDimArray<GUM_SCALAR*>* table,
57  Instantiation* instantiation )
58 #endif
59 
60 #ifdef GUM_MULTI_DIM_COMPLETE_PROJECTION_NAME_F
61 #define GUM_MULTI_DIM_COMPLETE_PROJECTION_TYPE GUM_SCALAR
62  template <typename GUM_SCALAR>
63  GUM_SCALAR GUM_MULTI_DIM_COMPLETE_PROJECTION_NAME_F(
64  const MultiDimArray<GUM_SCALAR>* table,
65  GUM_SCALAR ( *f )( const GUM_SCALAR&,
66  const GUM_SCALAR& ),
67  Instantiation* instantiation )
68 #endif
69 
70 #ifdef GUM_MULTI_DIM_COMPLETE_PROJECTION_POINTER_NAME_F
71 #define GUM_MULTI_DIM_COMPLETE_PROJECTION_TYPE GUM_SCALAR *
72 #define GUM_MULTI_DIM_COMPLETE_PROJECTION_POINTER
73  template <typename GUM_SCALAR>
74  GUM_SCALAR* GUM_MULTI_DIM_COMPLETE_PROJECTION_POINTER_NAME_F(
75  const MultiDimArray<GUM_SCALAR*>* table,
76  GUM_SCALAR* ( *f )( const GUM_SCALAR const*,
77  const GUM_SCALAR const* ),
78  Instantiation* instantiation )
79 #endif
80 
81 #ifdef GUM_MULTI_DIM_COMPLETE_PROJECTION_IMPL2ARRAY_NAME
82 #define GUM_MULTI_DIM_COMPLETE_PROJECTION_TYPE GUM_SCALAR
83  template <typename GUM_SCALAR>
84  GUM_SCALAR GUM_MULTI_DIM_COMPLETE_PROJECTION_IMPL2ARRAY_NAME(
85  const MultiDimImplementation<GUM_SCALAR>* ttable,
86  Instantiation* instantiation )
87 #endif
88 
89 #ifdef GUM_MULTI_DIM_COMPLETE_PROJECTION_POINTER_IMPL2ARRAY_NAME
90 #define GUM_MULTI_DIM_COMPLETE_PROJECTION_TYPE GUM_SCALAR *
91 #define GUM_MULTI_DIM_COMPLETE_PROJECTION_POINTER
92  template <typename GUM_SCALAR>
93  GUM_SCALAR*
94  GUM_MULTI_DIM_COMPLETE_PROJECTION_POINTER_IMPL2ARRAY_NAME(
95  const MultiDimImplementation<GUM_SCALAR*>* ttable,
96  Instantiation* instantiation )
97 #endif
98 
99  // clang-format on
100 
101  {
102 
103 # ifdef GUM_MULTI_DIM_COMPLETE_PROJECTION_IMPL2ARRAY_NAME
104  const auto table =
105  reinterpret_cast< const MultiDimArray< GUM_SCALAR >* >(ttable);
106 # endif
107 
108 # ifdef GUM_MULTI_DIM_COMPLETE_PROJECTION_POINTER_IMPL2ARRAY_NAME
109  const auto table =
110  reinterpret_cast< const MultiDimArray< GUM_SCALAR* >* >(ttable);
111 # endif
112 
113  // first, compute the domain size of the table:
114  Size nb_elt = table->domainSize();
115 
116  // now, parse the table and compute the projection. Start with the
117  // neutral element
118  GUM_MULTI_DIM_COMPLETE_PROJECTION_TYPE* ptable =
119  const_cast< GUM_MULTI_DIM_COMPLETE_PROJECTION_TYPE* >(
120  &(table->unsafeGet(0)));
121  GUM_SCALAR current_val = GUM_MULTI_DIM_COMPLETE_PROJECTION_NEUTRAL;
122 
123  if (instantiation) {
124  GUM_SCALAR old_val = current_val;
125  GUM_MULTI_DIM_COMPLETE_PROJECTION_TYPE* current_ptr = ptable;
126  GUM_MULTI_DIM_COMPLETE_PROJECTION_TYPE* deb_ptr = ptable;
127 
128  for (Size i = 0; i < nb_elt; ++i, ++ptable) {
129 # ifdef GUM_MULTI_DIM_COMPLETE_PROJECTION_POINTER
130  GUM_MULTI_DIM_COMPLETE_PROJECTION(&current_val, *ptable);
131 # else
132  GUM_MULTI_DIM_COMPLETE_PROJECTION(current_val, *ptable);
133 # endif
134 
135  if (current_val != old_val) {
136  old_val = current_val;
137  current_ptr = ptable;
138  }
139  }
140 
141  // put the table's variables into the instantiation
142  instantiation->forgetMaster();
143  instantiation->clear();
144  const Sequence< const DiscreteVariable* >& table_vars =
145  table->variablesSequence();
146 
147  for (const auto var : table_vars)
148  instantiation->add(*var);
149 
150  // return the result
151  table->fromOffset(*instantiation, Size(current_ptr - deb_ptr));
152 # ifdef GUM_MULTI_DIM_COMPLETE_PROJECTION_POINTER
153  return *current_ptr;
154 # else
155  return current_val;
156 # endif /* GUM_MULTI_DIM_COMPLETE_PROJECTION_POINTER */
157  } else {
158 # ifdef GUM_MULTI_DIM_COMPLETE_PROJECTION_POINTER
159  GUM_SCALAR old_val = current_val;
160  GUM_MULTI_DIM_COMPLETE_PROJECTION_TYPE* current_ptr = ptable;
161 
162  for (Size i = 0; i < nb_elt; ++i, ++ptable) {
163  GUM_MULTI_DIM_COMPLETE_PROJECTION(&current_val, *ptable);
164 
165  if (current_val != old_val) {
166  old_val = current_val;
167  current_ptr = ptable;
168  }
169  }
170 
171  return *current_ptr;
172 # else
173 
174  for (Size i = 0; i < nb_elt; ++i, ++ptable) {
175  GUM_MULTI_DIM_COMPLETE_PROJECTION(current_val, *ptable);
176  }
177 
178  return current_val;
179 # endif /* GUM_MULTI_DIM_COMPLETE_PROJECTION_POINTER */
180  }
181  }
182 
183 # undef GUM_MULTI_DIM_COMPLETE_PROJECTION_TYPE
184 
185 # ifdef GUM_MULTI_DIM_COMPLETE_PROJECTION_POINTER
186 # undef GUM_MULTI_DIM_COMPLETE_PROJECTION_POINTER
187 # endif
188 
189 } /* End of namespace gum */
190 
191 #endif /* GUM_COMPLETE_PROJECTION_PATTERN_ALLOWED */
Copyright 2005-2019 Pierre-Henri WUILLEMIN et Christophe GONZALES (LIP6) {prenom.nom}_at_lip6.fr.
Definition: agrum.h:25
std::size_t Size
In aGrUM, hashed values are unsigned long int.
Definition: types.h:48