diff --git a/MLPP/Activation/Activation.cpp b/MLPP/Activation/Activation.cpp index 70ffa8e..7ddc2c9 100644 --- a/MLPP/Activation/Activation.cpp +++ b/MLPP/Activation/Activation.cpp @@ -704,38 +704,14 @@ namespace MLPP{ std::vector Activation::arsech(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] = arsech(z[i], 1); - } - return deriv; - } - std::vector a; - a.resize(z.size()); - for(int i = 0; i < z.size(); i++){ - a[i] = arsech(z[i]); - } - return a; + if(deriv){ return alg.elementWiseDivision(alg.full(z.size(), -1), alg.hadamard_product(z, alg.exponentiate(alg.subtraction(alg.onevec(z.size()), alg.hadamard_product(z, z)), 0.5))); } + return alg.log(alg.addition(alg.elementWiseDivision(alg.onevec(z.size()), z), alg.hadamard_product(alg.addition(alg.elementWiseDivision(alg.onevec(z.size()), z), alg.onevec(z.size())), alg.subtraction(alg.elementWiseDivision(alg.onevec(z.size()), z), alg.onevec(z.size()))))); } std::vector> Activation::arsech(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] = arsech(z[i], 1); - } - return deriv; - } - std::vector> a; - a.resize(z.size()); - for(int i = 0; i < z.size(); i++){ - a[i] = arsech(z[i]); - } - return a; + if(deriv){ return alg.elementWiseDivision(alg.full(z.size(), z[0].size(), -1), alg.hadamard_product(z, alg.exponentiate(alg.subtraction(alg.onemat(z.size(), z[0].size()), alg.hadamard_product(z, z)), 0.5))); } + return alg.log(alg.addition(alg.elementWiseDivision(alg.onemat(z.size(), z[0].size()), z), alg.hadamard_product(alg.addition(alg.elementWiseDivision(alg.onemat(z.size(), z[0].size()), z), alg.onemat(z.size(), z[0].size())), alg.subtraction(alg.elementWiseDivision(alg.onemat(z.size(), z[0].size()), z), alg.onemat(z.size(), z[0].size()))))); } double Activation::arcoth(double z, bool deriv){ @@ -745,40 +721,16 @@ namespace MLPP{ return 0.5 * log((1 + z)/(z - 1)); } - std::vector> Activation::arcoth(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] = arcoth(z[i], 1); - } - return deriv; - } - std::vector> a; - a.resize(z.size()); - for(int i = 0; i < z.size(); i++){ - a[i] = arcoth(z[i]); - } - return a; - } - std::vector Activation::arcoth(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] = arcoth(z[i], 1); - } - return deriv; - } - std::vector a; - a.resize(z.size()); - for(int i = 0; i < z.size(); i++){ - a[i] = arcoth(z[i]); - } - return a; + if(deriv){ return alg.elementWiseDivision(alg.onevec(z.size()), alg.subtraction(alg.onevec(z.size()), alg.hadamard_product(z, z))); } + return alg.scalarMultiply(0.5, alg.log(alg.elementWiseDivision(alg.addition(alg.onevec(z.size()), z), alg.subtraction(z, alg.onevec(z.size()))))); + } + + std::vector> Activation::arcoth(std::vector> z, bool deriv){ + LinAlg alg; + if(deriv){ return alg.elementWiseDivision(alg.onemat(z.size(), z[0].size()), alg.subtraction(alg.onemat(z.size(), z[0].size()), alg.hadamard_product(z, z))); } + return alg.scalarMultiply(0.5, alg.log(alg.elementWiseDivision(alg.addition(alg.onemat(z.size(), z[0].size()), z), alg.subtraction(z, alg.onemat(z.size(), z[0].size()))))); } // TO DO: Implement this template activation diff --git a/main.cpp b/main.cpp index d18cc01..bd1a68a 100644 --- a/main.cpp +++ b/main.cpp @@ -350,16 +350,16 @@ int main() { // // Testing new Functions // double z_s = 0.001; - // std::cout << avn.arcsch(z_s) << std::endl; - // std::cout << avn.arcsch(z_s, 1) << std::endl; + // std::cout << avn.arcoth(z_s) << std::endl; + // std::cout << avn.arcoth(z_s, 1) << std::endl; // std::vector z_v = {0.001, 5}; - // alg.printVector(avn.arcsch(z_v)); - // alg.printVector(avn.arcsch(z_v, 1)); + // alg.printVector(avn.arcoth(z_v)); + // alg.printVector(avn.arcoth(z_v, 1)); // std::vector> Z_m = {{0.001, 5}}; - // alg.printMatrix(avn.arcsch(Z_m)); - // alg.printMatrix(avn.arcsch(Z_m, 1)); + // alg.printMatrix(avn.arcoth(Z_m)); + // alg.printMatrix(avn.arcoth(Z_m, 1)); // alg.printMatrix(alg.pinverse({{1,2}, {3,4}}));