コード例 #1
0
ファイル: gmm_b-all.c プロジェクト: awf/autodiff
/*
  Differentiation of arr_max in reverse (adjoint) mode:
   gradient     of useful results: *x arr_max
   with respect to varying inputs: *x
   Plus diff mem management of: x:in
*/
void arr_max_b(int n, double *x, double *xb, double arr_maxb) {
  double m;
  double mb;
  int i;
  int branch;
  double arr_max;
  m = x[0];
  for (i = 1; i < n; ++i)
    if (x[i] > m) {
      m = x[i];
      pushcontrol1b(1);
    }
    else
      pushcontrol1b(0);
  mb = arr_maxb;
  for (i = n - 1; i > 0; --i) {
    popcontrol1b(&branch);
    if (branch != 0) {
      xb[i] = xb[i] + mb;
      mb = 0.0;
    }
  }
  xb[0] = xb[0] + mb;
}
コード例 #2
0
ファイル: adBufferCtest.c プロジェクト: awf/autodiff
int main(int argc, char *argv[]) {
  double x, Y[10], px, PY[10] ;
  int a, B[20], pa, PB[20] ;
  int pc1, pc2, pc3, pc4 ;
  int i ;

  x = -1.0 ;
  for (i=0 ; i<10 ; ++i)
    Y[i] = i*1.1 ;
  a = -1 ;
  for (i=0 ; i<20 ; ++i)
    B[i] = i ;

  pushreal8(x) ;
  pushreal8array(Y,10) ;
  pushcontrol1b(1) ;
  pushcontrol3b(4) ;
  pushcontrol1b(0) ;
  pushcontrol5b(14) ;

  showallstacks() ;

  pushinteger4(a) ;
  pushinteger4array(B,20) ;

  showallstacks() ;

  popinteger4array(PB,20) ;

  showallstacks() ;

  lookinteger4(&pa) ;
  printf("l -1:%i\n",pa) ;
  lookcontrol5b(&pc1) ;
  printf("l 14?:%i\n",pc1) ;
  lookcontrol1b(&pc1) ;
  printf("l  0?:%i\n",pc1) ;
  pushcontrol5b( 7) ;
  pushcontrol5b(29) ;
  pushcontrol5b(23) ;
  pushcontrol5b(24) ;
  pushcontrol5b(25) ;
  pushcontrol5b(26) ;
  pushcontrol5b(27) ;

  showallstacks() ;

  pushcontrol5b(28) ;
  pushcontrol5b(21) ;
  pushcontrol5b(22) ;
  pushcontrol5b(23) ;
  pushcontrol5b(24) ;
  pushcontrol5b(25) ;
  pushcontrol5b(26) ;
  pushcontrol5b(27) ;
  pushcontrol5b(28) ;
  pushcontrol5b(29) ;

  printallbuffers() ;

  popcontrol5b(&pc3) ;
  printf("29?:%i\n",pc3) ;
  popcontrol5b(&pc3) ;
  printf("28?:%i\n",pc3) ;
  popcontrol5b(&pc3) ;
  printf("27?:%i\n",pc3) ;
  popcontrol5b(&pc3) ;
  printf("26?:%i\n",pc3) ;
  popcontrol5b(&pc3) ;
  printf("25?:%i\n",pc3) ;
  popcontrol5b(&pc3) ;
  printf("24?:%i\n",pc3) ;
  popcontrol5b(&pc3) ;
  printf("23?:%i\n",pc3) ;
  popcontrol5b(&pc3) ;
  printf("22?:%i\n",pc3) ;
  popcontrol5b(&pc3) ;
  printf("21?:%i\n",pc3) ;

  showallstacks() ;

  lookcontrol5b(&pc1) ;
  printf("L 28?:%i\n",pc1) ;
  popcontrol5b(&pc1) ;
  printf("28?:%i\n",pc1) ;

  showallstacks() ;

  popcontrol5b(&pc1) ;
  printf("27?:%i\n",pc1) ;
  popcontrol5b(&pc1) ;
  printf("26?:%i\n",pc1) ;
  popcontrol5b(&pc1) ;
  printf("25?:%i\n",pc1) ;
  popcontrol5b(&pc1) ;
  printf("24?:%i\n",pc1) ;
  popcontrol5b(&pc1) ;
  printf("23?:%i\n",pc1) ;
  popcontrol5b(&pc1) ;
  printf("29?:%i\n",pc1) ;
  popcontrol5b(&pc1) ;
  printf(" 7?:%i\n",pc1) ;
  popinteger4(&pa) ;
  printf("-1:%i\n",pa) ;

  showallstacks() ;

  lookcontrol5b(&pc1) ;
  printf("L 14?:%i\n",pc1) ;
  lookcontrol1b(&pc1) ;
  printf("L  0?:%i\n",pc1) ;
  lookcontrol3b(&pc1) ;
  printf("L  4?:%i\n",pc1) ;

  showallstacks() ;

  popcontrol5b(&pc1) ;
  printf("14?:%i\n",pc1) ;
  popcontrol1b(&pc1) ;
  printf(" 0?:%i\n",pc1) ;
  popcontrol3b(&pc1) ;
  printf(" 4?:%i\n",pc1) ;
  popcontrol1b(&pc1) ;
  printf(" 1?:%i\n",pc1) ;
  popreal8array(PY,10) ;
  //printf("y:%f\n",PY) ;
  popreal8(&px) ;
  printf("-1.0:%f\n",px) ;

  showallstacks() ;
}
コード例 #3
0
ファイル: acd_2d_8_b.c プロジェクト: 1014511134/src
/*
  Differentiation of acd_2d_8 in reverse (adjoint) mode:
   gradient     of useful results: **uc **up
   with respect to varying inputs: **csq **uc **up
   RW status of diff variables: **csq:out **uc:incr **up:in-out
   Plus diff mem management of: csq:in *csq:in uc:in *uc:in up:in
                *up:in
*/
void acd_2d_8_b(float **uc, float **ucb, float **up, float **upb, float **csq,
        float **csqb, int *s, int *e, float c0, float *c1, float *c2, float *
        c3, float *c4, int *lbc, int *rbc) {
    int i0, i1;
    int branch;
    float tmp4b;
    float tmpb;
    float tmp0b;
    float tmp3b;
    float tempb;
    float tmp2b;
    float tmp1b;
    /* boundary conditions - note that uc[-1][i]=0 etc. */
    if (lbc[1])
        pushcontrol1b(0);
    else
        pushcontrol1b(1);
    if (rbc[1])
        pushcontrol1b(0);
    else
        pushcontrol1b(1);
    if (lbc[0])
        pushcontrol1b(0);
    else
        pushcontrol1b(1);
    if (rbc[0])
        for (i1 = e[1]; i1 > s[1]-1; --i1) {
            upb[i1][e[0] - 2] = upb[i1][e[0] - 2] - upb[i1][e[0] + 4];
            upb[i1][e[0] + 4] = 0.0;
            upb[i1][e[0] - 1] = upb[i1][e[0] - 1] - upb[i1][e[0] + 3];
            upb[i1][e[0] + 3] = 0.0;
            upb[i1][e[0] - 0] = upb[i1][e[0] - 0] - upb[i1][e[0] + 2];
            upb[i1][e[0] + 2] = 0.0;
        }
    popcontrol1b(&branch);
    if (branch == 0)
        for (i1 = e[1]; i1 > s[1]-1; --i1) {
            upb[i1][s[0] + 2] = upb[i1][s[0] + 2] - upb[i1][s[0] - 4];
            upb[i1][s[0] - 4] = 0.0;
            upb[i1][s[0] + 1] = upb[i1][s[0] + 1] - upb[i1][s[0] - 3];
            upb[i1][s[0] - 3] = 0.0;
            upb[i1][s[0] + 0] = upb[i1][s[0] + 0] - upb[i1][s[0] - 2];
            upb[i1][s[0] - 2] = 0.0;
        }
    popcontrol1b(&branch);
    if (branch == 0)
        for (i0 = e[0]; i0 > s[0]-1; --i0) {
            tmp4b = upb[e[1] + 4][i0];
            upb[e[1] + 4][i0] = 0.0;
            upb[e[1] - 2][i0] = upb[e[1] - 2][i0] - tmp4b;
            tmp3b = upb[e[1] + 3][i0];
            upb[e[1] + 3][i0] = 0.0;
            upb[e[1] - 1][i0] = upb[e[1] - 1][i0] - tmp3b;
            tmp2b = upb[e[1] + 2][i0];
            upb[e[1] + 2][i0] = 0.0;
            upb[e[1] - 0][i0] = upb[e[1] - 0][i0] - tmp2b;
        }
    popcontrol1b(&branch);
    if (branch == 0)
        for (i0 = e[0]; i0 > s[0]-1; --i0) {
            tmp1b = upb[s[1] - 4][i0];
            upb[s[1] - 4][i0] = 0.0;
            upb[s[1] + 2][i0] = upb[s[1] + 2][i0] - tmp1b;
            tmp0b = upb[s[1] - 3][i0];
            upb[s[1] - 3][i0] = 0.0;
            upb[s[1] + 1][i0] = upb[s[1] + 1][i0] - tmp0b;
            tmpb = upb[s[1] - 2][i0];
            upb[s[1] - 2][i0] = 0.0;
            upb[s[1] + 0][i0] = upb[s[1] + 0][i0] - tmpb;
        }
/*    **csqb = 0.0; */
    for (i1 = e[1]; i1 > s[1]-1; --i1)
        for (i0 = e[0]; i0 > s[0]-1; --i0) {
            float lap = c0*uc[i1][i0]	+
            c1[0]*(uc[i1][i0+1] + uc[i1][i0-1]) +
            c1[1]*(uc[i1+1][i0] + uc[i1-1][i0]) +
            c2[0]*(uc[i1][i0+2] + uc[i1][i0-2]) +
            c2[1]*(uc[i1+2][i0] + uc[i1-2][i0]) +
            c3[0]*(uc[i1][i0+3] + uc[i1][i0-3]) +
            c3[1]*(uc[i1+3][i0] + uc[i1-3][i0]) +
            c4[0]*(uc[i1][i0+4] + uc[i1][i0-4]) +
            c4[1]*(uc[i1+4][i0] + uc[i1-4][i0]);
            
            tempb = csq[i1][i0]*upb[i1][i0];
            ucb[i1][i0] = ucb[i1][i0] + c0*tempb + 2.0*upb[i1][i0];
            csqb[i1][i0] = csqb[i1][i0] + lap*upb[i1][i0];
            ucb[i1][i0 + 1] = ucb[i1][i0 + 1] + c1[0]*tempb;
            ucb[i1][i0 - 1] = ucb[i1][i0 - 1] + c1[0]*tempb;
            ucb[i1 + 1][i0] = ucb[i1 + 1][i0] + c1[1]*tempb;
            ucb[i1 - 1][i0] = ucb[i1 - 1][i0] + c1[1]*tempb;
            ucb[i1][i0 + 2] = ucb[i1][i0 + 2] + c2[0]*tempb;
            ucb[i1][i0 - 2] = ucb[i1][i0 - 2] + c2[0]*tempb;
            ucb[i1 + 2][i0] = ucb[i1 + 2][i0] + c2[1]*tempb;
            ucb[i1 - 2][i0] = ucb[i1 - 2][i0] + c2[1]*tempb;
            ucb[i1][i0 + 3] = ucb[i1][i0 + 3] + c3[0]*tempb;
            ucb[i1][i0 - 3] = ucb[i1][i0 - 3] + c3[0]*tempb;
            ucb[i1 + 3][i0] = ucb[i1 + 3][i0] + c3[1]*tempb;
            ucb[i1 - 3][i0] = ucb[i1 - 3][i0] + c3[1]*tempb;
            ucb[i1][i0 + 4] = ucb[i1][i0 + 4] + c4[0]*tempb;
            ucb[i1][i0 - 4] = ucb[i1][i0 - 4] + c4[0]*tempb;
            ucb[i1 + 4][i0] = ucb[i1 + 4][i0] + c4[1]*tempb;
            ucb[i1 - 4][i0] = ucb[i1 - 4][i0] + c4[1]*tempb;
            upb[i1][i0] = -upb[i1][i0];
        }
}