Diana  0.8.3
DianaOEDTask.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: 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