#include "lp_soplexcdd.h" #include "printer.h" #include "spxdefines.h" #include "spxsolver.h" #include "timer.h" #include "spxpricer.h" //#include "spxdefaultpr.h" #include "spxparmultpr.h" #include "spxdevexpr.h" #include "spxhybridpr.h" #include "spxsteeppr.h" #include "spxweightpr.h" #include "spxratiotester.h" #include "spxharrisrt.h" #include "spxdefaultrt.h" #include "spxfastrt.h" #include "spxsimplifier.h" //#include "spxaggregatesm.h" //#include "spxredundantsm.h" //#include "spxrem1sm.h" //#include "spxgeneralsm.h" #include "spxscaler.h" #include "spxequilisc.h" #include "spxsumst.h" #include "spxweightst.h" #include "spxvectorst.h" #include "slufactor.h" #include "soplex.h" #include "continuedfractions.h" #include "matrix.h" #include "linalg.h" #include "log.h" using namespace soplex; /** Here comes a simple derived class from #SoPlex, which uses #terminate() as * callback method for outputting statistics. */ class MySoPlex : public SoPlex { private: SLUFactor m_slu; public: /// default constructor MySoPlex(SPxSolver::Type p_type = SPxSolver::LEAVE, SPxSolver::Representation p_rep = SPxSolver::COLUMN) : SoPlex(p_type, p_rep) { bool print_solution = false; bool print_quality = false; NameSet rownames; NameSet colnames; SPxStarter* starter = 0; SPxSolver::Type type = SPxSolver::LEAVE; SPxSolver::Representation representation = SPxSolver::COLUMN; int precision; Real delta = DEFAULT_BND_VIOL; Real epsilon = DEFAULT_EPS_ZERO; int verbose = 0; SLUFactor::UpdateType update = SLUFactor::FOREST_TOMLIN; Real timelimit = 1.0;-1.0; SPxPricer* pricer = 0; SPxRatioTester* ratiotester = 0; SPxScaler* scaler = 0; SPxSimplifier* simplifier = 0; precision = int(-log10(delta)) + 1; Param::setEpsilon(epsilon); Param::setVerbose(verbose); //options -p4 -t2 -g1 -s0 -c0 setUtype(update); setTerminationTime(timelimit); setDelta(delta); assert(isConsistent()); pricer = new SPxSteepPR; setPricer(pricer); assert(isConsistent()); ratiotester = new SPxFastRT; setTester(ratiotester); assert(isConsistent()); /* scaler = new SPxEquili(representation == SoPlex::COLUMN, true); setScaler(scaler); assert(isConsistent()); */ setSimplifier(simplifier); assert(isConsistent()); setStarter(starter); assert(isConsistent()); } virtual bool terminate() { /* if (iteration() % 100 == 0) std::cout << iteration() << ":\t" << value() << std::endl; */ return SoPlex::terminate(); } void setUtype(SLUFactor::UpdateType tp) { m_slu.setUtype(tp); } void build(const IntegerVectorList &g, IntegerVectorList::const_iterator i) { int width=g.size()-1; int height=i->v.size(); LPColSet cols(width,width*height); DSVector c1(height); //Build Cols for(IntegerVectorList::const_iterator j=g.begin();j!=g.end();j++) { c1.clear(); for(int t=0;tv[t]!=0) c1.add(t,(double)(j->v[t])); if(j!=i) { Real obj=0; Real upper=infinity; Real lower=0; cols.add(obj,lower,c1,upper); } } LPRowSet rows(height,width*height); DSVector r1(width); //Change Rows for(int t=0;tv[t],r1,i->v[t]); addRows(rows); addCols(cols); changeSense(SPxLP::MINIMIZE); assert(isConsistent()); } void buildType2(int n, const IntegerVectorList &inequalities, const IntegerVectorList &equations) { int width=n; int nInequalities=inequalities.size(); int height=inequalities.size()+equations.size(); IntegerMatrix m=rowsToIntegerMatrix(inequalities,n); m.append(rowsToIntegerMatrix(equations,n)); LPColSet cols(width,width*height); DSVector c1(height); //Build Cols for(int i=0;i0)return false; return true; } /* for(IntegerVectorList::const_iterator j=g.begin();j!=g.end();j++) { /* double prod=0; for(int i=0;i=0)return false; for(int i=1;i solution(work.nCols()); for(int i=0;i solutionNum; int denominator; doubleVectorToFractions(solution,solutionNum,denominator); IntegerVector s(solution.size()); for(int i=0;i certificate(work.nRows()); for(int i=0;i certificateNum; int denominator; doubleVectorToFractions(certificate,certificateNum,denominator); IntegerVector c(certificate.size()); for(int i=0;i solution(work.nCols()); for(int i=0;i solutionNum; int denominator; doubleVectorToFractions(solution,solutionNum,denominator); IntegerVector s(solution.size()); for(int i=0;isize()==solution.size()); for(int j=0;jsize();j++)S+=solution[j]*(*i)[j]; if(S>-0.000001 && S<0.000001)A.push_back(*i); } FieldMatrix temp=integerMatrixToFieldMatrix(rowsToIntegerMatrix(A,solution.size()),Q); FieldMatrix temp2=temp.reduceAndComputeKernel(); for(int i=0;i certificate(work.nRows()); for(int i=0;i certificateNum; int denominator; doubleVectorToFractions(certificate,certificateNum,denominator); IntegerVector c(certificate.size()); for(int i=0;i