// // $Source: /cvsroot/gambit/gambit/sources/tools/liap/funcmin.h,v $ // $Date: 2006/01/07 06:37:34 $ // $Revision: 1.4 $ // // DESCRIPTION: // Interface to N-dimensional function minimization routines // // This file is part of Gambit // Copyright (c) 2002, The Gambit Project // // This program is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation; either version 2 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. // #ifndef GFUNCMIN_H #define GFUNCMIN_H #include "libgambit/vector.h" template class gFunction { public: virtual ~gFunction() { } virtual T Value(const Gambit::Vector &) const = 0; }; template class gC1Function : public gFunction { public: virtual ~gC1Function() { } virtual bool Gradient(const Gambit::Vector &, Gambit::Vector &) const = 0; }; class gbtFuncMinError : public Gambit::Exception { public: virtual ~gbtFuncMinError() { } std::string GetDescription(void) const { return "Internal error in minimization code"; } }; // // gFunctionMinimizer is an abstract base class for function minimization // class gFunctionMinimizer { public: virtual ~gFunctionMinimizer() { } virtual void Set(const gC1Function &fdf, const Gambit::Vector &x, double &f, Gambit::Vector &gradient, double step_size, double p_tol) = 0; virtual void Restart(void) = 0; virtual bool Iterate(const gC1Function &fdf, Gambit::Vector &x, double &f, Gambit::Vector &gradient, Gambit::Vector &dx) = 0; }; // // gConjugatePR: implements Polak-Ribiere conjugate gradient descent // class gConjugatePR : public gFunctionMinimizer { private: int iter; double step; double max_step; double tol; Gambit::Vector x1; Gambit::Vector dx1; Gambit::Vector x2; double pnorm; Gambit::Vector p; double g0norm; Gambit::Vector g0; public: gConjugatePR(int n); virtual ~gConjugatePR() { } void Set(const gC1Function &fdf, const Gambit::Vector &x, double &f, Gambit::Vector &gradient, double step_size, double p_tol); void Restart(void); bool Iterate(const gC1Function &fdf, Gambit::Vector &x, double &f, Gambit::Vector &gradient, Gambit::Vector &dx); }; class gFuncMinException { }; #endif // GFUNCMIN_H