aGrUM  0.20.3
a C++ library for (probabilistic) graphical models
functors.h
Go to the documentation of this file.
1 /**
2  *
3  * Copyright (c) 2005-2021 by Pierre-Henri WUILLEMIN(@LIP6) & Christophe GONZALES(@AMU)
4  * info_at_agrum_dot_org
5  *
6  * This library is free software: you can redistribute it and/or modify
7  * it under the terms of the GNU Lesser General Public License as published by
8  * the Free Software Foundation, either version 3 of the License, or
9  * (at your option) any later version.
10  *
11  * This library is distributed in the hope that it will be useful,
12  * but WITHOUT ANY WARRANTY; without even the implied warranty of
13  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14  * GNU Lesser General Public License for more details.
15  *
16  * You should have received a copy of the GNU Lesser General Public License
17  * along with this library. If not, see <http://www.gnu.org/licenses/>.
18  *
19  */
20 
21 
22 /**
23  * @file
24  * @brief This files contains several function objects that are not (yet) defined
25  * in the STL
26  *
27  * Generically, function objects are instances of a class with member function
28  * operator() defined.
29  * This member function allows the object to be used with the same syntax as a
30  * function call.
31  *
32  * @author Jean-Christophe MAGNAN
33  */
34 
35 // =========================================================================
36 #ifndef GUM_FUNCTORS_H
37 #define GUM_FUNCTORS_H
38 // =========================================================================
39 #include <cstdlib>
40 // =========================================================================
41 #include <agrum/tools/core/argMaxSet.h>
42 // =========================================================================
43 
44 
45 namespace gum {
46 
47  /**
48  * @struct Maximizes functors.h <agrum/tools/core/functors.h>
49  * @brief Maximization function object class
50  * @ingroup core
51  *
52  * Returns the maximum of its two arguments
53  */
54  template < class GUM_SCALAR >
55  struct Maximizes {
56  // ###########################################################################
57  /// @name Operator()
58  // ###########################################################################
59  /// @{
60 
61  GUM_SCALAR operator()(const GUM_SCALAR& x, const GUM_SCALAR& y) const { return x >= y ? x : y; }
62 
63  /// @}
64 
65  typedef GUM_SCALAR first_argument_type;
66  typedef GUM_SCALAR second_argument_type;
67  typedef GUM_SCALAR result_type;
68  };
69 
70  /**
71  * @struct Minimizes functors.h <agrum/tools/core/functors.h>
72  * @brief Minimization function object class
73  * @ingroup core
74  *
75  * Returns the minimum of its two arguments
76  */
77  template < class GUM_SCALAR >
78  struct Minimizes {
79  // ###########################################################################
80  /// @name Operator()
81  // ###########################################################################
82  /// @{
83 
84  GUM_SCALAR operator()(const GUM_SCALAR& x, const GUM_SCALAR& y) const { return x <= y ? x : y; }
85 
86  /// @}
87 
88  typedef GUM_SCALAR first_argument_type;
89  typedef GUM_SCALAR second_argument_type;
90  typedef GUM_SCALAR result_type;
91  };
92 
93  /**
94  * @struct ArgumentMaximises functors.h <agrum/tools/core/functors.h>
95  * @brief Arg Max function object class
96  * @ingroup core
97  *
98  * @param Operator() takes two std::pairs.
99  * First element in each pair is the values we compare to do the argmax.
100  * Second element is the argument that leads to this value.
101  *
102  * @return best pair => the argument that is the arg max is ret.second
103  */
104 
105  template < class GUM_SCALAR >
107  // ###########################################################################
108  /// @name Operator()
109  // ###########################################################################
110  /// @{
111 
112  GUM_SCALAR operator()(const GUM_SCALAR& x, const GUM_SCALAR& y) const {
113  return x.first >= y.first ? x : y;
114  }
115 
116  /// @}
117 
118  typedef GUM_SCALAR first_argument_type;
119  typedef GUM_SCALAR second_argument_type;
120  typedef GUM_SCALAR result_type;
121  };
122 } // namespace gum
123 
124 #endif // GUM_FUNCTORS_H
GUM_SCALAR result_type
Definition: functors.h:120
GUM_SCALAR first_argument_type
Definition: functors.h:118
INLINE void emplace(Args &&... args)
Definition: set_tpl.h:643
GUM_SCALAR second_argument_type
Definition: functors.h:119
GUM_SCALAR operator()(const GUM_SCALAR &x, const GUM_SCALAR &y) const
Definition: functors.h:112
GUM_SCALAR operator()(const GUM_SCALAR &x, const GUM_SCALAR &y) const
Definition: functors.h:84
Arg Max function object class.
Definition: functors.h:106
Maximization function object classReturns the maximum of its two arguments.
Definition: functors.h:55
GUM_SCALAR second_argument_type
Definition: functors.h:89
GUM_SCALAR first_argument_type
Definition: functors.h:65
Minimization function object classReturns the minimum of its two arguments.
Definition: functors.h:78
GUM_SCALAR first_argument_type
Definition: functors.h:88
GUM_SCALAR operator()(const GUM_SCALAR &x, const GUM_SCALAR &y) const
Definition: functors.h:61
GUM_SCALAR second_argument_type
Definition: functors.h:66
GUM_SCALAR result_type
Definition: functors.h:90
GUM_SCALAR result_type
Definition: functors.h:67