Feat C++ API
A feature engineering automation tool
n_tanh.cc
Go to the documentation of this file.
1 /* FEAT
2 copyright 2017 William La Cava
3 license: GNU/GPL v3
4 */
5 
6 #include "n_tanh.h"
7 
8 namespace FT{
9 
10  namespace Pop{
11  namespace Op{
12  NodeTanh::NodeTanh(vector<float> W0)
13  {
14  name = "tanh";
15  otype = 'f';
16  arity['f'] = 1;
17  complexity = 3;
18 
19  if (W0.empty())
20  {
21  for (int i = 0; i < arity['f']; i++) {
22  W.push_back(r.rnd_dbl());
23  }
24  }
25  else
26  W = W0;
27  }
28 
29  #ifndef USE_CUDA
31  void NodeTanh::evaluate(const Data& data, State& state)
32  {
33  state.push<float>(limited(tanh(W[0]*state.pop<float>())));
34  }
35  #else
36  void NodeTanh::evaluate(const Data& data, State& state)
37  {
38  GPU_Tanh(state.dev_f, state.idx[otype], state.N, W[0]);
39  }
40  #endif
41 
44  {
45  state.push<float>("tanh(" + to_string(W[0], 4) + "*" + state.popStr<float>() + ")");
46  }
47 
48  ArrayXf NodeTanh::getDerivative(Trace& state, int loc)
49  {
50  ArrayXf numerator;
51  ArrayXf denom;
52  ArrayXf x = state.get<float>()[state.size<float>()-1];
53  switch (loc) {
54  case 1: // d/dw0
55  numerator = 4 * x * exp(2 * this->W[0] * x);
56  denom = pow(exp(2 * this->W[0] * x) + 1, 2);
57 
58  // numerator = 4 * x * exp(2 * this->W[0] * x - 1]);
59  // denom = pow(exp(2 * this->W[0] * x) + 1,2);
60  return numerator/denom;
61  case 0: // d/dx0
62  default:
63  numerator = 4 * this->W[0] * exp(2 * this->W[0] * x);
64  denom = pow(exp(2 * this->W[0] * x) + 1, 2);
65 
66  // numerator = 4 * W[0] * exp(2 * W[0] * state.f[state.f.size() - 1]);
67  // denom = pow(exp(2 * W[0] * state.f[state.f.size()-1]),2);
68  return numerator/denom;
69  }
70  }
71 
72  NodeTanh* NodeTanh::clone_impl() const { return new NodeTanh(*this); }
73 
74  NodeTanh* NodeTanh::rnd_clone_impl() const { return new NodeTanh(); }
75  }
76  }
77 }
data holding X, y, and Z data
Definition: data.h:42
std::vector< float > W
Definition: n_Dx.h:16
void evaluate(const Data &data, State &state)
Evaluates the node and updates the state states.
Definition: n_tanh.cc:31
NodeTanh * rnd_clone_impl() const override
Definition: n_tanh.cc:74
NodeTanh(vector< float > W0=vector< float >())
Definition: n_tanh.cc:12
void eval_eqn(State &state)
Evaluates the node symbolically.
Definition: n_tanh.cc:43
NodeTanh * clone_impl() const override
Definition: n_tanh.cc:72
ArrayXf getDerivative(Trace &state, int loc)
Definition: n_tanh.cc:48
string name
node type
Definition: node.h:56
std::map< char, unsigned int > arity
arity of the operator
Definition: node.h:59
ArrayXf limited(ArrayXf x)
limits node output to be between MIN_FLT and MAX_FLT
Definition: node.cc:37
char otype
output type
Definition: node.h:58
int complexity
complexity of node
Definition: node.h:60
float rnd_dbl(float min=0.0, float max=1.0)
Definition: rnd.cc:89
void GPU_Tanh(float *x, size_t idx, size_t N, float W0)
static Rnd & r
Definition: rnd.h:135
std::string to_string(const T &value)
template function to convert objects to string for logging
Definition: utils.h:422
main Feat namespace
Definition: data.cc:13
int i
Definition: params.cc:552
contains various types of State actually used by feat
Definition: state.h:102
string popStr()
Definition: state.h:143
Eigen::Array< T, Eigen::Dynamic, 1 > pop()
Definition: state.h:128
void push(Eigen::Array< T, Eigen::Dynamic, 1 > value)
Definition: state.h:123
used for tracing stack outputs for backprop algorithm.
Definition: state.h:232
unsigned int size()
Definition: state.h:242
vector< Eigen::Array< T, Eigen::Dynamic, 1 > > & get()
Definition: state.h:237