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