399 lines
12 KiB
Diff
399 lines
12 KiB
Diff
--- gfan0.7/src/lp_soplexcdd.cpp.orig 2024-08-12 13:34:07.043619886 -0600
|
|
+++ gfan0.7/src/lp_soplexcdd.cpp 2024-08-12 13:42:14.382953300 -0600
|
|
@@ -1,37 +1,11 @@
|
|
#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 <soplex/spxdefines.h>
|
|
+#include <soplex.h>
|
|
#include "continuedfractions.h"
|
|
#include "matrix.h"
|
|
#include "linalg.h"
|
|
+#include "printer.h"
|
|
|
|
#include "log.h"
|
|
using namespace soplex;
|
|
@@ -42,81 +16,45 @@ using namespace soplex;
|
|
class MySoPlex : public SoPlex
|
|
{
|
|
private:
|
|
- SLUFactor m_slu;
|
|
+ SLUFactor<Real> m_slu;
|
|
|
|
public:
|
|
/// default constructor
|
|
- MySoPlex(SPxSolver::Type p_type = SPxSolver::LEAVE, SPxSolver::Representation p_rep = SPxSolver::COLUMN)
|
|
- : SoPlex(p_type, p_rep)
|
|
+ MySoPlex() : SoPlexBase<Real>()
|
|
{
|
|
+ NameSet rownames;
|
|
+ NameSet colnames;
|
|
+ SPxOut::Verbosity verbose = SPxOut::Verbosity::ERROR;
|
|
+ SLUFactor<Real>::UpdateType update = SLUFactor<Real>::FOREST_TOMLIN;
|
|
+ Real timelimit = 1.0;
|
|
|
|
+ spxout.setVerbosity(verbose);
|
|
|
|
+ //options -p4 -t2 -g1 -s0 -c0
|
|
+ setUtype(update);
|
|
|
|
- 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());
|
|
+ setRealParam(TIMELIMIT, timelimit);
|
|
+ assert(isConsistent());
|
|
|
|
- ratiotester = new SPxFastRT;
|
|
- setTester(ratiotester);
|
|
- assert(isConsistent());
|
|
+ setIntParam(PRICER, PRICER_STEEP);
|
|
+ assert(isConsistent());
|
|
|
|
- /* scaler = new SPxEquili(representation == SoPlex::COLUMN, true);
|
|
- setScaler(scaler);
|
|
- assert(isConsistent());
|
|
- */
|
|
- setSimplifier(simplifier);
|
|
- assert(isConsistent());
|
|
+ setIntParam(RATIOTESTER, RATIOTESTER_FAST);
|
|
+ assert(isConsistent());
|
|
|
|
- setStarter(starter);
|
|
- assert(isConsistent());
|
|
- }
|
|
+ setIntParam(SIMPLIFIER, SIMPLIFIER_OFF);
|
|
+ assert(isConsistent());
|
|
|
|
- virtual bool terminate()
|
|
- {
|
|
- /* if (iteration() % 100 == 0)
|
|
- std::cout << iteration() << ":\t" << value() << std::endl;
|
|
- */
|
|
- return SoPlex::terminate();
|
|
+ setIntParam(STARTER, STARTER_OFF);
|
|
+ assert(isConsistent());
|
|
}
|
|
|
|
- void setUtype(SLUFactor::UpdateType tp)
|
|
+ void setUtype(SLUFactor<Real>::UpdateType tp)
|
|
{
|
|
m_slu.setUtype(tp);
|
|
}
|
|
|
|
- void build(const IntegerVectorList &g, IntegerVectorList::const_iterator i)
|
|
+ void build(const IntegerVectorList &g, IntegerVectorList::const_iterator i)
|
|
{
|
|
int width=g.size()-1;
|
|
int height=i->v.size();
|
|
@@ -141,22 +79,23 @@ public:
|
|
cols.add(obj,lower,c1,upper);
|
|
}
|
|
}
|
|
-
|
|
+
|
|
LPRowSet rows(height,width*height);
|
|
DSVector r1(width);
|
|
-
|
|
+
|
|
//Change Rows
|
|
for(int t=0;t<height;t++)
|
|
rows.add(i->v[t],r1,i->v[t]);
|
|
-
|
|
- addRows(rows);
|
|
- addCols(cols);
|
|
-
|
|
- changeSense(SPxLP::MINIMIZE);
|
|
-
|
|
+
|
|
+ addRowsReal(rows);
|
|
+ addColsReal(cols);
|
|
+
|
|
+ setIntParam(OBJSENSE, OBJSENSE_MINIMIZE);
|
|
+
|
|
assert(isConsistent());
|
|
}
|
|
- void buildType2(int n, const IntegerVectorList &inequalities, const IntegerVectorList &equations)
|
|
+
|
|
+ void buildType2(int n, const IntegerVectorList &inequalities, const IntegerVectorList &equations)
|
|
{
|
|
int width=n;
|
|
int nInequalities=inequalities.size();
|
|
@@ -192,27 +131,29 @@ public:
|
|
|
|
LPRowSet rows(height,width*height);
|
|
DSVector r1(width);
|
|
-
|
|
+
|
|
//Change Rows
|
|
for(int t=0;t<nInequalities;t++)
|
|
rows.add(0,r1,infinity);
|
|
for(int t=nInequalities;t<height;t++)
|
|
rows.add(0,r1,0);
|
|
-
|
|
- addRows(rows);
|
|
- addCols(cols);
|
|
-
|
|
- changeSense(SPxLP::MINIMIZE);
|
|
-
|
|
+
|
|
+ addRowsReal(rows);
|
|
+ addColsReal(cols);
|
|
+
|
|
+ setIntParam(OBJSENSE, OBJSENSE_MINIMIZE);
|
|
+
|
|
assert(isConsistent());
|
|
}
|
|
};
|
|
|
|
static int toint(float r)
|
|
{
|
|
- return *((int*)&r);
|
|
+ int *theInt = reinterpret_cast<int *>(&r);
|
|
+ return *theInt;
|
|
}
|
|
|
|
+#if 0
|
|
static void printLP(SPxLP &w)
|
|
{
|
|
std::cout << "LP has "
|
|
@@ -272,10 +213,9 @@ static void printLP(SPxLP &w)
|
|
std::cout<<toint(R.lhs())<<" "<<toint(R.rhs())<<" "<<R.type()<<std::endl;
|
|
}
|
|
}
|
|
+#endif
|
|
|
|
-
|
|
-MySoPlex work(SPxSolver::LEAVE, SPxSolver::COLUMN);
|
|
-
|
|
+static MySoPlex work;
|
|
|
|
static bool isFeasibleSolution(IntegerVector const &solution, int denominator, IntegerVectorList const &g, IntegerVectorList::const_iterator i)
|
|
{
|
|
@@ -308,7 +248,7 @@ static bool isInfeasibilityCertificate(I
|
|
/* for(IntegerVectorList::const_iterator j=g.begin();j!=g.end();j++)
|
|
{*/
|
|
/* double prod=0;
|
|
- for(int i=0;i<work.nRows();i++)
|
|
+ for(int i=0;i<work.numRows();i++)
|
|
{prod+=(*j)[i]*certificate[i];
|
|
// fprintf(stderr,"%f \n",prod);
|
|
}
|
|
@@ -357,17 +297,13 @@ static bool isInfeasibilityCertificateTy
|
|
|
|
bool LpSolverSoPlexCddGmp::isFacet(const IntegerVectorList &g, IntegerVectorList::const_iterator I)
|
|
{
|
|
- SPxSolver::Type type = SPxSolver::LEAVE;
|
|
- SPxSolver::Representation representation = SPxSolver::COLUMN;
|
|
-
|
|
int lp_status=0;
|
|
|
|
- work.clear();
|
|
+ work.clearLPReal();
|
|
+ work.clearBasis();
|
|
|
|
work.build(g,I);
|
|
|
|
- retry:
|
|
-
|
|
// std::cerr<< work;
|
|
work.solve();
|
|
|
|
@@ -377,19 +313,19 @@ bool LpSolverSoPlexCddGmp::isFacet(const
|
|
{
|
|
case SPxSolver::OPTIMAL:
|
|
{
|
|
- DVector objx(work.nCols());
|
|
+ DVector objx(work.numCols());
|
|
|
|
- if( work.getPrimal(objx) != SPxSolver::ERROR )
|
|
+ if( work.getPrimal(objx) )
|
|
{
|
|
- vector<double> solution(work.nCols());
|
|
- for(int i=0;i<work.nCols();i++)
|
|
+ vector<double> solution(work.numCols());
|
|
+ for(int i=0;i<work.numCols();i++)
|
|
solution[i]=objx[i];
|
|
|
|
vector<int> solutionNum;
|
|
int denominator;
|
|
doubleVectorToFractions(solution,solutionNum,denominator);
|
|
IntegerVector s(solution.size());
|
|
- for(int i=0;i<s.size();i++)s[i]=solutionNum[i];
|
|
+ for(size_t i=0;i<s.size();i++)s[i]=solutionNum[i];
|
|
|
|
if(isFeasibleSolution(s,denominator,g,I))
|
|
{
|
|
@@ -407,19 +343,19 @@ bool LpSolverSoPlexCddGmp::isFacet(const
|
|
break;
|
|
case SPxSolver::INFEASIBLE:
|
|
{
|
|
- DVector farkasx(work.nRows());
|
|
+ DVector farkasx(work.numRows());
|
|
|
|
- if( work.getDualfarkas(farkasx) != SPxSolver::ERROR )
|
|
+ if( work.getDualFarkas(farkasx) )
|
|
{
|
|
- vector<double> certificate(work.nRows());
|
|
- for(int i=0;i<work.nRows();i++)
|
|
+ vector<double> certificate(work.numRows());
|
|
+ for(int i=0;i<work.numRows();i++)
|
|
certificate[i]=farkasx[i];
|
|
|
|
vector<int> certificateNum;
|
|
int denominator;
|
|
doubleVectorToFractions(certificate,certificateNum,denominator);
|
|
IntegerVector c(certificate.size());
|
|
- for(int i=0;i<c.size();i++)c[i]=certificateNum[i];
|
|
+ for(size_t i=0;i<c.size();i++)c[i]=certificateNum[i];
|
|
|
|
if(isInfeasibilityCertificate(c,g,I))
|
|
{
|
|
@@ -462,17 +398,13 @@ bool LpSolverSoPlexCddGmp::isFacet(const
|
|
|
|
bool LpSolverSoPlexCddGmp::hasHomogeneousSolution(int n, const IntegerVectorList &inequalities, const IntegerVectorList &equations)
|
|
{
|
|
- SPxSolver::Type type = SPxSolver::LEAVE;
|
|
- SPxSolver::Representation representation = SPxSolver::COLUMN;
|
|
-
|
|
int lp_status=0;
|
|
|
|
- work.clear();
|
|
+ work.clearLPReal();
|
|
+ work.clearBasis();
|
|
|
|
work.buildType2(n,inequalities,equations);
|
|
|
|
- retry:
|
|
-
|
|
// std::cerr<< work;
|
|
|
|
// assert(0);
|
|
@@ -484,19 +416,19 @@ bool LpSolverSoPlexCddGmp::hasHomogeneou
|
|
{
|
|
case SPxSolver::OPTIMAL:
|
|
{
|
|
- DVector objx(work.nCols());
|
|
+ DVector objx(work.numCols());
|
|
|
|
- if( work.getPrimal(objx) != SPxSolver::ERROR )
|
|
+ if( work.getPrimal(objx) )
|
|
{
|
|
- vector<double> solution(work.nCols());
|
|
- for(int i=0;i<work.nCols();i++)
|
|
+ vector<double> solution(work.numCols());
|
|
+ for(int i=0;i<work.numCols();i++)
|
|
solution[i]=objx[i];
|
|
|
|
vector<int> solutionNum;
|
|
int denominator;
|
|
doubleVectorToFractions(solution,solutionNum,denominator);
|
|
IntegerVector s(solution.size());
|
|
- for(int i=0;i<s.size();i++)s[i]=solutionNum[i];
|
|
+ for(size_t i=0;i<s.size();i++)s[i]=solutionNum[i];
|
|
|
|
// AsciiPrinter(Stderr).printVector(s);
|
|
if(isFeasibleSolutionType2(s,inequalities,equations))
|
|
@@ -512,7 +444,7 @@ if(0) {
|
|
{
|
|
double S=0;
|
|
assert(i->size()==solution.size());
|
|
- for(int j=0;j<i->size();j++)S+=solution[j]*(*i)[j];
|
|
+ for(size_t j=0;j<i->size();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);
|
|
@@ -538,7 +470,7 @@ if(0) {
|
|
*/
|
|
log2 fprintf(Stderr,"Solution failed (Type2).\n");
|
|
|
|
- /* for(int i=0;i<work.nCols();i++)
|
|
+ /* for(int i=0;i<work.numCols();i++)
|
|
{
|
|
std::cerr<<solution[i]<<',';
|
|
}
|
|
@@ -558,19 +490,19 @@ if(0) {
|
|
break;
|
|
case SPxSolver::INFEASIBLE:
|
|
{
|
|
- DVector farkasx(work.nRows());
|
|
+ DVector farkasx(work.numRows());
|
|
|
|
- if( work.getDualfarkas(farkasx) != SPxSolver::ERROR )
|
|
+ if( work.getDualFarkas(farkasx) )
|
|
{
|
|
- vector<double> certificate(work.nRows());
|
|
- for(int i=0;i<work.nRows();i++)
|
|
+ vector<double> certificate(work.numRows());
|
|
+ for(int i=0;i<work.numRows();i++)
|
|
certificate[i]=farkasx[i];
|
|
|
|
vector<int> certificateNum;
|
|
int denominator;
|
|
doubleVectorToFractions(certificate,certificateNum,denominator);
|
|
IntegerVector c(certificate.size());
|
|
- for(int i=0;i<c.size();i++)c[i]=certificateNum[i];
|
|
+ for(size_t i=0;i<c.size();i++)c[i]=certificateNum[i];
|
|
|
|
if(isInfeasibilityCertificateType2(c,n,inequalities,equations))
|
|
{
|