Changeset 274 for trunk


Ignore:
Timestamp:
Mar 14, 2006 12:44:28 PM (14 years ago)
Author:
forrest
Message:

for miplib

Location:
trunk/Test
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • trunk/Test/CoinSolve.cpp

    r263 r274  
    7575#include  "CbcOrClpParam.hpp"
    7676#include  "CbcCutGenerator.hpp"
     77#include  "CbcStrategy.hpp"
    7778
    7879#include "OsiClpSolverInterface.hpp"
     
    106107int mainTest (int argc, const char *argv[],int algorithm,
    107108              ClpSimplex empty, bool doPresolve,int switchOff);
     109void CbcClpUnitTest (const CbcModel & saveModel);
    108110int CbcOrClpRead_mode=1;
    109111FILE * CbcOrClpReadCommand=stdin;
     
    14611463            }
    14621464            break;
     1465          case MIPLIB:
     1466            // User can set options - main differenec is lack of model and CglPreProcess
     1467            goodModel=true;
    14631468/*
    14641469  Run branch-and-cut. First set a few options -- node comparison, scaling. If
     
    14701475          case STRENGTHEN:
    14711476            if (goodModel) {
     1477              bool miplib = type==MIPLIB;
    14721478              int logLevel = parameters[slog].intValue();
    14731479              // Reduce printout
     
    14821488                si->setSpecialOptions(0x40000000);
    14831489              }
    1484               model.initialSolve();
     1490              if (!miplib)
     1491                model.initialSolve();
    14851492              // If user made settings then use them
    14861493              if (!defaultSettings) {
     
    15451552                clpSolver2->messageHandler()->setLogLevel(logLevel);
    15461553              lpSolver = clpSolver2->getModelPtr();
    1547               if (lpSolver->factorizationFrequency()==200) {
     1554              if (lpSolver->factorizationFrequency()==200&&!miplib) {
    15481555                // User did not touch preset
    15491556                int numberRows = lpSolver->numberRows();
     
    16281635              }
    16291636              // now tighten bounds
    1630               {
     1637              if (!miplib) {
    16311638                OsiClpSolverInterface * si =
    16321639                  dynamic_cast<OsiClpSolverInterface *>(babModel->solver()) ;
     
    16881695                babModel->addHeuristic(&heuristic4);
    16891696              }
    1690               CbcRounding heuristic1(*babModel);
    1691               if (useRounding)
    1692                 babModel->addHeuristic(&heuristic1) ;
    1693               CbcHeuristicLocal heuristic2(*babModel);
    1694               heuristic2.setSearchType(1);
    1695               if (useCombine)
    1696                 babModel->addHeuristic(&heuristic2);
    1697               CbcHeuristicGreedyCover heuristic3(*babModel);
    1698               CbcHeuristicGreedyEquality heuristic3a(*babModel);
    1699               if (useGreedy) {
    1700                 babModel->addHeuristic(&heuristic3);
    1701                 babModel->addHeuristic(&heuristic3a);
    1702               }
    1703               if (useLocalTree) {
    1704                 CbcTreeLocal localTree(babModel,NULL,10,0,0,10000,2000);
    1705                 babModel->passInTreeHandler(localTree);
     1697              if (!miplib) {
     1698                CbcRounding heuristic1(*babModel);
     1699                if (useRounding)
     1700                  babModel->addHeuristic(&heuristic1) ;
     1701                CbcHeuristicLocal heuristic2(*babModel);
     1702                heuristic2.setSearchType(1);
     1703                if (useCombine)
     1704                  babModel->addHeuristic(&heuristic2);
     1705                CbcHeuristicGreedyCover heuristic3(*babModel);
     1706                CbcHeuristicGreedyEquality heuristic3a(*babModel);
     1707                if (useGreedy) {
     1708                  babModel->addHeuristic(&heuristic3);
     1709                  babModel->addHeuristic(&heuristic3a);
     1710                }
     1711                if (useLocalTree) {
     1712                  CbcTreeLocal localTree(babModel,NULL,10,0,0,10000,2000);
     1713                  babModel->passInTreeHandler(localTree);
     1714                }
    17061715              }
    17071716              // add cut generators if wanted
     
    17791788              }
    17801789              // Could tune more
    1781               babModel->setMinimumDrop(min(5.0e-2,
    1782                                         fabs(babModel->getMinimizationObjValue())*1.0e-3+1.0e-4));
    1783               if (cutPass==-1234567) {
    1784                 if (babModel->getNumCols()<500)
    1785                   babModel->setMaximumCutPassesAtRoot(-100); // always do 100 if possible
    1786                 else if (babModel->getNumCols()<5000)
    1787                   babModel->setMaximumCutPassesAtRoot(100); // use minimum drop
    1788                 else
    1789                   babModel->setMaximumCutPassesAtRoot(20);
    1790               } else {
    1791                 babModel->setMaximumCutPassesAtRoot(cutPass);
    1792               }
    1793               babModel->setMaximumCutPasses(1);
    1794              
     1790              if (!miplib) {
     1791                babModel->setMinimumDrop(min(5.0e-2,
     1792                                             fabs(babModel->getMinimizationObjValue())*1.0e-3+1.0e-4));
     1793                if (cutPass==-1234567) {
     1794                  if (babModel->getNumCols()<500)
     1795                    babModel->setMaximumCutPassesAtRoot(-100); // always do 100 if possible
     1796                  else if (babModel->getNumCols()<5000)
     1797                    babModel->setMaximumCutPassesAtRoot(100); // use minimum drop
     1798                  else
     1799                    babModel->setMaximumCutPassesAtRoot(20);
     1800                } else {
     1801                  babModel->setMaximumCutPassesAtRoot(cutPass);
     1802                }
     1803                babModel->setMaximumCutPasses(1);
     1804              }
    17951805              // Do more strong branching if small
    17961806              //if (babModel->getNumCols()<5000)
     
    18161826              }
    18171827              double increment=babModel->getCutoffIncrement();;
    1818               int * changed = analyze( osiclp,numberChanged,increment,false);
     1828              int * changed = NULL;
     1829              if (!miplib)
     1830                changed=analyze( osiclp,numberChanged,increment,false);
    18191831              if (debugValues) {
    18201832                if (numberDebugValues==babModel->getNumCols()) {
     
    18441856              currentBranchModel = babModel;
    18451857              OsiSolverInterface * strengthenedModel=NULL;
    1846               if (type==BAB) {
     1858              if (type==BAB||type==MIPLIB) {
    18471859                int moreMipOptions = parameters[whichParam(MOREMIPOPTIONS,numberParameters,parameters)].intValue();
    18481860                if (moreMipOptions>=0) {
     
    18501862                  babModel->setSearchStrategy(moreMipOptions);
    18511863                }
     1864              }
     1865              if (type==BAB) {
    18521866                if (preProcess&&process.numberSOS()) {
    18531867                  int numberSOS = process.numberSOS();
     
    18881902                int statistics = (printOptions>0) ? printOptions: 0;
    18891903                babModel->branchAndBound(statistics);
     1904              } else if (type==MIPLIB) {
     1905                CbcStrategyDefault strategy(true,5,5);
     1906                // Set up pre-processing to find sos if wanted
     1907                if (preProcess)
     1908                  strategy.setupPreProcessing(2);
     1909                babModel->setStrategy(strategy);
     1910                CbcClpUnitTest(*babModel);
     1911                goodModel=false;
     1912                break;
    18901913              } else {
    18911914                strengthenedModel = babModel->strengthenedModel();
  • trunk/Test/unitTestClp.cpp

    r204 r274  
    1515#include "CoinHelperFunctions.hpp"
    1616#include "CoinTime.hpp"
    17 
     17#include "CbcModel.hpp"
     18#include "OsiClpSolverInterface.hpp"
    1819#include "ClpFactorization.hpp"
    1920#include "ClpSimplex.hpp"
     
    17471748#endif 
    17481749}
     1750void CbcClpUnitTest (const CbcModel & saveModel)
     1751{
     1752  unsigned int m ;
     1753  // See if files exist
     1754  FILE * fp;
     1755  bool doTest=false;
     1756  const char dirsep =  CoinFindDirSeparator();
     1757 
     1758  // Set directory containing miplib data files.
     1759  std::string miplibDir;
     1760  miplibDir = dirsep == '/' ? "./Samples/miplib3/" : ".\\Samples\\miplib3\\";
     1761  std::string test1 = miplibDir +"p0033";
     1762  fp=fopen(test1.c_str(),"r");
     1763  if (fp) {
     1764    doTest=true;
     1765    fclose(fp);
     1766  }
     1767#ifdef COIN_USE_ZLIB
     1768  test1 += ".gz";
     1769  fp=fopen(test1.c_str(),"r");
     1770  if (fp) {
     1771    doTest=true;
     1772    fclose(fp);
     1773  }
     1774#endif
     1775  if (!doTest)
     1776    return;
     1777  /*
     1778    Vectors to hold test problem names and characteristics. The objective value
     1779    after optimization (objValue) must agree to the specified tolerance
     1780    (objValueTol).
     1781  */
     1782  std::vector<std::string> mpsName ;
     1783  std::vector<int> nRows ;
     1784  std::vector<int> nCols ;
     1785  std::vector<double> objValueC ;
     1786  std::vector<double> objValue ;
     1787  std::vector<int> strategy ;
     1788  /*
     1789    And a macro to make the vector creation marginally readable.
     1790  */
     1791#define PUSH_MPS(zz_mpsName_zz,\
     1792                 zz_nRows_zz,zz_nCols_zz,zz_objValue_zz,zz_objValueC_zz, \
     1793                 zz_strategy_zz) \
     1794  mpsName.push_back(zz_mpsName_zz) ; \
     1795  nRows.push_back(zz_nRows_zz) ; \
     1796  nCols.push_back(zz_nCols_zz) ; \
     1797  objValueC.push_back(zz_objValueC_zz) ; \
     1798  strategy.push_back(zz_strategy_zz) ; \
     1799  objValue.push_back(zz_objValue_zz) ;
     1800 
     1801  /*
     1802    Load up the problem vector. Note that the row counts here include the
     1803    objective function.
     1804   
     1805  */
     1806  // 0 for no test, 1 for some, 2 for many, 3 for all
     1807#define HOWMANY 2
     1808#if HOWMANY
     1809#if HOWMANY>1
     1810  PUSH_MPS("10teams",230,2025,924,917,7);
     1811#endif
     1812  PUSH_MPS("air03",124,10757,340160,338864.25,7);
     1813#if HOWMANY==3
     1814  PUSH_MPS("air04",823,8904,56137,55535.436,8);
     1815  PUSH_MPS("air05",426,7195,26374,25877.609,8);
     1816#endif
     1817  //    PUSH_MPS("arki001",1048,1388,7580813.0459,7579599.80787,7);
     1818  PUSH_MPS("bell3a",123,133,878430.32,862578.64,7);
     1819#if HOWMANY>1
     1820  PUSH_MPS("bell5",91,104,8966406.49,8608417.95,7);
     1821#endif
     1822  PUSH_MPS("blend2",274,353,7.598985,6.9156751140,7);
     1823#if HOWMANY>1
     1824  PUSH_MPS("cap6000",2176,6000,-2451377,-2451537.325,7);
     1825#endif
     1826  //    PUSH_MPS("dano3mip",3202,13873,728.1111,576.23162474,7);
     1827  //PUSH_MPS("danoint",664,521,65.67,62.637280418,7);
     1828  PUSH_MPS("dcmulti",290,548,188182,183975.5397,7);
     1829  PUSH_MPS("dsbmip",1182,1886,-305.19817501,-305.19817501,7);
     1830  PUSH_MPS("egout",98,141,568.101,149.589,7);
     1831  PUSH_MPS("enigma",21,100,0.0,0.0,7);
     1832#if HOWMANY==3
     1833  PUSH_MPS("fast0507",507,63009,174,172.14556668,7);
     1834#endif
     1835  PUSH_MPS("fiber",363,1298,405935.18000,156082.51759,7);
     1836#if HOWMANY>1
     1837  PUSH_MPS("fixnet6",478,878,3983,1200.88,7);
     1838#endif
     1839  PUSH_MPS("flugpl",18,18,1201500,1167185.7,7);
     1840  PUSH_MPS("gen",780,870,112313,112130.0,7);
     1841#if HOWMANY>1
     1842  PUSH_MPS("gesa2",1392,1224,25779856.372,25476489.678,7);
     1843  PUSH_MPS("gesa2_o",1248,1224,25779856.372,25476489.678,7);
     1844#endif
     1845  PUSH_MPS("gesa3",1368,1152,27991042.648,27833632.451,7);
     1846  PUSH_MPS("gesa3_o",1224,1152,27991042.648,27833632.451,7);
     1847  PUSH_MPS("gt2",29,188,21166.000,13460.233074,7);
     1848#if HOWMANY==3
     1849  PUSH_MPS("harp2",112,2993,-73899798.00,-74353341.502,7);
     1850#endif
     1851  PUSH_MPS("khb05250",101,1350,106940226,95919464.0,7);
     1852#if HOWMANY>1
     1853  PUSH_MPS("l152lav",97,1989,4722,4656.36,7);
     1854#endif
     1855  PUSH_MPS("lseu",28,89,1120,834.68,7);
     1856  PUSH_MPS("misc03",96,160,3360,1910.,7);
     1857  PUSH_MPS("misc06",820,1808,12850.8607,12841.6,7);
     1858#if HOWMANY>1
     1859  PUSH_MPS("misc07",212,260,2810,1415.0,7);
     1860  PUSH_MPS("mitre",2054,10724,115155,114740.5184,7);
     1861#endif
     1862  PUSH_MPS("mod008",6,319,307,290.9,7);
     1863  PUSH_MPS("mod010",146,2655,6548,6532.08,7);
     1864#if HOWMANY==3
     1865  PUSH_MPS("mod011",4480,10958,-54558535,-62121982.55,7);
     1866  PUSH_MPS("modglob",291,422,20740508,20430947.,7);
     1867  PUSH_MPS("noswot",182,128,-43,-43.0,7);
     1868#endif
     1869#if HOWMANY>1
     1870  PUSH_MPS("nw04",36,87482,16862,16310.66667,7);
     1871#endif
     1872  PUSH_MPS("p0033",16,33,3089,2520.57,7);
     1873  PUSH_MPS("p0201",133,201,7615,6875.0,7);
     1874  PUSH_MPS("p0282",241,282,258411,176867.50,7);
     1875  PUSH_MPS("p0548",176,548,8691,315.29,7);
     1876  PUSH_MPS("p2756",755,2756,3124,2688.75,7);
     1877#if HOWMANY==3
     1878  PUSH_MPS("pk1",45,86,11.0,0.0,7);
     1879#endif
     1880#if HOWMANY>1
     1881  PUSH_MPS("pp08a",136,240,7350.0,2748.3452381,7);
     1882  PUSH_MPS("pp08aCUTS",246,240,7350.0,5480.6061563,7);
     1883#endif
     1884#if HOWMANY==3
     1885  PUSH_MPS("qiu",1192,840,-132.873137,-931.638857,7);
     1886#endif
     1887  PUSH_MPS("qnet1",503,1541,16029.692681,14274.102667,7);
     1888  PUSH_MPS("qnet1_o",456,1541,16029.692681,12095.571667,7);
     1889  PUSH_MPS("rentacar",6803,9557,30356761,28806137.644,7);
     1890  PUSH_MPS("rgn",24,180,82.1999,48.7999,7);
     1891#if HOWMANY==3
     1892  PUSH_MPS("rout",291,556,1077.56,981.86428571,7);
     1893  PUSH_MPS("set1ch",492,712,54537.75,32007.73,7);
     1894#endif
     1895  //    PUSH_MPS("seymour",4944,1372,423,403.84647413,7);
     1896  PUSH_MPS("stein27",118,27,18,13.0,7);
     1897#if HOWMANY>1
     1898  PUSH_MPS("stein45",331,45,30,22.0,7);
     1899#endif
     1900  PUSH_MPS("vpm1",234,378,20,15.4167,7);
     1901  PUSH_MPS("vpm2",234,378,13.75,9.8892645972,7);
     1902#endif
     1903#undef PUSH_MPS
     1904   
     1905  int numProbSolved = 0;
     1906  double timeTaken=0.0;
     1907 
     1908  /*
     1909    Open the main loop to step through the MPS problems.
     1910  */
     1911  for (m = 0 ; m < mpsName.size() ; m++) {
     1912    std::cerr << "  processing mps file: " << mpsName[m]
     1913              << " (" << m+1 << " out of " << mpsName.size() << ")" << std::endl ;
     1914    /*
     1915      Stage 1: Read the MPS
     1916      and make sure the size of the constraint matrix is correct.
     1917    */
     1918    CbcModel * model = new CbcModel(saveModel);
     1919     
     1920    std::string fn = miplibDir+mpsName[m] ;
     1921    model->solver()->readMps(fn.c_str(),"") ;
     1922    int nr = model->getNumRows() ;
     1923    int nc = model->getNumCols() ;
     1924    assert(nr == nRows[m]) ;
     1925    assert(nc == nCols[m]) ;
     1926    /*
     1927      Stage 2: Call solver to solve the problem.
     1928     
     1929      then check the return code and objective.
     1930     
     1931    */
     1932
     1933    double startTime = CoinCpuTime();
     1934    model->setMaximumNodes(50000);
     1935    OsiClpSolverInterface * si =
     1936      dynamic_cast<OsiClpSolverInterface *>(model->solver()) ;
     1937    assert (si != NULL);
     1938    // get clp itself
     1939    ClpSimplex * modelC = si->getModelPtr();
     1940    modelC->tightenPrimalBounds();
     1941    model->initialSolve();
     1942    model->setMinimumDrop(min(5.0e-2,
     1943                                 fabs(model->getMinimizationObjValue())*1.0e-3+1.0e-4));
     1944    if (model->getNumCols()<500)
     1945      model->setMaximumCutPassesAtRoot(-100); // always do 100 if possible
     1946    else if (model->getNumCols()<5000)
     1947      model->setMaximumCutPassesAtRoot(100); // use minimum drop
     1948    else
     1949      model->setMaximumCutPassesAtRoot(20);
     1950    model->branchAndBound();
     1951     
     1952    double timeOfSolution = CoinCpuTime()-startTime;
     1953    if (!model->status()) {
     1954      double soln = model->getObjValue();       
     1955      CoinRelFltEq eq(1.0e-3) ;
     1956      if (eq(soln,objValue[m])) {
     1957        std::cerr
     1958          <<"cbc_clp"<<" "
     1959          << soln << " = " << objValue[m] << " ; okay";
     1960        numProbSolved++;
     1961      } else  {
     1962        std::cerr <<"cbc_clp" <<" " <<soln << " != " <<objValue[m] << "; error=" ;
     1963        std::cerr <<fabs(objValue[m] - soln);
     1964      }
     1965    } else {
     1966      std::cerr << "error; too many nodes" ;
     1967    }
     1968    std::cerr<<" - took " <<timeOfSolution<<" seconds."<<std::endl;
     1969    timeTaken += timeOfSolution;
     1970    delete model;
     1971  }
     1972  std::cerr
     1973    <<"cbc_clp"
     1974    <<" solved "
     1975    <<numProbSolved
     1976    <<" out of "
     1977    <<objValue.size()
     1978    <<" and took "
     1979    <<timeTaken
     1980    <<" seconds."
     1981    <<std::endl;
     1982}
Note: See TracChangeset for help on using the changeset viewer.