Skip to content

Commit 11fda1e

Browse files
Merge pull request #141 from coin-or/evd-fix
Fixes for, e.g. EVD
2 parents a146a13 + 48ed866 commit 11fda1e

15 files changed

Lines changed: 286 additions & 132 deletions

src/DualSolver.cpp

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -72,7 +72,13 @@ void DualSolver::checkDualSolutionCandidates()
7272
// New dual solution
7373
env->results->setDualBound(C.objValue);
7474
currDualBound = C.objValue;
75-
env->solutionStatistics.iterationLastDualBoundUpdate = env->results->getCurrentIteration()->iterationNumber;
75+
76+
if(env->results->getNumberOfIterations() > 0)
77+
env->solutionStatistics.iterationLastDualBoundUpdate
78+
= env->results->getCurrentIteration()->iterationNumber;
79+
else
80+
env->solutionStatistics.iterationLastDualBoundUpdate = 0;
81+
7682
env->solutionStatistics.iterationLastDualBoundUpdate = env->timing->getElapsedTime("Total");
7783

7884
if(C.sourceType == E_DualSolutionSource::MIPSolutionOptimal
@@ -257,7 +263,8 @@ bool DualSolver::hasHyperplaneBeenAdded(double hash, int constraintIndex)
257263

258264
void DualSolver::addIntegerCut(IntegerCut integerCut)
259265
{
260-
if(env->reformulatedProblem->properties.numberOfIntegerVariables > 0 || env->reformulatedProblem->properties.numberOfSemiintegerVariables > 0)
266+
if(env->reformulatedProblem->properties.numberOfIntegerVariables > 0
267+
|| env->reformulatedProblem->properties.numberOfSemiintegerVariables > 0)
261268
integerCut.areAllVariablesBinary = false;
262269
else
263270
{

src/Enums.h

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -272,6 +272,12 @@ enum class ES_AddPrimalPointAsInteriorPoint
272272
OnlyAverage
273273
};
274274

275+
enum class ES_EigenValueDecompositionFormulation
276+
{
277+
CoefficientReformulated,
278+
CoefficientRemains
279+
};
280+
275281
enum class ES_HyperplaneCutStrategy
276282
{
277283
ESH,

src/MIPSolver/MIPSolverCplexSingleTree.cpp

Lines changed: 16 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -315,21 +315,26 @@ void CplexCallback::invoke(const IloCplex::Callback::Context& context)
315315

316316
if(checkFixedNLPStrategy(candidatePoints.at(0)))
317317
{
318-
env->primalSolver->addFixedNLPCandidate(candidatePoints.at(0).point, E_PrimalNLPSource::FirstSolution,
319-
context.getCandidateObjective(), env->results->getCurrentIteration()->iterationNumber,
320-
candidatePoints.at(0).maxDeviation);
321318

322319
if(taskSelectPrimNLPOriginal)
323-
taskSelectPrimNLPOriginal->run();
320+
{
321+
env->primalSolver->addFixedNLPCandidate(candidatePoints.at(0).point,
322+
E_PrimalNLPSource::FirstSolution, context.getCandidateObjective(),
323+
env->results->getCurrentIteration()->iterationNumber, candidatePoints.at(0).maxDeviation);
324324

325-
env->primalSolver->addFixedNLPCandidate(candidatePoints.at(0).point, E_PrimalNLPSource::FirstSolution,
326-
context.getCandidateObjective(), env->results->getCurrentIteration()->iterationNumber,
327-
candidatePoints.at(0).maxDeviation);
325+
taskSelectPrimNLPOriginal->run();
326+
env->primalSolver->fixedPrimalNLPCandidates.clear();
327+
}
328328

329329
if(taskSelectPrimNLPReformulated)
330-
taskSelectPrimNLPReformulated->run();
330+
{
331+
env->primalSolver->addFixedNLPCandidate(candidatePoints.at(0).point,
332+
E_PrimalNLPSource::FirstSolution, context.getCandidateObjective(),
333+
env->results->getCurrentIteration()->iterationNumber, candidatePoints.at(0).maxDeviation);
331334

332-
env->primalSolver->fixedPrimalNLPCandidates.clear();
335+
taskSelectPrimNLPReformulated->run();
336+
env->primalSolver->fixedPrimalNLPCandidates.clear();
337+
}
333338

334339
env->primalSolver->checkPrimalSolutionCandidates();
335340
}
@@ -554,8 +559,8 @@ void CplexCallback::addLazyConstraint(
554559

555560
for(auto& hp : env->dualSolver->hyperplaneWaitingList)
556561
{
557-
this->createHyperplane(hp, context);
558-
this->lastNumAddedHyperplanes++;
562+
if(this->createHyperplane(hp, context))
563+
this->lastNumAddedHyperplanes++;
559564
}
560565

561566
env->dualSolver->hyperplaneWaitingList.clear();

src/MIPSolver/MIPSolverCplexSingleTreeLegacy.cpp

Lines changed: 14 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -428,19 +428,23 @@ void CtCallbackI::main()
428428

429429
if(checkFixedNLPStrategy(solutionCandidate))
430430
{
431-
env->primalSolver->addFixedNLPCandidate(solution, E_PrimalNLPSource::FirstSolution, this->getObjValue(),
432-
env->results->getCurrentIteration()->iterationNumber, solutionCandidate.maxDeviation);
433-
434431
if(taskSelectPrimNLPOriginal)
435-
taskSelectPrimNLPOriginal->run();
432+
{
433+
env->primalSolver->addFixedNLPCandidate(solution, E_PrimalNLPSource::FirstSolution, this->getObjValue(),
434+
env->results->getCurrentIteration()->iterationNumber, solutionCandidate.maxDeviation);
436435

437-
env->primalSolver->addFixedNLPCandidate(solution, E_PrimalNLPSource::FirstSolution, this->getObjValue(),
438-
env->results->getCurrentIteration()->iterationNumber, solutionCandidate.maxDeviation);
436+
taskSelectPrimNLPOriginal->run();
437+
env->primalSolver->fixedPrimalNLPCandidates.clear();
438+
}
439439

440440
if(taskSelectPrimNLPReformulated)
441-
taskSelectPrimNLPReformulated->run();
441+
{
442+
env->primalSolver->addFixedNLPCandidate(solution, E_PrimalNLPSource::FirstSolution, this->getObjValue(),
443+
env->results->getCurrentIteration()->iterationNumber, solutionCandidate.maxDeviation);
442444

443-
env->primalSolver->fixedPrimalNLPCandidates.clear();
445+
taskSelectPrimNLPReformulated->run();
446+
env->primalSolver->fixedPrimalNLPCandidates.clear();
447+
}
444448

445449
env->primalSolver->checkPrimalSolutionCandidates();
446450

@@ -485,8 +489,8 @@ void CtCallbackI::main()
485489

486490
for(auto& hp : env->dualSolver->hyperplaneWaitingList)
487491
{
488-
this->createHyperplane(hp);
489-
this->lastNumAddedHyperplanes++;
492+
if(this->createHyperplane(hp))
493+
this->lastNumAddedHyperplanes++;
490494
}
491495

492496
env->dualSolver->hyperplaneWaitingList.clear();

src/MIPSolver/MIPSolverGurobi.cpp

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1096,6 +1096,9 @@ void MIPSolverGurobi::setTimeLimit(double seconds)
10961096

10971097
void MIPSolverGurobi::setCutOff(double cutOff)
10981098
{
1099+
if(std::abs(cutOff) > 1e20)
1100+
return;
1101+
10991102
try
11001103
{
11011104
// Gurobi has problems if not an epsilon value is added to the cutoff...

src/MIPSolver/MIPSolverGurobiSingleTree.cpp

Lines changed: 41 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -186,6 +186,31 @@ void GurobiCallbackSingleTree::callback()
186186

187187
try
188188
{
189+
190+
// Add current primal bound as new incumbent candidate
191+
auto primalBound = env->results->getPrimalBound();
192+
193+
if(((isMinimization && lastUpdatedPrimal < primalBound)
194+
|| (!isMinimization && lastUpdatedPrimal > primalBound)))
195+
{
196+
auto primalSol = env->results->primalSolution;
197+
198+
if((int)primalSol.size() < env->reformulatedProblem->properties.numberOfVariables)
199+
env->reformulatedProblem->augmentAuxiliaryVariableValues(primalSol);
200+
201+
assert(env->reformulatedProblem->properties.numberOfVariables == primalSol.size());
202+
203+
if(env->dualSolver->MIPSolver->hasDualAuxiliaryObjectiveVariable())
204+
primalSol.push_back(env->reformulatedProblem->objectiveFunction->calculateValue(primalSol));
205+
206+
for(size_t i = 0; i < primalSol.size(); i++)
207+
{
208+
setSolution(vars[i], primalSol.at(i));
209+
}
210+
211+
lastUpdatedPrimal = env->results->getPrimalBound();
212+
}
213+
189214
// Check if better dual bound
190215
double tmpDualObjBound;
191216

@@ -394,21 +419,25 @@ void GurobiCallbackSingleTree::callback()
394419

395420
if(checkFixedNLPStrategy(candidatePoints.at(0)))
396421
{
397-
env->primalSolver->addFixedNLPCandidate(candidatePoints.at(0).point, E_PrimalNLPSource::FirstSolution,
398-
getDoubleInfo(GRB_CB_MIPSOL_OBJ), env->results->getCurrentIteration()->iterationNumber,
399-
candidatePoints.at(0).maxDeviation);
400-
401422
if(taskSelectPrimNLPOriginal)
402-
taskSelectPrimNLPOriginal->run();
423+
{
424+
env->primalSolver->addFixedNLPCandidate(candidatePoints.at(0).point,
425+
E_PrimalNLPSource::FirstSolution, getDoubleInfo(GRB_CB_MIPSOL_OBJ),
426+
env->results->getCurrentIteration()->iterationNumber, candidatePoints.at(0).maxDeviation);
403427

404-
env->primalSolver->addFixedNLPCandidate(candidatePoints.at(0).point, E_PrimalNLPSource::FirstSolution,
405-
getDoubleInfo(GRB_CB_MIPSOL_OBJ), env->results->getCurrentIteration()->iterationNumber,
406-
candidatePoints.at(0).maxDeviation);
428+
taskSelectPrimNLPOriginal->run();
429+
env->primalSolver->fixedPrimalNLPCandidates.clear();
430+
}
407431

408432
if(taskSelectPrimNLPReformulated)
409-
taskSelectPrimNLPReformulated->run();
433+
{
434+
env->primalSolver->addFixedNLPCandidate(candidatePoints.at(0).point,
435+
E_PrimalNLPSource::FirstSolution, getDoubleInfo(GRB_CB_MIPSOL_OBJ),
436+
env->results->getCurrentIteration()->iterationNumber, candidatePoints.at(0).maxDeviation);
410437

411-
env->primalSolver->fixedPrimalNLPCandidates.clear();
438+
taskSelectPrimNLPReformulated->run();
439+
env->primalSolver->fixedPrimalNLPCandidates.clear();
440+
}
412441

413442
env->primalSolver->checkPrimalSolutionCandidates();
414443
}
@@ -443,30 +472,6 @@ void GurobiCallbackSingleTree::callback()
443472
lastExploredNodes = (int)getDoubleInfo(GRB_CB_MIP_NODCNT);
444473
lastOpenNodes = (int)getDoubleInfo(GRB_CB_MIP_NODLFT);
445474
}
446-
447-
// Add current primal bound as new incumbent candidate
448-
auto primalBound = env->results->getPrimalBound();
449-
450-
if(((isMinimization && lastUpdatedPrimal < primalBound)
451-
|| (!isMinimization && lastUpdatedPrimal > primalBound)))
452-
{
453-
auto primalSol = env->results->primalSolution;
454-
455-
if((int)primalSol.size() < env->reformulatedProblem->properties.numberOfVariables)
456-
env->reformulatedProblem->augmentAuxiliaryVariableValues(primalSol);
457-
458-
assert(env->reformulatedProblem->properties.numberOfVariables == primalSol.size());
459-
460-
if(env->dualSolver->MIPSolver->hasDualAuxiliaryObjectiveVariable())
461-
primalSol.push_back(env->reformulatedProblem->objectiveFunction->calculateValue(primalSol));
462-
463-
for(size_t i = 0; i < primalSol.size(); i++)
464-
{
465-
setSolution(vars[i], primalSol.at(i));
466-
}
467-
468-
lastUpdatedPrimal = env->results->getPrimalBound();
469-
}
470475
}
471476
catch(GRBException& e)
472477
{
@@ -669,8 +674,8 @@ void GurobiCallbackSingleTree::addLazyConstraint(std::vector<SolutionPoint> cand
669674

670675
for(auto& hp : env->dualSolver->hyperplaneWaitingList)
671676
{
672-
this->createHyperplane(hp);
673-
this->lastNumAddedHyperplanes++;
677+
if(this->createHyperplane(hp))
678+
this->lastNumAddedHyperplanes++;
674679
}
675680

676681
env->dualSolver->hyperplaneWaitingList.clear();

0 commit comments

Comments
 (0)