Skip to content

Commit

Permalink
Merge pull request #91 from Argonne-National-Laboratory/patch/issue87
Browse files Browse the repository at this point in the history
Fixed memory issues in DW
  • Loading branch information
kibaekkim authored Jul 10, 2020
2 parents 48cf7b5 + 4c7ad0e commit f3fc9e8
Show file tree
Hide file tree
Showing 4 changed files with 28 additions and 16 deletions.
11 changes: 11 additions & 0 deletions src/Solver/DantzigWolfe/DwBundleDual.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -619,6 +619,7 @@ DSP_RTN_CODE DwBundleDual::addRows(
/** allocate memory */
std::vector<double> Ax(nrows_orig_, 0.0);
cutvec.reserve(nrows_);
assert(mat_orig_->getNumRows() == Ax.size());

/** reset counter */
ngenerated_ = 0;
Expand All @@ -637,6 +638,10 @@ DSP_RTN_CODE DwBundleDual::addRows(

/** retrieve subproblem solution */
const CoinPackedVector* x = sols[s];
#ifdef DSP_DEBUG
DSPdebugMessage("sol[%d] =\n", s);
DspMessage::printArray(x);
#endif
#if 0
for (int i = 0; i < x->getNumElements(); ++i) {
int j = x->getIndices()[i];
Expand All @@ -659,6 +664,7 @@ DSP_RTN_CODE DwBundleDual::addRows(
cutvec.insert(sind, 1.0);
for (int i = 0; i < nrows_orig_; ++i) {
cutcoef = Ax[i];
assert(fabs(cutcoef) < 1e+20);
linerr_ -= cutcoef * d_[i];
if (fabs(cutcoef) > 1.0e-10)
cutvec.insert(nrows_conv_+i, cutcoef);
Expand All @@ -681,10 +687,12 @@ DSP_RTN_CODE DwBundleDual::addRows(
double* dx = x->denseVector(ncols_orig_);
for (int i = 0; i < nrows_branch_; ++i) {
cutcoef = branch_row_to_vec_[nrows_core_+i].dotProduct(dx);
assert(fabs(cutcoef) < 1e+20);
linerr_ -= cutcoef * d_[nrows_orig_+i];
if (fabs(cutcoef) > 1.0e-10)
cutvec.insert(nrows_core_+i, cutcoef);
}
// free dense vector
FREE_ARRAY_PTR(dx);
}
#endif
Expand Down Expand Up @@ -713,6 +721,9 @@ DSP_RTN_CODE DwBundleDual::addRows(
/** store columns */
cols_generated_.push_back(new DwCol(sind, -1, *x, cutvec, cutrhs, 0.0, COIN_DBL_MAX, false));
}

// free dense vector
// FREE_ARRAY_PTR(dx);
}
DSPdebugMessage("Number of columns in the pool: %lu\n", cols_generated_.size());

Expand Down
5 changes: 3 additions & 2 deletions src/Solver/DantzigWolfe/DwWorker.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -312,6 +312,7 @@ DSP_RTN_CODE DwWorker::generateCols(
/** subproblem coupling solution */
for (int j = 0; j < osi_[s]->si_->getNumCols(); ++j) {
double xval = x[j];
assert(fabs(xval) < 1e+20);
//if (sub_clbd_[s][j] == sub_cubd_[s][j])
// printf("sind %d j %d [%e, %e, %e]\n", sind, j, sub_clbd_[s][j], xval, sub_cubd_[s][j]);
if (fabs(xval) > 1.0e-8) {
Expand Down Expand Up @@ -418,7 +419,7 @@ DSP_RTN_CODE DwWorker::generateColsByFix(
sol->reserve(osi_[s]->si_->getNumCols());

if (!osi_[s]->si_->isProvenDualInfeasible()) {
const double* x = osi_[s]->si_->getColSolution();
const double* xs = osi_[s]->si_->getColSolution();

/** subproblem objective value */
if (osi_[s]->si_->getNumIntegers())
Expand All @@ -429,7 +430,7 @@ DSP_RTN_CODE DwWorker::generateColsByFix(

/** subproblem coupling solution */
for (int j = 0; j < osi_[s]->si_->getNumCols(); ++j) {
double xval = x[j];
double xval = xs[j];
//if (sub_clbd_[s][j] == sub_cubd_[s][j])
// printf("sind %d j %d [%e, %e, %e]\n", sind, j, sub_clbd_[s][j], xval, sub_cubd_[s][j]);
if (fabs(xval) > 1.0e-8) {
Expand Down
8 changes: 4 additions & 4 deletions src/SolverInterface/DspOsiCpx.h
Original file line number Diff line number Diff line change
Expand Up @@ -83,8 +83,8 @@ class DspOsiCpx : public DspOsi {
/** solution statue */
virtual int status() {
int status = DSP_STAT_UNKNOWN;
int probtype = CPXgetprobtype(cpx_->getEnvironmentPtr(), cpx_->getLpPtr());
int stat = CPXgetstat(cpx_->getEnvironmentPtr(), cpx_->getLpPtr());
int probtype = CPXgetprobtype(cpx_->getEnvironmentPtr(), cpx_->getLpPtr(OsiCpxSolverInterface::KEEPCACHED_ALL));
int stat = CPXgetstat(cpx_->getEnvironmentPtr(), cpx_->getLpPtr(OsiCpxSolverInterface::KEEPCACHED_ALL));

if (probtype == CPXPROB_LP) {
switch(stat) {
Expand Down Expand Up @@ -166,7 +166,7 @@ class DspOsiCpx : public DspOsi {
virtual double getDualObjValue() {
double val;
if (si_->getNumIntegers() > 0) {
CPXgetbestobjval(cpx_->getEnvironmentPtr(), cpx_->getLpPtr(), &val);
CPXgetbestobjval(cpx_->getEnvironmentPtr(), cpx_->getLpPtr(OsiCpxSolverInterface::KEEPCACHED_ALL), &val);
val *= cpx_->getObjSense();
} else {
val = si_->getObjValue();
Expand All @@ -176,7 +176,7 @@ class DspOsiCpx : public DspOsi {

/** get number of branch-and-bound nodes explored */
virtual int getNumNodes() {
return CPXgetnodecnt(cpx_->getEnvironmentPtr(), cpx_->getLpPtr());
return CPXgetnodecnt(cpx_->getEnvironmentPtr(), cpx_->getLpPtr(OsiCpxSolverInterface::KEEPCACHED_ALL));
}

/** set number of cores */
Expand Down
20 changes: 10 additions & 10 deletions src/SolverInterface/DspOsiGrb.h
Original file line number Diff line number Diff line change
Expand Up @@ -136,8 +136,8 @@ class DspOsiGrb : public DspOsi {
int status = DSP_STAT_UNKNOWN;
int stat;
try{
GUROBI_CALL("status", GRBupdatemodel(grb_->getLpPtr()));
GUROBI_CALL("status", GRBgetintattr(grb_->getLpPtr(), "Status", &stat));
GUROBI_CALL("status", GRBupdatemodel(grb_->getLpPtr(OsiGrbSolverInterface::KEEPCACHED_ALL)));
GUROBI_CALL("status", GRBgetintattr(grb_->getLpPtr(OsiGrbSolverInterface::KEEPCACHED_ALL), "Status", &stat));
}
catch(const CoinError& e){
e.print();
Expand Down Expand Up @@ -190,8 +190,8 @@ class DspOsiGrb : public DspOsi {
virtual double getDualObjValue() {
try{
double val;
GUROBI_CALL("getDualObjVal", GRBupdatemodel(grb_->getLpPtr()));
GUROBI_CALL("getDualObjVal", GRBgetdblattr(grb_->getLpPtr(), GRB_DBL_ATTR_OBJVAL, &val));
GUROBI_CALL("getDualObjVal", GRBupdatemodel(grb_->getLpPtr(OsiGrbSolverInterface::KEEPCACHED_ALL)));
GUROBI_CALL("getDualObjVal", GRBgetdblattr(grb_->getLpPtr(OsiGrbSolverInterface::KEEPCACHED_ALL), GRB_DBL_ATTR_OBJVAL, &val));
return val;
}
catch(const CoinError& e){
Expand All @@ -204,8 +204,8 @@ class DspOsiGrb : public DspOsi {
virtual int getNumNodes() {
try{
double node;
GUROBI_CALL("getNumNodes", GRBupdatemodel(grb_->getLpPtr()));
GUROBI_CALL("getNumNodes", GRBgetdblattr(grb_->getLpPtr(), GRB_DBL_ATTR_NODECOUNT, &node));
GUROBI_CALL("getNumNodes", GRBupdatemodel(grb_->getLpPtr(OsiGrbSolverInterface::KEEPCACHED_ALL)));
GUROBI_CALL("getNumNodes", GRBgetdblattr(grb_->getLpPtr(OsiGrbSolverInterface::KEEPCACHED_ALL), GRB_DBL_ATTR_NODECOUNT, &node));
return (int)node;
}
catch(const CoinError& e){
Expand All @@ -217,7 +217,7 @@ class DspOsiGrb : public DspOsi {
/** set number of cores */
virtual void setNumCores(int num) {
try{
GUROBI_CALL("setNumCores", GRBupdatemodel(grb_->getLpPtr()));
GUROBI_CALL("setNumCores", GRBupdatemodel(grb_->getLpPtr(OsiGrbSolverInterface::KEEPCACHED_ALL)));
GUROBI_CALL("setNumCores", GRBsetintparam(grb_->getEnvironmentPtr(), GRB_INT_PAR_THREADS, num));
}
catch(const CoinError& e){
Expand All @@ -228,7 +228,7 @@ class DspOsiGrb : public DspOsi {
/** set time limit */
virtual void setTimeLimit(double time) {
try{
GUROBI_CALL("setTimeLimit", GRBupdatemodel(grb_->getLpPtr()));
GUROBI_CALL("setTimeLimit", GRBupdatemodel(grb_->getLpPtr(OsiGrbSolverInterface::KEEPCACHED_ALL)));
GUROBI_CALL("setTimeLimit", GRBsetdblparam(grb_->getEnvironmentPtr(), GRB_DBL_PAR_TIMELIMIT, time));
}
catch(const CoinError& e){
Expand All @@ -239,7 +239,7 @@ class DspOsiGrb : public DspOsi {
/** set node limit */
virtual void setNodeLimit(double num) {
try{
GUROBI_CALL("setNodeLimit", GRBupdatemodel(grb_->getLpPtr()));
GUROBI_CALL("setNodeLimit", GRBupdatemodel(grb_->getLpPtr(OsiGrbSolverInterface::KEEPCACHED_ALL)));
GUROBI_CALL("setNodeLimit", GRBsetdblparam(grb_->getEnvironmentPtr(), GRB_DBL_PAR_NODELIMIT, num));
}
catch(const CoinError& e){
Expand All @@ -250,7 +250,7 @@ class DspOsiGrb : public DspOsi {
/** set relative MIP gap */
virtual void setRelMipGap(double tol) {
try{
GUROBI_CALL("setRelMipGap", GRBupdatemodel(grb_->getLpPtr()));
GUROBI_CALL("setRelMipGap", GRBupdatemodel(grb_->getLpPtr(OsiGrbSolverInterface::KEEPCACHED_ALL)));
GUROBI_CALL("setRelMipGap", GRBsetdblparam(grb_->getEnvironmentPtr(), GRB_DBL_PAR_MIPGAP, tol));
}
catch(const CoinError& e){
Expand Down

0 comments on commit f3fc9e8

Please sign in to comment.