Changeset 2543 for trunk


Ignore:
Timestamp:
Apr 5, 2019 9:20:10 AM (6 months ago)
Author:
forrest
Message:

mainly for bug #105 (also add debug write FX bounds)

Location:
trunk/Cbc/src
Files:
3 edited

Legend:

Unmodified
Added
Removed
  • trunk/Cbc/src/CbcHeuristic.cpp

    r2467 r2543  
    25722572      }
    25732573    }
     2574    // but integer variables may have wandered
     2575    for (i = 0; i < numberIntegers; i++) {
     2576      int iColumn = integerVariable[i];
     2577      double value = newSolution[iColumn];
     2578      if (fabs(floor(value + 0.5) - value) > integerTolerance)
     2579        penalty += fabs(floor(value + 0.5) - value);
     2580    }
    25742581  }
    25752582
  • trunk/Cbc/src/CbcModel.cpp

    r2542 r2543  
    56465646
    56475647  memset(dblParam_, 0, sizeof(dblParam_));
    5648   dblParam_[CbcIntegerTolerance] = 1e-6;
     5648  dblParam_[CbcIntegerTolerance] = 1e-7;
    56495649  dblParam_[CbcCutoffIncrement] = 1e-5;
    56505650  dblParam_[CbcAllowableGap] = 1.0e-10;
     
    58175817
    58185818  memset(dblParam_, 0, sizeof(dblParam_));
    5819   dblParam_[CbcIntegerTolerance] = 1e-6;
     5819  dblParam_[CbcIntegerTolerance] = 1e-7;
    58205820  dblParam_[CbcCutoffIncrement] = 1e-5;
    58215821  dblParam_[CbcAllowableGap] = 1.0e-10;
     
    75907590  if (!defaultHandler_) {
    75917591    // Must have clone
    7592     // obviously rubbish -- handler_ = handler_->clone();
     7592    handler_ = handler_->clone();  // Not sure - worst is small memory leak
    75937593    defaultHandler_ = true;
    75947594  }
     
    1215212152    int saveScaling = -1;
    1215312153#endif
     12154#define CBC_LEAVE_CRUNCH_ON_CHECK_SOLUTION // for now
     12155#ifndef CBC_LEAVE_CRUNCH_ON_CHECK_SOLUTION
     12156    int saveSpecialOptions=0;
     12157#endif
    1215412158    if (clpContinuousSolver) {
    1215512159      // be more accurate if possible
     
    1218212186        clpContinuousSolver->setHintParam(OsiDoScale, false, OsiHintTry);
    1218312187      }
     12188#endif
     12189#ifndef CBC_LEAVE_CRUNCH_ON_CHECK_SOLUTION
     12190      modifiedTolerances |= 8;
     12191      saveSpecialOptions = clpContinuousSolver->specialOptions();
     12192      clpContinuousSolver->setSpecialOptions(saveSpecialOptions&(~1)); // switch off crunch
    1218412193#endif
    1218512194    }
     
    1238812397          }
    1238912398#endif
     12399#ifndef CBC_LEAVE_CRUNCH_ON_CHECK_SOLUTION
     12400          // Restore
     12401          clpContinuousSolver->setSpecialOptions(saveSpecialOptions);
     12402#endif
    1239012403        }
    1239112404#endif
     
    1262312636      //assert(solver_->isProvenOptimal());
    1262412637      solver_->setHintParam(OsiDoDualInInitial, saveTakeHint, saveStrength);
    12625       objectiveValue = solver_->getObjValue() * solver_->getObjSense();
     12638      objectiveValue = solver_->isProvenOptimal() ? solver_->getObjValue() * solver_->getObjSense() : 1.0e50;
    1262612639    }
    1262712640    bestSolutionBasis_ = CoinWarmStartBasis();
     
    1286912882        clpContinuousSolver->setHintParam(OsiDoScale, true, OsiHintTry);
    1287012883      }
     12884#endif
     12885#ifndef CBC_LEAVE_CRUNCH_ON_CHECK_SOLUTION
     12886      clpContinuousSolver->setSpecialOptions(saveSpecialOptions);
    1287112887#endif
    1287212888    }
  • trunk/Cbc/src/CbcSolver.cpp

    r2540 r2543  
    8282//#define USER_HAS_FAKE_CLP
    8383//#define USER_HAS_FAKE_CBC
    84 
     84//#define NEW_DEBUG_AND_FILL // use this to make it easier to trap unset
     85
     86#ifdef NEW_DEBUG_AND_FILL
     87#include <malloc.h>
     88#include <exception>
     89#include <new>
     90void *operator new(size_t size)
     91{
     92  void * p = malloc(size);
     93  char * xx = (char *) p;
     94  memset(xx,0x20,size);
     95  return p;
     96}
     97void operator delete(void *p) throw()
     98{
     99  free(p);
     100}
     101#endif // end NEW_DEBUG
    85102//#define CLP_MALLOC_STATISTICS
    86103
     
    77317748                  }
    77327749
    7733                   assert(saveSolver->isProvenOptimal());
     7750                  //assert(saveSolver->isProvenOptimal());
    77347751#ifndef CBC_OTHER_SOLVER
    77357752                  // and original solver
     
    77547771                      osiclp->getModelPtr()->checkUnscaledSolution();
    77557772                  }
    7756                   assert(originalSolver->isProvenOptimal());
     7773                  //assert(originalSolver->isProvenOptimal());
    77577774#endif
    77587775                  babModel_->assignSolver(saveSolver);
     
    78127829#endif
    78137830                  }
    7814                   assert(originalSolver->isProvenOptimal());
     7831                  //assert(originalSolver->isProvenOptimal());
    78157832                }
    78167833#endif
     
    1004710064                  delete[] newMasks;
    1004810065                }
    10049                 if (printMode > 5) {
     10066                if (printMode > 5 && printMode < 12) {
    1005010067                  ClpSimplex *solver = clpSolver->getModelPtr();
    1005110068                  int numberColumns = numberPrintingColumns(clpSolver);
     
    1023210249                const double *columnLower = clpSolver->getColLower();
    1023310250                const double *columnUpper = clpSolver->getColUpper();
    10234                 if (printMode != 2) {
     10251                if (printMode != 2 && printMode < 12) {
    1023510252                  if (printMode == 5) {
    1023610253                    if (lengthName)
     
    1030110318                    }
    1030210319                  }
    10303                 } else {
     10320                } else if (printMode==2){
    1030410321                  // special format suitable for OsiRowCutDebugger
    1030510322                  int n = 0;
     
    1034610363                  }
    1034710364                  fprintf(fp, "};\n");
     10365                } else {
     10366                  // Make up a fake bounds section
     10367                  char outputValue[24];
     10368                  for (iColumn = 0; iColumn < numberColumns; iColumn++) {
     10369                    if (printMode==13||model_.solver()->isInteger(iColumn)) {
     10370                      fprintf(fp," FX BOUND001  ");
     10371                      const char *name = columnNames[iColumn].c_str();
     10372                      size_t n = strlen(name);
     10373                      size_t i;
     10374                      for (i = 0; i < n; i++)
     10375                        fprintf(fp, "%c", name[i]);
     10376                      for (; i < lengthPrint; i++)
     10377                        fprintf(fp, " ");
     10378                      CoinConvertDouble(5,2,primalColumnSolution[iColumn],
     10379                                        outputValue);
     10380                      fprintf(fp,"  %s\n",outputValue);
     10381                    } else {
     10382                      fprintf(fp," LO BOUND001  ");
     10383                      const char *name = columnNames[iColumn].c_str();
     10384                      size_t n = strlen(name);
     10385                      size_t i;
     10386                      for (i = 0; i < n; i++)
     10387                        fprintf(fp, "%c", name[i]);
     10388                      for (; i < lengthPrint; i++)
     10389                        fprintf(fp, " ");
     10390                      CoinConvertDouble(5,2,CoinMax(-1.0e30,columnLower[iColumn]),
     10391                                        outputValue);
     10392                      fprintf(fp,"  %s\n",outputValue);
     10393                      fprintf(fp," UP BOUND001  ");
     10394                      for (i = 0; i < n; i++)
     10395                        fprintf(fp, "%c", name[i]);
     10396                      for (; i < lengthPrint; i++)
     10397                        fprintf(fp, " ");
     10398                      CoinConvertDouble(5,2,CoinMin(1.0e30,columnUpper[iColumn]),
     10399                                        outputValue);
     10400                      fprintf(fp,"  %s\n",outputValue);
     10401                    }
     10402                  }
     10403                  for (iColumn = 0; iColumn < numberColumns; iColumn++) {
     10404                    if (primalColumnSolution[iColumn] > columnUpper[iColumn] + primalTolerance || primalColumnSolution[iColumn] < columnLower[iColumn] - primalTolerance) {
     10405                      fprintf(fp," FX BOUND002  ");
     10406                      const char *name = columnNames[iColumn].c_str();
     10407                      size_t n = strlen(name);
     10408                      size_t i;
     10409                      for (i = 0; i < n; i++)
     10410                        fprintf(fp, "%c", name[i]);
     10411                      for (; i < lengthPrint; i++)
     10412                        fprintf(fp, " ");
     10413                      CoinConvertDouble(5,2,primalColumnSolution[iColumn],
     10414                                        outputValue);
     10415                      fprintf(fp,"  %s\n",outputValue);
     10416                    }
     10417                  }
    1034810418                }
    1034910419                if (fp != stdout)
Note: See TracChangeset for help on using the changeset viewer.