/* macopt library release 1.1 gradient-based optimizer
Copyright (c) 2002 David J.C. MacKay and Steve Waterhouse
This library is free software; you can redistribute it and/or
modify it under the terms of the GNU Lesser General Public
License as published by the Free Software Foundation; either
version 2.1 of the License, or (at your option) any later version.
This library 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
Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public
License along with this library; if not, write to the Free Software
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
GNU licenses are here :
http://www.gnu.org/licenses/licenses.html
Author contact details are here :
http://www.inference.phy.cam.ac.uk/mackay/c/macopt.html mackay@mrao.cam.ac.uk
*/
#ifndef MACOPT_H
#define MACOPT_H
class Macopt
{
public:
Macopt(int _n,
int _verbose = 0,
double _tolerance = 0.001,
int _itmax = 100,
int _rich = 1);
virtual ~Macopt();
void macoptII(double *p, int dim );
void maccheckgrad(double *p, int n, double epsilon, int stopat);
protected:
virtual double func(double* _p) = 0;
virtual void dfunc(double* _p, double* _xi) = 0;
int a_n; /* dimension of parameter space */
private:
double maclinminII(double *p);
double macprodII (double * , double * , double ) ;
void macopt_restart ( int ) ;
private:
double a_tol ; /* convergence declared when the gradient vector is smaller
in magnitude than this, or when the mean absolute
step is less than this (see above) */
double a_grad_tol_tiny ; /* if gradient is less than this, we definitely
stop, even if we are not using a gradient
tolerance */
double a_step_tol_tiny ; /* if step is less than this, we stop, even if
we are not using a step tolerance */
int a_end_if_small_step ; /* defines the role of tol -- alternative is
end_on_small_grad */
int a_its ; /* number of its */
int a_itmax ; /* max */
int a_rich ; /* whether to do the extra gradient evaluation at the beginning
of each new line min */
int a_verbose ;
double a_stepmax ; /* largest step permitted (not used in macopt) */
int a_linmin_maxits ; /* in maclinmin */
double a_linmin_g1 ; /* factors for growing and shrinking the interval */
double a_linmin_g2 ;
double a_linmin_g3 ;
double a_lastx ; /* keeps track of typical step length */
double a_lastx_default ; /* if maclinmin is reset, lastx is set to this */
/* These should not be touched by the user. They are handy pointers for macopt
to use
*/
double a_gtyp ; /* stores the rms gradient for linmin */
double *a_pt , *a_gx , *a_gy , *a_gunused ;
double *a_xi , *a_g , *a_h ;
int a_restart ; /* whether to restart macopt - fresh cg directions */
/* a_lastx :--- 1.0 might make general sense, (cf N.R.)
but the best setting of all is to have
a prior idea of the eigenvalues. If
the objective function is equal to sum of N
terms then set this to 1/N, for example
Err on the small side to be conservative. */
};
#endif