MP_variable.cpp

Go to the documentation of this file.
00001 // ******************** FlopCpp **********************************************
00002 // File: MP_variable.cpp
00003 // $Id$
00004 // Author: Tim Helge Hultberg (thh@mat.ua.pt)
00005 // Copyright (C) 2003 Tim Helge Hultberg
00006 // All Rights Reserved.
00007 //****************************************************************************
00008 
00009 #include <iostream>
00010 #include <sstream>
00011 
00012 #include <OsiSolverInterface.hpp>
00013 #include "MP_variable.hpp"
00014 #include "MP_domain.hpp" 
00015 #include "MP_constant.hpp" 
00016 #include "MP_model.hpp"
00017 
00018 using namespace flopc;
00019 using namespace std;
00020 
00021 VariableRef::VariableRef(MP_variable* v, 
00022                          const MP_index_exp& i1,
00023                          const MP_index_exp& i2,
00024                          const MP_index_exp& i3,
00025                          const MP_index_exp& i4,
00026                          const MP_index_exp& i5) :
00027     V(v),I1(i1),I2(i2),I3(i3),I4(i4),I5(i5) { 
00028     offset = v->offset; 
00029 }
00030 
00031 double VariableRef::level() const {
00032     return  V->M->solution[V->offset +
00033                            V->f(V->S1->evaluate(),
00034                                 V->S2->evaluate(),
00035                                 V->S3->evaluate(),
00036                                 V->S4->evaluate(),
00037                                 V->S5->evaluate())];
00038 }
00039 
00040 int VariableRef::getColumn() const { 
00041     int i1 = V->S1->check(I1->evaluate());
00042     int i2 = V->S2->check(I2->evaluate());
00043     int i3 = V->S3->check(I3->evaluate());
00044     int i4 = V->S4->check(I4->evaluate());
00045     int i5 = V->S5->check(I5->evaluate());
00046     
00047     if (i1==outOfBound || i2==outOfBound || i3==outOfBound ||
00048         i4==outOfBound || i5==outOfBound) {
00049         return outOfBound;
00050     } else {
00051         return V->offset +  V->f(i1,i2,i3,i4,i5);
00052     }
00053 }
00054 
00055 void VariableRef::generate(const MP_domain& domain,
00056                            vector<Constant > multiplicators,
00057                            GenerateFunctor& f,
00058                            double m)  const {
00059     f.setMultiplicator(multiplicators,m);
00060     f.setTerminalExpression(this);
00061     domain.Forall(&f);
00062 }
00063  
00064 MP_variable::MP_variable(const MP_set_base &s1, 
00065                          const MP_set_base &s2, 
00066                          const MP_set_base &s3,
00067                          const MP_set_base &s4, 
00068                          const MP_set_base &s5) :
00069     RowMajor(s1.size(),s2.size(),s3.size(),s4.size(),s5.size()),
00070     upperLimit(MP_data(s1,s2,s3,s4,s5)),
00071     lowerLimit(MP_data(s1,s2,s3,s4,s5)),
00072     S1(&s1),S2(&s2),S3(&s3),S4(&s4),S5(&s5),
00073     offset(-1)
00074 {
00075     lowerLimit.initialize(0.0);
00076     upperLimit.initialize(MP_model::getDefaultModel().getInfinity());
00077     type = continuous;
00078 }    
00079 
00080 double MP_variable::level(int lcl_i1, int lcl_i2, int lcl_i3, int lcl_i4, int lcl_i5) {
00081     return M->solution[offset +  f(lcl_i1,lcl_i2,lcl_i3,lcl_i4,lcl_i5)];
00082 }
00083 
00084 void MP_variable::operator()() const {
00085     if (S1!=&MP_set::getEmpty()) cout << i1.evaluate() << " ";
00086     if (S2!=&MP_set::getEmpty()) cout << i2.evaluate() << " ";
00087     if (S3!=&MP_set::getEmpty()) cout << i3.evaluate() << " ";
00088     if (S4!=&MP_set::getEmpty()) cout << i4.evaluate() << " ";
00089     if (S5!=&MP_set::getEmpty()) cout << i5.evaluate() << " ";
00090     cout<<"  "<< M->solution[offset +
00091                              f(i1.evaluate(),
00092                                i2.evaluate(),
00093                                i3.evaluate(),
00094                                i4.evaluate(),
00095                                i5.evaluate())]<<endl;
00096 }
00097 
00098 void MP_variable::display(const std::string &s) {
00099   cout<<s<<endl;
00100   if (offset >= 0) {
00101     ((*S1)(i1)*(*S2)(i2)*(*S3)(i3)*(*S4)(i4)*(*S5)(i5)).Forall(this);
00102   } else {
00103     cout<<"No solution available!"<<endl;
00104   }
00105 }

Generated on Sun Nov 6 03:14:50 2011 for FLOPC++ by  doxygen 1.4.7