00001
00002
00003
00004
00005 #ifndef ALGORITHM_H
00006 #define ALGORITHM_H
00007
00008 class Data;
00009 class Variables;
00010 class Residuals;
00011 class LinearSystem;
00012 class Status;
00013 class OoqpMonitor;
00014 class OoqpStartStrategy;
00015 class ProblemFormulation;
00016
00026 class Solver
00027 {
00028 protected:
00029 OoqpMonitor * itsMonitors;
00030 Status *status;
00031 OoqpStartStrategy * startStrategy;
00032
00034 double dnorm;
00035
00037 double mutol, artol;
00038
00040 double gamma_f, gamma_a;
00041
00044 double phi;
00045
00047 int maxit;
00048
00050 double *mu_history;
00051
00054 double *rnorm_history;
00055
00057 double *phi_history;
00058
00061 double *phi_min_history;
00062
00063 public:
00064
00066 int iter;
00067
00068 Solver();
00069 virtual ~Solver();
00070
00072 virtual void start( ProblemFormulation * formulation,
00073 Variables * iterate, Data * prob,
00074 Residuals * resid, Variables * step);
00075
00077 virtual void defaultStart( ProblemFormulation * formulation,
00078 Variables * iterate, Data * prob,
00079 Residuals * resid, Variables * step);
00080
00082 virtual void stevestart ( ProblemFormulation * formulation,
00083 Variables * iterate, Data * prob,
00084 Residuals * resid, Variables * step );
00085
00089 virtual void dumbstart ( ProblemFormulation * formulation,
00090 Variables * iterate, Data * prob,
00091 Residuals * resid, Variables * step );
00092
00094 virtual int solve(Data *prob, Variables *iterate, Residuals * resids) = 0;
00095
00097 virtual double finalStepLength( Variables *iterate, Variables *step );
00098
00100 virtual void doMonitor( Data * data, Variables * vars,
00101 Residuals * resids,
00102 double alpha, double sigma,
00103 int i, double mu,
00104 int stop_code,
00105 int level );
00108 virtual void defaultMonitor( Data * data, Variables * vars,
00109 Residuals * resids,
00110 double alpha, double sigma,
00111 int i, double mu,
00112 int stop_code,
00113 int level ) = 0;
00114
00117 virtual int doStatus( Data * data, Variables * vars,
00118 Residuals * resids,
00119 int i, double mu,
00120 int level );
00121
00124 virtual int defaultStatus( Data * data, Variables * vars,
00125 Residuals * resids,
00126 int i, double mu,
00127 int level );
00128
00131 void addMonitor( OoqpMonitor * );
00132
00135 void useStatus( Status * s ) { status = s; }
00136
00139 void useStartStrategy( OoqpStartStrategy * s ) { startStrategy = s; }
00140
00142 void monitorSelf();
00143
00144 void setMuTol( double m ) { mutol = m; }
00145 double getMuTol() { return mutol; }
00146
00147 void setArTol( double ar ) { artol = ar; }
00148 double getArTol() { return artol; }
00149
00150 double dataNorm() { return dnorm; }
00153 LinearSystem * getLinearSystem() { return sys; };
00154 protected:
00155 LinearSystem *sys;
00156 };
00157
00159
00160 #endif
00161