Changeset 235


Ignore:
Timestamp:
Jan 30, 2006 5:09:01 PM (14 years ago)
Author:
forrest
Message:

for ampl

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/Test/CoinSolve.cpp

    r228 r235  
    7676
    7777#include "OsiClpSolverInterface.hpp"
    78 
     78#ifdef CBC_AMPL
     79#include "ampl.h"
     80static bool usingAmpl=false;
     81#endif
    7982static double totalTime=0.0;
    8083
     
    103106int CbcOrClpRead_mode=1;
    104107FILE * CbcOrClpReadCommand=stdin;
     108static bool noPrinting=false;
    105109static int * analyze(OsiClpSolverInterface * solverMod, int & numberChanged, double & increment,
    106110                     bool changeInt)
     
    345349  delete [] changeRhs;
    346350  delete [] ignore;
    347   if (numberInteger)
     351  if (numberInteger&&!noPrinting)
    348352    printf("%d integer variables",numberInteger);
    349353  if (changeInt) {
    350     if (numberChanged)
    351       printf(" and %d variables made integer\n",numberChanged);
    352     else
    353       printf("\n");
     354    if (!noPrinting) {
     355      if (numberChanged)
     356        printf(" and %d variables made integer\n",numberChanged);
     357      else
     358        printf("\n");
     359    }
    354360    delete [] ignore;
    355361    //increment=0.0;
     
    367373    }
    368374  } else {
    369     if (numberChanged)
    370       printf(" and %d variables could be made integer\n",numberChanged);
    371     else
    372       printf("\n");
     375    if (!noPrinting) {
     376      if (numberChanged)
     377        printf(" and %d variables could be made integer\n",numberChanged);
     378      else
     379        printf("\n");
     380    }
    373381    // just get increment
    374382    CbcModel model(*solver);
     383    if (noPrinting)
     384      model.setLogLevel(0);
    375385    model.analyzeObjective();
    376386    double increment2=model.getCutoffIncrement();
    377387    if (increment2>increment) {
    378       printf("cutoff increment increased from %g to %g\n",increment,increment2);
     388      if (!noPrinting)
     389        printf("cutoff increment increased from %g to %g\n",increment,increment2);
    379390      increment=increment2;
    380391    }
     
    393404  {
    394405    double time1 = CoinCpuTime(),time2;
     406    bool goodModel=false;
    395407    CoinSighandler_t saveSignal=SIG_DFL;
    396408    // register signal handler
     
    407419    clpSolver->messageHandler()->setLogLevel(0) ;
    408420    model.messageHandler()->setLogLevel(1);
    409    
    410    
     421#ifdef CBC_AMPL
     422    ampl_info info;
     423    if (argc>2&&!strcmp(argv[2],"-AMPL")) {
     424      usingAmpl=true;
     425      int returnCode = readAmpl(&info,argc,const_cast<char **>(argv));
     426      if (returnCode)
     427        return returnCode;
     428      CbcOrClpRead_mode=2; // so will start with parameters
     429      // see if log in list
     430      noPrinting=true;
     431      for (int i=1;i<info.numberArguments;i++) {
     432        if (!strcmp(info.arguments[i],"log")) {
     433          if (i<info.numberArguments-1&&atoi(info.arguments[i+1])>0)
     434            noPrinting=false;
     435          break;
     436        }
     437      }
     438      if (noPrinting) {
     439        model.messageHandler()->setLogLevel(0);
     440        setCbcOrClpPrinting(false);
     441      }
     442      if (!noPrinting)
     443        printf("%d rows, %d columns and %d elements\n",
     444               info.numberRows,info.numberColumns,info.numberElements);
     445      solver->loadProblem(info.numberColumns,info.numberRows,info.starts,
     446                          info.rows,info.elements,
     447                          info.columnLower,info.columnUpper,info.objective,
     448                          info.rowLower,info.rowUpper);
     449      // If we had a solution use it
     450      if (info.primalSolution) {
     451        solver->setColSolution(info.primalSolution);
     452      }
     453      // status
     454      if (info.rowStatus) {
     455        unsigned char * statusArray = lpSolver->statusArray();
     456        int i;
     457        for (i=0;i<info.numberColumns;i++)
     458          statusArray[i]=(char)info.columnStatus[i];
     459        statusArray+=info.numberColumns;
     460        for (i=0;i<info.numberRows;i++)
     461          statusArray[i]=(char)info.rowStatus[i];
     462        CoinWarmStartBasis * basis = lpSolver->getBasis();
     463        solver->setWarmStart(basis);
     464        delete basis;
     465      }
     466      freeArrays1(&info);
     467      // modify objective if necessary
     468      solver->setObjSense(info.direction);
     469      solver->setDblParam(OsiObjOffset,info.offset);
     470      // Set integer variables
     471      for (int i=info.numberColumns-info.numberBinary-info.numberIntegers;
     472           i<info.numberColumns;i++)
     473        solver->setInteger(i);
     474      goodModel=true;
     475      // change argc etc
     476      argc = info.numberArguments;
     477      argv = const_cast<const char **>(info.arguments);
     478    }
     479#endif   
    411480    // default action on import
    412481    int allowImportErrors=0;
     
    459528    parameters[whichParam(IDIOT,numberParameters,parameters)].setIntValue(doIdiot);
    460529    parameters[whichParam(IMPORT,numberParameters,parameters)].setStringValue(importFile);
     530    parameters[whichParam(PRESOLVETOLERANCE,numberParameters,parameters)].setDoubleValue(1.0e-8);
    461531    int slog = whichParam(SOLVERLOGLEVEL,numberParameters,parameters);
    462532    int log = whichParam(LOGLEVEL,numberParameters,parameters);
     
    488558    parameters[whichParam(PREPROCESS,numberParameters,parameters)].setCurrentOption("sos");
    489559    parameters[whichParam(MIPOPTIONS,numberParameters,parameters)].setIntValue(128|64|1);
     560    parameters[whichParam(MOREMIPOPTIONS,numberParameters,parameters)].setIntValue(-1);
     561    parameters[whichParam(MAXHOTITS,numberParameters,parameters)].setIntValue(100);
    490562
    491563    CglGomory gomoryGen;
     
    555627    parameters[whichParam(ROUNDING,numberParameters,parameters)].setCurrentOption("on");
    556628    bool useFpump=true;
     629    parameters[whichParam(FPUMP,numberParameters,parameters)].setCurrentOption("on");
    557630    bool useGreedy=true;
    558631    parameters[whichParam(GREEDY,numberParameters,parameters)].setCurrentOption("on");
     
    565638    // total number of commands read
    566639    int numberGoodCommands=0;
    567     bool goodModel=false;
    568640    // Set false if user does anything advanced
    569641    bool defaultSettings=true;
     
    581653   
    582654    std::string field;
    583     std::cout<<"Coin Cbc and Clp Solver version "<<CBCVERSION
    584              <<", build "<<__DATE__<<std::endl;
    585     // Print command line
    586     if (argc>1) {
    587       printf("command line - ");
    588       for (int i=0;i<argc;i++)
    589         printf("%s ",argv[i]);
    590       printf("\n");
     655    if (!noPrinting) {
     656      std::cout<<"Coin Cbc and Clp Solver version "<<CBCVERSION
     657               <<", build "<<__DATE__<<std::endl;
     658      // Print command line
     659      if (argc>1) {
     660        printf("command line - ");
     661        for (int i=0;i<argc;i++)
     662          printf("%s ",argv[i]);
     663        printf("\n");
     664      }
    591665    }
    592666    while (1) {
    593667      // next command
    594668      field=CoinReadGetCommand(argc,argv);
    595      
    596669      // exit if null or similar
    597670      if (!field.length()) {
     
    730803          double value = CoinReadGetDoubleField(argc,argv,&valid);
    731804          if (!valid) {
    732             parameters[iParam].setDoubleValue(value);
    733805            if (type<51) {
    734806              parameters[iParam].setDoubleParameter(lpSolver,value);
     
    736808              parameters[iParam].setDoubleParameter(model,value);
    737809            } else {
     810              parameters[iParam].setDoubleParameter(lpSolver,value);
    738811              switch(type) {
    739812              case DJFIX:
     
    763836          int value = CoinReadGetIntField(argc,argv,&valid);
    764837          if (!valid) {
    765             parameters[iParam].setIntValue(value);
    766838            if (type<151) {
    767839              if (parameters[iParam].type()==PRESOLVEPASS)
     
    783855              else if (parameters[iParam].type()==FPUMPITS)
    784856                { useFpump = true;parameters[iParam].setIntValue(value);}
    785               else
    786                 parameters[iParam].setIntParameter(lpSolver,value);
     857              parameters[iParam].setIntParameter(lpSolver,value);
    787858            } else {
    788859              parameters[iParam].setIntParameter(model,value);
     
    808879            }
    809880          } else {
    810             parameters[iParam].setCurrentOption(action);
     881            parameters[iParam].setCurrentOption(action,!noPrinting);
    811882            // for now hard wired
    812883            switch (type) {
     
    10281099        } else {
    10291100          // action
    1030           if (type==EXIT)
     1101          if (type==EXIT) {
     1102#ifdef CBC_AMPL
     1103            if(usingAmpl) {
     1104              if (info.numberIntegers||info.numberBinary) {
     1105                // integer
     1106              } else {
     1107                // linear
     1108              }
     1109              writeAmpl(&info);
     1110              freeArrays2(&info);
     1111              freeArgs(&info);
     1112            }
     1113#endif
    10311114            break; // stop all
     1115          }
    10321116          switch (type) {
    10331117          case DUALSIMPLEX:
     
    10391123              ClpSolve::PresolveType presolveType;
    10401124              ClpSimplex * model2 = lpSolver;
     1125              if (noPrinting)
     1126                lpSolver->setLogLevel(0);
    10411127              ClpSolve solveOptions;
    10421128              if (preSolve!=5&&preSolve)
     
    11191205              model2->initialSolve(solveOptions);
    11201206              basisHasValues=1;
     1207#ifdef CBC_AMPL
     1208              if (usingAmpl) {
     1209                double value = model2->getObjValue()*model2->getObjSense();
     1210                char buf[300];
     1211                int pos=0;
     1212                int iStat = model2->status();
     1213                if (iStat==0) {
     1214                  pos += sprintf(buf+pos,"optimal," );
     1215                } else if (iStat==1) {
     1216                  // infeasible
     1217                  pos += sprintf(buf+pos,"infeasible,");
     1218                } else if (iStat==2) {
     1219                  // unbounded
     1220                  pos += sprintf(buf+pos,"unbounded,");
     1221                } else if (iStat==3) {
     1222                  pos += sprintf(buf+pos,"stopped on iterations or time,");
     1223                } else if (iStat==4) {
     1224                  iStat = 7;
     1225                  pos += sprintf(buf+pos,"stopped on difficulties,");
     1226                } else if (iStat==5) {
     1227                  iStat = 3;
     1228                  pos += sprintf(buf+pos,"stopped on ctrl-c,");
     1229                } else {
     1230                  pos += sprintf(buf+pos,"status unknown,");
     1231                  iStat=6;
     1232                }
     1233                info.problemStatus=iStat;
     1234                info.objValue = value;
     1235                pos += sprintf(buf+pos," objective %.*g",ampl_obj_prec(),
     1236                               value);
     1237                sprintf(buf+pos,"\n%d iterations",
     1238                        model2->getIterationCount());
     1239                free(info.primalSolution);
     1240                int numberColumns=model2->numberColumns();
     1241                info.primalSolution = (double *) malloc(numberColumns*sizeof(double));
     1242                CoinCopyN(model2->primalColumnSolution(),numberColumns,info.primalSolution);
     1243                int numberRows = model2->numberRows();
     1244                free(info.dualSolution);
     1245                info.dualSolution = (double *) malloc(numberRows*sizeof(double));
     1246                CoinCopyN(model2->dualRowSolution(),numberRows,info.dualSolution);
     1247                CoinWarmStartBasis * basis = model2->getBasis();
     1248                // Put basis in
     1249                int i;
     1250                // free,basic,ub,lb are 0,1,2,3
     1251                for (i=0;i<numberRows;i++) {
     1252                  CoinWarmStartBasis::Status status = basis->getArtifStatus(i);
     1253                  info.rowStatus[i]=status;
     1254                }
     1255                for (i=0;i<numberColumns;i++) {
     1256                  CoinWarmStartBasis::Status status = basis->getStructStatus(i);
     1257                  info.columnStatus[i]=status;
     1258                }
     1259                // put buffer into info
     1260                strcpy(info.buffer,buf);
     1261                delete basis;
     1262              }
     1263#endif
    11211264            } else {
    11221265              std::cout<<"** Current model not valid"<<std::endl;
     
    13001443                  process.addCutGenerator(&generator1);
    13011444                  int translate[]={9999,0,0,-1,2};
     1445                  process.messageHandler()->setLogLevel(babModel->logLevel());
    13021446                  solver2 = process.preProcessNonDefault(*saveSolver,translate[preProcess],10);
    13031447                  // Tell solver we are not in Branch and Cut
     
    13061450                    solver2->setHintParam(OsiDoInBranchAndCut,false,OsiHintDo) ;
    13071451                }
    1308                 if (!solver2) {
    1309                   printf("Pre-processing says infeasible\n");
    1310                   break;
    1311                 } else {
    1312                   printf("processed model has %d rows, %d columns and %d elements\n",
    1313                          solver2->getNumRows(),solver2->getNumCols(),solver2->getNumElements());
     1452                if (!noPrinting) {
     1453                  if (!solver2) {
     1454                    printf("Pre-processing says infeasible\n");
     1455                    break;
     1456                  } else {
     1457                    printf("processed model has %d rows, %d columns and %d elements\n",
     1458                           solver2->getNumRows(),solver2->getNumCols(),solver2->getNumElements());
     1459                  }
    13141460                }
    13151461                //solver2->resolve();
     
    13331479                // get clp itself
    13341480                ClpSimplex * modelC = si->getModelPtr();
     1481                if (noPrinting)
     1482                  modelC->setLogLevel(0);
    13351483                if (modelC->tightenPrimalBounds()!=0) {
    13361484                  std::cout<<"Problem is infeasible!"<<std::endl;
     
    14961644              //if (babModel->getNumCols()>10*babModel->getNumRows())
    14971645              //babModel->setNumberStrong(0);
    1498               babModel->messageHandler()->setLogLevel(parameters[log].intValue());
    1499               if (babModel->getNumCols()>2000||babModel->getNumRows()>1500||
    1500                   babModel->messageHandler()->logLevel()>1)
    1501                 babModel->setPrintFrequency(100);
     1646              if (!noPrinting) {
     1647                babModel->messageHandler()->setLogLevel(parameters[log].intValue());
     1648                if (babModel->getNumCols()>2000||babModel->getNumRows()>1500||
     1649                    babModel->messageHandler()->logLevel()>1)
     1650                  babModel->setPrintFrequency(100);
     1651              }
    15021652             
    1503               babModel->solver()->setIntParam(OsiMaxNumIterationHotStart,100);
     1653              babModel->solver()->setIntParam(OsiMaxNumIterationHotStart,
     1654                    parameters[whichParam(MAXHOTITS,numberParameters,parameters)].intValue());
    15041655              OsiClpSolverInterface * osiclp = dynamic_cast< OsiClpSolverInterface*> (babModel->solver());
    15051656              // go faster stripes
     
    15391690              OsiSolverInterface * strengthenedModel=NULL;
    15401691              if (type==BAB) {
    1541                 if (babModel->numberBeforeTrust()>5)
    1542                   babModel->setSearchStrategy(1);
     1692                int moreMipOptions = parameters[whichParam(MOREMIPOPTIONS,numberParameters,parameters)].intValue();
     1693                if (moreMipOptions>=0) {
     1694                  printf("more mip options %d\n",moreMipOptions);
     1695                  babModel->setSearchStrategy(moreMipOptions);
     1696                }
    15431697                if (preProcess&&process.numberSOS()) {
    15441698                  int numberSOS = process.numberSOS();
     
    15911745                saveSolution(osiclp->getModelPtr(),"debug.file");
    15921746              }
    1593               // Print more statistics
    1594               std::cout<<"Cuts at root node changed objective from "<<babModel->getContinuousObjective()
    1595                        <<" to "<<babModel->rootObjectiveAfterCuts()<<std::endl;
    1596              
    1597               for (iGenerator=0;iGenerator<numberGenerators;iGenerator++) {
    1598                 CbcCutGenerator * generator = babModel->cutGenerator(iGenerator);
    1599                 std::cout<<generator->cutGeneratorName()<<" was tried "
    1600                          <<generator->numberTimesEntered()<<" times and created "
    1601                          <<generator->numberCutsInTotal()<<" cuts of which "
    1602                          <<generator->numberCutsActive()<<" were active after adding rounds of cuts";
    1603                 if (generator->timing())
    1604                   std::cout<<" ( "<<generator->timeInCutGenerator()<<" seconds)"<<std::endl;
    1605                 else
    1606                   std::cout<<std::endl;
     1747              if (!noPrinting) {
     1748                // Print more statistics
     1749                std::cout<<"Cuts at root node changed objective from "<<babModel->getContinuousObjective()
     1750                         <<" to "<<babModel->rootObjectiveAfterCuts()<<std::endl;
     1751               
     1752                for (iGenerator=0;iGenerator<numberGenerators;iGenerator++) {
     1753                  CbcCutGenerator * generator = babModel->cutGenerator(iGenerator);
     1754                  std::cout<<generator->cutGeneratorName()<<" was tried "
     1755                           <<generator->numberTimesEntered()<<" times and created "
     1756                           <<generator->numberCutsInTotal()<<" cuts of which "
     1757                           <<generator->numberCutsActive()<<" were active after adding rounds of cuts";
     1758                  if (generator->timing())
     1759                    std::cout<<" ( "<<generator->timeInCutGenerator()<<" seconds)"<<std::endl;
     1760                  else
     1761                    std::cout<<std::endl;
     1762                }
    16071763              }
    16081764              time2 = CoinCpuTime();
     
    16461802                std::string statusName[]={"Finished","Stopped on ","Difficulties",
    16471803                                          "","","User ctrl-c"};
    1648                 std::string minor[]={"","","gap","nodes","time","","solutions"};
     1804                std::string minor[]={"","","gap","nodes","time","","solutions","user ctrl-c"};
    16491805                int iStat = babModel->status();
    16501806                int iStat2 = babModel->secondaryStatus();
    1651                 std::cout<<"Result - "<<statusName[iStat]<<minor[iStat2]
    1652                          <<" objective "<<babModel->getObjValue()<<
    1653                   " after "<<babModel->getNodeCount()<<" nodes and "
    1654                          <<babModel->getIterationCount()<<
    1655                   " iterations - took "<<time2-time1<<" seconds"<<std::endl;
     1807                if (!noPrinting)
     1808                  std::cout<<"Result - "<<statusName[iStat]<<minor[iStat2]
     1809                           <<" objective "<<babModel->getObjValue()<<
     1810                    " after "<<babModel->getNodeCount()<<" nodes and "
     1811                           <<babModel->getIterationCount()<<
     1812                    " iterations - took "<<time2-time1<<" seconds"<<std::endl;
     1813#ifdef CBC_AMPL
     1814                if (usingAmpl) {
     1815                  double value = babModel->getObjValue()*lpSolver->getObjSense();
     1816                  char buf[300];
     1817                  int pos=0;
     1818                  if (iStat==0) {
     1819                    if (babModel->getObjValue()<1.0e40) {
     1820                      pos += sprintf(buf+pos,"optimal," );
     1821                    } else {
     1822                      // infeasible
     1823                      iStat=1;
     1824                      pos += sprintf(buf+pos,"infeasible,");
     1825                    }
     1826                  } else if (iStat==1) {
     1827                    if (iStat2!=6)
     1828                      iStat=3;
     1829                    else
     1830                      iStat=4;
     1831                    pos += sprintf(buf+pos,"stopped on %s,",minor[iStat2].c_str());
     1832                  } else if (iStat==2) {
     1833                    iStat = 7;
     1834                    pos += sprintf(buf+pos,"stopped on difficulties,");
     1835                  } else if (iStat==5) {
     1836                    iStat = 3;
     1837                    pos += sprintf(buf+pos,"stopped on ctrl-c,");
     1838                  } else {
     1839                    pos += sprintf(buf+pos,"status unknown,");
     1840                    iStat=6;
     1841                  }
     1842                  info.problemStatus=iStat;
     1843                  info.objValue = value;
     1844                  if (babModel->getObjValue()<1.0e40)
     1845                    pos += sprintf(buf+pos," objective %.*g",ampl_obj_prec(),
     1846                                   value);
     1847                  sprintf(buf+pos,"\n%d nodes, %d iterations",
     1848                          babModel->getNodeCount(),
     1849                          babModel->getIterationCount());
     1850                  if (bestSolution) {
     1851                    free(info.primalSolution);
     1852                    info.primalSolution = (double *) malloc(n*sizeof(double));
     1853                    CoinCopyN(lpSolver->primalColumnSolution(),n,info.primalSolution);
     1854                    int numberRows = lpSolver->numberRows();
     1855                    free(info.dualSolution);
     1856                    info.dualSolution = (double *) malloc(numberRows*sizeof(double));
     1857                    CoinCopyN(lpSolver->dualRowSolution(),numberRows,info.dualSolution);
     1858                  } else {
     1859                    info.primalSolution=NULL;
     1860                    info.dualSolution=NULL;
     1861                  }
     1862                  // put buffer into info
     1863                  strcpy(info.buffer,buf);
     1864                }
     1865#endif
    16561866              } else {
    16571867                std::cout<<"Model strengthend - now has "<<clpSolver->getNumRows()
     
    18162026                  if ((printOptions&1)!=0)
    18172027                    pinfo.statistics();
    1818                   model2 =
    1819                     pinfo.presolvedModel(*lpSolver,1.0e-8,
     2028                  double presolveTolerance =
     2029                    parameters[whichParam(PRESOLVETOLERANCE,numberParameters,parameters)].doubleValue();
     2030                  model2 =
     2031                    pinfo.presolvedModel(*lpSolver,presolveTolerance,
    18202032                                         true,preSolve);
    18212033                  if (model2) {
     
    21112323                if (preSolve) {
    21122324                  ClpPresolve pinfo;
     2325                  double presolveTolerance =
     2326                    parameters[whichParam(PRESOLVETOLERANCE,numberParameters,parameters)].doubleValue();
    21132327                  model2 =
    2114                     pinfo.presolvedModel(*lpSolver,1.0e-8,
     2328                    pinfo.presolvedModel(*lpSolver,presolveTolerance,
    21152329                                         false,preSolve);
    21162330                  if (model2) {
Note: See TracChangeset for help on using the changeset viewer.