00001
00002 #ifndef NLP
00003 #define NLP
00004
00018 #include "IotrRefCount.hh"
00019 #include "IotrHandle.hh"
00020 #include "LinearOperator.hh"
00021 #include <iostream>
00022
00023 class NlpIterate;
00024 class NlpResiduals;
00025 class NlpLinsys;
00026 class NlpLocalModel;
00027 class NlpValues;
00028 class NlpBounds;
00029 class NlpGrads;
00030 class NlpHessian;
00031 class GenMatrix;
00032 class Functional;
00033
00043 class Nlp : public IotrRefCount {
00044 public:
00048 virtual void initialize( IotrVector & rxlow, IotrVector & rxupp,
00049 IotrVector & rclow, IotrVector & rcupp,
00050 IotrVector & x, IotrVector & yz,
00051 double bignum,
00052 Functional * c) = 0;
00054 virtual NlpBounds * getBoundsPtr() = 0;
00056 virtual NlpBounds & bounds() = 0;
00057
00061 virtual NlpIterate * newVariables() = 0;
00062 virtual NlpIterate * initialVariables() = 0;
00063 virtual NlpResiduals * newResiduals() = 0;
00064 virtual NlpLinsys * newLinsys() = 0;
00065 virtual NlpValues * newValues() = 0;
00066 virtual NlpGrads * newGrads() = 0;
00067 virtual NlpHessian * newHessian() = 0;
00069
00070 virtual NlpLocalModel * localModelAt( NlpIterate & ) = 0;
00072 virtual void writeConfiguration( std::ostream & out, char indent[] ) = 0;
00074 virtual void inspect() = 0;
00075 };
00076 typedef Handle<Nlp> NlpHandle;
00077
00078
00080
00084 class NlpLocalModel : public IotrRefCount {
00085 public:
00087 virtual void updateValues( NlpValues & values ) = 0;
00089 virtual void updateGrads( NlpGrads & grads ) = 0;
00091 virtual void updateHessian( NlpHessian & hessian ) = 0;
00092 };
00093 typedef Handle<NlpLocalModel> NlpLocalModelHandle;
00094
00095
00097
00101 class NlpValues : public IotrRefCount {
00102 public:
00104 NlpValues() {}
00105
00106 virtual const IotrVector & c() const = 0;
00107
00108 virtual double obj() = 0;
00109
00110 virtual void inspect() = 0;
00111
00112 virtual void inspectAsMatlab() = 0;
00113 };
00114 typedef Handle<NlpValues> NlpValuesHandle;
00115
00116
00118
00122 class NlpGrads : public IotrRefCount {
00123 public:
00125 NlpGrads() {}
00127 virtual void getObjectiveGradient( IotrVector & g ) = 0;
00129 virtual void jacobianTransposeMult( double alpha, IotrVector & x,
00130 double beta, IotrVector & y ) = 0;
00131 virtual void jacobianTransposeMult( double alpha, IotrVector & y,
00132 IotrVector & lambda, IotrVector & pi,
00133 IotrVector & gamma, IotrVector & phi,
00134 double beta, IotrVector & x ) = 0;
00135
00137 virtual void jacobianMult( double alpha, IotrVector & x,
00138 double beta, IotrVector & y ) = 0;
00139
00141 virtual void condensedJacobianMult( double alpha, IotrVector & x,
00142 double beta, IotrVector & y ) = 0;
00143
00144 virtual void inspect() = 0;
00145 virtual void inspectAsMatlab() = 0;
00146 };
00147 typedef Handle<NlpGrads> NlpGradsHandle;
00148
00149
00151
00154 class NlpJacobianMult : public LinearOperator {
00155 protected:
00156 NlpGradsHandle mGrads;
00157 public:
00158 NlpJacobianMult( NlpGrads * grads );
00159
00160 virtual void mult( double alpha, IotrVector & x,
00161 double beta, IotrVector & y );
00162 };
00163 typedef Handle<NlpJacobianMult> NlpJacobianMultHandle;
00164
00165
00170 class NlpHessian : public IotrRefCount {
00171 public:
00173 NlpHessian() {}
00174
00175 virtual double lowerBoundEigenvalue() = 0;
00176 virtual void mult(double alpha, IotrVector & x,
00177 double beta, IotrVector & y ) = 0;
00178 virtual void inspect() = 0;
00179 virtual void inspectAsMatlab() = 0;
00180 };
00181 typedef Handle<NlpHessian> NlpHessianHandle;
00182
00183
00184
00185 #endif