Changeset 2076


Ignore:
Timestamp:
Dec 12, 2014 10:50:44 AM (5 years ago)
Author:
forrest
Message:

stability improvements

Location:
stable/1.15/Clp/src
Files:
5 edited

Legend:

Unmodified
Added
Removed
  • stable/1.15/Clp/src/ClpMain.cpp

    r2009 r2076  
    8080#else
    8181static AbcSimplex * currentModel = NULL;
     82#endif
     83//#define LAPACK_TEST
     84//#define CLP_USE_OPENBLAS 1
     85#if CLP_USE_OPENBLAS
     86extern "C"
     87{
     88  void openblas_set_num_threads(int num_threads);
     89}
     90#endif
     91#ifdef LAPACK_TEST
     92#include "/include/lapacke.h"
     93// using simple lapack interface
     94extern "C"
     95{
     96  void openblas_set_num_threads(int num_threads);
     97#if 0
     98  /** LAPACK Fortran subroutine DGETRF. */
     99  void LAPACK_dgetrf(int * m, int *n,
     100                               double *A, int *ldA,
     101                               int * ipiv, int *info);
     102  /** LAPACK Fortran subroutine DGETRS. */
     103  void LAPACK_dgetrs(char *trans, int *n,
     104                               int *nrhs, const double *A, int *ldA,
     105                     int * ipiv, double *B, int *ldB, int *info);
     106  //    LAPACK_dgetrf(&N, &N, m, &LDA,ipiv, &info);
     107#endif
     108}
     109int test_lapack(int n)
     110{
     111  int* ipiv;
     112  int info;
     113  int i, j;
     114  double * m, *x, *y;
     115 
     116  int LDB,LDA, N, NRHS;
     117  char transp = 'N';
     118 
     119 
     120  m=(double*)malloc(sizeof(double)*n*n);
     121  x=(double*)malloc(sizeof(double)*n);
     122  y=(double*)malloc(sizeof(double)*n);
     123  ipiv=(int*)malloc(sizeof(int)*n);
     124 
     125  for (i=0; i<n; ++i) {
     126    x[i]=1.0;
     127    for (j=0; j<n; ++j) {
     128      m[i*n+j]=(rand()%100+1)/10.0;
     129      //      printf("m[%d,%d]=%lf\n",i,j, m[i*n+j]);
     130    }
     131  }
     132 
     133  /* test cblas.h */
     134  //cblas_dgemv(CblasColMajor, CblasNoTrans, n, n, 1.0, m, n,
     135  //          x, 1, 0.0, y, 1);
     136 
     137  //  for (i=0; i<n; ++i)  printf("x[%d]=%lf\n",i, x[i]);
     138  //for (i=0; i<n; ++i)  printf("y[%d]=%lf\n",i, y[i]);
     139 
     140        LDB=n;
     141        LDA=n;
     142        N=n;
     143        NRHS=1;
     144        info=0;
     145       
     146        LAPACK_dgetrf(&N, &N, m, &LDA,ipiv, &info);
     147       
     148if (info != 0) fprintf(stderr, "dgetrf failure with error %d\n", info);
     149 
     150  LAPACK_dgetrs(&transp, &N, &NRHS, m, &LDA, ipiv, y, &LDB, &info);
     151 
     152  if (info != 0) fprintf(stderr, "failure with error %d\n", info);
     153  //  for (i=0; i<n; ++i) printf("%lf\n", y[i]);
     154
     155  free(m);
     156  free(x);
     157  free(y);
     158  free(ipiv);
     159  return 0;
     160}
    82161#endif
    83162
     
    159238main (int argc, const char *argv[])
    160239{
     240#if CLP_USE_OPENBLAS
     241  openblas_set_num_threads(CLP_USE_OPENBLAS);
     242#endif
     243#ifdef LAPACK_TEST
     244  //void openblas_set_num_threads(int num_threads);
     245  openblas_set_num_threads(1);
     246  if(argc<2){
     247    printf("Error - need size of matrix for lapack test\n");
     248    return 1;
     249  }
     250  int n=atoi(argv[1]);
     251  printf("n=%d\n",n);
     252  if(argc>2){
     253    int nThreads=atoi(argv[2]);
     254    printf("Using %d threads\n",nThreads);
     255    openblas_set_num_threads(nThreads);
     256  }
     257  test_lapack(n);
     258  return 0;
     259#endif
    161260#ifdef CILK_TEST
    162261  cilkTest();
     
    834933#else
    835934                                   AbcSimplex * model2 = models + iModel;
     935#endif
    836936                                   if (type==CLP_PARAM_ACTION_EITHERSIMPLEX||
    837937                                       type==CBC_PARAM_ACTION_BAB)
    838938                                     solveOptions.setSpecialOption(3,0); // allow +-1
    839 #endif
    840939                                   if (dualize==4) {
    841940                                     solveOptions.setSpecialOption(4, 77);
  • stable/1.15/Clp/src/ClpSimplex.cpp

    r1989 r2076  
    43544354     }
    43554355#endif
     4356     if ((moreSpecialOptions_&4194304)!=0) {
     4357       // preset tolerances were changed
     4358       moreSpecialOptions_ &= ~4194304;
     4359       primalTolerance_=1.0e-7;
     4360       dblParam_[ClpPrimalTolerance]=primalTolerance_;
     4361       dualTolerance_=1.0e-7;
     4362       dblParam_[ClpDualTolerance]=dualTolerance_;
     4363     }
    43564364     // ray may be null if in branch and bound
    43574365     if (rowScale_) {
  • stable/1.15/Clp/src/ClpSimplex.hpp

    r2006 r2076  
    12081208         65536 bit - perturb in postsolve cleanup (even if < 10000 rows)
    12091209         1048576 bit - don't perturb even if long time
     1210         4194304 bit - tolerances have been changed by code
    12101211     */
    12111212     inline void setMoreSpecialOptions(int value) {
  • stable/1.15/Clp/src/ClpSimplexPrimal.cpp

    r2006 r2076  
    887887                    problemStatus_ = -3;
    888888          }
     889          if(progress->realInfeasibility_[0]<1.0e-1 &&
     890             primalTolerance_==1.0e-7&&progress->iterationNumber_[0]>0&&
     891             progress->iterationNumber_[CLP_PROGRESS-1]-progress->iterationNumber_[0]>25) {
     892            // default - so user did not set
     893            int iP;
     894            double minAverage=COIN_DBL_MAX;
     895            double maxAverage=0.0;
     896            for (iP=0;iP<CLP_PROGRESS;iP++) {
     897              int n=progress->numberInfeasibilities_[iP];
     898              if (!n) {
     899                break;
     900              } else {
     901                double average=progress->realInfeasibility_[iP];
     902                if (average>0.1)
     903                  break;
     904                average /= static_cast<double>(n);
     905                minAverage=CoinMin(minAverage,average);
     906                maxAverage=CoinMax(maxAverage,average);
     907              }
     908            }
     909            if (iP==CLP_PROGRESS&&minAverage<1.0e-5&&maxAverage<1.0e-3) {
     910              // change tolerance
     911#if CBC_USEFUL_PRINTING>0
     912              printf("CCchanging tolerance\n");
     913#endif
     914              primalTolerance_=1.0e-6;
     915              dblParam_[ClpPrimalTolerance]=1.0e-6;
     916              moreSpecialOptions_ |= 4194304;
     917            }
     918          }
    889919          // at this stage status is -3 or -5 if looks unbounded
    890920          // get primal and dual solutions
  • stable/1.15/Clp/src/Idiot.cpp

    r2006 r2076  
    615615     memset(lambda, 0, nrows * sizeof(double));
    616616     slackStart = countCostedSlacks(model_);
     617     // redo in case odd matrix
     618     row = matrix->getIndices();
     619     columnStart = matrix->getVectorStarts();
     620     columnLength = matrix->getVectorLengths();
     621     element = matrix->getElements();
    617622     if (slackStart >= 0) {
    618623       COIN_DETAIL_PRINT(printf("This model has costed slacks\n"));
Note: See TracChangeset for help on using the changeset viewer.