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