2 #ifndef OPENGM_FUNCTION_LEVEL_ACCUMULATOR_HXX
3 #define OPENGM_FUNCTION_LEVEL_ACCUMULATOR_HXX
15 template<
class A,
class B,
class ACC>
16 class AccumulateAllImpl {
18 typedef typename A::ValueType ValueType;
21 static void op(
const A&, B&);
22 static void op(
const A&, B&, std::vector<LabelType>& state);
26 template<
class A,
class B,
class ACC>
27 class AccumulateSomeImpl {
29 typedef typename A::IndexType IndexType;
30 typedef typename A::ValueType ValueType;
31 typedef std::vector<IndexType> ViSequenceType;
34 template<
class Iterator,
class VIS_A,
class VIS_B>
35 static void op(
const A&,
const VIS_A &, Iterator, Iterator, B&, VIS_B&);
39 template<
class A,
class ACC>
40 class AccumulateSomeInplaceImpl {
42 typedef typename A::IndexType IndexType;
43 typedef typename A::ValueType ValueType;
44 typedef std::vector<IndexType> ViSequenceType;
47 template<
class Iterator>
48 static void op(A&, ViSequenceType&, Iterator, Iterator);
52 template<
class A,
class B,
class ACC>
53 void AccumulateAllImpl<A, B, ACC>::op
58 OPENGM_ASSERT(a.dimension() != 0 || (a.dimension() == 0 && a.size() == 1));
59 opengm::Accumulation<ValueType, LabelType, ACC> acc;
60 const size_t dimA = a.dimension();
61 const size_t numElement = a.size();
63 typedef opengm::AccessorIterator<opengm::FunctionShapeAccessor<A>,
true> ShapeIterType;
64 ShapeIterType shapeABegin(a, 0);
65 opengm::ShapeWalker< ShapeIterType> shapeWalker(shapeABegin, dimA);
67 for(
size_t i=0; i<numElement ; ++i) {
68 acc(a(coordinate.
begin()));
73 size_t indexSequenceToScalar[] = {0};
74 acc(a(indexSequenceToScalar));
76 b =
static_cast<B
>(acc.value());
80 template<
class A,
class B,
class ACC>
81 void AccumulateAllImpl<A, B, ACC>::op
85 std::vector<
typename AccumulateAllImpl<A, B, ACC>::LabelType>& state
87 OPENGM_ASSERT(a.dimension() != 0 || (a.dimension() == 0 && a.size() == 1));
88 opengm::Accumulation<ValueType, LabelType, ACC> acc;
89 const size_t dimA = a.dimension();
90 const size_t numElement = a.size();
93 typedef opengm::AccessorIterator<opengm::FunctionShapeAccessor<A>,
true> ShapeIterType;
94 ShapeIterType shapeABegin(a, 0);
95 opengm::ShapeWalker< ShapeIterType> shapeWalker(shapeABegin, dimA);
97 for(
size_t i=0; i<numElement; ++i) {
98 acc(a(coordinate.
begin()), coordinate);
104 size_t indexSequenceToScalar[] = {0};
105 acc(a(indexSequenceToScalar));
108 b =
static_cast<B
>(acc.value());
112 template<
class A,
class B,
class ACC>
113 template<
class Iterator,
class VIS_A,
class VIS_B>
114 void AccumulateSomeImpl<A, B, ACC>::op
124 OPENGM_ASSERT(a.dimension() != 0 || (a.dimension() == 0 && a.size() == 1));
125 const size_t dimA = a.dimension();
129 size_t rawViSize = std::distance(viAccBegin, viAccEnd);
134 for(
size_t i=0; i <dimA; ++i) {
136 for(
size_t j=0; j < rawViSize; ++j) {
137 if(static_cast<opengm::UInt64Type>(viA[i]) == static_cast<opengm::UInt64Type>(viAccBegin[j])) {
145 viB.push_back(viA[i]);
150 if(shapeAcc.
size() == dimA) {
152 ValueType scalarAccResult;
153 AccumulateAllImpl<A, ValueType, ACC>::op(a, scalarAccResult);
154 size_t indexSequenceToScalar[] = {0};
155 size_t shapeToScalarArray[] = {0};
156 b.resize(shapeToScalarArray, shapeToScalarArray);
157 b(indexSequenceToScalar) = scalarAccResult;
159 else if(shapeAcc.
size() == 0) {
162 b.resize(shapeNotAcc.
begin(), shapeNotAcc.
end());
163 opengm::ShapeWalker< opengm::FastSequence<size_t>::const_iterator> shapeWalker(shapeNotAcc.
begin(), dimA);
165 for(
size_t i=0; i <a.size() ; ++i) {
166 b(coordinate.begin()) = a(coordinate.begin());
169 viB.
assign(viA.begin(),viA.end());
173 b.resize(shapeNotAcc.
begin(), shapeNotAcc.
end());
175 opengm::ShapeWalker< opengm::FastSequence<size_t>::const_iterator> walker(shapeNotAcc.
begin(), shapeNotAcc.
size());
178 typedef opengm::AccessorIterator<opengm::FunctionShapeAccessor<A>,
true> ShapeIterType;
179 ShapeIterType shapeABegin(a, 0);
181 subWalker(shapeABegin, dimA, notAccPosition, coordinateNotAcc);
182 const size_t subSizeAcc = subWalker.subSize();
184 for(
size_t i=0; i<b.size(); ++i) {
187 Accumulation<ValueType, LabelType, ACC> acc;
188 subWalker.resetCoordinate();
189 for(
size_t j=0; j < subSizeAcc; ++j) {
190 acc(a( subWalker.coordinateTuple().begin()));
193 b(coordinateNotAcc.begin()) = acc.value();
199 Accumulation<ValueType, LabelType, ACC> acc;
200 size_t indexSequenceToScalar[] = {0};
201 ValueType accRes=
static_cast<ValueType
>(0.0);
203 size_t shapeToScalarArray[] = {0};
204 b.resize(shapeToScalarArray, shapeToScalarArray);
205 b(indexSequenceToScalar) = acc.value();
208 OPENGM_ASSERT(b.dimension() != 0 || (b.dimension() == 0 && b.size() == 1));
212 template<
class A,
class ACC>
213 template<
class Iterator>
214 void AccumulateSomeInplaceImpl<A, ACC>::op
222 OPENGM_ASSERT(a.dimension() != 0 || (a.dimension() == 0 && a.size() == 1));
223 const size_t dimA = a.dimension();
226 const size_t rawViSize = std::distance(viAccBegin, viAccEnd);
231 for(
size_t i = 0; i <dimA; ++i) {
233 for(
size_t j=0; j < rawViSize; ++j) {
234 if( static_cast<UInt64Type>(viA[i]) == static_cast<UInt64Type>(viAccBegin[j])) {
247 if(shapeAcc.
size() == dimA) {
249 ValueType scalarAccResult;
250 AccumulateAllImpl<A, ValueType, ACC>::op(a, scalarAccResult);
252 size_t shapeToScalarArray[] = {0};
253 a.resize(shapeToScalarArray, shapeToScalarArray);
254 a(shapeToScalarArray) = scalarAccResult;
257 else if(shapeAcc.
size() == 0) {
264 b.resize(shapeNotAcc.
begin(), shapeNotAcc.
end());
266 opengm::ShapeWalker< typename opengm::FastSequence<size_t>::const_iterator> walker(shapeNotAcc.
begin(), shapeNotAcc.
size());
269 typedef opengm::AccessorIterator<opengm::FunctionShapeAccessor<A>,
true> ShapeIterType;
270 ShapeIterType shapeABegin(a, 0);
272 subWalker(shapeABegin, dimA, notAccPosition, coordinateNotAcc);
273 const size_t subSizeAcc = subWalker.subSize();
275 for(
size_t i=0; i < b.size(); ++i) {
278 Accumulation<ValueType, LabelType, ACC> acc;
279 subWalker.resetCoordinate();
280 for(
size_t j=0; j<subSizeAcc; ++j) {
281 acc(a(subWalker.coordinateTuple().begin()));
284 b(coordinateNotAcc.begin()) = acc.value();
292 Accumulation<ValueType, LabelType, ACC> acc;
293 ValueType accRes=
static_cast<ValueType
>(0.0);
299 OPENGM_ASSERT(a.dimension() != 0 || (a.dimension() == 0 && a.size() == 1));
306 #endif // OPENGM_FUNCTION_LEVEL_ACCUMULATOR_HXX
void assign(ITERATOR, ITERATOR)
assign values
void push_back(const T &)
append a value
Vector that stores values on the stack if size is smaller than MAX_STACK.
T const * end() const
end iterator
#define OPENGM_ASSERT(expression)
T const * begin() const
begin iterator