Diana
0.8.3
|
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