Home | History | Annotate | Download | only in core
      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:
     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