source: CIVL/examples/experimental/reverse_CIVL/runtime_dense_reverse/ad_grad.h

main
Last change on this file was ea777aa, checked in by Alex Wilton <awilton@…>, 3 years ago

Moved examples, include, build_default.properties, common.xml, and README out from dev.civl.com into the root of the repo.

git-svn-id: svn://vsl.cis.udel.edu/civl/trunk@5704 fb995dde-84ed-4084-dfe6-e5aef3e2452c

  • Property mode set to 100644
File size: 10.4 KB
Line 
1/*
2 * ad_grad.hpp
3 *
4 * Created on: Jan 29, 2013
5 * Author: snarayan
6 */
7
8#ifndef AD_GRAD_HPP_
9#define AD_GRAD_HPP_
10#include <stdio.h>
11#include <stdlib.h>
12#include "ad_types.h"
13
14void
15ADIC_Init();
16
17void
18ADIC_Finalize();
19
20void
21ADIC_SetForwardMode();
22
23void
24ADIC_SetReverseMode();
25
26int
27ADIC_GetMode();
28
29/**
30 * Internal ADIC macros and functions, do not use in directly.
31 */
32int
33__ADIC_IncrShadowVar();
34void
35__ADIC_CommitShadowVar();
36void
37__ADIC_ResetShadowVar();
38int
39__ADIC_GradSize();
40
41extern int __adic_grad_size;
42#define __ADIC_GradSize() (__adic_grad_size)
43
44#define __ADIC_Validate(g)
45
46/* Setting independent and dependent variables
47 * Prototype: void ADIC_SetIndep(DERIV_TYPE var);
48 */
49#define ADIC_SetIndep(var) \
50 { \
51 int mode = ADIC_GetMode(); \
52 int __adic_pos = -1;\
53 if(mode==0) { \
54 __adic_pos = __ADIC_IncrShadowVar(); \
55 if (__adic_pos > ADIC_GRADVEC_LENGTH) { \
56 fprintf(stderr, "ADIC_SetIndep() Error: the number of independent " \
57 "variables %d exceeds the max (ADIC_GRADVEC_LENGTH=%d)!\n", \
58 __adic_pos, ADIC_GRADVEC_LENGTH); \
59 fflush(stderr); \
60 abort(); \
61 }\
62 __ADIC_SetGradVal(&(var), 1.0, __adic_pos); \
63 } else if(mode==1) { \
64 __ADIC_SetGradVal(&(var), 0.0, __adic_pos); \
65 } else \
66 fprintf(stderr, "ADIC_SetIndep() Error: Differentiation Mode not set.\n");\
67 }
68
69/* Setting independent and dependent 1-D array variables
70 * Prototype: void ADIC_SetIndepArray(DERIV_TYPE arrayvar[], arraysize);
71 */
72#define ADIC_SetIndepArray(arrayvar, arraysize) \
73 { \
74 int __adic_iCtr; \
75 for (__adic_iCtr = 0; __adic_iCtr < arraysize; __adic_iCtr++) { \
76 ADIC_SetIndep((arrayvar)[__adic_iCtr]); \
77 } \
78 }
79
80/* Setting independent and dependent variables
81 * Prototype: void ADIC_SetIndep(DERIV_TYPE var);
82 */
83
84#define ADIC_SetDep(var) \
85 { \
86 int __adic_pos = -1; \
87 int mode = ADIC_GetMode(); \
88 if(mode==0) { \
89 __ADIC_SetGradVal(&(var), 0.0, __adic_pos); \
90 } else if(mode==1) { \
91 __adic_pos = __ADIC_IncrShadowVar(); \
92 if (__adic_pos > ADIC_GRADVEC_LENGTH) { \
93 fprintf(stderr, "ADIC_SetIndep() Error: the number of independent " \
94 "variables %d exceeds the max (ADIC_GRADVEC_LENGTH=%d)!\n", \
95 __adic_pos, ADIC_GRADVEC_LENGTH); \
96 fflush(stderr); \
97 abort(); \
98 }\
99 __ADIC_SetGradVal(&(var), 1.0, __adic_pos); \
100 } else \
101 fprintf(stderr, "ADIC_SetDep() Error: Differentiation Mode not set.\n");\
102 }
103
104/* Setting independent and dependent 1-D array variables
105 * Prototype: void ADIC_SetIndepArray(DERIV_TYPE arrayvar[], arraysize);
106 */
107#define ADIC_SetDepArray(arrayvar, arraysize) \
108 { \
109 int __adic_iCtr; \
110 for (__adic_iCtr = 0; __adic_iCtr < arraysize; __adic_iCtr++) { \
111 ADIC_SetDep((arrayvar)[__adic_iCtr]); \
112 } \
113 }
114
115#define ADIC_SetIndepDone() __ADIC_CommitShadowVar()
116#define ADIC_ResetIndep() __ADIC_ResetShadowVar()
117
118
119
120/* Extract the gradient array
121 * Prototype: void ADIC_ExtractGrad(double *tgt, DERIV_TYPE src)
122 */
123#define ADIC_ExtractGrad(tgt, src) \
124 { \
125 int __adic_iCtr; \
126 for (__adic_iCtr = 0; __adic_iCtr < ADIC_GRADVEC_LENGTH; __adic_iCtr++) { \
127 tgt[__adic_iCtr] = DERIV_grad(src)[__adic_iCtr]; \
128 } \
129 }
130
131/* Extract the value of a DERIV_TYPE variable (same as DERIV_val(src))
132 * Prototype: void ADIC_ExtractVal(double *tgt, DERIV_TYPE src)
133 */
134#define ADIC_ExtractVal(tgt, src) \
135 { \
136 tgt = DERIV_val(src) \
137 }
138
139/* Set the value of a DERIV_TYPE variable (same as DERIV_val(src))
140 * Prototype: void ADIC_SetValue(DERIV_TYPE tgt, double val)
141 */
142#define ADIC_SetValue(tgt, val) \
143 { \
144 DERIV_val(tgt) = val; \
145 }
146
147/* Set the value of one element of the gradient vector and set the
148 * rest of the vector elements to zero.
149 * Prototype: void ADIC_SetGradVal(DERIV_TYPE *var, double a, int position);
150 */
151#define __ADIC_SetGradVal(var, a, i) \
152 { \
153 int __adic_pos2; \
154 __ADIC_Validate(var); \
155 for (__adic_pos2 = 0; __adic_pos2 < ADIC_GRADVEC_LENGTH; __adic_pos2++) { \
156 if (__adic_pos2 == i) { \
157 DERIV_grad(*var)[__adic_pos2] = a; \
158 } else { \
159 DERIV_grad(*var)[__adic_pos2] = 0.0; \
160 } \
161 } \
162 }
163
164/* Set the value of one element of the gradient vector and set the
165 * rest of the vector elements to zero.
166 * Prototype: void ADIC_SetGradVal(DERIV_TYPE *var, double a, int position);
167 */
168#define ADIC_Initialize(var) \
169 { \
170 }
171
172#define Saxpy(a, x, y)\
173{\
174 int __adic_iCtr; double *__adic_gradz = DERIV_grad(y), *__adic_grad1 = DERIV_grad(x);\
175 for (__adic_iCtr = 0; __adic_iCtr < __ADIC_GradSize(); __adic_iCtr++) {\
176 __adic_gradz[__adic_iCtr] = __adic_gradz[__adic_iCtr] + (a) * __adic_grad1[__adic_iCtr];\
177 }\
178}
179
180#define ADIC_SetDeriv(y,x){\
181 int __adic_iCtr; double *__adic_gradz = DERIV_grad(x),\
182 *__adic_grads=DERIV_grad(y);\
183 for (__adic_iCtr = 0 ; __adic_iCtr < __ADIC_GradSize() ; __adic_iCtr++) {\
184 __adic_gradz[__adic_iCtr] = __adic_grads[__adic_iCtr];\
185 }\
186}
187
188#define DecDeriv(x,y){\
189 int __adic_iCtr; double *__adic_gradz = DERIV_grad(x),\
190 *__adic_grads=DERIV_grad(y);\
191 for (__adic_iCtr = 0 ; __adic_iCtr < __ADIC_GradSize() ; __adic_iCtr++) {\
192 __adic_gradz[__adic_iCtr] = __adic_gradz[__adic_iCtr] - __adic_grads[__adic_iCtr];\
193 }\
194}
195
196#define IncDeriv(x,y){\
197 int __adic_iCtr; double *__adic_gradz = DERIV_grad(x),\
198 *__adic_grads=DERIV_grad(y);\
199 for (__adic_iCtr = 0 ; __adic_iCtr < __ADIC_GradSize() ; __adic_iCtr++) {\
200 __adic_gradz[__adic_iCtr] = __adic_gradz[__adic_iCtr] + __adic_grads[__adic_iCtr];\
201 }\
202}
203
204#define ZeroDeriv(x){\
205 int __adic_iCtr; double *__adic_gradz = DERIV_grad(x);\
206 for (__adic_iCtr = 0 ; __adic_iCtr < __ADIC_GradSize() ; __adic_iCtr++) {\
207 __adic_gradz[__adic_iCtr] = 0.0;\
208 }\
209}
210
211#define ZeroDerivvector(x, __dim0){\
212 int __adic_dim0Ctr;\
213 for (__adic_dim0Ctr = 0 ;__adic_dim0Ctr < __dim0 ;__adic_dim0Ctr++) {\
214 ZeroDeriv((x)[__adic_dim0Ctr])\
215 }\
216}
217
218#define SetZeroValvector(x, __dim0){\
219 int __adic_dim0Ctr;\
220 for (__adic_dim0Ctr = 0 ;__adic_dim0Ctr < __dim0 ;__adic_dim0Ctr++) {\
221 DERIV_val((x)[__adic_dim0Ctr]) = 0.0;\
222 }\
223}
224
225#define ZeroDerivmatrix(x, __dim1, __dim0){\
226 int __adic_dim0Ctr, __adic_dim1Ctr;\
227 for (__adic_dim1Ctr = 0 ;__adic_dim1Ctr < __dim1 ;__adic_dim1Ctr++) {\
228 for (__adic_dim0Ctr = 0 ;__adic_dim0Ctr < __dim0 ;__adic_dim0Ctr++) {\
229 ZeroDeriv((x)[__adic_dim1Ctr][__adic_dim0Ctr])\
230 }\
231 }\
232}
233
234#define SetZeroValmatrix(x, __dim1, __dim0){\
235 int __adic_dim0Ctr, __adic_dim1Ctr;\
236 for (__adic_dim1Ctr = 0 ;__adic_dim1Ctr < __dim1 ;__adic_dim1Ctr++) {\
237 for (__adic_dim0Ctr = 0 ;__adic_dim0Ctr < __dim0 ;__adic_dim0Ctr++) {\
238 DERIV_val((x)[__adic_dim1Ctr][__adic_dim0Ctr]) = 0.0;\
239 }\
240 }\
241}
242
243#define ZeroDerivthree_tensor(x, __dim2, __dim1, __dim0){\
244 int __adic_dim0Ctr, __adic_dim1Ctr, __adic_dim2Ctr;\
245 for (__adic_dim2Ctr = 0 ;__adic_dim2Ctr < __dim2 ;__adic_dim2Ctr++) {\
246 for (__adic_dim1Ctr = 0 ;__adic_dim1Ctr < __dim1 ;__adic_dim1Ctr++) {\
247 for (__adic_dim0Ctr = 0 ;__adic_dim0Ctr < __dim0 ;__adic_dim0Ctr++) {\
248 ZeroDeriv((x)[__adic_dim2Ctr][__adic_dim1Ctr][__adic_dim0Ctr])\
249 }\
250 }\
251 }\
252}
253
254#define SetZeroValthree_tensor(x, __dim2, __dim1, __dim0){\
255 int __adic_dim0Ctr, __adic_dim1Ctr, __adic_dim2Ctr;\
256 for (__adic_dim2Ctr = 0 ;__adic_dim2Ctr < __dim2 ;__adic_dim2Ctr++) {\
257 for (__adic_dim1Ctr = 0 ;__adic_dim1Ctr < __dim1 ;__adic_dim1Ctr++) {\
258 for (__adic_dim0Ctr = 0 ;__adic_dim0Ctr < __dim0 ;__adic_dim0Ctr++) {\
259 DERIV_val((x)[__adic_dim2Ctr][__adic_dim1Ctr][__adic_dim0Ctr]) = 0.0;\
260 }\
261 }\
262 }\
263}
264
265#define MallocDerivPointer(var) {\
266 (var) = (DERIV_TYPE *) malloc(sizeof(DERIV_TYPE));\
267}
268
269#define oad_AllocateMatching(tgt,src) {\
270\
271}
272
273
274#define oad_convert(tgt,src) {\
275 (tgt) = (src);\
276}
277
278#define oad_ShapeTest(newvar,referencevar) {\
279\
280}
281
282#endif /* AD_GRAD_HPP_ */
Note: See TracBrowser for help on using the repository browser.