Diana  0.8.3
DianaParameterFittingTask.hpp
00001 #ifndef DIANA_PARAMETERFITTINGTASK_HPP
00002 #define DIANA_PARAMETERFITTINGTASK_HPP
00003 
00004 #include <CapeOpen.hpp>
00005 
00006 #ifdef _MSC_VER
00007 #include <direct.h>
00008 #define popen _popen
00009 #define pclose _pclose
00010 #endif
00011 
00012 
00013 namespace Numeric {
00014   namespace Solvers {
00015     namespace NLPTasks {
00016 
00017       // Forward declaration of interfaces
00018       class DianaParameterFittingTask;
00019       class ParameterFittingTask;
00020       class SensParameterFittingTask;
00021       class ParameterFittingTaskReport;
00022 
00023 
00025       typedef std::vector<DianaParameterFittingTask*> ArrayDianaParameterFittingTask;
00027       typedef std::vector<ParameterFittingTask*> ArrayParameterFittingTask;
00029       typedef std::vector<SensParameterFittingTask*> ArraySensParameterFittingTask;
00030 
00032       typedef std::vector<Common::Types::CapeArrayDouble> DianaNLPFullMatrixDouble;
00033 
00034 
00038       class IDianaSensitivityTaskCreator {
00039       public:
00041         virtual Numeric::Solvers::NLPTasks::ICapeNLPTask* GetSensitivityTask()
00042           throw(Common::Error::ECapeInvalidArgument, Common::Error::ECapeUnknown) = 0;
00043       };
00044 
00045 
00046 
00050       class DianaParameterFittingTask : public DianaDynamicNLPTask, virtual public IDianaNLPTaskReporting {
00051       public:
00052 
00054         DianaParameterFittingTask(const Common::NLPData::CapeMeasuredData* _expdata, 
00055                                   Numeric::Solvers::Solver::ICapeNumericSolver* _solver = NULL,
00056                                   Numeric::Solvers::Model::ICapeNumericContinuousModel* _model = NULL,
00057                                   IDianaMain* _dianaMain = NULL,
00058                                   CapeString _solverName = NULL);
00059 
00061         virtual ~DianaParameterFittingTask();
00062 
00064         virtual void SetNLPParameters(Parameters::ICapeOptimizationPoint* _pars) 
00065           throw(Common::Error::ECapeUnknown) { DianaNLPTask::SetNLPParameters(_pars); isPrepearedStatesMatrix = false; };
00066 
00068         inline const Common::NLPData::CapeMeasuredData* GetExpData() throw(Common::Error::ECapeUnknown) { return pExpData; };
00069 
00071         void SetFittingInterval(Common::Types::CapeDouble _startTime, Common::Types::CapeDouble _endTime) 
00072           throw (Common::Error::ECapeUnknown);
00073 
00075         virtual CapeLong GetFixedSoughtParamsCount() = 0;
00076 
00078         virtual CapeLong GetStateSoughtParamsCount() = 0;
00079 
00082         void SetStoringStateVariables(const CapeArrayString &names);
00083 #ifndef SWIG    
00084 
00086         void SetStoringStateVariables(const CapeArrayLong &indices);
00087 #endif
00088 
00089         inline const DianaNLPFullMatrixDouble& GetStoredStates() {
00090           return statesMatrix;
00091         }
00092 
00094         inline Numeric::Solvers::Eso::ICapeNumericESO* GetActiveESO() 
00095           throw(Common::Error::ECapeUnknown) { 
00096           return this->pOldESO; 
00097         }
00098 
00099         // methods for outputting parameterfitting results (TODO: make a report for tasks)
00101         void EnableOutput(const Common::Types::CapeString& stream_name)
00102           throw(Common::Error::ECapeUnknown);
00104         void DisableOutput();
00105 
00108         void SetOutputStateVariables(const CapeArrayString &names);
00109 
00112         void SetReportingInterface(ParameterFittingTaskReport* _pReportingInterface);
00113 
00116         void Output(Diana::SolverEvents event) throw (Common::Error::ECapeUnknown, Common::Error::ECapeInvalidArgument, Common::Error::ECapeFailedInitialisation);
00117 
00118         ICapeNumericESO* GetOldESO () { return pOldESO; }
00119 
00120       protected:
00122         inline Common::Types::CapeBoolean IsInFittingTimeInterval(Common::Types::CapeDouble dblVal) const { 
00123           return ((this->dblStartTime <= dblVal) && (this->dblEndTime >= dblVal)); 
00124         }
00125 
00127         void StorePointVariable(const Common::Types::CapeArrayDouble& _vars) {
00128           statesMatrix.push_back(_vars);
00129         }
00130 
00131       protected:
00132         /* Information for solver's creation */
00133         Diana::IDianaMain* dianaMain;                           
00134         Common::Types::CapeString strSolverLibrary;             
00135 
00136         const Common::NLPData::CapeMeasuredData* pExpData;      
00137 
00138         Common::Types::CapeBoolean isPrepearedStatesMatrix;     
00139         DianaNLPFullMatrixDouble statesMatrix;                  
00140         Common::Types::CapeArrayLong statesIndices;             
00141 
00142         Common::Types::CapeDouble dblStartTime;                 
00143         Common::Types::CapeDouble dblEndTime;                   
00144 
00145         Common::Types::CapeBoolean enabledOutput;               
00146         FILE *out_stream;                                       
00147         Common::Types::CapeArrayLong idxOutStates;              
00148 
00149         ICapeNumericESO* pOldESO;                               
00150 
00151         ParameterFittingTaskReport* report;                     
00152 
00153         Common::Types::CapeBoolean bInitialized;                
00154 
00155       };
00156 
00157 
00161       class ParameterFittingTask : public DianaParameterFittingTask, public IDianaSensitivityTaskCreator {
00162       public:
00163 
00170         ParameterFittingTask(ICapeNumericSolver* _solver, ICapeNumericContinuousModel* _model, const Common::NLPData::CapeMeasuredData* _expdata,
00171                              const Common::Parameter::CapeArrayParameterSpec& _fixedSoughtParams, 
00172                              const Common::Parameter::CapeArrayParameterSpec& _stateSoughtParams) throw(Common::Error::ECapeInvalidArgument, Common::Error::ECapeUnknown);
00173 
00179         ParameterFittingTask(ICapeNumericSolver* _solver, ICapeNumericContinuousModel* _model, const Common::NLPData::CapeMeasuredData* _expdata,
00180                              const Common::Parameter::CapeArrayParameterSpec& _fixedSoughtParams) throw(Common::Error::ECapeInvalidArgument, Common::Error::ECapeUnknown);
00181 
00182 
00190         ParameterFittingTask(IDianaMain* _dianaMain, CapeString _solverName, ICapeNumericContinuousModel* _model, const Common::NLPData::CapeMeasuredData* _expdata,
00191                              const Common::Parameter::CapeArrayParameterSpec& _fixedSoughtParams, 
00192                              const Common::Parameter::CapeArrayParameterSpec& _stateSoughtParams) throw(Common::Error::ECapeInvalidArgument, Common::Error::ECapeUnknown);
00193 
00200         ParameterFittingTask(IDianaMain* _dianaMain, CapeString _solverName, ICapeNumericContinuousModel* _model, const Common::NLPData::CapeMeasuredData* _expdata,
00201                              const Common::Parameter::CapeArrayParameterSpec& _fixedSoughtParams) throw(Common::Error::ECapeInvalidArgument, Common::Error::ECapeUnknown);
00202 
00204         virtual ~ParameterFittingTask();
00205 
00207         virtual eCapeNLPTaskType Type() const { return CAPE_NULLRANGE; }
00208 
00210         virtual CapeDouble CalcObjFunction() 
00211           throw(Common::Error::ECapeUnknown, Common::Error::ECapeSolvingError);
00212 
00214         virtual inline CapeLong GetFixedSoughtParamsCount() { return soughtParams.Count() - cntStateSoughtParams; };
00215 
00217         virtual inline CapeLong GetStateSoughtParamsCount() { return cntStateSoughtParams; };
00218 
00220         virtual const Common::Types::CapeString& GetComponentName() const
00221           throw (Common::Error::ECapeUnknown);
00222 
00224         virtual const Common::Types::CapeString& GetComponentDescription() const
00225           throw (Common::Error::ECapeUnknown);
00226 
00228         Numeric::Solvers::NLPTasks::ICapeNLPTask* GetSensitivityTask()
00229           throw(Common::Error::ECapeInvalidArgument, Common::Error::ECapeUnknown);
00230 
00231       private:
00234         void ExtractParams(const Numeric::Solvers::NLPTasks::Parameters::ICapeOptimizationPoint& _parVals)
00235           throw(Common::Error::ECapeUnknown);
00236 
00238         inline Common::Types::CapeBoolean IsInFittingTimeInterval(Common::Types::CapeDouble dblVal) const { return ((this->dblStartTime <= dblVal) && (dblEndTime >= dblVal)); };
00239 
00241         void InitTask(const Common::Parameter::CapeArrayParameterSpec* _fixedSoughtParams, 
00242                       const Common::Parameter::CapeArrayParameterSpec* _stateSoughtParams) throw(Common::Error::ECapeInvalidArgument, Common::Error::ECapeUnknown);
00243 
00245         virtual void InitTask(IDianaMain* _dianaMain, CapeString _solverName, ICapeNumericContinuousModel* _model, 
00246                               const  Common::Parameter::CapeArrayParameterSpec* _fixedSoughtParams, 
00247                               const  Common::Parameter::CapeArrayParameterSpec* _stateSoughtParams)
00248           throw(Common::Error::ECapeUnknown){}
00250         virtual void InitTask(IDianaMain* _dianaMain, CapeString _solverName, ICapeNumericContinuousModel* _model, 
00251                               const CapeArrayString* _fixedSoughtParams, const CapeArrayString* _stateSoughtParams)
00252           throw(Common::Error::ECapeUnknown){}
00254         virtual void InitTask(IDianaMain* _dianaMain, CapeString _solverName, ICapeNumericContinuousModel* _model, 
00255                               const CapeArrayLong* _fixedSoughtParams, const CapeArrayLong* _stateSoughtParams)
00256           throw(Common::Error::ECapeUnknown){}
00257 
00270         virtual void Initialize()
00271           throw(Common::Error::ECapeUnknown, Common::Error::ECapeFailedInitialisation,
00272                 Common::Error::ECapeOutOfResources, Common::Error::ECapeLicenceError,
00273                 Common::Error::ECapeBadInvOrder);
00274 
00275       private:
00276 
00277         Common::Types::CapeString                    strName;              
00278         Common::Types::CapeString                    strDescription;       
00279 
00280         CapeLong cntStateSoughtParams;              
00281       };
00282 
00283 
00287       class SensParameterFittingTask : public DianaParameterFittingTask, public ICapeSensNLPTask {
00288       public:
00289 #ifndef SWIG
00290 
00295         SensParameterFittingTask(Numeric::Solvers::Solver::ICapeNumericSolver* _solver, 
00296                                  Diana::IDianaContinuousModel* _model, 
00297                                  Common::NLPData::CapeMeasuredData* _expdata);
00298 #endif
00299 
00305         SensParameterFittingTask(Diana::IDianaMain* _dianaMain, Common::Types::CapeString _solverName, 
00306                                  Numeric::Solvers::Model::ICapeNumericContinuousModel* _model, 
00307                                  const Common::NLPData::CapeMeasuredData* _expdata);
00308 
00315         SensParameterFittingTask(Diana::IDianaMain* _dianaMain, Common::Types::CapeString _solverName, 
00316                                  Numeric::Solvers::Model::ICapeNumericContinuousModel* _model, 
00317                                  const Common::NLPData::CapeMeasuredData* _expdata, const Common::Collection::ICapeCollection *pars);
00318 
00320         virtual ~SensParameterFittingTask();
00321 
00325         virtual void AddEstimatedParameterBySpec(const Common::Parameter::ICapeParameterSpec* pSpecValue, 
00326                                                  eEstimatedParameterType eptTypeOfUnknown = DIANA_PARAMETER)
00327           throw(Common::Error::ECapeUnknown, Common::Error::ECapeInvalidArgument);
00328 
00332         virtual void AddEstimatedParameterByName(const Common::Types::CapeString strName, 
00333                                                  eEstimatedParameterType eptTypeOfUnknown = DIANA_PARAMETER)
00334           throw(Common::Error::ECapeUnknown, Common::Error::ECapeInvalidArgument);
00335 
00339         virtual void AddEstimatedParameterByIndex(const Common::Types::CapeLong nIndex, 
00340                                                   eEstimatedParameterType eptTypeOfUnknown = DIANA_PARAMETER)
00341           throw(Common::Error::ECapeUnknown, Common::Error::ECapeInvalidArgument);
00342 
00344         inline Common::Types::CapeLong GetFixedSoughtParamsCount() { 
00345           return arrEstimatedParameters.size(); // dynamic_cast<Diana::DianaSensDAESO*>(pESO)->GetNumSensParameters(); 
00346         }
00347 
00349         inline Common::Types::CapeLong GetStateSoughtParamsCount() { 
00350           return arrEstimatedInitStates.size(); // dynamic_cast<Diana::DianaSensDAESO*>(pESO)->GetNumSensInitStates(); 
00351         }
00352 
00354         virtual eCapeNLPTaskType Type()  const { return CAPE_FIRSTRANGE; }
00355 
00358         virtual Common::Types::CapeDouble CalcObjFunction() 
00359           throw(Common::Error::ECapeUnknown, Common::Error::ECapeSolvingError);
00360 
00368         virtual Common::Types::CapeArrayDouble GetObjFunctionGradient() 
00369           throw(Common::Error::ECapeUnknown, Common::Error::ECapeSolvingError);
00370 
00372         void ExecuteAllCalculations() 
00373           throw(Common::Error::ECapeUnknown, Common::Error::ECapeSolvingError);
00374 
00379         virtual const Diana::DianaSparseArray& GetConstraintsJacobian(ConstraintType _type)
00380           throw(Common::Error::ECapeUnknown, Common::Error::ECapeSolvingError);
00381 
00394         virtual void Initialize()
00395           throw(Common::Error::ECapeUnknown, Common::Error::ECapeFailedInitialisation,
00396                 Common::Error::ECapeOutOfResources, Common::Error::ECapeLicenceError,
00397                 Common::Error::ECapeBadInvOrder);
00398 
00400         inline const Common::Types::CapeString& GetComponentName() const
00401           throw (Common::Error::ECapeUnknown) {
00402           return this->strName;
00403         }
00404 
00406         inline const Common::Types::CapeString& GetComponentDescription() const
00407           throw (Common::Error::ECapeUnknown) {
00408           return this->strDescription;
00409         }
00410 
00413         void SetComponentName(const Common::Types::CapeString& _name)
00414           throw(Common::Error::ECapeUnknown, Common::Error::ECapeInvalidArgument);
00415 
00418         void SetComponentDescription(const Common::Types::CapeString& _description)
00419           throw (Common::Error::ECapeUnknown, Common::Error::ECapeInvalidArgument);
00420 
00421       private:
00424         void ExtractParams(const  Numeric::Solvers::NLPTasks::Parameters::ICapeOptimizationPoint& _parVals)
00425           throw(Common::Error::ECapeUnknown);
00426 
00427       protected:
00428 
00429         /* Lists of unknowns */
00430         Common::Parameter::CapeArrayParameter arrEstimatedInitStates;   
00431         Common::Parameter::CapeArrayParameter arrEstimatedParameters;   
00432 
00433         /* Information for constraint's Jacobian calculation */
00434         Diana::DianaSparseArray mtrConstraintsJacobian; 
00435         Common::Types::CapeDouble dblEpsilon;           
00436 
00437 
00438 
00439 
00440         Common::Types::CapeBoolean bInitialized;        
00441       private:
00442         /* Elements for realization of interface ICapeIdentification */
00443         Common::Types::CapeString strName;              
00444         Common::Types::CapeString strDescription;       
00445 
00446         /* Buffers for default values of ESO's elements */
00447         Common::Types::CapeArrayDouble arrDefaultDerivatives;      
00448         Common::Types::CapeArrayDouble arrDefaultSensitivities;    
00449         Common::Types::CapeArrayDouble arrDefaultModelDerivatives; 
00450         Common::Types::CapeArrayDouble arrDefaultModelVariables;   
00451       };
00452 
00456       class ParameterFittingTaskReport : public Common::Utilities::ICapeUtilities
00457       {
00458       public:
00461         ParameterFittingTaskReport(const CapeString& _filename) throw(Common::Error::ECapeUnknown);
00462 
00464         ~ParameterFittingTaskReport() throw(Common::Error::ECapeUnknown);
00465 
00467         inline void Activate() { active = true; };
00469         inline void Deactivate() { active = false; };
00470 
00474         void Output(Diana::SolverEvents event, DianaParameterFittingTask *task) throw (Common::Error::ECapeUnknown, Common::Error::ECapeInvalidArgument, Common::Error::ECapeFailedInitialisation);
00475 
00478         void SetOutputParameters(const Common::Types::CapeArrayString &_strs) { outpars = _strs; };
00479 
00489         Common::Collection::ICapeCollection* GetParameters()
00490           throw (Common::Error::ECapeUnknown, Common::Error::ECapeFailedInitialisation,
00491                  Common::Error::ECapeNoImpl);
00492 
00506         void SetSimulationContext(Common::Identification::ICapeIdentification* simContextManager)
00507           throw (Common::Error::ECapeUnknown, Common::Error::ECapeInvalidArgument,
00508                  Common::Error::ECapeFailedInitialisation, Common::Error::ECapeNoImpl);
00509 
00522         void Initialize()
00523           throw (Common::Error::ECapeUnknown, Common::Error::ECapeFailedInitialisation,
00524                  Common::Error::ECapeOutOfResources, Common::Error::ECapeLicenceError,
00525                  Common::Error::ECapeBadInvOrder);
00526   
00535         void Terminate()
00536           throw (Common::Error::ECapeUnknown, Common::Error::ECapeOutOfResources,
00537                  Common::Error::ECapeBadInvOrder);
00538 
00539       private:
00540         CapeBoolean active;                      
00541 
00542         FILE * plot_pipe;                        
00543         CapeBoolean Initialized;                 
00544         CapeString fname;                        
00545         CapeArrayString outpars;                 
00546 
00548         Diana::DianaCollection collParameters; 
00549 
00550       };
00551     }
00552   }
00553 }
00554 
00555 #endif // DIANA_PARAMETERFITTINGTASK_HPP