Changeset 504 for branches/devel/Cbc/src


Ignore:
Timestamp:
Dec 19, 2006 5:12:16 PM (13 years ago)
Author:
forrest
Message:

quadratic again

Location:
branches/devel/Cbc/src
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • branches/devel/Cbc/src/Cbc_ampl.cpp

    r496 r504  
    961961    // add in quadratic
    962962    int nz = 1 + n_con;
     963    int nOdd=0;
    963964    fint ** rowqp = colqp + nz;
    964965    double ** delsqp = (double **)(rowqp + nz);
     
    969970        int * start = (int *) colqp[i];
    970971        int * row = (int *) rowqp[i];
     972        if (!element) {
     973          // odd row - probably not quadratic
     974          nOdd++;
     975          continue;
     976        }
    971977#if 0
    972978        printf("%d quadratic els\n",nels);
     
    10671073      }
    10681074    }
     1075    if (nOdd) {
     1076      printf("%d non-linear constraints could not be converted to quadratic\n",nOdd);
     1077      exit(77);
     1078    }
    10691079  }
    10701080  // see if any sos
  • branches/devel/Cbc/src/CoinSolve.cpp

    r503 r504  
    20812081                //                         babModel->getNumCols());
    20822082              }
    2083               if (useCosts) {
     2083              int testOsiOptions = parameters[whichParam(TESTOSI,numberParameters,parameters)].intValue();
     2084              if (useCosts&&testOsiOptions<0) {
    20842085                int numberColumns = babModel->getNumCols();
    20852086                int * sort = new int[numberColumns];
     
    22312232                switches[numberGenerators++]=0;
    22322233              }
    2233               if (gomoryAction&&!complicatedInteger) {
     2234              if (gomoryAction&&(!complicatedInteger||gomoryAction==1)) {
    22342235                babModel->addCutGenerator(&gomoryGen,translate[gomoryAction],"Gomory");
    22352236                switches[numberGenerators++]=-1;
     
    24242425                  }
    24252426                }
    2426                 int testOsiOptions = parameters[whichParam(TESTOSI,numberParameters,parameters)].intValue();
    24272427                OsiSolverInterface * testOsiSolver= (testOsiOptions>=0) ? babModel->solver() : NULL;
    24282428                if (!testOsiSolver) {
     
    26082608                  // *************************************************************
    26092609                  // OsiObjects
     2610                  // Find if none
     2611                  int numberIntegers = testOsiSolver->getNumIntegers();
     2612                  /* model may not have created objects
     2613                     If none then create
     2614                  */
     2615                  if (!numberIntegers||!testOsiSolver->numberObjects()) {
     2616                    //int type = (pseudoUp) ? 1 : 0;
     2617                    testOsiSolver->findIntegers(false);
     2618                    numberIntegers = testOsiSolver->getNumIntegers();
     2619                  }
    26102620                  if (preProcess&&process.numberSOS()) {
    26112621                    int numberSOS = process.numberSOS();
    2612                     int numberIntegers = testOsiSolver->getNumIntegers();
    2613                     /* model may not have created objects
    2614                        If none then create
    2615                     */
    2616                     if (!numberIntegers||!testOsiSolver->numberObjects()) {
    2617                       //int type = (pseudoUp) ? 1 : 0;
    2618                       testOsiSolver->findIntegers(false);
    2619                       numberIntegers = testOsiSolver->getNumIntegers();
    2620                     }
    26212622                    OsiObject ** oldObjects = testOsiSolver->objects();
    26222623                    // Do sets and priorities
     
    26672668                    delete [] objects;
    26682669                  } else if (priorities||branchDirection||pseudoDown||pseudoUp||numberSOS) {
    2669                     // do anyway for priorities etc
    2670                     int numberIntegers = testOsiSolver->getNumIntegers();
    2671                     /* model may not have created objects
    2672                        If none then create
    2673                     */
    2674                     if (!numberIntegers||!testOsiSolver->numberObjects()) {
    2675                       //int type = (pseudoUp) ? 1 : 0;
    2676                       testOsiSolver->findIntegers(false);
    2677                     }
    26782670                    if (numberSOS) {
    26792671                      // Do sets and priorities
     
    28802872                  decision.setChooseMethod(choose);
    28812873                  babModel->setBranchingMethod(decision);
     2874                  if (useCosts&&testOsiOptions>=0) {
     2875                    int numberColumns = babModel->getNumCols();
     2876                    int * sort = new int[numberColumns];
     2877                    double * dsort = new double[numberColumns];
     2878                    int * priority = new int [numberColumns];
     2879                    const double * objective = babModel->getObjCoefficients();
     2880                    const double * lower = babModel->getColLower() ;
     2881                    const double * upper = babModel->getColUpper() ;
     2882                    const CoinPackedMatrix * matrix = babModel->solver()->getMatrixByCol();
     2883                    const int * columnLength = matrix->getVectorLengths();
     2884                    int iColumn;
     2885                    for (iColumn=0;iColumn<numberColumns;iColumn++) {
     2886                      sort[iColumn]=iColumn;
     2887                      if (useCosts==1)
     2888                        dsort[iColumn]=-fabs(objective[iColumn]);
     2889                      else if (useCosts==2)
     2890                        dsort[iColumn]=iColumn;
     2891                      else if (useCosts==3)
     2892                        dsort[iColumn]=upper[iColumn]-lower[iColumn];
     2893                      else if (useCosts==4)
     2894                        dsort[iColumn]=-(upper[iColumn]-lower[iColumn]);
     2895                      else if (useCosts==5)
     2896                        dsort[iColumn]=-columnLength[iColumn];
     2897                    }
     2898                    CoinSort_2(dsort,dsort+numberColumns,sort);
     2899                    int level=0;
     2900                    double last = -1.0e100;
     2901                    for (int i=0;i<numberColumns;i++) {
     2902                      int iPut=sort[i];
     2903                      if (dsort[i]!=last) {
     2904                        level++;
     2905                        last=dsort[i];
     2906                      }
     2907                      priority[iPut]=level;
     2908                    }
     2909                    OsiObject ** objects = babModel->objects();
     2910                    int numberObjects = babModel->numberObjects();
     2911                    for (int iObj = 0;iObj<numberObjects;iObj++) {
     2912                      OsiObject * obj = objects[iObj] ;
     2913                      int iColumn = obj->columnNumber();
     2914                      if (iColumn>=0)
     2915                        obj->setPriority(priority[iColumn]);
     2916                    }
     2917                    delete [] priority;
     2918                    delete [] sort;
     2919                    delete [] dsort;
     2920                  }
    28822921                }
    28832922                checkSOS(babModel, babModel->solver());
Note: See TracChangeset for help on using the changeset viewer.