OpenGM  2.3.x
Discrete Graphical Model Library
multiplier.hxx
Go to the documentation of this file.
1 #pragma once
2 #ifndef OPENGM_OPERATION_MULTIPLIER_HXX
3 #define OPENGM_OPERATION_MULTIPLIER_HXX
4 
6 
7 namespace opengm {
8 
12 struct Multiplier
13 {
15  template<class T>
16  static T neutral()
17  { return static_cast<T>(1); }
18 
20  template<class T>
21  static void neutral(T& out)
22  { out = static_cast<T>(1); }
23 
25  template<class T>
26  static T ineutral()
27  { return static_cast<T>(1); }
28 
30  template<class T>
31  static void ineutral(T& out)
32  { out = static_cast<T>(1); }
33 
35  template<class T1, class T2>
36  static void op(const T1& in, T2& out)
37  { out *= in; }
38 
40  template<class T1,class T2,class T3>
41  static void op(const T1& in1, const T2& in2, T3& out)
42  { out = in1 * in2; }
43 
45  template<class T1, class T2>
46  static void iop(const T1& in, T2& out)
47  { out /= in; }
48 
50  template<class T1, class T2, class T3>
51  static void iop(const T1& in1, const T2& in2, T3& out)
52  { out = in1 / in2; }
53 
55  static bool hasbop()
56  {return false;}
57 
59  template<class T1, class T2>
60  static void hop(const T1& in1, T2& out)
61  {
62  opengm::operateUnary(out,opengm::PowFunctor<T1>(in1) );
63  //T2 temp = out;
64  //opengm::operateUnary(temp,out,opengm::PowFunctor<T1>(in1));
65  //out.operateUnary(out,opengm::PowFunctor<T2>(in1)) ;
66  //out= pow(out, in1);
67  }
68 
70  template<class T1, class T2, class T3>
71  static void hop(const T1& in1, const T2& in2, T3& out)
72  {
73  opengm::operateUnary(in1,out,opengm::PowFunctor<T2>(in2) );
74  //out.operateUnary(in1,opengm::PowFunctor<T2>(in2)) ;
75  //out= pow(in1, in2);
76  }
77 
79  template<class T1, class T2>
80  static void ihop(const T1& in1, T2& out)
81  {
82  opengm::operateUnary(out,opengm::PowFunctor<T1>(1.0/in1) );
83  //out= pow(out, in1);
84  }
85 
87  template<class T1, class T2, class T3>
88  static void ihop(const T1& in1, const T2& in2, T3& out)
89  {
90  //out = pow(in1, 1/in2);
91  opengm::operateUnary(in1,out,opengm::PowFunctor<T2>(1.0/in2) );
92  }
93 };
94 
95 } // namespace opengm
96 
97 #endif // #ifndef OPENGM_OPERATION_MULTIPLIER_HXX
The OpenGM namespace.
Definition: config.hxx:43
Multiplication as a binary operation.
Definition: multiplier.hxx:12
static T ineutral()
inverse neutral element (with return)
Definition: multiplier.hxx:26
static void hop(const T1 &in1, const T2 &in2, T3 &out)
hyper-operation (not in-place)
Definition: multiplier.hxx:71
static void hop(const T1 &in1, T2 &out)
hyper-operation (not in-place)
Definition: multiplier.hxx:60
static void ineutral(T &out)
inverse neutral element (call by reference)
Definition: multiplier.hxx:31
static void neutral(T &out)
neutral element (call by reference)
Definition: multiplier.hxx:21
static void ihop(const T1 &in1, T2 &out)
inverse hyper-operation (in-place)
Definition: multiplier.hxx:80
static void iop(const T1 &in1, const T2 &in2, T3 &out)
inverse operation (not in-place)
Definition: multiplier.hxx:51
static void ihop(const T1 &in1, const T2 &in2, T3 &out)
inverse hyper-operation (not in-place)
Definition: multiplier.hxx:88
static void op(const T1 &in, T2 &out)
operation (in-place)
Definition: multiplier.hxx:36
static T neutral()
neutral element (with return)
Definition: multiplier.hxx:16
static void iop(const T1 &in, T2 &out)
inverse operation (in-place)
Definition: multiplier.hxx:46
static bool hasbop()
bool operation flag
Definition: multiplier.hxx:55
static void op(const T1 &in1, const T2 &in2, T3 &out)
operation (not in-place)
Definition: multiplier.hxx:41