jacobian

Unnamed repository; edit this file 'description' to name the repository.
Log | Files | Refs | README

commit ca08263f2ff0cba7e76a66ebe99305a6e3a114b8
parent 2d1fe04feb6f0f4bbe59bdba540b81478f2c5b2d
Author: David Freifeld <freifeld.david@gmail.com>
Date:   Fri, 10 Jul 2020 17:13:14 -0700

Extending float changes to strassen + utils

Diffstat:
Mtests/strassen.cpp | 35++++++++++++++++++-----------------
Mutils.hpp | 40++++++++++++++++++++--------------------
2 files changed, 38 insertions(+), 37 deletions(-)

diff --git a/tests/strassen.cpp b/tests/strassen.cpp @@ -11,7 +11,7 @@ #include <iostream> // Not remotely extensible, just initial test. -Eigen::MatrixXd strassen_mul(Eigen::MatrixXd x, Eigen::MatrixXd y) +Eigen::MatrixXf strassen_mul(Eigen::MatrixXf x, Eigen::MatrixXf y) { int power = 0; int largest; @@ -23,22 +23,23 @@ Eigen::MatrixXd strassen_mul(Eigen::MatrixXd x, Eigen::MatrixXd y) std::cout << pow(2, power) << " " << power <<"\n"; } std::cout << "POWER: " << power << " LARGEST: " << largest << "\n"; - Eigen::MatrixXd a ((int)pow(2,power), (int)pow(2,power)); - Eigen::MatrixXd b ((int)pow(2,power), (int)pow(2,power)); + Eigen::MatrixXf a ((int)pow(2,power), (int)pow(2,power)); + Eigen::MatrixXf b ((int)pow(2,power), (int)pow(2,power)); a.block(0,0,x.rows(), x.cols()) = x; b.block(0,0,y.rows(), y.cols()) = y; - //Eigen::MatrixXd a () + std::cout << "\nINIT\n" << a << "\n\n" << b << "\n\n\n"; + std::cout << "\nEIGEN_VER\n" << a*b << "\n\n\n"; + //Eigen::MatrixXf a () int block_len = largest/2; - Eigen::MatrixXd result ((int)pow(2,power), (int)pow(2,power)); - - Eigen::MatrixXd m1 = ((a.block(0,0, block_len, block_len)) + a.block(a.rows()-block_len,a.cols()-block_len, block_len, block_len)) * (b.block(0,0, block_len, block_len) + b.block(b.rows()-block_len,b.cols()-block_len, block_len, block_len)); - Eigen::MatrixXd m2 = (a.block(a.rows()-block_len, 0, block_len, block_len) + a.block(a.rows()-block_len,a.cols()-block_len, block_len, block_len)) * (b.block(0,0, block_len, block_len)); - Eigen::MatrixXd m3 = a.block(0,0, block_len, block_len) * (b.block(0,b.cols()-block_len, block_len, block_len) - b.block(b.rows()-block_len,b.cols()-block_len, block_len, block_len)); - Eigen::MatrixXd m4 = a.block(a.rows()-block_len,a.cols()-block_len, block_len, block_len) * (b.block(b.rows()-block_len,0, block_len, block_len) - b.block(0,0, block_len, block_len)); - Eigen::MatrixXd m5 = (a.block(0, 0, block_len, block_len) + a.block(0,a.cols()-block_len, block_len, block_len)) * (b.block(b.rows()-block_len,b.cols()-block_len, block_len, block_len)); - Eigen::MatrixXd m6 = (a.block(a.rows()-block_len,0, block_len, block_len) - a.block(0,0, block_len, block_len)) * (b.block(0,0, block_len, block_len) + b.block(0,b.cols()-block_len, block_len, block_len)); - Eigen::MatrixXd m7 = (a.block(0,a.cols()-block_len, block_len, block_len) - a.block(a.rows()-block_len,a.cols()-block_len, block_len, block_len)) * (b.block(a.rows()-block_len,0, block_len, block_len) + b.block(b.rows()-block_len,b.cols()-block_len, block_len, block_len)); + Eigen::MatrixXf result ((int)pow(2,power), (int)pow(2,power)); + Eigen::MatrixXf m1 = ((a.block(0,0, block_len, block_len)) + a.block(a.rows()-block_len,a.cols()-block_len, block_len, block_len)) * (b.block(0,0, block_len, block_len) + b.block(b.rows()-block_len,b.cols()-block_len, block_len, block_len)); + Eigen::MatrixXf m2 = (a.block(a.rows()-block_len, 0, block_len, block_len) + a.block(a.rows()-block_len,a.cols()-block_len, block_len, block_len)) * (b.block(0,0, block_len, block_len)); + Eigen::MatrixXf m3 = a.block(0,0, block_len, block_len) * (b.block(0,b.cols()-block_len, block_len, block_len) - b.block(b.rows()-block_len,b.cols()-block_len, block_len, block_len)); + Eigen::MatrixXf m4 = a.block(a.rows()-block_len,a.cols()-block_len, block_len, block_len) * (b.block(b.rows()-block_len,0, block_len, block_len) - b.block(0,0, block_len, block_len)); + Eigen::MatrixXf m5 = (a.block(0, 0, block_len, block_len) + a.block(0,a.cols()-block_len, block_len, block_len)) * (b.block(b.rows()-block_len,b.cols()-block_len, block_len, block_len)); + Eigen::MatrixXf m6 = (a.block(a.rows()-block_len,0, block_len, block_len) - a.block(0,0, block_len, block_len)) * (b.block(0,0, block_len, block_len) + b.block(0,b.cols()-block_len, block_len, block_len)); + Eigen::MatrixXf m7 = (a.block(0,a.cols()-block_len, block_len, block_len) - a.block(a.rows()-block_len,a.cols()-block_len, block_len, block_len)) * (b.block(a.rows()-block_len,0, block_len, block_len) + b.block(b.rows()-block_len,b.cols()-block_len, block_len, block_len)); std::cout << m1 + m4 - m5 + m7 << "\n\n" << m3+m5 << "\n\n" << m2+m4 << "\n\n" << m1-m2+m3+m6; @@ -55,15 +56,15 @@ int main() srand((unsigned int) time(0)); int sz; std::cin >> sz; - Eigen::MatrixXd a = Eigen::MatrixXd::Random(sz, 3); - Eigen::MatrixXd b = Eigen::MatrixXd::Random(3, sz); + Eigen::MatrixXf a = Eigen::MatrixXf::Random(sz, 3); + Eigen::MatrixXf b = Eigen::MatrixXf::Random(3, sz); auto eigen_begin = std::chrono::high_resolution_clock::now(); - Eigen::MatrixXd product = a * b; + Eigen::MatrixXf product = a * b; auto eigen_end = std::chrono::high_resolution_clock::now(); auto strassen_begin = std::chrono::high_resolution_clock::now(); - Eigen::MatrixXd sproduct = strassen_mul(a, b); + Eigen::MatrixXf sproduct = strassen_mul(a, b); auto strassen_end = std::chrono::high_resolution_clock::now(); std::cout << "EIGEN: " << std::chrono::duration_cast<std::chrono::nanoseconds>(eigen_end - eigen_begin).count() / pow(10,9) << " STRASSEN: " << std::chrono::duration_cast<std::chrono::nanoseconds>(strassen_end - strassen_begin).count() / pow(10,9) << "\n"; diff --git a/utils.hpp b/utils.hpp @@ -4,26 +4,26 @@ #include <functional> // A zoo of activation functions. -double sigmoid(double x); -double sigmoid_deriv(double x); -double linear(double x); -double linear_deriv(double x); -double step(double x); -double step_deriv(double x); -double bipolar(double x); -double bipolar_deriv(double x); -double mytanh(double x); -double tanh_deriv(double x); -double lecun_tanh(double x); -double lecun_tanh_deriv(double x); -double cloglog(double x); -double cloglog_deriv(double x); -double softplus(double x); -double softplus_deriv(double x); -double inverse_logit(double x); -double inverse_logit_deriv(double x); -std::function<double(double)> rectifier(double (*activation)(double)); +float sigmoid(float x); +float sigmoid_deriv(float x); +float linear(float x); +float linear_deriv(float x); +float step(float x); +float step_deriv(float x); +float bipolar(float x); +float bipolar_deriv(float x); +float mytanh(float x); +float tanh_deriv(float x); +float lecun_tanh(float x); +float lecun_tanh_deriv(float x); +float cloglog(float x); +float cloglog_deriv(float x); +float softplus(float x); +float softplus_deriv(float x); +float inverse_logit(float x); +float inverse_logit_deriv(float x); +std::function<float(float)> rectifier(float (*activation)(float)); -Eigen::MatrixXd strassen_mul(Eigen::MatrixXd a, Eigen::MatrixXd b); +Eigen::MatrixXf strassen_mul(Eigen::MatrixXf a, Eigen::MatrixXf b); #endif /* MODULE_H */