Ignore:
Timestamp:
Aug 30, 2012 11:43:19 AM (7 years ago)
Author:
forrest
Message:

minor changes to implement Aboca

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/Clp/src/ClpSimplexDual.cpp

    r1868 r1878  
    569569ClpSimplexDual::dual(int ifValuesPass, int startFinishOptions)
    570570{
     571  //handler_->setLogLevel(63);
     572  //yprintf("STARTing dual %d rows\n",numberRows_);
    571573     bestObjectiveValue_ = -COIN_DBL_MAX;
    572574     algorithm_ = -1;
     
    26282630     }
    26292631#endif
    2630      double freeAlpha = 0.0;
     2632     //double freeAlpha = 0.0;
    26312633     if (alreadyChosen < 0) {
    26322634          // first see if any free variables and put them in basis
     
    26782680               if (chosenRow >= 0) {
    26792681                    pivotRow_ = chosenRow;
    2680                     freeAlpha = work[chosenRow];
     2682                    //freeAlpha = work[chosenRow];
    26812683               }
    26822684               rowArray_[1]->clear();
     
    51955197               } else if (largestPrimalError_ > 1.0e5) {
    51965198                    {
    5197                          int iBigB = -1;
     5199                      //int iBigB = -1;
    51985200                         double bigB = 0.0;
    5199                          int iBigN = -1;
     5201                         //int iBigN = -1;
    52005202                         double bigN = 0.0;
    52015203                         for (int i = 0; i < numberRows_ + numberColumns_; i++) {
     
    52045206                                   if (value > bigB) {
    52055207                                        bigB = value;
    5206                                         iBigB = i;
     5208                                        //iBigB = i;
    52075209                                   }
    52085210                              } else {
    52095211                                   if (value > bigN) {
    52105212                                        bigN = value;
    5211                                         iBigN = i;
     5213                                        //iBigN = i;
    52125214                                   }
    52135215                              }
     
    54285430     return modified;
    54295431}
     5432#if ABC_NORMAL_DEBUG>0
     5433//#define PERT_STATISTICS
     5434#endif
     5435#ifdef PERT_STATISTICS
     5436static void breakdown(const char * name, int numberLook, const double * region)
     5437{
     5438     double range[] = {
     5439          -COIN_DBL_MAX,
     5440          -1.0e15, -1.0e11, -1.0e8, -1.0e5, -1.0e4, -1.0e3, -1.0e2, -1.0e1,
     5441          -1.0,
     5442          -1.0e-1, -1.0e-2, -1.0e-3, -1.0e-4, -1.0e-5, -1.0e-8, -1.0e-11, -1.0e-15,
     5443          0.0,
     5444          1.0e-15, 1.0e-11, 1.0e-8, 1.0e-5, 1.0e-4, 1.0e-3, 1.0e-2, 1.0e-1,
     5445          1.0,
     5446          1.0e1, 1.0e2, 1.0e3, 1.0e4, 1.0e5, 1.0e8, 1.0e11, 1.0e15,
     5447          COIN_DBL_MAX
     5448     };
     5449     int nRanges = static_cast<int> (sizeof(range) / sizeof(double));
     5450     int * number = new int[nRanges];
     5451     memset(number, 0, nRanges * sizeof(int));
     5452     int * numberExact = new int[nRanges];
     5453     memset(numberExact, 0, nRanges * sizeof(int));
     5454     int i;
     5455     for ( i = 0; i < numberLook; i++) {
     5456          double value = region[i];
     5457          for (int j = 0; j < nRanges; j++) {
     5458               if (value == range[j]) {
     5459                    numberExact[j]++;
     5460                    break;
     5461               } else if (value < range[j]) {
     5462                    number[j]++;
     5463                    break;
     5464               }
     5465          }
     5466     }
     5467     printf("\n%s has %d entries\n", name, numberLook);
     5468     for (i = 0; i < nRanges; i++) {
     5469          if (number[i])
     5470               printf("%d between %g and %g", number[i], range[i-1], range[i]);
     5471          if (numberExact[i]) {
     5472               if (number[i])
     5473                    printf(", ");
     5474               printf("%d exactly at %g", numberExact[i], range[i]);
     5475          }
     5476          if (number[i] + numberExact[i])
     5477               printf("\n");
     5478     }
     5479     delete [] number;
     5480     delete [] numberExact;
     5481}
     5482#endif
    54305483// Perturbs problem
    54315484int
     
    56805733     double weight[] = {1.0e-4, 1.0e-2, 5.0e-1, 1.0, 2.0, 5.0, 10.0, 20.0, 30.0, 40.0, 100.0};
    56815734     //double weight[]={1.0e-4,1.0e-2,5.0e-1,1.0,20.0,50.0,100.0,120.0,130.0,140.0,200.0};
    5682      double extraWeight = 10.0;
     5735     //double extraWeight = 10.0;
    56835736     // Scale back if wanted
    56845737     double weight2[] = {1.0e-4, 1.0e-2, 5.0e-1, 1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0};
    56855738     if (constantPerturbation < 99.0 * dualTolerance_) {
    56865739          perturbation *= 0.1;
    5687           extraWeight = 0.5;
     5740          //extraWeight = 0.5;
    56885741          memcpy(weight, weight2, sizeof(weight2));
    56895742     }
     
    58085861     //CoinZeroN(cost_+nTotal,nTotal);
    58095862     // say perturbed
     5863#ifdef PERT_STATISTICS
     5864  {
     5865    double averageCost = 0.0;
     5866    int numberNonZero = 0;
     5867    double * COIN_RESTRICT sort = new double[numberColumns_];
     5868    for (int i = 0; i < numberColumns_; i++) {
     5869      double value = fabs(cost_[i]);
     5870      sort[i] = value;
     5871      averageCost += value;
     5872      if (value)
     5873        numberNonZero++;
     5874    }
     5875    if (numberNonZero)
     5876      averageCost /= static_cast<double> (numberNonZero);
     5877    else
     5878      averageCost = 1.0;
     5879    std::sort(sort, sort + numberColumns_);
     5880    int number = 1;
     5881    double last = sort[0];
     5882    for (int i = 1; i < numberColumns_; i++) {
     5883      if (last != sort[i])
     5884        number++;
     5885    last = sort[i];
     5886    }
     5887    printf("nnz %d percent %d", number, (number * 100) / numberColumns_);
     5888    delete [] sort;
     5889    breakdown("Objective", numberColumns_+numberRows_, cost_);
     5890  }
     5891#endif
    58105892     perturbation_ = 101;
    58115893     return 0;
Note: See TracChangeset for help on using the changeset viewer.