Ignore:
File:
1 edited

Legend:

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

    r2077 r2097  
    175175    struct timespec absTime2;
    176176    my_gettime(&absTime2);
    177     double time2 = (double)absTime2.tv_sec + 1.0e-9 * (double)absTime2.tv_nsec;
     177    double time2 = absTime2.tv_sec + 1.0e-9 *
     178      static_cast<double>(absTime2.tv_nsec);
    178179    return time2;
    179180}
     
    595596CbcBaseModel::stopThreads(int type)
    596597{
     598    CbcModel * baseModel = children_[0].baseModel();
    597599    if (type < 0) {
    598600        // max nodes ?
     
    607609          }
    608610        }
     611        for (int i = 0; i < numberThreads_; i++) {
     612          baseModel->incrementExtra(threadModel_[i]->getExtraNodeCount(),
     613                                    threadModel_[i]->numberExtraIterations(),
     614                                    threadModel_[i]->getFathomCount());
     615          threadModel_[i]->zeroExtra();
     616        }
    609617        return;
    610618    }
     
    612620        children_[i].wait(1, 0);
    613621        assert (children_[i].returnCode() == -1);
     622        baseModel->incrementExtra(threadModel_[i]->getExtraNodeCount(),
     623                                  threadModel_[i]->numberExtraIterations(),
     624                                  threadModel_[i]->getFathomCount());
    614625        threadModel_[i]->setInfoInChild(-2, NULL);
    615626        children_[i].setReturnCode( 0);
     
    640651    int anyLeft = 0;
    641652    // May be able to combine parts later
    642 
    643653    if (type == 0) {
    644654        bool locked = true;
     
    651661            for (iThread = 0; iThread < numberThreads_; iThread++) {
    652662                if (children_[iThread].status()) {
    653                     if (children_[iThread].returnCode() == 0)
     663                  if (children_[iThread].returnCode() == 0) {
    654664                        break;
     665                  }
    655666                }
    656667            }
     
    755766        // Start one off if any available
    756767        for (iThread = 0; iThread < numberThreads_; iThread++) {
    757             if (children_[iThread].returnCode() == -1)
     768          if (children_[iThread].returnCode() == -1) {
    758769                break;
     770          }
    759771        }
    760772        if (iThread < numberThreads_) {
     
    878890            if (children_[i].deterministic() > 0)
    879891                delete [] children_[i].delNode();
     892            if (children_[i].node()) {
     893              delete children_[i].node();
     894              children_[i].setNode(NULL);
     895            }
    880896            children_[i].setReturnCode( 0);
    881897            children_[i].unlockFromMaster();
     
    13181334        otherModel->numberSolutions_ = numberSolutions_;
    13191335        otherModel->numberHeuristicSolutions_ = numberHeuristicSolutions_;
    1320         otherModel->numberNodes_ = 1; //numberNodes_;
     1336        otherModel->numberNodes_ = numberNodes_;
    13211337        otherModel->numberIterations_ = numberIterations_;
    13221338#ifdef JJF_ZERO
     
    14171433CbcModel::moveToModel(CbcModel * baseModel, int mode)
    14181434{
     1435#ifdef THREAD_DEBUG
     1436    {
     1437      CbcThread * stuff = reinterpret_cast<CbcThread *> (masterThread_);
     1438      if (stuff)
     1439        printf("mode %d node_ %p createdNode_ %p - stuff %p\n",
     1440               mode,stuff->node(),stuff->createdNode(),stuff);
     1441      else
     1442        printf("mode %d null stuff\n",mode);
     1443    }
     1444#endif
    14191445    if (mode == 0) {
    14201446        setCutoff(baseModel->getCutoff());
    14211447        bestObjective_ = baseModel->bestObjective_;
    14221448        //assert (!baseModel->globalCuts_.sizeRowCuts());
    1423         if (numberSolutions_ < baseModel->numberSolutions_) {
    1424           assert (baseModel->bestSolution_);
     1449        if (numberSolutions_ < baseModel->numberSolutions_&& baseModel->bestSolution_) {
    14251450          int numberColumns = solver_->getNumCols();
    14261451          if (!bestSolution_)
     
    14631488            }
    14641489        }
     1490        // add new global cuts
     1491        CbcRowCuts * baseGlobal = baseModel->globalCuts();
     1492        CbcRowCuts * thisGlobal = globalCuts();
     1493        int baseNumberCuts = baseGlobal->sizeRowCuts();
     1494        int thisNumberCuts = thisGlobal->sizeRowCuts();
     1495        for (int i=thisNumberCuts;i<baseNumberCuts;i++) {
     1496          thisGlobal->addCutIfNotDuplicate(*baseGlobal->cut(i));
     1497        }
     1498        numberGlobalCutsIn_ = baseNumberCuts;
    14651499    } else if (mode == 1) {
    14661500        lockThread();
     
    15021536        if (stuff->createdNode())
    15031537            baseModel->tree_->push(stuff->createdNode());
     1538        // add new global cuts to base and take off
     1539        CbcRowCuts * baseGlobal = baseModel->globalCuts();
     1540        CbcRowCuts * thisGlobal = globalCuts();
     1541        int thisNumberCuts = thisGlobal->sizeRowCuts();
     1542        for (int i=thisNumberCuts-1;i>=numberGlobalCutsIn_;i--) {
     1543          baseGlobal->addCutIfNotDuplicate(*thisGlobal->cut(i),thisGlobal->cut(i)->whichRow());
     1544          thisGlobal->eraseRowCut(i);
     1545        }
     1546        //thisGlobal->truncate(numberGlobalCutsIn_);
     1547        numberGlobalCutsIn_ = 999999;
    15041548        unlockThread();
    15051549    } else if (mode == 2) {
     
    15311575            tree_ = NULL;
    15321576        }
     1577        if ((moreSpecialOptions2_&32)!=0)
     1578          delete eventHandler_;
    15331579        eventHandler_ = NULL;
    15341580        delete solverCharacteristics_;
     
    15421588    } else if (mode == -1) {
    15431589        delete eventHandler_;
    1544         eventHandler_ = baseModel->eventHandler_;
     1590        if ((moreSpecialOptions2_&32)==0||!baseModel->eventHandler_) {
     1591          eventHandler_ = baseModel->eventHandler_;
     1592        } else {
     1593          eventHandler_ = baseModel->eventHandler_->clone();
     1594          eventHandler_->setModel(this);
     1595        }
    15451596        assert (!statistics_);
    15461597        assert(baseModel->solverCharacteristics_);
     
    15681619            tree_->setComparison(*nodeCompare_) ;
    15691620        }
     1621        delete continuousSolver_;
    15701622        continuousSolver_ = baseModel->continuousSolver_->clone();
    15711623        // make sure solvers have correct message handler
     
    15941646            generator_[i] = new CbcCutGenerator(*baseModel->generator_[i]);
    15951647            // refreshModel was overkill as thought too many rows
    1596             generator_[i]->setModel(this);
     1648            if (generator_[i]->needsRefresh())
     1649              generator_[i]->refreshModel(this);
     1650            else
     1651              generator_[i]->setModel(this);
    15971652        }
    15981653    } else if (mode == 10) {
     
    16531708                CoinCopyN(bestSolution_, numberColumns, baseModel->bestSolution_);
    16541709                baseModel->setCutoff(getCutoff());
     1710                baseModel->handler_->message(CBC_ROUNDING, messages_)
     1711                << bestObjective_
     1712                << "heuristic"
     1713                << baseModel->numberIterations_
     1714                << baseModel->numberNodes_ << getCurrentSeconds()
     1715                << CoinMessageEol;
    16551716            }
    16561717            //stateOfSearch_
     
    18441905
    18451906        for (j = numberRowCutsBefore; j < numberRowCutsAfter; j++) {
    1846             whichGenerator_[numberBefore++] = i ;
     1907            whichGenerator_[numberBefore++] = i  ;
    18471908            const OsiRowCut * thisCut = theseCuts.rowCutPtr(j) ;
    18481909            if (thisCut->lb() > thisCut->ub())
     
    18801941                    printf("Old cut added - violation %g\n",
    18811942                           thisCut->violated(cbcColSolution_)) ;
    1882                 whichGenerator_[numberOld++] = -1;
     1943                whichGenerator_[numberOld++] = 999;
    18831944                theseCuts.insert(*thisCut) ;
    18841945            }
Note: See TracChangeset for help on using the changeset viewer.