00001 #ifndef NLPSIMPLE
00002 #define NLPSIMPLE
00003
00017 #include "IotrRefCount.hh"
00018 #include "IotrHandle.hh"
00019 #include "NlpBounds.hh"
00020 #include "Nlp.hh"
00021
00022 class NlpIterate;
00023 class NlpResiduals;
00024 class NlpLinsys;
00025 class NlpLocalModel;
00026 class NlpValues;
00027 class NlpGrads;
00028 class NlpHessian;
00029 class GenMatrix;
00030 class Functional;
00031 class IotrMask;
00032
00033 typedef Handle<Functional> FunctionalHandle;
00034 typedef Handle<NlpBounds> NlpBoundsHandle;
00035 typedef Handle<GenMatrix> GenMatrixHandle;
00036 typedef Handle<IotrMask> IotrMaskHandle;
00037
00042 class NlpSimple : public Nlp {
00043 private:
00044 void initializeBounds( IotrVector & rxlow, IotrVector & rxupp,
00045 IotrVector & rclow, IotrVector & rcupp,
00046 double bignum );
00047 protected:
00049 NlpBoundsHandle mBounds;
00051 FunctionalHandle mRawFunctional;
00052 ElementGatherHandle mIxfixed, mXfilter;
00053 IotrMaskHandle mXmask;
00054 IotrVectorHandle mFixed;
00055
00056 IotrVectorHandle mRawX, mYz;
00057 public:
00058 NlpSimple();
00059 virtual void initialize( IotrVector & rxlow, IotrVector & rxupp,
00060 IotrVector & rclow, IotrVector & rcupp,
00061 IotrVector & x, IotrVector & yz,
00062 double bignum,
00063 Functional * c);
00064
00066 virtual NlpBounds * getBoundsPtr();
00067 virtual NlpBounds & bounds();
00068 NlpBounds & rawBounds() { return *mBounds; }
00069
00073 virtual NlpIterate * newVariables();
00074 virtual NlpIterate * initialVariables();
00075 virtual NlpResiduals * newResiduals();
00076 virtual NlpLinsys * newLinsys();
00077 virtual NlpValues * newValues();
00078 virtual NlpGrads * newGrads();
00079 virtual NlpHessian * newHessian();
00081
00082 virtual NlpLocalModel * localModelAt( NlpIterate & );
00083 virtual void inspect();
00084 virtual void writeConfiguration( std::ostream & out, char indent[] );
00085 };
00086 typedef Handle<NlpSimple> NlpSimpleHandle;
00087
00088
00089 class IotrVector;
00090 class EvaluationContext;
00091 class SymMatrix;
00092 class IotrMask;
00093
00094 typedef Handle<IotrVector> IotrVectorHandle;
00095 typedef Handle<IotrMask> IotrMaskHandle;
00096 typedef Handle<EvaluationContext> EvaluationContextHandle;
00097 typedef Handle<SymMatrix> SymMatrixHandle;
00098
00103 class NlpSimpleLocalModel : public NlpLocalModel {
00104 protected:
00106 EvaluationContextHandle mEc;
00107
00108 public:
00109 NlpSimpleLocalModel( EvaluationContext * ec );
00115 virtual void updateValues( NlpValues & values );
00117 virtual void updateGrads( NlpGrads & grads );
00119 virtual void updateHessian( NlpHessian & hessian );
00121 };
00122
00129 class NlpSimpleValues : public NlpValues {
00130 friend class NlpSimpleLocalModel;
00131 protected:
00133 IotrVectorHandle mC;
00135 double mObj;
00136 public:
00138 NlpSimpleValues( IotrVector * c );
00139
00140 virtual const IotrVector & c() const;
00142 virtual double obj();
00143
00144 virtual void inspect();
00145 virtual void inspectAsMatlab();
00146 };
00147
00153 class NlpSimpleGrads : public NlpGrads {
00154 friend class NlpSimpleLocalModel;
00155 protected:
00157 IotrVectorHandle mRawG, mYz;
00159 GenMatrixHandle mJ;
00160
00161 ElementGatherHandle mXfilter;
00162 NlpBoundsHandle mBounds;
00163 public:
00165 NlpSimpleGrads( IotrVector * rawG, IotrVector * yz, GenMatrix * J,
00166 ElementGather * aXfilter, NlpBounds * bounds );
00167
00168 GenMatrix & J() { return *mJ; }
00169 virtual LinearOperator * condensedJacobianOperator();
00170
00172 virtual void getObjectiveGradient( IotrVector & g );
00174 virtual void jacobianTransposeMult( double alpha, IotrVector & x,
00175 double beta, IotrVector & y );
00176 virtual void jacobianTransposeMult( double alpha, IotrVector & y,
00177 IotrVector & lambda, IotrVector & pi,
00178 IotrVector & gamma, IotrVector & phi,
00179 double beta, IotrVector & x );
00180
00182 virtual void jacobianMult( double alpha, IotrVector & x,
00183 double beta, IotrVector & y );
00184
00186 virtual void condensedJacobianMult( double alpha, IotrVector & x,
00187 double beta, IotrVector & y );
00188
00189 virtual void inspect();
00190 virtual void inspectAsMatlab();
00191 };
00192
00197 class NlpSimpleHessian : public NlpHessian {
00198 friend class NlpSimpleLocalModel;
00199 protected:
00201 SymMatrixHandle mH;
00202 IotrMaskHandle mXmask;
00203 public:
00205 NlpSimpleHessian( SymMatrix * H, IotrMask * aMask );
00207 SymMatrix & H() { return *mH; }
00208 virtual double lowerBoundEigenvalue();
00209 virtual void mult( double alpha, IotrVector & x,
00210 double beta, IotrVector & y );
00211 virtual void inspect();
00212 virtual void inspectAsMatlab();
00213 };
00214
00215 typedef Handle<NlpSimpleLocalModel> NlpSimpleLocalModelHandle;
00216 typedef Handle<NlpSimpleValues> NlpSimpleValuesHandle;
00217 typedef Handle<NlpSimpleGrads> NlpSimpleGradsHandle;
00218 typedef Handle<NlpSimpleHessian> NlpSimpleHessianHandle;
00219
00220 #endif
00221