00001 #ifndef PLAYA_OPT_STATE_H
00002 #define PLAYA_OPT_STATE_H
00003
00004
00005 #include "PlayaVectorDecl.hpp"
00006
00007 namespace Playa
00008 {
00009
00010
00011
00012
00013
00014 enum OptStatus
00015 {
00016 Opt_Continue,
00017 Opt_Converged,
00018 Opt_DirectionFailure,
00019 Opt_ExceededMaxiters,
00020 Opt_LineSearchFailed,
00021 Opt_Crashed
00022 };
00023
00024
00025 inline std::ostream& operator<<(std::ostream& os, const OptStatus& s)
00026 {
00027 switch (s)
00028 {
00029 case Opt_Continue:
00030 os << "Opt_Continue"; break;
00031 case Opt_Converged:
00032 os << "Opt_Converged"; break;
00033 case Opt_DirectionFailure:
00034 os << "Opt_DirectionFailure"; break;
00035 case Opt_ExceededMaxiters:
00036 os << "Opt_ExceededMaxiters"; break;
00037 case Opt_LineSearchFailed:
00038 os << "Opt_LineSearchFailed"; break;
00039 default:
00040 os << "Opt_Crashed";
00041 }
00042 return os;
00043 }
00044
00045
00046
00047
00048
00049
00050 class OptState
00051 {
00052 public:
00053
00054 OptState(const Vector<double>& xCur,
00055 const double& fCur,
00056 const Vector<double>& gradCur);
00057
00058
00059 OptStatus status() const {return status_;}
00060
00061
00062 void setStatus(const OptStatus status) {status_ = status;}
00063
00064
00065 int iter() const {return iter_;}
00066
00067
00068 double fCur() const {return fCur_;}
00069
00070
00071 double fPrev() const {return fPrev_;}
00072
00073
00074 Vector<double> xCur() const {return xCur_;}
00075
00076
00077 Vector<double> xPrev() const {return xPrev_;}
00078
00079
00080 Vector<double> gradCur() const {return gradCur_;}
00081
00082
00083 Vector<double> gradPrev() const {return gradPrev_;}
00084
00085
00086 void update(const Vector<double>& xNew, const Vector<double>& gradNew,
00087 const double& fNew);
00088
00089 private:
00090 OptStatus status_;
00091 int iter_;
00092
00093 Vector<double> xCur_;
00094 Vector<double> xPrev_;
00095
00096 Vector<double> gradCur_;
00097 Vector<double> gradPrev_;
00098
00099 double fCur_;
00100 double fPrev_;
00101
00102 };
00103
00104 }
00105
00106 #endif
00107