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