Diana  0.8.3
DianaDynamicNLPTask.hpp
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