1 #ifndef ACMODULE_INCLUDED
2 #define ACMODULE_INCLUDED
18 size_t register_var(T& z) {
19 v.push_back(&z);
return v.size()-1;
24 T& operator[](
size_t i) {
27 size_t size() {
return v.size(); }
36 stack<vector<T> > argument_checkpoint;
40 void register_input(T& v, T& a) {
41 x.register_var(v); ax.register_var(a);
46 void register_output(T& v, T& a) {
47 y.register_var(v); ay.register_var(a);
52 void register_inoutput(T& xv, T& xa, T& yv, T& ya) {
53 x.register_var(xv); ax.register_var(xa);
54 y.register_var(yv); ay.register_var(ya);
57 x=xv; ax=xa; y=yv; ay=ya;
59 void reset_inoutput() { x.clear(); ax.clear(); y.clear(); ay.clear(); }
60 virtual void push_arguments() {
61 vector<T> a(x.size());
62 for (
size_t i=0;i<x.size();i++) a[i]=x[i];
63 argument_checkpoint.push(a);
65 virtual void read_arguments() {
66 vector<T> a(x.size()); a=argument_checkpoint.top();
67 for (
size_t i=0;i<x.size();i++) x[i]=a[i];
69 virtual void pop_arguments() {
70 argument_checkpoint.pop();
72 virtual void evaluate_primal()=0;
73 virtual void evaluate_joint_primal() {
77 virtual void evaluate_split_primal()=0;
78 virtual void evaluate_split_adjoint()=0;
79 virtual void evaluate_joint_adjoint() {
80 read_arguments(); pop_arguments();
81 evaluate_split_primal();
82 evaluate_split_adjoint();