123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149 |
- /*
- * VNode.cpp
- *
- * Created on: 8 Apr 2013
- * Author: s0965328
- */
- #include "VNode.h"
- #include "Tape.h"
- #include "Stack.h"
- using namespace std;
- namespace AutoDiff {
- #if FORWARD_ENABLED
- int VNode::DEFAULT_ID = -1;
- #endif
- VNode::VNode(double v) : ActNode(), val(v),u(NaN_Double)
- #if FORWARD_ENABLED
- ,id(DEFAULT_ID)
- #endif
- {
- }
- VNode::~VNode() {
- }
- void VNode::collect_vnodes(boost::unordered_set<Node*>& nodes,unsigned int& total)
- {
- total++;
- boost::unordered_set<Node*>::iterator it = nodes.find(this);
- if(it==nodes.end())
- nodes.insert(this);
- }
- void VNode::inorder_visit(int level,ostream& oss)
- {
- oss<<this->toString(level)<<endl;
- }
- void VNode::eval_function()
- {
- SV->push_back(val);
- }
- string VNode::toString(int level)
- {
- ostringstream oss;
- string s(level,'\t');
- oss<<s<<"[VNode](index:"<<index<<",val:"<<val<<",u:"<<u<<") - "<<this;
- return oss.str();
- }
- void VNode::grad_reverse_0()
- {
- this->adj = 0;
- SV->push_back(val);
- }
- void VNode::grad_reverse_1()
- {
- //do nothing
- //this is a leaf node
- }
- #if FORWARD_ENABLED
- void VNode::hess_forward(unsigned int len, double** ret_vec)
- {
- assert(id!=DEFAULT_ID);
- (*ret_vec) = new double[len];
- std::fill_n(*ret_vec,len,0);
- (*ret_vec)[id]=1;
- SV->push_back(this->val);
- }
- #endif
- unsigned int VNode::hess_reverse_0()
- {
- if(index==0)
- {//this node is not on tape
- double nan = NaN_Double;
- TT->set(val); //x_i
- TT->set(nan); //x_bar_i
- TT->set(u); //w_i
- TT->set(nan); //w_bar_i
- index = TT->index;
- }
- // cout<<toString(0)<<" -- "<<index<<endl;
- return index;
- }
- void VNode::hess_reverse_0_get_values(unsigned int i,double& x, double& x_bar, double& w, double& w_bar)
- {
- w_bar = TT->get(--i);
- w = TT->get(--i);
- x_bar = TT->get(--i);
- x = TT->get(--i);
- }
- void VNode::hess_reverse_1(unsigned int i)
- {
- n_in_arcs--;
- //leaf node do nothing
- }
- void VNode::hess_reverse_1_init_x_bar(unsigned int i)
- {
- TT->at(i-3) = 1;
- }
- void VNode::update_x_bar(unsigned int i ,double v)
- {
- // cout<<toString(0)<<" --- "<<__FUNCTION__<<" v="<<TT->at(i-3)<<"+"<<v<<endl;
- TT->at(i-3) = isnan(TT->get(i-3))? v: TT->get(i-3) + v;
- }
- void VNode::update_w_bar(unsigned int i,double v)
- {
- // cout<<toString(0)<<" --- "<<__FUNCTION__<<" v="<<TT->at(i-1)<<"+"<<v<<endl;
- TT->at(i-1) = isnan(TT->get(i-1))? v: TT->get(i-1) + v;
- }
- void VNode::hess_reverse_1_get_xw(unsigned int i, double& w,double& x)
- {
- //cout<<toString(0)<<" --- "<<__FUNCTION__<<" w="<<TT->get(i-2)<<"-- "<<"x="<<TT->get(i-4)<<endl;
- w = TT->get(i-2);
- x = TT->get(i-4);
- }
- void VNode::hess_reverse_get_x(unsigned int i ,double& x)
- {
- x = TT->get(i-4);
- }
- void VNode::nonlinearEdges(EdgeSet& edges)
- {
- // for(list<Edge>::iterator it = edges.edges.begin();it!=edges.edges.end();)
- // {
- // Edge e=*it;
- //
- // }
- }
- TYPE VNode::getType()
- {
- return VNode_Type;
- }
- }
|