Adjoint Code Design Patterns  v0.1
U.Naumann
MyACEnsemblePathwiseEvolutionRecursiveBisection.hpp
1 #include<cmath>
2 using namespace std;
3 
4 #include "ACEnsemblePathwise.hpp"
5 #include "ACEvolutionRecursiveBisection.hpp"
6 using namespace ACDesignPatterns;
7 
11 template<typename T>
13  T p;
14  public:
15  T& p_ref() { return p; }
16 };
17 
21 template<typename T>
22 class MyACEvolutionStep : public ACModule<T> {
23  stack<T> required_T;
24  using ACModule<T>::x;
25  using ACModule<T>::ax;
26  using ACModule<T>::y;
27  using ACModule<T>::ay;
28  public:
31  void evaluate_primal() {
32  y[0]=sin(x[0]*d.p_ref());
33  }
34  void evaluate_split_primal() {
35  if (&x[0]==&y[0]) required_T.push(x[0]);
36  y[0]=sin(x[0]*d.p_ref());
37  }
38  void evaluate_split_adjoint() {
39  if (&x[0]==&y[0]) {
40  x[0]=required_T.top(); required_T.pop();
41  ax[0]*=d.p_ref()*cos(x[0]*d.p_ref());
42  } else
43  ax[0]+=d.p_ref()*cos(x[0]*d.p_ref())*ay[0];
44  }
45 };
46 
52 template<typename T>
55  public:
56  MyACEvolutionRecomputeAll(size_t nsteps, ACModule<T>* s)
57  : ACEvolutionRecomputeAll<T>(nsteps) {
58  step=s;
59  }
60 };
61 
66 template<typename T>
68  public:
71  MyACEvolutionRecursiveBisection(size_t nsteps, size_t ncheckpoints, MyACEvolutionStepUserData<T>& d) : ACEvolutionRecursiveBisection<T>(nsteps,ncheckpoints) {
72  step=new MyACEvolutionStep<T>(d);
73  m=new MyACEvolutionRecomputeAll<T>(nsteps,step);
74  }
75  ~MyACEvolutionRecursiveBisection() { delete step; delete m; }
76 };
77 
82 template<typename T>
84  public:
86  using ACModule<T>::x;
87  using ACModule<T>::ax;
88  using ACModule<T>::y;
89  using ACModule<T>::ay;
93  MyACEnsemblePathwiseEvolutionRecursiveBisection(size_t npaths, size_t nsteps, size_t ncheckpoints, MyACEvolutionStepUserData<T>& d) : ACEnsemblePathwise<T>(npaths) {
94  path=new MyACEvolutionRecursiveBisection<T>(nsteps,ncheckpoints,d);
95  }
97 };