1
#include "lp_soplexcdd.h"
5
#include "spxdefines.h"
10
//#include "spxdefaultpr.h"
11
#include "spxparmultpr.h"
12
#include "spxdevexpr.h"
13
#include "spxhybridpr.h"
14
#include "spxsteeppr.h"
15
#include "spxweightpr.h"
16
#include "spxratiotester.h"
17
#include "spxharrisrt.h"
18
#include "spxdefaultrt.h"
19
#include "spxfastrt.h"
20
#include "spxsimplifier.h"
21
//#include "spxaggregatesm.h"
22
//#include "spxredundantsm.h"
23
//#include "spxrem1sm.h"
24
//#include "spxgeneralsm.h"
25
#include "spxscaler.h"
26
#include "spxequilisc.h"
28
#include "spxweightst.h"
29
#include "spxvectorst.h"
30
#include "slufactor.h"
32
#include "continuedfractions.h"
36
using namespace soplex;
38
/** Here comes a simple derived class from #SoPlex, which uses #terminate() as
39
* callback method for outputting statistics.
41
class MySoPlex : public SoPlex
47
/// default constructor
48
MySoPlex(SPxSolver::Type p_type = SPxSolver::LEAVE, SPxSolver::Representation p_rep = SPxSolver::COLUMN)
49
: SoPlex(p_type, p_rep)
54
bool print_solution = false;
55
bool print_quality = false;
58
SPxStarter* starter = 0;
59
SPxSolver::Type type = SPxSolver::LEAVE;
60
SPxSolver::Representation representation = SPxSolver::COLUMN;
62
Real delta = DEFAULT_BND_VIOL;
63
Real epsilon = DEFAULT_EPS_ZERO;
65
SLUFactor::UpdateType update = SLUFactor::FOREST_TOMLIN;
66
Real timelimit = 1.0;-1.0;
67
SPxPricer* pricer = 0;
68
SPxRatioTester* ratiotester = 0;
69
SPxScaler* scaler = 0;
70
SPxSimplifier* simplifier = 0;
72
precision = int(-log10(delta)) + 1;
74
Param::setEpsilon(epsilon);
75
Param::setVerbose(verbose);
79
//options -p4 -t2 -g1 -s0 -c0
81
setTerminationTime(timelimit);
84
assert(isConsistent());
86
pricer = new SPxSteepPR;
88
assert(isConsistent());
90
ratiotester = new SPxFastRT;
91
setTester(ratiotester);
92
assert(isConsistent());
94
/* scaler = new SPxEquili(representation == SoPlex::COLUMN, true);
96
assert(isConsistent());
98
setSimplifier(simplifier);
99
assert(isConsistent());
102
assert(isConsistent());
105
virtual bool terminate()
107
/* if (iteration() % 100 == 0)
108
std::cout << iteration() << ":\t" << value() << std::endl;
110
return SoPlex::terminate();
113
void setUtype(SLUFactor::UpdateType tp)
118
void build(const IntegerVectorList &g, IntegerVectorList::const_iterator i)
120
int width=g.size()-1;
121
int height=i->v.size();
123
LPColSet cols(width,width*height);
127
for(IntegerVectorList::const_iterator j=g.begin();j!=g.end();j++)
130
for(int t=0;t<height;t++)
132
c1.add(t,(double)(j->v[t]));
140
cols.add(obj,lower,c1,upper);
144
LPRowSet rows(height,width*height);
148
for(int t=0;t<height;t++)
149
rows.add(i->v[t],r1,i->v[t]);
154
changeSense(SPxLP::MINIMIZE);
156
assert(isConsistent());
158
void buildType2(int n, const IntegerVectorList &inequalities, const IntegerVectorList &equations)
161
int nInequalities=inequalities.size();
162
int height=inequalities.size()+equations.size();
164
IntegerMatrix m=rowsToIntegerMatrix(inequalities,n);
165
m.append(rowsToIntegerMatrix(equations,n));
167
LPColSet cols(width,width*height);
171
for(int i=0;i<width;i++)
174
for(int t=0;t<height;t++)
176
c1.add(t,(double)(m[t][i]));
181
Real lower=-infinity;//is this correct?
189
cols.add(obj,lower,c1,upper);
192
LPRowSet rows(height,width*height);
196
for(int t=0;t<nInequalities;t++)
197
rows.add(0,r1,infinity);
198
for(int t=nInequalities;t<height;t++)
204
changeSense(SPxLP::MINIMIZE);
206
assert(isConsistent());
210
static int toint(float r)
215
static void printLP(SPxLP &w)
217
std::cout << "LP has "
226
for(int i=0;i<nr;i++)
228
for(int j=0;j<nc;j++)
232
// if(j<R.rowVector().size())
233
std::cout<<R.rowVector()[j]<<" ";
235
// std::cout<<(0.0)<<" ";
237
std::cout<<std::endl;
239
std::cout<<std::endl;
241
for(int i=0;i<nr;i++)
243
for(int j=0;j<nc;j++)
247
// if(i<C.colVector().size())
248
std::cout<<C.colVector()[i]<<" ";
250
// std::cout<<(0.0)<<" ";
252
std::cout<<std::endl;
255
std::cout<<"cols:"<<std::endl;
257
for(int j=0;j<nc;j++)
261
std::cout<<C.lower()<<" "<<C.upper()<<" "<<C.obj()<<std::endl;
262
std::cout<<toint(C.lower())<<" "<<toint(C.upper())<<" "<<toint(C.obj())<<std::endl;
265
std::cout<<"rows:"<<std::endl;
267
for(int i=0;i<nr;i++)
271
std::cout<<toint(R.lhs())<<" "<<toint(R.rhs())<<" "<<R.type()<<std::endl;
276
MySoPlex work(SPxSolver::LEAVE, SPxSolver::COLUMN);
279
static bool isFeasibleSolution(IntegerVector const &solution, int denominator, IntegerVectorList const &g, IntegerVectorList::const_iterator i)
281
if(denominator<=0)return false;
283
IntegerVector sum=denominator*(*i);
286
for(IntegerVectorList::const_iterator j=g.begin();j!=g.end();j++)
289
if(solution[t]<0)return false;
290
sum-=solution[t]*(*j);
296
static bool isInfeasibilityCertificate(IntegerVector const &certificate, IntegerVectorList const &g, IntegerVectorList::const_iterator i)
298
IntegerVector c=certificate;
299
// To do: add truncation on c
300
if(dotLong(c,*i)<=0)return false;
302
for(IntegerVectorList::const_iterator j=g.begin();j!=g.end();j++)
304
if(dotLong(c,*j)>0)return false;
307
/* for(IntegerVectorList::const_iterator j=g.begin();j!=g.end();j++)
310
for(int i=0;i<work.nRows();i++)
311
{prod+=(*j)[i]*certificate[i];
312
// fprintf(stderr,"%f \n",prod);
314
int num,den;doubleToFraction(prod,num,den);
316
// fprintf(stderr,":%f: %i/%i\n",prod,num,den);
317
/* fprintf(stderr,":%i\n",dotLong(c,*j));
322
static bool isFeasibleSolutionType2(IntegerVector const &s, IntegerVectorList const &inequalities, IntegerVectorList const &equations)
324
// To do: do truncation
325
if(s[0]<=0)return false;
326
for(IntegerVectorList::const_iterator i=inequalities.begin();i!=inequalities.end();i++)
327
if(dotLong(s,*i)<0)return false;
328
for(IntegerVectorList::const_iterator i=equations.begin();i!=equations.end();i++)
329
if(dotLong(s,*i)!=0)return false;
334
static bool isInfeasibilityCertificateType2(IntegerVector const &c, int n, IntegerVectorList const &inequalities, IntegerVectorList const &equations)
337
int nInequalities=inequalities.size();
338
if(!c.subvector(0,nInequalities).isNonNegative())return false;
340
IntegerVector sum(n);
342
for(IntegerVectorList::const_iterator i=inequalities.begin();i!=inequalities.end();i++,j++)
344
for(IntegerVectorList::const_iterator i=equations.begin();i!=equations.end();i++,j++)
347
if(sum[0]>=0)return false;
357
bool LpSolverSoPlexCddGmp::isFacet(const IntegerVectorList &g, IntegerVectorList::const_iterator I)
359
SPxSolver::Type type = SPxSolver::LEAVE;
360
SPxSolver::Representation representation = SPxSolver::COLUMN;
373
SPxSolver::Status stat = work.status();
377
case SPxSolver::OPTIMAL:
379
DVector objx(work.nCols());
381
if( work.getPrimal(objx) != SPxSolver::ERROR )
383
vector<double> solution(work.nCols());
384
for(int i=0;i<work.nCols();i++)
387
vector<int> solutionNum;
389
doubleVectorToFractions(solution,solutionNum,denominator);
390
IntegerVector s(solution.size());
391
for(int i=0;i<s.size();i++)s[i]=solutionNum[i];
393
if(isFeasibleSolution(s,denominator,g,I))
395
log3 fprintf(Stderr,"Solution OK.\n");
398
log3 fprintf(Stderr,"Solution failed .\n");
403
case SPxSolver::UNBOUNDED:
404
std::cerr << "LP is unbounded";
407
case SPxSolver::INFEASIBLE:
409
DVector farkasx(work.nRows());
411
if( work.getDualfarkas(farkasx) != SPxSolver::ERROR )
413
vector<double> certificate(work.nRows());
414
for(int i=0;i<work.nRows();i++)
415
certificate[i]=farkasx[i];
417
vector<int> certificateNum;
419
doubleVectorToFractions(certificate,certificateNum,denominator);
420
IntegerVector c(certificate.size());
421
for(int i=0;i<c.size();i++)c[i]=certificateNum[i];
423
if(isInfeasibilityCertificate(c,g,I))
425
log3 fprintf(Stderr,"Certificate for infeasibility OK.\n");
428
log3 fprintf(Stderr,"Certificate failed.\n");
432
log3 fprintf(Stderr,"Error while producing certificate\n");
437
case SPxSolver::ABORT_TIME:
438
std::cout << "aborted due to time limit";
441
case SPxSolver::ABORT_ITER:
442
std::cout << "aborted due to iteration limit";
445
case SPxSolver::ABORT_VALUE:
446
std::cout << "aborted due to objective value limit";
450
std::cout << "An error occurred during the solution process";
456
log0 fprintf(Stderr,"Falling back on CddLib\n");
457
return LpSolverCddGmp::isFacet(g,I);
462
bool LpSolverSoPlexCddGmp::hasHomogeneousSolution(int n, const IntegerVectorList &inequalities, const IntegerVectorList &equations)
464
SPxSolver::Type type = SPxSolver::LEAVE;
465
SPxSolver::Representation representation = SPxSolver::COLUMN;
471
work.buildType2(n,inequalities,equations);
480
SPxSolver::Status stat = work.status();
484
case SPxSolver::OPTIMAL:
486
DVector objx(work.nCols());
488
if( work.getPrimal(objx) != SPxSolver::ERROR )
490
vector<double> solution(work.nCols());
491
for(int i=0;i<work.nCols();i++)
494
vector<int> solutionNum;
496
doubleVectorToFractions(solution,solutionNum,denominator);
497
IntegerVector s(solution.size());
498
for(int i=0;i<s.size();i++)s[i]=solutionNum[i];
500
// AsciiPrinter(Stderr).printVector(s);
501
if(isFeasibleSolutionType2(s,inequalities,equations))
503
log3 fprintf(Stderr,"Solution OK.\n");
506
log2 fprintf(Stderr,"Solution failed (Type2).\n");
508
/* for(int i=0;i<work.nCols();i++)
510
std::cerr<<solution[i]<<',';
513
AsciiPrinter(Stderr).printVector(s);
514
AsciiPrinter(Stderr).printVectorList(inequalities);
515
AsciiPrinter(Stderr).printVectorList(equations);
522
case SPxSolver::UNBOUNDED:
523
std::cerr << "LP is unbounded";
526
case SPxSolver::INFEASIBLE:
528
DVector farkasx(work.nRows());
530
if( work.getDualfarkas(farkasx) != SPxSolver::ERROR )
532
vector<double> certificate(work.nRows());
533
for(int i=0;i<work.nRows();i++)
534
certificate[i]=farkasx[i];
536
vector<int> certificateNum;
538
doubleVectorToFractions(certificate,certificateNum,denominator);
539
IntegerVector c(certificate.size());
540
for(int i=0;i<c.size();i++)c[i]=certificateNum[i];
542
if(isInfeasibilityCertificateType2(c,n,inequalities,equations))
544
log3 fprintf(Stderr,"Certificate for infeasibility OK.\n");
548
log2 fprintf(Stderr,"Certificate failed (Type2).\n");
551
AsciiPrinter(Stderr).printVector(c);
552
AsciiPrinter(Stderr).printVectorList(inequalities);
553
AsciiPrinter(Stderr).printVectorList(equations);
559
log3 fprintf(Stderr,"Error while producing certificate\n");
565
case SPxSolver::ABORT_TIME:
566
std::cout << "aborted due to time limit";
569
case SPxSolver::ABORT_ITER:
570
std::cout << "aborted due to iteration limit";
573
case SPxSolver::ABORT_VALUE:
574
std::cout << "aborted due to objective value limit";
578
std::cout << "An error occurred during the solution process";
584
log0 fprintf(Stderr,"Falling back on CddLib\n");
585
return LpSolverCddGmp::hasHomogeneousSolution(n, inequalities,equations);
589
static LpSolverSoPlexCddGmp theLpSolverSoPlexCdd;