2 #ifndef OPENGM_ACCUMULATIONWRAPPER_HXX
3 #define OPENGM_ACCUMULATIONWRAPPER_HXX
12 namespace functionwrapper {
15 struct IndependentFactorFlag;
16 struct IndependentFactorOrFactorFlag;
22 template<
class A,
class B,
class ACC,
size_t IX,
size_t DX,
bool END>
23 class AccumulateAllExecutor;
25 template<
class A,
class B,
class ACC,
size_t IX,
size_t DX>
26 class AccumulateAllExecutor<A, B, ACC, IX, DX, false> {
35 typedef typename meta::GetFunction<A, IX>::FunctionType FunctionTypeA;
36 const FunctionTypeA& fa = meta::GetFunction<A, IX>::get(a);
37 typedef opengm::AccumulateAllImpl<FunctionTypeA, B, ACC> AccumulationType;
38 AccumulationType::op(fa, b);
41 typedef AccumulateAllExecutor<A, B, ACC, IX+1, DX, meta::Bool<IX+1==DX>::value > NewExecutorType;
42 NewExecutorType::op(a, b, rtia);
50 std::vector<typename A::LabelType> & state,
54 typedef typename meta::GetFunction<A, IX>::FunctionType FunctionTypeA;
55 const FunctionTypeA& fa = meta::GetFunction<A, IX>::get(a);
56 typedef opengm::AccumulateAllImpl<FunctionTypeA, B, ACC> AccumulationType;
57 AccumulationType::op(fa, b,state);
60 typedef AccumulateAllExecutor<A, B, ACC, IX+1, DX, meta::Bool<IX+1==DX>::value> NewExecutorType;
61 NewExecutorType::op(a, b, state, rtia);
66 template<
class A,
class B,
class ACC,
size_t IX,
size_t DX>
67 class AccumulateAllExecutor<A, B, ACC, IX, DX, true> {
69 typedef std::vector<size_t> ViType;
77 throw RuntimeError(
"wrong function id");
79 template<
class INDEX_TYPE>
84 std::vector<INDEX_TYPE> & state,
87 throw RuntimeError(
"wrong function id");
91 template<
class A,
class B,
class ACC,
size_t IX,
size_t DX,
bool END>
92 class AccumulateSomeExecutor;
94 template<
class A,
class B,
class ACC,
size_t IX,
size_t DX>
95 class AccumulateSomeExecutor<A, B, ACC, IX, DX, false>
98 typedef typename A::VisContainerType ViTypeA;
99 typedef typename B::VisContainerType ViTypeB;
101 template<
class ViAccIter>
105 ViAccIter beginViAcc,
111 typedef typename meta::GetFunction<A, IX>::FunctionType FunctionTypeA;
112 typedef typename meta::GetFunction<B, 0>::FunctionType FunctionTypeB;
113 const FunctionTypeA & fa=meta::GetFunction<A, IX>::get(a);
114 FunctionTypeB & fb=meta::GetFunction<B, 0>::get(b);
115 const ViTypeA & viA=a.variableIndexSequence();
116 ViTypeB & viB=b.variableIndexSequence();
117 typedef opengm::AccumulateSomeImpl<FunctionTypeA, FunctionTypeB, ACC> AccumulationType;
118 AccumulationType::op(fa, viA, beginViAcc, endViAcc, fb, viB);
121 typedef AccumulateSomeExecutor<A, B, ACC, IX+1, DX, meta::Bool<IX+1==DX>::value > NewExecutorType;
122 NewExecutorType::op(a, beginViAcc, endViAcc, b, rtia);
127 template<
class A,
class B,
class ACC,
size_t IX,
size_t DX>
128 class AccumulateSomeExecutor<A, B, ACC, IX, DX, true> {
131 typedef typename A::VisContainerType ViTypeA;
132 typedef typename B::VisContainerType ViTypeB;
133 template<
class ViAccIter>
137 ViAccIter beginViAcc ,
142 throw RuntimeError(
"wrong function id");
148 template<
class A,
class B,
class ACC>
149 class AccumulateAllWrapper {
156 typedef typename meta::EvalIf
158 meta::IsIndependentFactor<A>::value,
159 meta::Self<meta::SizeT<1> >,
160 meta::Self< meta::SizeT<A::NrOfFunctionTypes> >
162 typedef executor::AccumulateAllExecutor<A, B, ACC, 0, NFA::value, NFA::value==0> ExecutorType;
163 ExecutorType::op(a, b, opengm::meta::GetFunctionTypeIndex<A>::get(a));
166 template<
class LABEL_TYPE>
171 std::vector<LABEL_TYPE> & state
173 typedef typename meta::EvalIf
175 meta::IsIndependentFactor<A>::value,
176 meta::Self<meta::SizeT<1> >,
177 meta::Self< meta::SizeT<A::NrOfFunctionTypes> >
179 typedef executor::AccumulateAllExecutor<A, B, ACC, 0, NFA::value, NFA::value==0> ExecutorType;
181 (a, b, state, opengm::meta::GetFunctionTypeIndex<A>::get(a));
185 template<
class A,
class B,
class ACC>
186 class AccumulateSomeWrapper {
187 typedef typename A::VisContainerType ViTypeA;
188 typedef typename B::VisContainerType ViTypeB;
191 template<
class ViAccIter>
194 ViAccIter beginViAcc,
200 typedef typename meta::EvalIf
202 meta::IsIndependentFactor<A>::value,
203 meta::Self<meta::SizeT<1> >,
204 meta::Self< meta::SizeT<A::NrOfFunctionTypes> >
206 typedef executor::AccumulateSomeExecutor<A, B, ACC, 0, NFA::value, NFA::value==0> ExecutorType;
207 ExecutorType::op (a, beginViAcc, endViAcc, b, opengm::meta::GetFunctionTypeIndex<A>::get(a));
213 template<
class ACC,
class A,
class B>
214 inline void accumulate
219 functionwrapper::AccumulateAllWrapper<A, B, ACC>::op(a, b);
222 template<
class ACC,
class A,
class B,
class INDEX_TYPE>
223 inline void accumulate
227 std::vector<INDEX_TYPE> & state
229 functionwrapper::AccumulateAllWrapper<A, B, ACC>::op(a, b, state);
232 template<
class ACC,
class A,
class ViAccIterator,
class B>
233 inline void accumulate
236 ViAccIterator viAccBegin,
237 ViAccIterator viAccEnd,
240 functionwrapper::AccumulateSomeWrapper<A, B, ACC>::op(a, viAccBegin, viAccEnd, b);
243 template<
class ACC,
class A,
class ViAccIterator>
244 inline void accumulate
247 ViAccIterator viAccBegin,
248 ViAccIterator viAccEnd
250 opengm::AccumulateSomeInplaceImpl<typename A::FunctionType, ACC>::op(opengm::meta::GetFunction<A,0>::get(a), a.variableIndexSequence(), viAccBegin, viAccEnd);
257 #endif // #ifndef OPENGM_ACCUMULATIONWRAPPER_HXX