MINLP.h

Go to the documentation of this file.
00001 // Copyright (C) 2006 Ivo Nowak and Stefan Vigerske
00002 // All Rights Reserved.
00003 // This code is published under the Common Public License.
00004 //
00005 // Author: Stefan Vigerske
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_

Generated on Tue Oct 21 03:12:10 2008 for LaGO by  doxygen 1.4.7