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: DianaOEDTask.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 //#pragma once 00016 #ifndef DIANAOEDTASK_HPP 00017 #define DIANAOEDTASK_HPP 00018 00019 #include <CapeOpen.hpp> 00020 #include "DianaNLPTask.hpp" 00021 #include "DianaBasicNLPTask.hpp" 00022 00023 #include "DianaSolver.hpp" 00024 //#include "DianaParameterFittingTask.hpp" 00025 00026 00027 namespace Numeric { 00028 namespace Solvers { 00029 namespace NLPTasks { 00030 00031 class DianaParameterFittingTask; 00032 00033 namespace OED { 00034 00035 // Forward declaration of interface 00036 class DianaOEDTask; 00037 class OEDOptimalityCriterion; 00038 00040 typedef std::vector<DianaOEDTask*> ArrayOEDTask; 00041 00045 enum OEDOptimalityCriterionType { 00046 DIANA_OED_A, 00047 DIANA_OED_D, 00048 DIANA_OED_M, 00049 DIANA_OED_E, 00050 DIANA_OED_EStar, 00051 DIANA_OED_USER 00052 }; 00053 00061 class DianaOEDTask : public Numeric::Solvers::NLPTasks::DianaNLPTask { 00062 public: 00064 DianaOEDTask(Numeric::Solvers::NLPTasks::DianaParameterFittingTask* pParFitTask, 00065 Numeric::Solvers::Solver::ICapeNumericNLPSolver* pOptimizer, 00066 const Common::Parameter::CapeArrayParameterSpec& colDesignVars) 00067 throw(Common::Error::ECapeUnknown); 00068 00070 ~DianaOEDTask(); 00071 00073 virtual Common::Types::CapeDouble CalcObjFunction() 00074 throw(Common::Error::ECapeUnknown, Common::Error::ECapeSolvingError); 00075 00088 virtual void Initialize() 00089 throw (Common::Error::ECapeUnknown, Common::Error::ECapeFailedInitialisation, 00090 Common::Error::ECapeOutOfResources, Common::Error::ECapeLicenceError, 00091 Common::Error::ECapeBadInvOrder); 00092 00095 void SetOptimalityCriterion(/*OEDOptimalityCriterion*/Numeric::Solvers::NLPTasks::ICapeNLPFunction* func) 00096 throw(Common::Error::ECapeUnknown); 00097 00099 const Common::Types::CapeArrayDouble& GetParametersBiasEstimate() const 00100 throw(Common::Error::ECapeUnknown); 00101 00103 const Diana::DianaArray& GetCovarianceMatrixEstimate() const 00104 throw(Common::Error::ECapeUnknown); 00105 00107 Numeric::Solvers::NLPTasks::DianaParameterFittingTask* GetParameterFttingTask() 00108 throw(Common::Error::ECapeUnknown); 00109 00111 Numeric::Solvers::Solver::ICapeNumericSolver* GetPFOptimizer() 00112 throw(Common::Error::ECapeUnknown); 00113 00115 Numeric::Solvers::NLPTasks::ICapeNLPFunction* GetOptimalityCriterion()// const 00116 throw(Common::Error::ECapeUnknown); 00117 00121 inline Common::Collection::ICapeCollection* GetDesignVariables() 00122 throw (Common::Error::ECapeUnknown, Common::Error::ECapeFailedInitialisation, Common::Error::ECapeNoImpl) 00123 { return &(this->collDesignVars); } 00124 00128 inline Common::Collection::ICapeCollection* GetEstimatedParameters() 00129 throw (Common::Error::ECapeUnknown, Common::Error::ECapeFailedInitialisation, Common::Error::ECapeNoImpl) 00130 { return &(this->collEstimatedPars); } 00131 00132 protected: 00134 virtual Common::Types::CapeDouble EvaluateObjFunction() 00135 throw(Common::Error::ECapeUnknown, Common::Error::ECapeSolvingError) = 0; 00136 00137 protected: 00138 Numeric::Solvers::NLPTasks::DianaParameterFittingTask* pParFitTask; 00139 Numeric::Solvers::Solver::ICapeNumericNLPSolver* pParFitOptimizer; 00140 00141 OEDOptimalityCriterion* pOptCriterion; 00142 OEDOptimalityCriterionType eOptimalityCriterionType; 00143 00144 Diana::DianaCollection collDesignVars; 00145 Diana::DianaCollection collEstimatedPars; 00146 00147 Common::Types::CapeBoolean bInitialized; 00148 00149 Diana::DianaArray daCovMatrix; 00150 Common::Types::CapeArrayDouble arrBias; 00151 }; 00152 00153 00154 00155 00159 class OEDOptimalityCriterion : public Numeric::Solvers::NLPTasks::ICapeNLPFunction { 00160 public: 00162 OEDOptimalityCriterion(); 00163 00165 OEDOptimalityCriterion(const Numeric::Solvers::NLPTasks::ICapeNLPFunction& func); 00166 00170 virtual Common::Types::CapeDouble Exec(Numeric::Solvers::NLPTasks::ICapeNLPTask& task) 00171 throw (Common::Error::ECapeSolvingError) = 0; 00172 00174 virtual const Common::Types::CapeString& GetComponentName() const 00175 throw (Common::Error::ECapeUnknown); 00176 00179 virtual void SetComponentName(const Common::Types::CapeString& _name) 00180 throw (Common::Error::ECapeUnknown, Common::Error::ECapeInvalidArgument); 00181 00183 virtual const Common::Types::CapeString& GetComponentDescription() const 00184 throw (Common::Error::ECapeUnknown); 00185 00188 virtual void SetComponentDescription(const Common::Types::CapeString& _description) 00189 throw (Common::Error::ECapeUnknown, Common::Error::ECapeInvalidArgument); 00190 00191 private: 00192 Common::Types::CapeString strName; 00193 Common::Types::CapeString strDescription; 00194 }; 00195 00196 00197 00198 #ifndef SWIG 00199 00200 typedef Common::Types::CapeDouble (*COEDOptimalityFunction)(DianaOEDTask& task); 00201 00205 class CFuncOEDOptimalityCriterion : public OEDOptimalityCriterion { 00206 public: 00209 CFuncOEDOptimalityCriterion(COEDOptimalityFunction pFuncCOEDOptCriterion); 00210 00214 virtual Common::Types::CapeDouble Exec(Numeric::Solvers::NLPTasks::ICapeNLPTask& task) 00215 throw (Common::Error::ECapeSolvingError); 00216 00218 virtual ICapeIdentification* clone() 00219 throw (Common::Error::ECapeUnknown, Common::Error::ECapeNoImpl); 00220 00221 private: 00222 COEDOptimalityFunction pFuncCOEDOptCriterion; 00223 }; 00224 #endif 00225 } 00226 } 00227 } 00228 } 00229 00230 #endif 00231