1 /*M///////////////////////////////////////////////////////////////////////////////////////
2 //
3 //  IMPORTANT: READ BEFORE DOWNLOADING, COPYING, INSTALLING OR USING.
4 //
5 //  By downloading, copying, installing or using the software you agree to this license.
6 //  If you do not agree to this license, do not download, install,
7 //  copy or use the software.
8 //
9 //
10 //                           License Agreement
11 //                For Open Source Computer Vision Library
12 //
13 // Copyright (C) 2013, OpenCV Foundation, all rights reserved.
14 // Third party copyrights are property of their respective owners.
15 //
16 // Redistribution and use in source and binary forms, with or without modification,
17 // are permitted provided that the following conditions are met:
18 //
19 //   * Redistribution's of source code must retain the above copyright notice,
20 //     this list of conditions and the following disclaimer.
21 //
22 //   * Redistribution's in binary form must reproduce the above copyright notice,
23 //     this list of conditions and the following disclaimer in the documentation
24 //     and/or other materials provided with the distribution.
25 //
26 //   * The name of the copyright holders may not be used to endorse or promote products
27 //     derived from this software without specific prior written permission.
28 //
29 // This software is provided by the copyright holders and contributors "as is" and
30 // any express or implied warranties, including, but not limited to, the implied
31 // warranties of merchantability and fitness for a particular purpose are disclaimed.
32 // In no event shall the OpenCV Foundation or contributors be liable for any direct,
33 // indirect, incidental, special, exemplary, or consequential damages
34 // (including, but not limited to, procurement of substitute goods or services;
35 // loss of use, data, or profits; or business interruption) however caused
36 // and on any theory of liability, whether in contract, strict liability,
37 // or tort (including negligence or otherwise) arising in any way out of
38 // the use of this software, even if advised of the possibility of such damage.
39 //
40 //M*/
41 
42 #ifndef __OPENCV_OPTIM_HPP__
43 #define __OPENCV_OPTIM_HPP__
44 
45 #include "opencv2/core.hpp"
46 
47 namespace cv
48 {
49 
50 /** @addtogroup core_optim
51 The algorithms in this section minimize or maximize function value within specified constraints or
52 without any constraints.
53 @{
54 */
55 
56 /** @brief Basic interface for all solvers
57  */
58 class CV_EXPORTS MinProblemSolver : public Algorithm
59 {
60 public:
61     /** @brief Represents function being optimized
62      */
63     class CV_EXPORTS Function
64     {
65     public:
~Function()66         virtual ~Function() {}
67         virtual int getDims() const = 0;
68         virtual double getGradientEps() const;
69         virtual double calc(const double* x) const = 0;
70         virtual void getGradient(const double* x,double* grad);
71     };
72 
73     /** @brief Getter for the optimized function.
74 
75     The optimized function is represented by Function interface, which requires derivatives to
76     implement the sole method calc(double*) to evaluate the function.
77 
78     @return Smart-pointer to an object that implements Function interface - it represents the
79     function that is being optimized. It can be empty, if no function was given so far.
80      */
81     virtual Ptr<Function> getFunction() const = 0;
82 
83     /** @brief Setter for the optimized function.
84 
85     *It should be called at least once before the call to* minimize(), as default value is not usable.
86 
87     @param f The new function to optimize.
88      */
89     virtual void setFunction(const Ptr<Function>& f) = 0;
90 
91     /** @brief Getter for the previously set terminal criteria for this algorithm.
92 
93     @return Deep copy of the terminal criteria used at the moment.
94      */
95     virtual TermCriteria getTermCriteria() const = 0;
96 
97     /** @brief Set terminal criteria for solver.
98 
99     This method *is not necessary* to be called before the first call to minimize(), as the default
100     value is sensible.
101 
102     Algorithm stops when the number of function evaluations done exceeds termcrit.maxCount, when
103     the function values at the vertices of simplex are within termcrit.epsilon range or simplex
104     becomes so small that it can enclosed in a box with termcrit.epsilon sides, whatever comes
105     first.
106     @param termcrit Terminal criteria to be used, represented as cv::TermCriteria structure.
107      */
108     virtual void setTermCriteria(const TermCriteria& termcrit) = 0;
109 
110     /** @brief actually runs the algorithm and performs the minimization.
111 
112     The sole input parameter determines the centroid of the starting simplex (roughly, it tells
113     where to start), all the others (terminal criteria, initial step, function to be minimized) are
114     supposed to be set via the setters before the call to this method or the default values (not
115     always sensible) will be used.
116 
117     @param x The initial point, that will become a centroid of an initial simplex. After the algorithm
118     will terminate, it will be setted to the point where the algorithm stops, the point of possible
119     minimum.
120     @return The value of a function at the point found.
121      */
122     virtual double minimize(InputOutputArray x) = 0;
123 };
124 
125 /** @brief This class is used to perform the non-linear non-constrained minimization of a function,
126 
127 defined on an `n`-dimensional Euclidean space, using the **Nelder-Mead method**, also known as
128 **downhill simplex method**. The basic idea about the method can be obtained from
129 <http://en.wikipedia.org/wiki/Nelder-Mead_method>.
130 
131 It should be noted, that this method, although deterministic, is rather a heuristic and therefore
132 may converge to a local minima, not necessary a global one. It is iterative optimization technique,
133 which at each step uses an information about the values of a function evaluated only at `n+1`
134 points, arranged as a *simplex* in `n`-dimensional space (hence the second name of the method). At
135 each step new point is chosen to evaluate function at, obtained value is compared with previous
136 ones and based on this information simplex changes it's shape , slowly moving to the local minimum.
137 Thus this method is using *only* function values to make decision, on contrary to, say, Nonlinear
138 Conjugate Gradient method (which is also implemented in optim).
139 
140 Algorithm stops when the number of function evaluations done exceeds termcrit.maxCount, when the
141 function values at the vertices of simplex are within termcrit.epsilon range or simplex becomes so
142 small that it can enclosed in a box with termcrit.epsilon sides, whatever comes first, for some
143 defined by user positive integer termcrit.maxCount and positive non-integer termcrit.epsilon.
144 
145 @note DownhillSolver is a derivative of the abstract interface
146 cv::MinProblemSolver, which in turn is derived from the Algorithm interface and is used to
147 encapsulate the functionality, common to all non-linear optimization algorithms in the optim
148 module.
149 
150 @note term criteria should meet following condition:
151 @code
152     termcrit.type == (TermCriteria::MAX_ITER + TermCriteria::EPS) && termcrit.epsilon > 0 && termcrit.maxCount > 0
153 @endcode
154  */
155 class CV_EXPORTS DownhillSolver : public MinProblemSolver
156 {
157 public:
158     /** @brief Returns the initial step that will be used in downhill simplex algorithm.
159 
160     @param step Initial step that will be used in algorithm. Note, that although corresponding setter
161     accepts column-vectors as well as row-vectors, this method will return a row-vector.
162     @see DownhillSolver::setInitStep
163      */
164     virtual void getInitStep(OutputArray step) const=0;
165 
166     /** @brief Sets the initial step that will be used in downhill simplex algorithm.
167 
168     Step, together with initial point (givin in DownhillSolver::minimize) are two `n`-dimensional
169     vectors that are used to determine the shape of initial simplex. Roughly said, initial point
170     determines the position of a simplex (it will become simplex's centroid), while step determines the
171     spread (size in each dimension) of a simplex. To be more precise, if \f$s,x_0\in\mathbb{R}^n\f$ are
172     the initial step and initial point respectively, the vertices of a simplex will be:
173     \f$v_0:=x_0-\frac{1}{2} s\f$ and \f$v_i:=x_0+s_i\f$ for \f$i=1,2,\dots,n\f$ where \f$s_i\f$ denotes
174     projections of the initial step of *n*-th coordinate (the result of projection is treated to be
175     vector given by \f$s_i:=e_i\cdot\left<e_i\cdot s\right>\f$, where \f$e_i\f$ form canonical basis)
176 
177     @param step Initial step that will be used in algorithm. Roughly said, it determines the spread
178     (size in each dimension) of an initial simplex.
179      */
180     virtual void setInitStep(InputArray step)=0;
181 
182     /** @brief This function returns the reference to the ready-to-use DownhillSolver object.
183 
184     All the parameters are optional, so this procedure can be called even without parameters at
185     all. In this case, the default values will be used. As default value for terminal criteria are
186     the only sensible ones, MinProblemSolver::setFunction() and DownhillSolver::setInitStep()
187     should be called upon the obtained object, if the respective parameters were not given to
188     create(). Otherwise, the two ways (give parameters to createDownhillSolver() or miss them out
189     and call the MinProblemSolver::setFunction() and DownhillSolver::setInitStep()) are absolutely
190     equivalent (and will drop the same errors in the same way, should invalid input be detected).
191     @param f Pointer to the function that will be minimized, similarly to the one you submit via
192     MinProblemSolver::setFunction.
193     @param initStep Initial step, that will be used to construct the initial simplex, similarly to the one
194     you submit via MinProblemSolver::setInitStep.
195     @param termcrit Terminal criteria to the algorithm, similarly to the one you submit via
196     MinProblemSolver::setTermCriteria.
197      */
198     static Ptr<DownhillSolver> create(const Ptr<MinProblemSolver::Function>& f=Ptr<MinProblemSolver::Function>(),
199                                       InputArray initStep=Mat_<double>(1,1,0.0),
200                                       TermCriteria termcrit=TermCriteria(TermCriteria::MAX_ITER+TermCriteria::EPS,5000,0.000001));
201 };
202 
203 /** @brief This class is used to perform the non-linear non-constrained minimization of a function
204 with known gradient,
205 
206 defined on an *n*-dimensional Euclidean space, using the **Nonlinear Conjugate Gradient method**.
207 The implementation was done based on the beautifully clear explanatory article [An Introduction to
208 the Conjugate Gradient Method Without the Agonizing
209 Pain](http://www.cs.cmu.edu/~quake-papers/painless-conjugate-gradient.pdf) by Jonathan Richard
210 Shewchuk. The method can be seen as an adaptation of a standard Conjugate Gradient method (see, for
211 example <http://en.wikipedia.org/wiki/Conjugate_gradient_method>) for numerically solving the
212 systems of linear equations.
213 
214 It should be noted, that this method, although deterministic, is rather a heuristic method and
215 therefore may converge to a local minima, not necessary a global one. What is even more disastrous,
216 most of its behaviour is ruled by gradient, therefore it essentially cannot distinguish between
217 local minima and maxima. Therefore, if it starts sufficiently near to the local maximum, it may
218 converge to it. Another obvious restriction is that it should be possible to compute the gradient of
219 a function at any point, thus it is preferable to have analytic expression for gradient and
220 computational burden should be born by the user.
221 
222 The latter responsibility is accompilished via the getGradient method of a
223 MinProblemSolver::Function interface (which represents function being optimized). This method takes
224 point a point in *n*-dimensional space (first argument represents the array of coordinates of that
225 point) and comput its gradient (it should be stored in the second argument as an array).
226 
227 @note class ConjGradSolver thus does not add any new methods to the basic MinProblemSolver interface.
228 
229 @note term criteria should meet following condition:
230 @code
231     termcrit.type == (TermCriteria::MAX_ITER + TermCriteria::EPS) && termcrit.epsilon > 0 && termcrit.maxCount > 0
232     // or
233     termcrit.type == TermCriteria::MAX_ITER) && termcrit.maxCount > 0
234 @endcode
235  */
236 class CV_EXPORTS ConjGradSolver : public MinProblemSolver
237 {
238 public:
239     /** @brief This function returns the reference to the ready-to-use ConjGradSolver object.
240 
241     All the parameters are optional, so this procedure can be called even without parameters at
242     all. In this case, the default values will be used. As default value for terminal criteria are
243     the only sensible ones, MinProblemSolver::setFunction() should be called upon the obtained
244     object, if the function was not given to create(). Otherwise, the two ways (submit it to
245     create() or miss it out and call the MinProblemSolver::setFunction()) are absolutely equivalent
246     (and will drop the same errors in the same way, should invalid input be detected).
247     @param f Pointer to the function that will be minimized, similarly to the one you submit via
248     MinProblemSolver::setFunction.
249     @param termcrit Terminal criteria to the algorithm, similarly to the one you submit via
250     MinProblemSolver::setTermCriteria.
251     */
252     static Ptr<ConjGradSolver> create(const Ptr<MinProblemSolver::Function>& f=Ptr<ConjGradSolver::Function>(),
253                                       TermCriteria termcrit=TermCriteria(TermCriteria::MAX_ITER+TermCriteria::EPS,5000,0.000001));
254 };
255 
256 //! return codes for cv::solveLP() function
257 enum SolveLPResult
258 {
259     SOLVELP_UNBOUNDED    = -2, //!< problem is unbounded (target function can achieve arbitrary high values)
260     SOLVELP_UNFEASIBLE    = -1, //!< problem is unfeasible (there are no points that satisfy all the constraints imposed)
261     SOLVELP_SINGLE    = 0, //!< there is only one maximum for target function
262     SOLVELP_MULTI    = 1 //!< there are multiple maxima for target function - the arbitrary one is returned
263 };
264 
265 /** @brief Solve given (non-integer) linear programming problem using the Simplex Algorithm (Simplex Method).
266 
267 What we mean here by "linear programming problem" (or LP problem, for short) can be formulated as:
268 
269 \f[\mbox{Maximize } c\cdot x\\
270  \mbox{Subject to:}\\
271  Ax\leq b\\
272  x\geq 0\f]
273 
274 Where \f$c\f$ is fixed `1`-by-`n` row-vector, \f$A\f$ is fixed `m`-by-`n` matrix, \f$b\f$ is fixed `m`-by-`1`
275 column vector and \f$x\f$ is an arbitrary `n`-by-`1` column vector, which satisfies the constraints.
276 
277 Simplex algorithm is one of many algorithms that are designed to handle this sort of problems
278 efficiently. Although it is not optimal in theoretical sense (there exist algorithms that can solve
279 any problem written as above in polynomial time, while simplex method degenerates to exponential
280 time for some special cases), it is well-studied, easy to implement and is shown to work well for
281 real-life purposes.
282 
283 The particular implementation is taken almost verbatim from **Introduction to Algorithms, third
284 edition** by T. H. Cormen, C. E. Leiserson, R. L. Rivest and Clifford Stein. In particular, the
285 Bland's rule <http://en.wikipedia.org/wiki/Bland%27s_rule> is used to prevent cycling.
286 
287 @param Func This row-vector corresponds to \f$c\f$ in the LP problem formulation (see above). It should
288 contain 32- or 64-bit floating point numbers. As a convenience, column-vector may be also submitted,
289 in the latter case it is understood to correspond to \f$c^T\f$.
290 @param Constr `m`-by-`n+1` matrix, whose rightmost column corresponds to \f$b\f$ in formulation above
291 and the remaining to \f$A\f$. It should containt 32- or 64-bit floating point numbers.
292 @param z The solution will be returned here as a column-vector - it corresponds to \f$c\f$ in the
293 formulation above. It will contain 64-bit floating point numbers.
294 @return One of cv::SolveLPResult
295  */
296 CV_EXPORTS_W int solveLP(const Mat& Func, const Mat& Constr, Mat& z);
297 
298 //! @}
299 
300 }// cv
301 
302 #endif
303