00001
00002
00003
00004
00005
00006
00007 #ifndef _MINLP_H_
00008 #define _MINLP_H_
00009
00010 #include "standard.h"
00011 #include "MINLPView.h"
00012 #include "MINLPData.h"
00013
00016 class MINLP : public MINLPView {
00017 private:
00018 template <class ObjOrCon> class ObjConView : public virtual MINLPView::ObjConView {
00019 protected:
00020 const ObjOrCon& objcon;
00021 public:
00022 ObjConView(const ObjOrCon& objcon_)
00023 : objcon(objcon_)
00024 { }
00025
00026 int dim() const { return objcon.func->dim(); }
00027 const string& name() const { return objcon.name; }
00028 SepQcFunc::ftype functype() const { return objcon.functype; }
00029 Func::CurvatureType curvature() const { return objcon.curvtype; }
00030
00031 double evaluate(const UserVector<double>& x) const { return objcon.func->eval(x); }
00032
00033 using MINLPView::ObjConView::evaluate;
00034
00035 void gradient(UserVector<double>& grad, const UserVector<double>& x) const { objcon.func->grad(grad, x); }
00036
00037 using MINLPView::ObjConView::gradient;
00038
00039 double evaluate_and_gradient(UserVector<double>& grad, const UserVector<double>& x) const { double val; objcon.func->valgrad(val, grad, x); return val; }
00040
00041 void hessianmult(UserVector<double>& prod, const UserVector<double>& x, const UserVector<double>& factor) const { objcon.func->HessMult(prod, x, factor); }
00042 };
00043
00044 public:
00045 class ConstraintView : public MINLPView::ConstraintView, public MINLP::ObjConView<MINLPData::Constraint> {
00046 public:
00047 ConstraintView(const MINLPData::Constraint& con_)
00048 : MINLP::ObjConView<MINLPData::Constraint>(con_)
00049 { }
00050
00051 int dim() const { return MINLP::ObjConView<MINLPData::Constraint>::dim(); }
00052 int index() const { return objcon.index; }
00053 bool equality() const { return objcon.equality; }
00054 const string& name() const { return MINLP::ObjConView<MINLPData::Constraint>::name(); }
00055 SepQcFunc::ftype functype() const { return MINLP::ObjConView<MINLPData::Constraint>::functype(); }
00056 Func::CurvatureType curvature() const { return MINLP::ObjConView<MINLPData::Constraint>::curvature(); }
00057
00058 double evaluate(const UserVector<double>& x) const { return MINLP::ObjConView<MINLPData::Constraint>::evaluate(x); }
00059 using MINLPView::ConstraintView::evaluate;
00060
00061 void gradient(UserVector<double>& grad, const UserVector<double>& x) const { MINLP::ObjConView<MINLPData::Constraint>::gradient(grad, x); }
00062 using MINLPView::ConstraintView::gradient;
00063
00064 double evaluate_and_gradient(UserVector<double>& grad, const UserVector<double>& x) const { return MINLP::ObjConView<MINLPData::Constraint>::evaluate_and_gradient(grad, x); }
00065
00066 void hessianmult(UserVector<double>& prod, const UserVector<double>& x, const UserVector<double>& factor) const { MINLP::ObjConView<MINLPData::Constraint>::hessianmult(prod, x, factor); }
00067 };
00068
00069 class ObjectiveView : public MINLPView::ObjectiveView, public MINLP::ObjConView<MINLPData::Objective> {
00070 public:
00071 ObjectiveView(const MINLPData::Objective& obj_)
00072 : MINLP::ObjConView<MINLPData::Objective>(obj_)
00073 { }
00074
00075 int dim() const { return MINLP::ObjConView<MINLPData::Objective>::dim(); }
00076 const string& name() const { return MINLP::ObjConView<MINLPData::Objective>::name(); }
00077 SepQcFunc::ftype functype() const { return MINLP::ObjConView<MINLPData::Objective>::functype(); }
00078 Func::CurvatureType curvature() const { return MINLP::ObjConView<MINLPData::Objective>::curvature(); }
00079
00080 double evaluate(const UserVector<double>& x) const { return MINLP::ObjConView<MINLPData::Objective>::evaluate(x); }
00081 using MINLPView::ObjectiveView::evaluate;
00082
00083 void gradient(UserVector<double>& grad, const UserVector<double>& x) const { MINLP::ObjConView<MINLPData::Objective>::gradient(grad, x); }
00084 using MINLPView::ObjectiveView::gradient;
00085
00086 double evaluate_and_gradient(UserVector<double>& grad, const UserVector<double>& x) const { return MINLP::ObjConView<MINLPData::Objective>::evaluate_and_gradient(grad, x); }
00087
00088 void hessianmult(UserVector<double>& prod, const UserVector<double>& x, const UserVector<double>& factor) const { MINLP::ObjConView<MINLPData::Objective>::hessianmult(prod, x, factor); }
00089 };
00090
00091 class VariableView : public MINLPView::VariableView {
00092 private:
00093 const MINLPData::Variable& var;
00094 public:
00095 VariableView(const MINLPData::Variable& var_)
00096 : var(var_)
00097 { }
00098
00099 int index() const { return var.index; }
00100 int block_nr() const { return var.block_nr; }
00101 int index_in_block() const { return var.index_in_block; }
00102 const string& name() const { return var.name; }
00103 double lower() const { return var.lower; }
00104 double upper() const { return var.upper; }
00105 bool discrete() const { return var.discrete; }
00106 };
00107
00108
00109 class BlockView : public MINLPView::BlockView {
00110 private:
00111 const MINLPData::Block& block;
00112 public:
00113 BlockView(const MINLPData::Block& block_)
00114 : block(block_)
00115 { }
00116
00117 int size() const { return block.size(); }
00118
00119 int operator()(int index) const { return block[index]; }
00120 };
00121
00122
00123 protected:
00124 const MINLPData& data;
00125 public:
00126 MINLP(const MINLPData& data_);
00127
00128 ~MINLP() { };
00129
00130 int dim() const { return data.var.size(); }
00131
00132 int connr() const { return data.con.size(); }
00133
00134 int nr_discr() const { return data.discrete_var.size(); }
00135
00136 int nr_blocks() const { return data.block.size(); }
00137
00138 VariableView var(int index) const { return VariableView(data.var[index]); }
00139
00140 ObjectiveView obj() const { return ObjectiveView(data.obj); }
00141
00142 ConstraintView con(int index) const { return ConstraintView(data.con[index]); }
00143
00144 BlockView block(int block_nr) const { return BlockView(data.block[block_nr]); }
00145
00146 Pointer<MINLPView::BlockView> blockPtr(int block_nr) const { return new BlockView(data.block[block_nr]); }
00147
00148 Pointer<MINLPView::VariableView> varPtr(int index) const { return new VariableView(data.var[index]); }
00149
00150 Pointer<MINLPView::ConstraintView> conPtr(int index) const { return new ConstraintView(data.con[index]); }
00151
00152 Pointer<MINLPView::ObjectiveView> objPtr() const { return new ObjectiveView(data.obj); }
00153
00154 };
00155
00156 #endif //_MINLP_H_