2 #ifndef OPENGM_FoE_FUNCTION_HXX
3 #define OPENGM_FoE_FUNCTION_HXX
19 template<
class T,
class I =
size_t,
class L =
size_t>
21 :
public FunctionBase<FoEFunction<T, I, L>, T, size_t, size_t>
28 FoEFunction(
const std::vector<T>&,
const std::vector<T>&,
const L);
30 FoEFunction(IT, IT,
const L,
const I,
const size_t);
32 LabelType
shape(
const size_t)
const;
35 template<
class ITERATOR> ValueType
operator()(ITERATOR)
const;
44 mutable std::vector<T>
l_;
51 template<
class T,
class I,
class L>
59 template<
class T,
class I,
class L>
60 class FunctionSerialization<FoEFunction<T, I, L> > {
62 typedef typename FoEFunction<T, I, L>::ValueType ValueType;
64 static size_t indexSequenceSize(
const FoEFunction<T, I, L>&);
65 static size_t valueSequenceSize(
const FoEFunction<T, I, L>&);
66 template<
class INDEX_OUTPUT_ITERATOR,
class VALUE_OUTPUT_ITERATOR>
67 static void serialize(
const FoEFunction<T, I, L>&, INDEX_OUTPUT_ITERATOR, VALUE_OUTPUT_ITERATOR);
68 template<
class INDEX_INPUT_ITERATOR,
class VALUE_INPUT_ITERATOR>
69 static void deserialize( INDEX_INPUT_ITERATOR, VALUE_INPUT_ITERATOR, FoEFunction<T, I, L>&);
74 template <
class T,
class I,
class L>
86 template <
class T,
class I,
class L>
94 const double a_alpha[3] = {0.586612685392731, 1.157638405566669, 0.846059486257292};
95 const double a_expert[3][4] = {
96 {-0.0582774013402734, 0.0339010363051084, -0.0501593018104054, 0.0745568557931712},
97 {0.0492112815304123, -0.0307820846538285, -0.123247230948424, 0.104812330861557},
98 {0.0562633568728865, 0.0152832583489560, -0.0576215592718086, -0.0139673758425540}
100 for(
size_t e=0; e<3; ++e){
101 alphas_[e] = a_alpha[e];
103 for(
size_t i=0; i<4;++i){
104 experts_[e+i*3] = a_expert[e][i];
117 template <
class T,
class I,
class L>
120 (
const std::vector<T>& e,
const std::vector<T>& a,
const L numL)
125 order_ = e.size()/a.size();
134 template <
class T,
class I,
class L>
138 numLabels_ = numLabels;
140 experts_.resize(numVars*numExperts);
141 alphas_.resize(numExperts);
143 for(
size_t i=0; i<numVars*numExperts; ++i,++ite)
145 for(
size_t i=0; i<numExperts; ++i,++ita)
150 template <
class T,
class I,
class L>
151 template <
class ITERATOR>
158 for (
size_t j = 0; j < order_; ++j) {
159 l_[j] =
static_cast<T
>(*begin);
165 for (
size_t e = 0; e < alphas_.size(); ++e) {
167 for (
size_t j = 0; j < order_; ++j,++i) {
168 dot += experts_[i] * l_[j];
170 val += alphas_[e] * std::log(1 + 0.5 * dot * dot);
175 template <
class T,
class I,
class L>
185 template <
class T,
class I,
class L>
191 template <
class T,
class I,
class L>
195 for(
size_t i=0; i<dimension(); ++i)
200 template<
class T,
class I,
class L>
209 template<
class T,
class I,
class L>
211 FunctionSerialization<FoEFunction<T, I, L> >::valueSequenceSize
213 const FoEFunction<T, I, L> & src
215 return src.experts_.size()+src.alphas_.size();
218 template<
class T,
class I,
class L>
219 template<
class INDEX_OUTPUT_ITERATOR,
class VALUE_OUTPUT_ITERATOR >
221 FunctionSerialization<FoEFunction<T, I, L> >::serialize
223 const FoEFunction<T, I, L> & src,
224 INDEX_OUTPUT_ITERATOR indexOutIterator,
225 VALUE_OUTPUT_ITERATOR valueOutIterator
227 for(
size_t i=0; i<src.experts_.size(); ++i){
228 *valueOutIterator = src.experts_[i];
231 std::cout <<std::endl;
232 for(
size_t i=0; i<src.alphas_.size(); ++i){
233 *valueOutIterator = src.alphas_[i];
237 *indexOutIterator = src.alphas_.size();
239 *indexOutIterator = src.order_;
241 *indexOutIterator = src.numLabels_;
244 template<
class T,
class I,
class L>
245 template<
class INDEX_INPUT_ITERATOR,
class VALUE_INPUT_ITERATOR >
247 FunctionSerialization<FoEFunction<T, I, L> >::deserialize
249 INDEX_INPUT_ITERATOR indexInIterator,
250 VALUE_INPUT_ITERATOR valueInIterator,
251 FoEFunction<T, I, L> & dst
253 size_t numExperts = *indexInIterator;
255 size_t order = *indexInIterator;
257 size_t numLabels = *indexInIterator;
259 std::vector<T> alphas(numExperts);
260 std::vector<T> experts(numExperts*order);
262 for(
size_t i=0; i<numExperts*order; ++i){
263 experts[i] = *valueInIterator;
266 for(
size_t i=0; i<numExperts; ++i){
267 alphas[i] = *valueInIterator;
271 dst=FoEFunction<T, I, L>(experts,alphas,numLabels);
276 #endif // #ifndef OPENGM_FoE_FUNCTION_HXX
Fallback implementation of member functions of OpenGM functions.
FoEFunction()
constructor for demo function
ValueType operator()(ITERATOR) const
Field of Expert function.
LabelType shape(const size_t) const
#define OPENGM_ASSERT(expression)
std::vector< T > experts_
const size_t FUNCTION_TYPE_ID_OFFSET
User-defined function have ids smaller than FUNCTION_TYPE_ID_OFFSET.