Ignore:
Timestamp:
Jul 16, 2014 5:29:16 AM (5 years ago)
Author:
forrest
Message:

First try at orbital branching

File:
1 edited

Legend:

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

    r2043 r2048  
    6262#include "CbcFathom.hpp"
    6363#include "CbcFullNodeInfo.hpp"
     64#ifdef COIN_HAS_NTY
     65#include "CbcSymmetry.hpp"
     66#endif
    6467// include Probing
    6568#include "CglProbing.hpp"
     
    22812284    */
    22822285    continuousSolver_ = solver_->clone() ;
     2286#ifdef COIN_HAS_NTY
     2287    // maybe allow on fix and restart later
     2288    if ((moreSpecialOptions2_&(128|256))!=0&&!parentModel_) {
     2289      symmetryInfo_ = new CbcSymmetry();
     2290      symmetryInfo_->setupSymmetry(*continuousSolver_);
     2291      int numberGenerators = symmetryInfo_->statsOrbits(this,0);
     2292      if (!numberGenerators) {
     2293        delete symmetryInfo_;
     2294        symmetryInfo_=NULL;
     2295        moreSpecialOptions2_ &= ~128;
     2296      }
     2297    }
     2298#endif
    22832299
    22842300    // add cutoff as constraint if wanted
     
    25652581        rootModels[i]->setMoreSpecialOptions(moreSpecialOptions_ &
    25662582                                             (~134217728));
     2583        rootModels[i]->setMoreSpecialOptions2(moreSpecialOptions2_ &
     2584                                             (~128));
    25672585        rootModels[i]->solver_->setWarmStart(basis);
    25682586#ifdef COIN_HAS_CLP
     
    38563874        if (toZero[number01]) {
    38573875            CglTreeProbingInfo info(*probingInfo_);
    3858             if ((moreSpecialOptions_&1048576)!=0&&!parentModel_) {
     3876            if ((moreSpecialOptions2_&64)!=0&&!parentModel_) {
    38593877              /*
    38603878                Marginal idea. Further exploration probably good. Build some extra
     
    45234541                << CoinMessageEol ;
    45244542            }
     4543#ifdef COIN_HAS_NTY
     4544            if (symmetryInfo_)
     4545              symmetryInfo_->statsOrbits(this,1);
     4546#endif
    45254547            if (eventHandler && !eventHandler->event(CbcEventHandler::treeStatus)) {
    45264548                eventHappened_ = true; // exit
     
    47624784        << numberDJFixed_ << numberExtraNodes_ << numberExtraIterations_
    47634785        << CoinMessageEol ;
     4786#ifdef COIN_HAS_NTY
     4787    if (symmetryInfo_)
     4788      symmetryInfo_->statsOrbits(this,1);
     4789#endif
    47644790    if (doStatistics == 100) {
    47654791        for (int i = 0; i < numberObjects_; i++) {
     
    52795305        fastNodeDepth_(-1),
    52805306        eventHandler_(NULL),
     5307#ifdef COIN_HAS_NTY
     5308        symmetryInfo_(NULL),
     5309#endif
    52815310        numberObjects_(0),
    52825311        object_(NULL),
     
    54445473        fastNodeDepth_(-1),
    54455474        eventHandler_(NULL),
     5475#ifdef COIN_HAS_NTY
     5476        symmetryInfo_(NULL),
     5477#endif
    54465478        numberObjects_(0),
    54475479        object_(NULL),
     
    59625994        lastCut_ = NULL;
    59635995    }
     5996#ifdef COIN_HAS_NTY
     5997    if (rhs.symmetryInfo_)
     5998      symmetryInfo_ = new CbcSymmetry(*rhs.symmetryInfo_);
     5999    else
     6000      symmetryInfo_ = NULL;
     6001#endif
    59646002    synchronizeModel();
    59656003    if (cloneHandler && !defaultHandler_) {
     
    62966334            lastCut_ = NULL;
    62976335        }
     6336#ifdef COIN_HAS_NTY
     6337        if (rhs.symmetryInfo_)
     6338          symmetryInfo_ = new CbcSymmetry(*rhs.symmetryInfo_);
     6339        else
     6340          symmetryInfo_ = NULL;
     6341#endif
    62986342        synchronizeModel();
    62996343        cbcColLower_ = NULL;
     
    63876431    topOfTree_ = NULL;
    63886432    resetModel();
     6433#ifdef COIN_HAS_NTY
     6434    delete symmetryInfo_;
     6435    symmetryInfo_ = NULL;
     6436#endif
    63896437}
    63906438// Clears out enough to reset CbcModel
     
    66126660    messageHandler()->setLogLevel(rhs.messageHandler()->logLevel());
    66136661    whenCuts_ = rhs.whenCuts_;
     6662#ifdef COIN_HAS_NTY
     6663    if (rhs.symmetryInfo_)
     6664      symmetryInfo_ = new CbcSymmetry (*rhs.symmetryInfo_);
     6665    else
     6666      symmetryInfo_ = NULL;
     6667#endif
    66146668    synchronizeModel();
    66156669}
     
    1181211866        // Can trust solution
    1181311867        int numberColumns = solver_->getNumCols();
     11868#ifdef COIN_HAS_CLP
     11869        OsiClpSolverInterface * clpContinuousSolver
     11870          = dynamic_cast<OsiClpSolverInterface *> (continuousSolver_);
     11871        int modifiedTolerances=0;
     11872#ifndef CBC_LEAVE_PERTURBATION_ON_CHECK_SOLUTION
     11873        int savePerturbation=-1;
     11874#endif
     11875#ifndef CBC_LEAVE_TOLERANCE_ON_CHECK_SOLUTION
     11876        double savePrimalTolerance=0.0;
     11877#endif
     11878#ifndef CBC_LEAVE_SCALING_ON_CHECK_SOLUTION
     11879        int saveScaling=-1;
     11880#endif
     11881        if (clpContinuousSolver ) {
     11882          // be more accurate if possible
     11883          ClpSimplex * clp = clpContinuousSolver->getModelPtr();
     11884#ifndef CBC_LEAVE_PERTURBATION_ON_CHECK_SOLUTION
     11885          savePerturbation=clp->perturbation();
     11886#endif
     11887#ifndef CBC_LEAVE_TOLERANCE_ON_CHECK_SOLUTION
     11888          savePrimalTolerance=clp->primalTolerance();
     11889#endif
     11890#ifndef CBC_LEAVE_SCALING_ON_CHECK_SOLUTION
     11891          saveScaling=clp->scalingFlag();
     11892#endif
     11893#ifndef CBC_LEAVE_TOLERANCE_ON_CHECK_SOLUTION
     11894          if (savePrimalTolerance>0.9999999e-7) {
     11895            modifiedTolerances |= 1;
     11896            clp->setPrimalTolerance(1.0e-8);
     11897          }
     11898#endif
     11899#ifndef CBC_LEAVE_PERTURBATION_ON_CHECK_SOLUTION
     11900          if (savePerturbation<100) {
     11901            modifiedTolerances |= 2;
     11902            clp->setPerturbation(100);
     11903          }
     11904#endif
     11905#ifndef CBC_LEAVE_SCALING_ON_CHECK_SOLUTION
     11906          if (saveScaling) {
     11907            modifiedTolerances |= 4;
     11908            clp->scaling(0);
     11909          }
     11910#endif
     11911        }
     11912#endif
    1181411913
    1181511914        /*
     
    1216812267#endif
    1216912268                    solver_->initialSolve();
     12269#ifdef COIN_HAS_CLP
     12270                    if (!solver_->isProvenOptimal()&&modifiedTolerances) {
     12271                      // Restore
     12272                      ClpSimplex * clp = clpContinuousSolver->getModelPtr();
     12273#ifndef CBC_LEAVE_TOLERANCE_ON_CHECK_SOLUTION
     12274                      clp->setPrimalTolerance(savePrimalTolerance);
     12275#endif
     12276#ifndef CBC_LEAVE_PERTURBATION_ON_CHECK_SOLUTION
     12277                      clp->setPerturbation(savePerturbation);
     12278#endif
     12279#ifndef CBC_LEAVE_SCALING_ON_CHECK_SOLUTION
     12280                      clp->scaling(saveScaling);
     12281#endif
     12282                      solver_->resolve();
     12283                    }
     12284#endif
    1217012285#if COIN_DEVELOP>1
    1217112286                    if (!solver_->isProvenOptimal()) {
     
    1236112476                objectiveValue = objValue;
    1236212477                //}
    12363 #ifdef CLP_INVESTIGATE
     12478#if 1 //def CLP_INVESTIGATE
    1236412479                if (largestInfeasibility > 10.0*primalTolerance)
    12365                     printf("largest infeasibility is %g\n", largestInfeasibility);
     12480                    printf("XX largest infeasibility is %g\n", largestInfeasibility);
    1236612481#endif
    1236712482                if (largestInfeasibility > 200.0*primalTolerance) {
     
    1239712512        solver_ = saveSolver;
    1239812513        testSolution_ = save;
     12514#ifdef COIN_HAS_CLP
     12515        if (modifiedTolerances) {
     12516          // Restore
     12517          ClpSimplex * clp = clpContinuousSolver->getModelPtr();
     12518#ifndef CBC_LEAVE_TOLERANCE_ON_CHECK_SOLUTION
     12519          clp->setPrimalTolerance(savePrimalTolerance);
     12520#endif
     12521#ifndef CBC_LEAVE_PERTURBATION_ON_CHECK_SOLUTION
     12522          clp->setPerturbation(savePerturbation);
     12523#endif
     12524#ifndef CBC_LEAVE_SCALING_ON_CHECK_SOLUTION
     12525          clp->scaling(saveScaling);
     12526#endif
     12527        }
     12528#endif
    1239912529        return objectiveValue;
    1240012530    } else {
     
    1447814608            }
    1447914609#endif
     14610#ifdef COIN_HAS_NTY
     14611            if (symmetryInfo_) {
     14612              CbcNodeInfo * infoX = oldNode ? oldNode->nodeInfo() : NULL;
     14613              bool worthTrying = false;
     14614              if (infoX) {
     14615                CbcNodeInfo * info = infoX;
     14616                for (int i=0;i<NTY_BAD_DEPTH;i++) {
     14617                  if (!info->parent()) {
     14618                    worthTrying = true;
     14619                    break;
     14620                  }
     14621                  info = info->parent();
     14622                  if (info->symmetryWorked()) {
     14623                    worthTrying = true;
     14624                    break;
     14625                  }
     14626                }
     14627              } else {
     14628                worthTrying=true;
     14629              }
     14630              if (worthTrying) {
     14631                int n=symmetryInfo_->orbitalFixing(solver_);
     14632                if (n) {
     14633#if PRINT_MORE==0
     14634                  if (logLevel()>1)
     14635                    printf("%d orbital fixes\n",n);
     14636#endif
     14637                  solver_->resolve();
     14638                  if(!isProvenOptimal()) {
     14639                    if (logLevel()>1)
     14640                      printf("infeasible after orbital fixing\n");
     14641                  }
     14642                }
     14643              }
     14644            }
     14645#endif
    1448014646            if (numberBeforeTrust_ == 0 ) {
    1448114647                anyAction = newNode->chooseBranch(this, oldNode, numberPassesLeft) ;
     
    1691917085                             * dblParam_[CbcAllowableFractionGap]);
    1692017086    returnCode = (bestObjective_ - bestPossibleObjective_ < testGap && getCutoffIncrement() >= 0.0);
    16921   }
     17087  }
     17088#if 1
     17089  if (returnCode) {
     17090    if (fabs(bestObjective_+1469650.0)<1.0) {
     17091      fprintf(stderr,"BAD - cr to continue\n");
     17092      fflush(stdout);
     17093      char xx;
     17094      xx=getc(stdin);
     17095    }
     17096  }
     17097#endif
    1692217098  return returnCode;
    1692317099}
Note: See TracChangeset for help on using the changeset viewer.