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