Changeset 220


Ignore:
Timestamp:
May 9, 2011 9:57:56 AM (8 years ago)
Author:
awalther
Message:

improved implementation of extend_nonlinearity_domain_binary_step

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/ADOL-C/src/uni5_for.c

    r219 r220  
    38383838
    38393839void extend_nonlinearity_domain_binary_step
    3840 (int arg1, int arg2, locint **ind_dom, locint **nonl_dom) {
    3841     int index,num,num1, i,j,k,l,m;
    3842     locint* temp_nonl;
    3843     num = ind_dom[arg2][0];
    3844 
    3845     for(m=2;m<ind_dom[arg1][0]+2;m++) {
    3846           index = ind_dom[arg1][m];
    3847        if (nonl_dom[index][0] == 0) { /* empty list */
    3848           if ( nonl_dom[index][1] < num){
    3849              free(nonl_dom[index]);
    3850              nonl_dom[index] = (locint*) malloc(sizeof(locint)*2*(num+1) );
    3851              nonl_dom[index][1] = 2*num;
    3852           }
    3853           for(i=2;i<num+2;i++)      /* append index domain list of "arg" */
    3854                 nonl_dom[index][i] = ind_dom[arg2][i];
    3855           nonl_dom[index][0] = num;
    3856           } else { /* merge lists */
    3857              num1 = nonl_dom[index][0];
    3858           temp_nonl = (locint*) malloc(sizeof(locint)*num1);
    3859           for(i=0;i<num1; i++)
    3860              temp_nonl[i] = nonl_dom[index][i+2];
    3861 
    3862           if ( (nonl_dom[index][1]) < (num+num1) ){
    3863              free(nonl_dom[index]);
    3864              nonl_dom[index] = (locint*) malloc(sizeof(locint)*2*(num+num1+1) );
    3865              nonl_dom[index][1] = 2*(num+num1);
    3866           }
    3867 
    3868           i = 0;
     3840(int arg1, int arg2, locint **ind_dom, locint **nonl_dom)
     3841{
     3842  int index,num,num1, num2, num3, i,j,k,l,m;
     3843  locint *temp_nonl, *index_nonl_dom, *arg1_ind_dom, *arg2_ind_dom;
     3844
     3845  arg2_ind_dom = ind_dom[arg2];
     3846  num = arg2_ind_dom[0];
     3847  num3 = num+2;
     3848 
     3849  for(m=2;m<ind_dom[arg1][0]+2;m++)
     3850    {
     3851      index = ind_dom[arg1][m];
     3852      index_nonl_dom = nonl_dom[index];
     3853
     3854      if (index_nonl_dom[0] == 0)  /* empty list */
     3855        {
     3856          if ( index_nonl_dom[1] < num)
     3857            {
     3858              free(index_nonl_dom);
     3859              index_nonl_dom = (locint*) malloc(sizeof(locint)*2*(num+1) );
     3860              index_nonl_dom[1] = 2*num;
     3861            }
     3862          for(i=2;i<num3;i++)      /* append index domain list of "arg" */
     3863            index_nonl_dom[i] = arg2_ind_dom[i];
     3864          index_nonl_dom[0] = num;
     3865        }
     3866      else
     3867        { /* merge lists */
     3868          num1 = index_nonl_dom[0];
     3869          num2 = index_nonl_dom[1];
     3870
     3871          if (num1+num > num2)
     3872            num2 = num1+num;
     3873
     3874          temp_nonl = (locint*) malloc(sizeof(locint)*(num2+2));
     3875          temp_nonl[1] = num2;
     3876
     3877          num1 += 2;
     3878
     3879          i = 2;
    38693880          k = 2;
    38703881          j = 2;
    3871           while ((i<num1) && (j < num+2)){
    3872                 if (ind_dom[arg2][j] < temp_nonl[i]) /* < */ {
    3873                    nonl_dom[index][k] = ind_dom[arg2][j];
    3874                    j++; k++;
    3875                  } else {
    3876                    if (ind_dom[arg2][j] == temp_nonl[i])  /* == */ {
    3877              nonl_dom[index][k] = ind_dom[arg2][j];
    3878              j++; k++; i++;
    3879              } else {
    3880                nonl_dom[index][k] = temp_nonl[i];
    3881                i++; k++;
    3882                 }
    3883                  }
    3884              }
    3885            for(l = j;l<num+2;l++) {
    3886                nonl_dom[index][k] = ind_dom[arg2][l];
    3887             k++;
    3888            }
    3889         for(l = i;l<num1;l++) {
    3890             nonl_dom[index][k] = temp_nonl[l];
    3891             k++;
    3892         }
    3893         nonl_dom[index][0] = k-2;
    3894         free((char*) temp_nonl);
    3895          }
     3882          while ((i<num1) && (j < num)){
     3883            if (arg2_ind_dom[j] < index_nonl_dom[i]) /* < */
     3884              {
     3885                temp_nonl[k] = arg2_ind_dom[j];
     3886                j++; k++;
     3887              }
     3888            else
     3889              {
     3890                if (arg2_ind_dom[j] == index_nonl_dom[i])  /* == */
     3891                  {
     3892                    temp_nonl[k] = arg2_ind_dom[j];
     3893                    j++; k++; i++;
     3894                  }
     3895                else
     3896                  {
     3897                    temp_nonl[k] = index_nonl_dom[i];
     3898                    i++; k++;
     3899                  }
     3900              }
     3901          }
     3902          for(l = j;l<num3;l++)
     3903            {
     3904              temp_nonl[k] = arg2_ind_dom[l];
     3905              k++;
     3906            }
     3907          for(l = i;l<num1;l++)
     3908            {
     3909              temp_nonl[k] = index_nonl_dom[l];
     3910              k++;
     3911            }
     3912          temp_nonl[0] = k-2;
     3913          free((char*) index_nonl_dom);
     3914          nonl_dom[index] = temp_nonl;
     3915        }
    38963916    }
    38973917}
Note: See TracChangeset for help on using the changeset viewer.