diff --git a/MLPP/Activation/Activation.cpp b/MLPP/Activation/Activation.cpp index f4a91cc..e853447 100644 --- a/MLPP/Activation/Activation.cpp +++ b/MLPP/Activation/Activation.cpp @@ -626,37 +626,15 @@ namespace MLPP{ } std::vector Activation::arsinh(std::vector z, bool deriv){ - if(deriv){ - std::vector deriv; - deriv.resize(z.size()); - for(int i = 0; i < z.size(); i++){ - deriv[i] = arsinh(z[i], 1); - } - return deriv; - } - std::vector a; - a.resize(z.size()); - for(int i = 0; i < z.size(); i++){ - a[i] = arsinh(z[i]); - } - return a; + LinAlg alg; + if(deriv){ return alg.elementWiseDivision(alg.onevec(z.size()), alg.exponentiate(alg.addition(alg.hadamard_product(z, z), alg.onevec(z.size())), 0.5)); } + return alg.log(alg.addition(z, alg.exponentiate(alg.addition(alg.hadamard_product(z, z), alg.onevec(z.size())), 0.5))); } std::vector> Activation::arsinh(std::vector> z, bool deriv){ - if(deriv){ - std::vector> deriv; - deriv.resize(z.size()); - for(int i = 0; i < z.size(); i++){ - deriv[i] = arsinh(z[i], 1); - } - return deriv; - } - std::vector> a; - a.resize(z.size()); - for(int i = 0; i < z.size(); i++){ - a[i] = arsinh(z[i]); - } - return a; + LinAlg alg; + if(deriv){ return alg.elementWiseDivision(alg.onemat(z.size(), z[0].size()), alg.exponentiate(alg.addition(alg.hadamard_product(z, z), alg.onemat(z.size(), z[0].size())), 0.5)); } + return alg.log(alg.addition(z, alg.exponentiate(alg.addition(alg.hadamard_product(z, z), alg.onemat(z.size(), z[0].size())), 0.5))); } double Activation::arcosh(double z, bool deriv){ @@ -668,38 +646,14 @@ namespace MLPP{ std::vector Activation::arcosh(std::vector z, bool deriv){ LinAlg alg; - if(deriv){ - std::vector deriv; - deriv.resize(z.size()); - for(int i = 0; i < z.size(); i++){ - deriv[i] = arcosh(z[i], 1); - } - return deriv; - } - std::vector a; - a.resize(z.size()); - for(int i = 0; i < z.size(); i++){ - a[i] = arcosh(z[i]); - } - return a; + if(deriv){ return alg.elementWiseDivision(alg.onevec(z.size()), alg.exponentiate(alg.subtraction(alg.hadamard_product(z, z), alg.onevec(z.size())), 0.5)); } + return alg.log(alg.addition(z, alg.exponentiate(alg.subtraction(alg.hadamard_product(z, z), alg.onevec(z.size())), 0.5))); } std::vector> Activation::arcosh(std::vector> z, bool deriv){ LinAlg alg; - if(deriv){ - std::vector> deriv; - deriv.resize(z.size()); - for(int i = 0; i < z.size(); i++){ - deriv[i] = arcosh(z[i], 1); - } - return deriv; - } - std::vector> a; - a.resize(z.size()); - for(int i = 0; i < z.size(); i++){ - a[i] = arcosh(z[i]); - } - return a; + if(deriv){ return alg.elementWiseDivision(alg.onemat(z.size(), z[0].size()), alg.exponentiate(alg.subtraction(alg.hadamard_product(z, z), alg.onemat(z.size(), z[0].size())), 0.5)); } + return alg.log(alg.addition(z, alg.exponentiate(alg.subtraction(alg.hadamard_product(z, z), alg.onemat(z.size(), z[0].size())), 0.5))); } double Activation::artanh(double z, bool deriv){ diff --git a/MLPP/LinAlg/LinAlg.cpp b/MLPP/LinAlg/LinAlg.cpp index 41296e1..84ce3d2 100644 --- a/MLPP/LinAlg/LinAlg.cpp +++ b/MLPP/LinAlg/LinAlg.cpp @@ -636,6 +636,15 @@ namespace MLPP{ return b; } + std::vector LinAlg::exponentiate(std::vector a, double p){ + std::vector b; + b.resize(a.size()); + for(int i = 0; i < b.size(); i++){ + b[i] = pow(a[i], p); + } + return b; + } + double LinAlg::dot(std::vector a, std::vector b){ double c = 0; for(int i = 0; i < a.size(); i++){ diff --git a/MLPP/LinAlg/LinAlg.hpp b/MLPP/LinAlg/LinAlg.hpp index ff41181..7c689b6 100644 --- a/MLPP/LinAlg/LinAlg.hpp +++ b/MLPP/LinAlg/LinAlg.hpp @@ -101,6 +101,8 @@ namespace MLPP{ std::vector exp(std::vector a); std::vector erf(std::vector a); + + std::vector exponentiate(std::vector a, double p); double dot(std::vector a, std::vector b); @@ -131,6 +133,7 @@ namespace MLPP{ // TENSOR FUNCTIONS std::vector flatten(std::vector>> A); + void printTensor(std::vector>> A); diff --git a/a.out b/a.out index fb4e7ae..09b1be7 100755 Binary files a/a.out and b/a.out differ diff --git a/main.cpp b/main.cpp index 5112104..45f4853 100644 --- a/main.cpp +++ b/main.cpp @@ -350,18 +350,18 @@ int main() { // // Testing new Functions // double z_s = 4; - // std::cout << avn.coth(z_s) << std::endl; - // std::cout << avn.coth(z_s, 1) << std::endl; + // std::cout << avn.arcosh(z_s) << std::endl; + // std::cout << avn.arcosh(z_s, 1) << std::endl; // std::vector z_v = {4, 5}; - // alg.printVector(avn.coth(z_v)); - // alg.printVector(avn.coth(z_v, 1)); + // alg.printVector(avn.arcosh(z_v)); + // alg.printVector(avn.arcosh(z_v, 1)); // std::vector> Z_m = {{4, 5}}; - // alg.printMatrix(avn.coth(Z_m)); - // alg.printMatrix(avn.coth(Z_m, 1)); + // alg.printMatrix(avn.arcosh(Z_m)); + // alg.printMatrix(avn.arcosh(Z_m, 1)); - // // alg.printMatrix(alg.pinverse({{1,2}, {3,4}})); + // alg.printMatrix(alg.pinverse({{1,2}, {3,4}})); return 0; -} +} \ No newline at end of file