1 /*
2 * PNode.cpp
3 *
4 * Created on: 8 Apr 2013
5 * Author: s0965328
6 */
7
8 #include "PNode.h"
9 #include "Stack.h"
10 #include "Tape.h"
11 #include "EdgeSet.h"
12
13 namespace AutoDiff {
14
PNode(double value)15 PNode::PNode(double value):pval(value) {
16 assert(!isnan(value));
17 }
18
~PNode()19 PNode::~PNode() {
20 }
21
inorder_visit(int level,ostream & oss)22 void PNode::inorder_visit(int level,ostream& oss){
23 oss<<this->toString(level)<<endl;
24 }
25
collect_vnodes(boost::unordered_set<Node * > & nodes,unsigned int & total)26 void PNode::collect_vnodes(boost::unordered_set<Node*>& nodes,unsigned int& total)
27 {
28 //do not fill this to nodes, as this is a parameter node
29 total++;
30 }
31
eval_function()32 void PNode::eval_function()
33 {
34 SV->push_back(pval);
35 }
36
toString(int level)37 string PNode::toString(int level)
38 {
39 ostringstream oss;
40 string s(level,'\t');
41 oss<<s<<"[PNode]("<<pval<<")";
42 return oss.str();
43 }
44
grad_reverse_0()45 void PNode::grad_reverse_0()
46 {
47 SV->push_back(pval);
48 }
grad_reverse_1_init_adj()49 void PNode::grad_reverse_1_init_adj()
50 {
51 //do nothing as PNode does not have adjoint
52 }
53
grad_reverse_1()54 void PNode::grad_reverse_1()
55 {
56 //do nothing
57 //this is a parameter
58 }
59
update_adj(double & v)60 void PNode::update_adj(double& v)
61 {
62 //do nothing
63 //no adj for PNode
64 }
65
hess_reverse_0()66 unsigned int PNode::hess_reverse_0()
67 {
68 if(index==0)
69 {
70 TT->set(pval);
71 assert(TT->index == TT->index);
72 index = TT->index;
73 }
74 return index;
75 }
76
hess_reverse_0_get_values(unsigned int i,double & x,double & x_bar,double & w,double & w_bar)77 void PNode::hess_reverse_0_get_values(unsigned int i,double& x,double& x_bar,double& w,double& w_bar)
78 {
79 x = TT->get(--i);
80 x_bar = 0;
81 w = 0;
82 w_bar = 0;
83 }
84
hess_reverse_1(unsigned int i)85 void PNode::hess_reverse_1(unsigned int i)
86 {
87 n_in_arcs--;
88 //leaf node do nothing
89 }
90
hess_reverse_1_init_x_bar(unsigned int)91 void PNode::hess_reverse_1_init_x_bar(unsigned int)
92 {
93 //do nothing as Parameter does not have x_bar
94 }
95
update_x_bar(unsigned int i,double v)96 void PNode::update_x_bar(unsigned int i ,double v)
97 {
98 //do nothing as Parameter does not have x_bar
99 }
update_w_bar(unsigned int i,double v)100 void PNode::update_w_bar(unsigned int i ,double v)
101 {
102 //do nothing as Parameter does not have w_bar
103 }
hess_reverse_1_get_xw(unsigned int i,double & w,double & x)104 void PNode::hess_reverse_1_get_xw(unsigned int i, double& w,double& x)
105 {
106 //do nothing as Parameter does not have w
107 x = TT->get(i-1);
108 w = 0;
109 }
hess_reverse_get_x(unsigned int i,double & x)110 void PNode::hess_reverse_get_x(unsigned int i, double& x)
111 {
112 x = TT->get(i-1);
113 }
114
nonlinearEdges(EdgeSet & edges)115 void PNode::nonlinearEdges(EdgeSet& edges)
116 {
117 for(std::list<Edge>::iterator it=edges.edges.begin();it!=edges.edges.end();)
118 {
119 Edge e = *it;
120 if(e.a == this || e.b == this)
121 {
122 it = edges.edges.erase(it); //erase invalidate the iterator
123 }
124 else
125 {
126 it++;
127 }
128 }
129 }
130
131 #if FORWARD_ENABLED
hess_forward(unsigned int len,double ** ret_vec)132 void PNode::hess_forward(unsigned int len, double** ret_vec)
133 {
134 //it's a scalar
135 (*ret_vec) = new double[len];
136 std::fill_n(*ret_vec,len,0);
137 SV->push_back(this->pval);
138 assert(SV->size()==1);
139 }
140 #endif
141
142
getType()143 TYPE PNode::getType()
144 {
145 return PNode_Type;
146 }
147 }
148