Skip to content

Commit

Permalink
Merge pull request #18 from adeeconometrics/dev-lazymatrix
Browse files Browse the repository at this point in the history
Add ACosOp struct and acos function to LazyOps.hpp
  • Loading branch information
adeeconometrics committed Jun 7, 2024
2 parents 1bc36f5 + 650e3b4 commit 2f131f8
Show file tree
Hide file tree
Showing 2 changed files with 70 additions and 93 deletions.
12 changes: 12 additions & 0 deletions include/LazyOps.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -195,6 +195,18 @@ auto asin(const Expr &expr) -> UnaryExpr<ASinOp, Expr> {
return UnaryExpr<ASinOp, Expr>(expr);
}

struct ACosOp {
template <typename T, typename = std::enable_if_t<std::is_arithmetic_v<T>>>
auto operator()(T t) const {
return std::acos(t);
}
};

template <typename Expr>
auto acos(const Expr &expr) -> UnaryExpr<ACosOp, Expr> {
return UnaryExpr<ACosOp, Expr>(expr);
}

struct ATanOp {
template <typename T, typename = std::enable_if_t<std::is_arithmetic_v<T>>>
auto operator()(T t) const {
Expand Down
151 changes: 58 additions & 93 deletions test/unittest.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -63,111 +63,76 @@ TEST(BinaryExpr, BinaryOps) {
}

TEST(UnaryExpr, UnaryOps) {
const Matrix<float, 3, 3> M0{{1., 2., 3.}, {4., 5., 6.}, {7., 8., 9.}};
const Matrix<float, 3, 3> ENeg{
{-1., -2., -3.}, {-4., -5., -6.}, {-7., -8., -9.}};
const Matrix<float, 3, 3> ELog{{0.0, 0.6931472, 1.0986123},
{1.3862944, 1.609438, 1.7917595},
{1.9459102, 2.0794415, 2.1972246}};
const Matrix<float, 3, 3> M0{{.1, .2, .3}, {.4, .5, .6}, {.7, .8, .9}};
const Matrix<float, 3, 3> M1{{1, 2, 3}, {4, 5, 6}, {7, 8, 9}};

const Matrix<float, 3, 3> ELog10{{0.0, 0.30103, 0.47712123},
{0.60206, 0.69897, 0.7781513},
{0.845098, 0.90309, 0.9542425}};
const auto ENeg = -M0;
const auto ELog = log(M0);
const auto ELog10 = log10(M0);
const auto ELog2 = log2(M0);
const auto EExp = exp(M0);
const auto EExp2 = exp2(M0);
const auto ESqrt = sqrt(M0);
const auto ECBrt = cbrt(M0);

const Matrix<float, 3, 3> ELog2{{0.0, 1.0, 1.5849625},
{2.0, 2.321928, 2.5849626},
{2.807355, 3.0, 3.169925}};
const auto ESin = sin(M0);
const auto ECos = cos(M0);
const auto ETan = tan(M0);

const Matrix<float, 3, 3> EExp{{2.718282, 7.3890557, 20.085537},
{54.59815, 148.41316, 403.42877},
{1096.6332, 2980.958, 8103.084}};
const auto EAsin = asin(M0);
const auto EAcos = acos(M0);
const auto EAtan = atan(M0);

const Matrix<float, 3, 3> EExp2{
{2.0, 4.0, 8.0}, {16.0, 32.0, 64.0}, {128.0, 16.0, 16.0}};
const auto Esinh = sinh(M0);
const auto Ecosh = cosh(M0);
const auto Etanh = tanh(M0);

const Matrix<float, 3, 3> ESqrt{{1.0, 1.4142135, 1.7320508},
{2.0, 2.236068, 2.4494898},
{2.6457512, 2.828427, 3.0}};
const auto EAsinh = asinh(M1);
const auto EAcosh = acosh(M1);
const auto EAtanh = atanh(M1);

const Matrix<float, 3, 3> ECrbt{{1.0, 1.2599211, 1.4422495},
{1.587401, 1.709976, 1.8171206},
{1.9129312, 2.0, 2.0800838}};
// const auto E

const Matrix<float, 3, 3> ESin{{0.841471, 0.9092974, 0.14112},
{-0.7568025, -0.9589243, -0.2794155},
{0.6569866, 0.98935825, 0.41211846}};

const Matrix<float, 3, 3> ECos{{0.5403023, -0.4161468, -0.9899925},
{-0.6536436, 0.28366217, 0.96017027},
{0.75390226, -0.14550003, -0.91113025}};

const Matrix<float, 3, 3> ETan{{1.5574077, -2.1850398, -0.14254655},
{1.1578213, -3.380515, -0.29100618},
{0.871448, -6.799711, -0.45231566}};

const Matrix<float, 3, 3> EToDeg{{57.29577951, 114.59155903, 171.88733854},
{229.18311805, 286.47889757, 343.77467708},
{401.07045659, 458.3662361, 515.66201562}};

const Matrix<float, 3, 3> EToRad{{0.01745329, 0.03490659, 0.05235988},
{0.06981317, 0.08726646, 0.10471976},
{0.12217305, 0.13962634, 0.15707963}};

Matrix<float, 3, 3> Neg{};
Neg = -M0;

Matrix<float, 3, 3> Log{};
Log = log(M0);

Matrix<float, 3, 3> Log10{};
Log10 = log10(M0);

Matrix<float, 3, 3> Log2{};
Log2 = log2(M0);

Matrix<float, 3, 3> Exp{};
Exp = exp(M0);

Matrix<float, 3, 3> Exp2{};
Exp2 = exp2(M0);

Matrix<float, 3, 3> Sqrt{};
Sqrt = sqrt(M0);

Matrix<float, 3, 3> Cbrt{};
Cbrt = cbrt(M0);

Matrix<float, 3, 3> Sin{};
Sin = sin(M0);

Matrix<float, 3, 3> Cos{};
Cos = cos(M0);

Matrix<float, 3, 3> Tan{};
Tan = tan(M0);

Matrix<float, 3, 3> Deg{};
Deg = to_deg(M0);
for (std::size_t i = 0; i < 3; i++) {
for (std::size_t j = 0; j < 3; j++) {
EXPECT_DOUBLE_EQ(ENeg(i, j), -M0(i, j));
EXPECT_DOUBLE_EQ(ELog(i, j), std::log(M0(i, j)));
EXPECT_DOUBLE_EQ(ELog10(i, j), std::log10(M0(i, j)));
EXPECT_DOUBLE_EQ(ELog2(i, j), std::log2(M0(i, j)));
EXPECT_DOUBLE_EQ(EExp(i, j), std::exp(M0(i, j)));
EXPECT_DOUBLE_EQ(EExp2(i, j), std::exp2(M0(i, j)));
EXPECT_DOUBLE_EQ(ESqrt(i, j), std::sqrt(M0(i, j)));
EXPECT_DOUBLE_EQ(ECBrt(i, j), std::cbrt(M0(i, j)));

EXPECT_DOUBLE_EQ(ESin(i, j), std::sin(M0(i, j)));
EXPECT_DOUBLE_EQ(ECos(i, j), std::cos(M0(i, j)));
EXPECT_DOUBLE_EQ(ETan(i, j), std::tan(M0(i, j)));

EXPECT_DOUBLE_EQ(EAsin(i, j), std::asin(M0(i, j)));
EXPECT_DOUBLE_EQ(EAcos(i, j), std::acos(M0(i, j)));
EXPECT_DOUBLE_EQ(EAtan(i, j), std::atan(M0(i, j)));

EXPECT_DOUBLE_EQ(Esinh(i, j), std::sinh(M0(i, j)));
EXPECT_DOUBLE_EQ(Ecosh(i, j), std::cosh(M0(i, j)));
EXPECT_DOUBLE_EQ(Etanh(i, j), std::tanh(M0(i, j)));

EXPECT_DOUBLE_EQ(EAsinh(i, j), std::asinh(M1(i, j)));
// EXPECT_DOUBLE_EQ(EAcosh(i, j), std::acosh(M1(i, j)));
EXPECT_DOUBLE_EQ(EAtanh(i, j), std::atanh(M1(i, j)));
}
}
}

Matrix<float, 3, 3> Rad{};
Rad = to_rad(M0);
TEST(UnaryExpr, UnaryOpsHelper) {
const Matrix<float, 3, 3> M0{{1, 2, 3}, {4, 5, 6}, {7, 8, 9}};

EXPECT_EQ(Neg, ENeg);
const auto EToRad = to_rad(M0);
const auto EToDeg = to_deg(EToRad);

for (std::size_t i = 0; i < 3; i++) {
for (std::size_t j = 0; j < 3; j++) {
EXPECT_NEAR(Log(i, j), ELog(i, j), 1e-6);
EXPECT_NEAR(Log10(i, j), ELog10(i, j), 1e-6);
EXPECT_NEAR(Log2(i, j), ELog2(i, j), 1e-6);
EXPECT_NEAR(Exp(i, j), EExp(i, j), 1e-4);
EXPECT_NEAR(Exp2(i, j), Exp2(i, j), 1e-6);
EXPECT_NEAR(Sqrt(i, j), ESqrt(i, j), 1e-6);
EXPECT_NEAR(Cbrt(i, j), ECrbt(i, j), 1e-6);
EXPECT_NEAR(Sin(i, j), ESin(i, j), 1e-6);
EXPECT_NEAR(Cos(i, j), ECos(i, j), 1e-6);
EXPECT_NEAR(Tan(i, j), ETan(i, j), 1e-6);
EXPECT_NEAR(Deg(i, j), EToDeg(i, j), 1e-6);
EXPECT_NEAR(Rad(i, j), EToRad(i, j), 1e-6);
EXPECT_DOUBLE_EQ(EToRad(i, j), M0(i, j) * M_PI / 180);
EXPECT_DOUBLE_EQ(EToDeg(i, j), M0(i, j));
}
}
}
Expand Down

0 comments on commit 2f131f8

Please sign in to comment.