/* 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; }
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() ; }
/* 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]; } }