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