#include #include #include #include "problem.h" #define DEBUG using namespace std; Problem::Problem(istream &in){ in>>*this; } template void rowopadd(int n,T &dst,const U &src,double times){ for(int i=0;i void rowopmult(int n,T &dst,double times){ for(int i=0;i int min_index(const vector &v){ if(v.size()==0)throw logic_error("No minimum element in empty vector"); int mi=0; int size=v.size(); for(int i=1;i origzfunc=zfunc; for(int j=0;j=0&&vartype[j]==VT_ART;j--){ removefrombasis(j); nart++; } vartype.resize(nvars-nart); zfunc.resize(nvars-nart); restr.resize(nvars-nart,restr.height()); #ifdef DEBUG cerr<<" === SOLVING ORIGINAL PROBLEM ==="<=0)break; //optimal solution found int pivotrestr=-1; for(int i=0;i>(istream &in,Problem &prob){ string type; in>>type; bool negate=false; if(type=="max")negate=true; else if(type!="min")throw invalid_argument("Invalid LP problem type"); int nvars,nrestr; in>>nvars>>nrestr; if(nvars<=0)throw invalid_argument("Invalid number of variables"); if(nrestr<=0)throw invalid_argument("Invalid number of restrictions"); prob.vartype.clear(); prob.vartype.resize(nvars); prob.zfunc.clear(); prob.zfunc.resize(nvars); prob.restr.clear(); prob.restr.resize(nvars,nrestr); prob.bvec.clear(); prob.bvec.resize(nrestr); prob.basis.clear(); prob.basis.resize(nrestr,-1); for(int i=0;i addslack(nrestr,0),addart(nrestr,0); for(int i=0;i="; else if(type==">=")type="<="; } if(type=="<="){ addslack[i]=1; } else if(type==">="){ addslack[i]=-1; addart[i]=1; } else if(type=="="){ addart[i]=1; } else { throw invalid_argument("Invalid restriction type"); } } for(int i=0;i