00001
00002
00003
00004
00005
00006
00007
00008
00009 #include <iostream>
00010 #include <sstream>
00011 using std::cout;
00012 using std::endl;
00013
00014 #include <OsiSolverInterface.hpp>
00015 #include "MP_variable.hpp"
00016 #include "MP_domain.hpp"
00017 #include "MP_constant.hpp"
00018 #include "MP_model.hpp"
00019 using namespace flopc;
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 }