Diana
0.8.3
|
00001 /* ----------------------------------------------------------------------------- 00002 * Diana process modelling, simulation and analysis software 00003 * Copyright (c) 2006, Sergiy Gogolenko 00004 * e-mail: gogolenk@mpi-magdeburg.mpg.de 00005 * All rights reserved. 00006 * ----------------------------------------------------------------------------- 00007 * $Id: DianaDynamicNLPTask.hpp Mon Oct 9 14:49:07 2006 gogolenk $ 00008 * ----------------------------------------------------------------------------- 00009 * Written under: i586-suse-linux 00010 * ----------------------------------------------------------------------------- 00011 * Last update: Mon Oct 9 14:49:07 2006 00012 * ----------------------------------------------------------------------------- 00013 * Description: 00014 */ 00015 #ifndef DIANADYNAMICNLPTASK_HPP 00016 #define DIANADYNAMICNLPTASK_HPP 00017 00018 #include <CapeOpen.hpp> 00019 #include "DianaNLPTask.hpp" 00020 #include "DianaBasicNLPTask.hpp" 00021 00022 namespace Numeric { 00023 namespace Solvers { 00024 namespace NLPTasks { 00025 00026 enum eEstimatedParameterType { 00027 DIANA_PARAMETER = 0, 00028 DIANA_INITSTATE = 1, 00029 DIANA_FREEPAR = 2 00030 }; 00031 00032 // Forward declaration of interface 00033 class DianaDynamicNLPTask; 00034 class BasicDynamicNLPTask; 00035 00037 typedef std::vector<DianaDynamicNLPTask*> ArrayDynamicNLPTask; 00038 00042 class DianaDynamicNLPTask : virtual public DianaNLPTask, virtual public Numeric::Solvers::NLPTasks::ICapeDynamicOptimizationTask { 00043 public: 00045 DianaDynamicNLPTask(Numeric::Solvers::Solver::ICapeNumericSolver* _solver = NULL, 00046 Numeric::Solvers::Model::ICapeNumericContinuousModel* _model = NULL); 00047 00049 virtual ~DianaDynamicNLPTask(); 00050 00052 inline Numeric::Solvers::Model::ICapeNumericContinuousModel* GetModel() 00053 throw(Common::Error::ECapeUnknown) { 00054 return this->pModel; 00055 } 00056 00058 inline Numeric::Solvers::Solver::ICapeNumericSolver* GetIntegrator() 00059 throw(Common::Error::ECapeUnknown) { 00060 return this->pSolver; 00061 } 00062 00063 protected: 00067 virtual void ExtractParams(const Numeric::Solvers::NLPTasks::Parameters::ICapeOptimizationPoint& _parVals) 00068 throw(Common::Error::ECapeUnknown); 00069 00071 Common::Types::CapeString makeVarName(Common::Types::CapeString name, int idxAmount, ...) 00072 throw (Common::Error::ECapeUnknown); 00073 00074 protected: 00075 Numeric::Solvers::Solver::ICapeNumericSolver* pSolver; 00076 ICapeNumericContinuousModel* pModel; 00077 Numeric::Solvers::Eso::ICapeNumericESO* pESO; 00078 00079 CapeArrayDouble arrDefaultStateVars; 00080 00081 Common::Types::CapeBoolean bUsedExternalModelAndSolver; 00082 }; 00083 00087 class BasicDynamicNLPTask : public DianaDynamicNLPTask, public BasicNLPTask { 00088 public: 00092 BasicDynamicNLPTask(Numeric::Solvers::Solver::ICapeNumericSolver* _solver, 00093 Numeric::Solvers::Model::ICapeNumericContinuousModel* _model); 00094 00101 BasicDynamicNLPTask(Diana::IDianaMain* _dianaMain, Common::Types::CapeString _solverName, 00102 Numeric::Solvers::Model::ICapeNumericContinuousModel* _model); 00103 00105 virtual ~BasicDynamicNLPTask(); 00106 00107 00111 virtual void AddEstimatedParameter(const Common::Parameter::ICapeParameterSpec* pSpecValue, 00112 eEstimatedParameterType eptTypeOfUnknown = DIANA_PARAMETER) 00113 throw(Common::Error::ECapeUnknown, Common::Error::ECapeInvalidArgument); 00114 00118 virtual void AddEstimatedParameter(const Common::Types::CapeString strName, 00119 eEstimatedParameterType eptTypeOfUnknown = DIANA_PARAMETER) 00120 throw(Common::Error::ECapeUnknown, Common::Error::ECapeInvalidArgument); 00121 00125 virtual void AddEstimatedParameter(const Common::Types::CapeLong nIndex, 00126 eEstimatedParameterType eptTypeOfUnknown = DIANA_PARAMETER) 00127 throw(Common::Error::ECapeUnknown, Common::Error::ECapeInvalidArgument); 00128 00130 virtual Common::Types::CapeDouble CalcObjFunction() 00131 throw(Common::Error::ECapeUnknown, Common::Error::ECapeSolvingError); 00132 00145 virtual void Initialize() 00146 throw (Common::Error::ECapeUnknown, Common::Error::ECapeFailedInitialisation, 00147 Common::Error::ECapeOutOfResources, Common::Error::ECapeLicenceError, 00148 Common::Error::ECapeBadInvOrder); 00149 00151 virtual Common::Types::CapeArrayDouble GetObjFunctionGradient() 00152 throw(Common::Error::ECapeUnknown); 00153 00155 Common::Types::CapeLong GetModelParametersCount() const; 00156 00158 Common::Types::CapeLong GetModelStateVarsCount() const; 00159 00161 Common::Types::CapeLong GetFreeParametersCount() const; 00162 00163 protected: 00165 virtual Common::Types::CapeDouble EvaluateObjFunction() 00166 throw(Common::Error::ECapeUnknown, Common::Error::ECapeSolvingError); 00167 00172 void Init(Diana::IDianaMain* _dianaMain, Common::Types::CapeString _solverName, 00173 Numeric::Solvers::Model::ICapeNumericContinuousModel* _model); 00174 00176 void Init(Numeric::Solvers::Solver::ICapeNumericSolver* _solver, 00177 Numeric::Solvers::Model::ICapeNumericContinuousModel* _model); 00178 00182 virtual void ExtractParams(const Numeric::Solvers::NLPTasks::Parameters::ICapeOptimizationPoint& _parVals) 00183 throw(Common::Error::ECapeUnknown); 00184 00185 protected: 00186 /* Lists of unknowns */ 00187 Common::Parameter::CapeArrayParameter arrEstimatedInitStates; 00188 Common::Parameter::CapeArrayParameter arrEstimatedParameters; 00189 Common::Parameter::CapeArrayParameter arrEstimatedFreeParams; 00190 00191 Common::Types::CapeBoolean bInitialized; 00192 }; 00193 00194 } 00195 } 00196 } 00197 00198 #endif 00199