2 #ifndef OPENGM_INDEXING_HXX
3 #define OPENGM_INDEXING_HXX
10 template<
class VECTOR>
11 bool isEqualValueVector(
const VECTOR vector) {
12 for(
size_t i=0;i<vector.size();++i) {
13 if(vector[0]!=vector[i]) {
21 template<
class Iterator,
class FIXED_COORDINATE_INDEX_CONTAINER,
class FIXED_COORDINATE_VALUE_CONTAINER>
32 const size_t dimension,
33 const FIXED_COORDINATE_INDEX_CONTAINER & fixedCoordinateIndex,
34 const FIXED_COORDINATE_VALUE_CONTAINER & fixedCoordinateValue
36 : shapeBegin_(shapeBegin),
37 coordinateTuple_(dimension,0),
38 fixedCoordinateValue_(fixedCoordinateValue),
39 fixedCoordinateIndex_(fixedCoordinateIndex),
40 dimension_(dimension) {
41 for(
size_t d = 0; d < fixedCoordinateIndex_.size(); ++d) {
42 coordinateTuple_[fixedCoordinateIndex_[d]] = fixedCoordinateValue_[d];
47 void resetCoordinate() {
48 for(
size_t i = 0; i < dimension_; ++i) {
49 coordinateTuple_[i] =
static_cast<size_t>(0);
51 for(
size_t i = 0; i < fixedCoordinateIndex_.size(); ++i) {
52 coordinateTuple_[fixedCoordinateIndex_[i]] = fixedCoordinateValue_[i];
59 for(
size_t d = 0; d < dimension_; ++d) {
60 bool atFixedValue =
false;
61 for(
size_t i = counter; i < fixedCoordinateIndex_.size(); ++i) {
62 if(d == fixedCoordinateIndex_[i]) {
67 if(atFixedValue ==
false) {
68 if(coordinateTuple_[d] != shapeBegin_[d] - 1) {
69 coordinateTuple_[d]++;
73 if(d != dimension_ - 1) {
74 coordinateTuple_[d] = 0;
77 coordinateTuple_[d]++;
88 return coordinateTuple_;
95 for(
size_t d = 0; d < dimension_; ++d) {
96 bool fixedVal =
false;
97 for(
size_t i = counter; i < fixedCoordinateIndex_.size(); ++i) {
98 if(d == fixedCoordinateIndex_[i])
105 if(fixedVal ==
false) {
106 result *= shapeBegin_[d];
113 Iterator shapeBegin_;
115 const FIXED_COORDINATE_VALUE_CONTAINER & fixedCoordinateValue_;
116 const FIXED_COORDINATE_INDEX_CONTAINER & fixedCoordinateIndex_;
117 const size_t dimension_;
121 template<
class Iterator>
125 ShapeWalker(Iterator shapeBegin,
size_t dimension)
126 : shapeBegin_(shapeBegin),
127 coordinateTuple_(dimension, 0),
128 dimension_(dimension) { }
130 for(
size_t d = 0; d < dimension_; ++d) {
131 if(
size_t(coordinateTuple_[d]) != (
size_t(shapeBegin_[d]) -
size_t(1)) ) {
132 ++coordinateTuple_[d];
137 if(d != dimension_ - 1) {
138 coordinateTuple_[d] = 0;
141 coordinateTuple_[d]++;
149 return coordinateTuple_;
152 std::fill(coordinateTuple_.begin(),coordinateTuple_.end(),0);
155 Iterator shapeBegin_;
157 const size_t dimension_;
160 template<
class Iterator>
161 class ShapeWalkerSwitchedOrder
164 ShapeWalkerSwitchedOrder(Iterator shapeBegin,
size_t dimension)
165 : shapeBegin_(shapeBegin),
166 coordinateTuple_(dimension, 0),
167 dimension_(dimension) { }
169 for(
size_t d = dimension_-1;
true; --d) {
170 if(
size_t(coordinateTuple_[d]) != (
size_t(shapeBegin_[d]) -
size_t(1)) ) {
171 ++coordinateTuple_[d];
177 coordinateTuple_[d] = 0;
180 coordinateTuple_[d]++;
191 return coordinateTuple_;
195 Iterator shapeBegin_;
197 const size_t dimension_;
200 template<
class SHAPE_AB_ITERATOR>
201 class TripleShapeWalker{
203 template<
class VI_AB,
class VI_A,
class VI_B>
206 SHAPE_AB_ITERATOR shapeABBegin,
211 ): shapeABBegin_(shapeABBegin),
213 coordinateTupleAB_(viAB.size(), 0),
214 coordinateTupleA_(viA.size(), 0),
215 coordinateTupleB_(viB.size(), 0),
216 viMatchA_(viAB.size(),
false),
217 viMatchB_(viAB.size(),
false),
218 viMatchIndexA_(viAB.size()),
219 viMatchIndexB_(viAB.size()) {
226 for(
size_t d = 0; d < dimensionAB_; ++d) {
227 if(counterA<viA.size()) {
228 if(viAB[d] == viA[counterA]) {
230 viMatchIndexA_[d] = counterA;
234 if(counterB<viB.size()) {
235 if(viAB[d] == viB[counterB]) {
237 viMatchIndexB_[d] = counterB;
245 for(
size_t d = 0; d < dimensionAB_; ++d) {
246 if(
int (coordinateTupleAB_[d]) !=
int(
int(shapeABBegin_[d]) -
int(1))) {
247 coordinateTupleAB_[d]++;
249 coordinateTupleA_[viMatchIndexA_[d]]++;
252 coordinateTupleB_[viMatchIndexB_[d]]++;
257 coordinateTupleAB_[d] = 0;
259 coordinateTupleA_[viMatchIndexA_[d]] = 0;
262 coordinateTupleB_[viMatchIndexB_[d]] = 0;
270 return coordinateTupleA_;
274 return coordinateTupleB_;
278 return coordinateTupleAB_;
281 SHAPE_AB_ITERATOR shapeABBegin_;
282 const size_t dimensionAB_;
292 template<
class SHAPE_AB_ITERATOR>
293 class DoubleShapeWalker {
295 template<
class VI_A,
class VI_B>
298 SHAPE_AB_ITERATOR shapeABbegin,
303 :shapeABbegin_(shapeABbegin),
305 coordinateTupleAB_(dimensionAB_, 0),
306 coordinateTupleA_(viA.size(), 0),
307 viMatchA_(dimensionAB_,
false),
308 viMatchIndexA_(dimensionAB_) {
311 for(
size_t d = 0; d < dimensionAB_; ++d) {
312 for(
size_t i = counterA; i < viA.size(); ++i) {
313 if(viAB[d] == viA[i]) {
315 viMatchIndexA_[d] = i;
323 for(
size_t d = 0; d < dimensionAB_; ++d) {
324 if(coordinateTupleAB_[d] != shapeABbegin_[d] - 1) {
325 coordinateTupleAB_[d]++;
326 if(viMatchA_[d] ==
true) {
327 coordinateTupleA_[viMatchIndexA_[d]]++;
332 coordinateTupleAB_[d] = 0;
333 if(viMatchA_[d] ==
true) {
334 coordinateTupleA_[viMatchIndexA_[d]] = 0;
342 return coordinateTupleA_;
346 return coordinateTupleAB_;
350 SHAPE_AB_ITERATOR shapeABbegin_;
351 const size_t dimensionAB_;
360 #endif // #ifndef OPENGM_INDEXING_HXX
Vector that stores values on the stack if size is smaller than MAX_STACK.
#define OPENGM_ASSERT(expression)
View< T, false, A > & operator++(View< T, false, A > &v)