Diana  0.8.3
DianaNLPTask.hpp
00001 #ifndef DIANA_NLP_TASK_HPP
00002 #define DIANA_NLP_TASK_HPP
00003 
00004 #include <CapeOpen.hpp>
00005 
00006 #include <Diana/IDianaMain.hpp>
00007 #include <Diana/DianaParameter.hpp>
00008 #include <Diana/DianaModel.hpp>
00009 #include <Diana/IDianaDAESO.hpp>
00010 #include <Diana/DianaSensDAESO.hpp>
00011 #include <Diana/IDianaReporting.hpp>
00012 
00013 #include <math.h>
00014 #include <iostream>
00015 #include <sstream>
00016 #include <stdarg.h>
00017 #include <fstream>
00018 
00019 using namespace std;
00020 using namespace Diana;
00021 using namespace Common::Types;
00022 using namespace Common::Collection;
00023 using namespace Numeric::Solvers::Eso;
00024 using namespace Numeric::Solvers::Model;
00025 using namespace Numeric::Solvers::Solver;
00026 using namespace Common::NLPData;
00027 
00028 namespace Numeric {
00029   namespace Solvers {
00030     namespace NLPTasks {
00031 
00032 
00033       // Forward declaration of interfaces
00034       class IDianaNLPTaskReporting;
00035 
00036       /* Interface for task classes supporting task reports building */
00037       class IDianaNLPTaskReporting {
00038       public:
00039         virtual void Output(Diana::SolverEvents event) = 0;
00040       };
00041 
00043       typedef CapeDouble (*evalfunc)(Numeric::Solvers::NLPTasks::ICapeNLPTask& task);
00044 
00048       class CFunction : public Numeric::Solvers::NLPTasks::ICapeNLPFunction {
00049       public:
00051         CFunction(evalfunc f);
00052 
00056         inline CapeDouble Exec(Numeric::Solvers::NLPTasks::ICapeNLPTask& task) 
00057           throw (Common::Error::ECapeSolvingError) { return pCFunc(task); }
00058 
00060         virtual const Common::Types::CapeString& GetComponentName() const
00061           throw (Common::Error::ECapeUnknown);
00062 
00065         virtual void SetComponentName(const Common::Types::CapeString& _name)
00066           throw (Common::Error::ECapeUnknown, Common::Error::ECapeInvalidArgument);
00067 
00069         virtual const Common::Types::CapeString& GetComponentDescription() const
00070           throw (Common::Error::ECapeUnknown);
00071 
00074         virtual void SetComponentDescription(const Common::Types::CapeString& _description)
00075           throw (Common::Error::ECapeUnknown, Common::Error::ECapeInvalidArgument);
00076 
00077 #ifndef SWIG
00078 
00079         virtual ICapeIdentification* clone()
00080           throw (Common::Error::ECapeUnknown, Common::Error::ECapeNoImpl);
00081 #endif
00082       private:
00083         evalfunc pCFunc;        
00084 
00085         Common::Types::CapeString strName;        
00086         Common::Types::CapeString strDescription; 
00087       };
00088 
00089       enum DerivativeApproximationType {
00090         daForwardDifference = 0,
00091         daCentralDifference,
00092         daFourthCentralDifference
00093       };
00094 
00098       class DianaNLPTask : virtual public Numeric::Solvers::NLPTasks::ICapeNLPTask {
00099       public:
00101         virtual ~DianaNLPTask();
00102 
00104         inline const Common::Collection::ICapeCollection& GetSoughtParameters() const
00105           throw(Common::Error::ECapeUnknown) { return soughtParams; }
00106 
00108         virtual ConstraintFuncArray* GetConstraintFuncList(ConstraintType _type) 
00109           throw(Common::Error::ECapeUnknown);
00110 
00112         virtual void SetNLPParameters(Parameters::ICapeOptimizationPoint* _pars) 
00113           throw(Common::Error::ECapeUnknown) { fitParams = _pars; }
00114 
00116         const Parameters::ICapeOptimizationPoint& GetNLPParameters() 
00117           throw(Common::Error::ECapeUnknown) { return *fitParams; }
00118 
00120         virtual void AddConstraintFunc(ICapeNLPFunction *_func, ConstraintType _type) 
00121           throw(Common::Error::ECapeUnknown);
00122 
00125         virtual Common::Types::CapeArrayDouble CalcConstraints(ConstraintType _type)
00126           throw(Common::Error::ECapeUnknown);
00127 
00131         virtual Common::Types::CapeDouble CalcConstraint(Common::Types::CapeLong _index, ConstraintType _type)
00132           throw(Common::Error::ECapeUnknown);
00133 
00136         virtual Common::Types::CapeShort GetConstraintsCount(ConstraintType type) const
00137           throw(Common::Error::ECapeUnknown);
00138 
00152         virtual void SetSimulationContext(Common::Identification::ICapeIdentification* simContextManager)
00153           throw (Common::Error::ECapeUnknown, Common::Error::ECapeInvalidArgument,
00154                  Common::Error::ECapeFailedInitialisation, Common::Error::ECapeNoImpl) {}
00155 
00168         virtual void Initialize()
00169           throw (Common::Error::ECapeUnknown, Common::Error::ECapeFailedInitialisation,
00170                  Common::Error::ECapeOutOfResources, Common::Error::ECapeLicenceError,
00171                  Common::Error::ECapeBadInvOrder) {}
00172 
00181         virtual void Terminate()
00182           throw (Common::Error::ECapeUnknown, Common::Error::ECapeOutOfResources,
00183                  Common::Error::ECapeBadInvOrder) {}
00184 
00194         inline Common::Collection::ICapeCollection* GetParameters() 
00195           throw(Common::Error::ECapeUnknown, Common::Error::ECapeFailedInitialisation,
00196                 Common::Error::ECapeNoImpl) { 
00197           return &this->collParameters; 
00198         }
00199 
00202         virtual void SetComponentName(const Common::Types::CapeString& _name)
00203           throw (Common::Error::ECapeUnknown, Common::Error::ECapeInvalidArgument);
00204 
00207         virtual void SetComponentDescription(const Common::Types::CapeString& _description)
00208           throw (Common::Error::ECapeUnknown, Common::Error::ECapeInvalidArgument);
00209 
00211         virtual void UpdateNLPParameters()
00212           throw (Common::Error::ECapeUnknown, Common::Error::ECapeInvalidArgument);
00213 
00215         virtual void UpdateOptimizationPoint()
00216           throw (Common::Error::ECapeUnknown, Common::Error::ECapeInvalidArgument);
00217 
00230         void SetReportingInterface(Diana::IDianaReporting* _pReportingInterface)
00231           throw (Common::Error::ECapeUnknown);
00232 
00233         void RemoveReportingInterface(Diana::IDianaReporting* _pReportingInterface)
00234           throw (Common::Error::ECapeUnknown);
00235 
00236       protected:
00237 #ifndef SWIG 
00238 
00239         inline void AddSoughtParameter(const Common::Parameter::ICapeParameter* parParameter) {
00240           soughtParams.AddIndexed(new DianaParameter(dynamic_cast<const Diana::DianaParameter&>
00241                                                      (*parParameter)));
00242         }
00243 
00246         void AddParametersSpec(const Common::Parameter::CapeArrayParameterSpec &_parspecs) 
00247           throw(Common::Error::ECapeInvalidArgument);
00248 
00251         void notifyEventHandlers(NLPTaskEvents event) 
00252           throw (Common::Error::ECapeUnknown, Common::Error::ECapeInvalidArgument, 
00253                  Common::Error::ECapeFailedInitialisation);
00254 
00255         bool areEventHandlers();
00256 #endif
00257       protected:
00258         Diana::DianaCollection collParameters;                  
00259 
00260         ConstraintFuncArray constrainsGx;                       
00261         ConstraintFuncArray constrainsHx;                       
00262         Diana::DianaCollection soughtParams;                    
00263         Parameters::ICapeOptimizationPoint* fitParams;          
00264 
00265       private:
00266         std::vector<Diana::IDianaReporting*>  arrReportingInterfaces; 
00267       };
00268 
00269 
00273       class ICapeNLPTest : public Common::Identification::ICapeIdentification {
00274       public:
00276         ICapeNLPTest(Diana::IDianaMain* _dmain) : parcount(2), dmain(_dmain) {};
00277 
00279         virtual ~ICapeNLPTest();
00280 
00283         virtual ICapeNLPTask* getCapeNLPTask() = 0;
00284 
00286         inline void SetParameterCount(int _parcount) { parcount = _parcount; };
00287 
00289         virtual const Common::Types::CapeString& GetComponentName() const
00290           throw (Common::Error::ECapeUnknown);
00291 
00294         virtual void SetComponentName(const Common::Types::CapeString& _name)
00295           throw (Common::Error::ECapeUnknown, Common::Error::ECapeInvalidArgument);
00296 
00298         virtual const Common::Types::CapeString& GetComponentDescription() const
00299           throw (Common::Error::ECapeUnknown);
00300 
00303         virtual void SetComponentDescription(const Common::Types::CapeString& _description)
00304           throw (Common::Error::ECapeUnknown, Common::Error::ECapeInvalidArgument);
00305       protected:
00306         CapeArrayNLPTask tasks;         
00307         int parcount;                   
00308         IDianaMain* dmain;              
00309       };
00310 
00311     }
00312   }
00313 }
00314 
00315 #endif // DIANA_NLP_TASK_HPP