• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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