Changeset 59 for trunk/ADOL-C/src/sparse


Ignore:
Timestamp:
Nov 17, 2009 2:58:21 PM (10 years ago)
Author:
awalther
Message:

modified sparsity detection for jacobians

Location:
trunk/ADOL-C/src/sparse
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • trunk/ADOL-C/src/sparse/sparsedrivers.cpp

    r58 r59  
    3535/*                                                sparsity pattern Jacobian */
    3636/*--------------------------------------------------------------------------*/
    37 /*                                                                          */
     37/*                                                                         */
    3838
    3939int jac_pat(
    40     short        tag,        /* tape identification                        */
    41     int          depen,      /* number of dependent variables              */
    42     int          indep,      /* number of independent variables            */
    43     double       *basepoint, /* independant variable values                */
     40    short          tag,       /* tape identification                       */
     41    int            depen,     /* number of dependent variables             */
     42    int            indep,     /* number of independent variables           */
     43    const double  *basepoint, /* independant variable values               */
    4444    unsigned int **crs,
    4545    /* returned compressed row block-index storage                         */
     
    7272    if (( options[1] < 0 ) || (options[1] > 1 ))
    7373        options[1] = 0; /* default */
    74     if (( options[2] < 0 ) || (options[2] > 2 ))
     74    if (( options[2] < -1 ) || (options[2] > 2 ))
    7575        options[2] = 0; /* default */
    7676
     
    194194    int            indep,      /* number of independent variables         */
    195195    int            repeat,     /* indicated repeated call with same seed  */
    196     double        *basepoint,  /* independant variable values             */
     196    const double  *basepoint,  /* independant variable values             */
    197197    int           *nnz,        /* number of nonzeros                      */
    198198    unsigned int **rind,       /* row index                               */
     
    231231      if (( options[1] < 0 ) || (options[1] > 1 ))
    232232        options[1] = 0; /* default */
    233       if (( options[2] < 0 ) || (options[2] > 2 ))
     233      if (( options[2] < -1 ) || (options[2] > 2 ))
    234234        options[2] = 0; /* default */
    235235      if (( options[3] < 0 ) || (options[3] > 1 ))
     
    239239      ret_val = jac_pat(tag, depen, indep, basepoint, sJinfos.JP, options);
    240240     
     241
    241242      if (ret_val < 0) {
    242243        printf(" ADOL-C error in sparse_jac() \n");
     
    251252     
    252253      *nnz = sJinfos.nnz_in;
    253      
    254      
     254
     255      if (options[2] == -1)
     256        {
     257          (*rind) = new unsigned int[*nnz];
     258          (*cind) = new unsigned int[*nnz];
     259          unsigned int index = 0;
     260          for (i=0;i<depen;i++)
     261            for (j=1;j<=sJinfos.JP[i][0];j++)
     262              {
     263                (*rind)[index] = i;
     264                (*cind)[index++] = sJinfos.JP[i][j];
     265              }
     266        }
     267
    255268      FILE *fp_JP;
    256269                       
     
    296309    }
    297310
     311    if (options[2] == -1)
     312      return ret_val;
     313
    298314    /* compute jacobian times matrix product */
    299315
     
    308324      ret_val = fov_forward(tag, depen, indep, sJinfos.p, basepoint, sJinfos.Seed, sJinfos.y, sJinfos.B);
    309325   
     326
    310327    /* recover compressed Jacobian => ColPack library */
    311328
     
    357374
    358375    /* Generate sparsity pattern, determine nnz, allocate memory */
    359     if (repeat == 0) {
     376    if (repeat <= 0) {
    360377        if (( options[0] < 0 ) || (options[0] > 1 ))
    361378          options[0] = 0; /* default */
     
    363380          options[1] = 0; /* default */
    364381
    365         sHinfos.HP    = (unsigned int **) malloc(indep*sizeof(unsigned int *));
    366 
    367         /* generate sparsity pattern */
    368         ret_val = hess_pat(tag, indep, basepoint, sHinfos.HP, options[0]);
    369 
    370         if (ret_val < 0) {
    371             printf(" ADOL-C error in sparse_hess() \n");
    372             return ret_val;
    373         }
    374 
    375         sHinfos.nnz_in = 0;
     382        if (repeat == 0)
     383          {
     384            sHinfos.HP    = (unsigned int **) malloc(indep*sizeof(unsigned int *));
     385
     386            /* generate sparsity pattern */
     387            ret_val = hess_pat(tag, indep, basepoint, sHinfos.HP, options[0]);
     388
     389            if (ret_val < 0) {
     390              printf(" ADOL-C error in sparse_hess() \n");
     391              return ret_val;
     392            }
     393          }
     394        else
     395          {
     396            tapeInfos=getTapeInfos(tag);
     397            memcpy(&ADOLC_CURRENT_TAPE_INFOS, tapeInfos, sizeof(TapeInfos));
     398            sHinfos.HP     = ADOLC_CURRENT_TAPE_INFOS.pTapeInfos.sHinfos.HP;
     399          }
     400
     401        sHinfos.nnz_in = 0;
     402
    376403        for (i=0;i<indep;i++) {
    377404            for (j=1;j<=sHinfos.HP[i][0];j++)
     
    447474    }
    448475
     476    if (repeat == -1)
     477      return ret_val;
     478
    449479//     this is the most efficient variant. However, there is somewhere a bug in hos_ov_reverse
    450480//     ret_val = hov_wk_forward(tag,1,indep,1,2,sHinfos.p,basepoint,sHinfos.Xppp,&y,sHinfos.Yppp);
     
    493523}
    494524
     525
     526/****************************************************************************/
     527/*******        sparse Hessians, complete driver              ***************/
     528/****************************************************************************/
     529
     530int set_HP(
     531    short          tag,        /* tape identification                     */
     532    int            indep,      /* number of independent variables         */
     533    unsigned int ** HP)
     534{
     535    SparseHessInfos sHinfos;
     536    TapeInfos *tapeInfos;
     537
     538    tapeInfos=getTapeInfos(tag);
     539    memcpy(&ADOLC_CURRENT_TAPE_INFOS, tapeInfos, sizeof(TapeInfos));
     540    sHinfos.nnz_in = ADOLC_CURRENT_TAPE_INFOS.pTapeInfos.sHinfos.nnz_in;
     541    sHinfos.HP     = HP;
     542    sHinfos.Hcomp  = ADOLC_CURRENT_TAPE_INFOS.pTapeInfos.sHinfos.Hcomp;
     543    sHinfos.Xppp   = ADOLC_CURRENT_TAPE_INFOS.pTapeInfos.sHinfos.Xppp;
     544    sHinfos.Yppp   = ADOLC_CURRENT_TAPE_INFOS.pTapeInfos.sHinfos.Yppp;
     545    sHinfos.Zppp   = ADOLC_CURRENT_TAPE_INFOS.pTapeInfos.sHinfos.Zppp;
     546    sHinfos.Upp    = ADOLC_CURRENT_TAPE_INFOS.pTapeInfos.sHinfos.Upp;
     547    sHinfos.p      = ADOLC_CURRENT_TAPE_INFOS.pTapeInfos.sHinfos.p;
     548    setTapeInfoHessSparse(tag, sHinfos);
     549}
     550
    495551/*****************************************************************************/
    496552/*                                                    JACOBIAN BLOCK PATTERN */
     
    498554/* ------------------------------------------------------------------------- */
    499555int bit_vector_propagation(
    500     short  tag,        /* tape identification                        */
    501     int    depen,      /* number of dependent variables              */
    502     int    indep,      /* number of independent variables            */
    503     double *basepoint, /* independant variable values                */
     556    short          tag,        /* tape identification                */
     557    int            depen,      /* number of dependent variables      */
     558    int            indep,      /* number of independent variables    */
     559    const double  *basepoint, /* independant variable values         */
    504560    unsigned int **crs,
    505561    /* compressed block row storage                                  */
  • trunk/ADOL-C/src/sparse/sparsedrivers.h

    r42 r59  
    3434
    3535ADOLC_DLL_EXPORT int jac_pat
    36 (short,int,int,double*,unsigned int**,int*);
     36(short,int,int,const double*,unsigned int**,int*);
    3737
    3838/*--------------------------------------------------------------------------*/
     
    4949
    5050ADOLC_DLL_EXPORT int sparse_jac
    51 (short, int , int, int, double*, int *,
     51(short, int , int, int, const double*, int *,
    5252 unsigned int **, unsigned int **, double **,int*);
    5353
     
    7878 unsigned int **, unsigned int **, double **,int*);
    7979
     80int set_HP(
     81    short          tag,        /* tape identification                     */
     82    int            indep,      /* number of independent variables         */
     83    unsigned int ** HP);
     84
    8085/*--------------------------------------------------------------------------*/
    8186/*                                                   JACOBIAN BLOCK PATTERN */
     
    9095
    9196ADOLC_DLL_EXPORT int bit_vector_propagation
    92 (short, int, int, double*, unsigned int**, int*);
     97(short, int, int, const double*, unsigned int**, int*);
    9398
    9499
Note: See TracChangeset for help on using the changeset viewer.