diff --git a/src/tsqsim-lib/src/TSXformFactory.cpp b/src/tsqsim-lib/src/TSXformFactory.cpp index 45b8e5e..80d7a5d 100644 --- a/src/tsqsim-lib/src/TSXformFactory.cpp +++ b/src/tsqsim-lib/src/TSXformFactory.cpp @@ -43,6 +43,8 @@ CorPtr TSXformFactory::Create(const Str & name) const case TSXformType::SQRTS: return CorPtr(new TSXformSqrtSafe()); case TSXformType::LOGS: return CorPtr(new TSXformLogSafe()); case TSXformType::ADD: return CorPtr(new TSXformAdd(params)); + case TSXformType::MUL: return CorPtr(new TSXformMul(params)); + case TSXformType::DIV: return CorPtr(new TSXformDiv(params)); case TSXformType::END: return CorPtr(new TSXformDiff()); // Fake } } diff --git a/src/tsqsim-lib/src/TSXformImpl.cpp b/src/tsqsim-lib/src/TSXformImpl.cpp index a328350..740bc6a 100644 --- a/src/tsqsim-lib/src/TSXformImpl.cpp +++ b/src/tsqsim-lib/src/TSXformImpl.cpp @@ -6,6 +6,7 @@ #include #include #include +#include using namespace EnjoLib; @@ -117,7 +118,7 @@ TSXformAdd::TSXformAdd(const VecStr & params) } double TSXformAdd::Run(const TSFunBase & input, int idx, double valPrev) const { - return valPrev + m_add; + return Run(VecD(1, valPrev)); } double TSXformAdd::Run(const EnjoLib::VecD & vals) const { @@ -125,6 +126,41 @@ double TSXformAdd::Run(const EnjoLib::VecD & vals) const } double TSXformAdd::Invert(const EnjoLib::VecD & vals) const { - return vals.at(0); + return vals.at(0) - m_add; } +TSXformMul::TSXformMul(const VecStr & params) +: m_mul(CharManipulations().ToDouble(params.at(0))) +{ + Assertions::IsNonZero(m_mul, "TSXformMul::TSXformMul()"); +} +double TSXformMul::Run(const TSFunBase & input, int idx, double valPrev) const +{ + return Run(VecD(1, valPrev)); +} +double TSXformMul::Run(const EnjoLib::VecD & vals) const +{ + return vals.at(0) * m_mul; +} +double TSXformMul::Invert(const EnjoLib::VecD & vals) const +{ + return vals.at(0) / m_mul; +} + +TSXformDiv::TSXformDiv(const VecStr & params) +: m_div(CharManipulations().ToDouble(params.at(0))) +{ + Assertions::IsNonZero(m_div, "TSXformDiv::TSXformDiv()"); +} +double TSXformDiv::Run(const TSFunBase & input, int idx, double valPrev) const +{ + return Run(VecD(1, valPrev)); +} +double TSXformDiv::Run(const EnjoLib::VecD & vals) const +{ + return vals.at(0) / m_div; +} +double TSXformDiv::Invert(const EnjoLib::VecD & vals) const +{ + return vals.at(0) * m_div; +} diff --git a/src/tsqsim-lib/src/TSXformImpl.h b/src/tsqsim-lib/src/TSXformImpl.h index 57338b8..306a739 100644 --- a/src/tsqsim-lib/src/TSXformImpl.h +++ b/src/tsqsim-lib/src/TSXformImpl.h @@ -45,4 +45,24 @@ struct TSXformAdd : public ITSXform double m_add = 0; }; +struct TSXformMul : public ITSXform +{ + TSXformMul(const VecStr & params); + double Run(const TSFunBase & input, int idx, double valPrev) const override; + double Run(const EnjoLib::VecD & vals) const override; + double Invert(const EnjoLib::VecD & vals) const override; + + double m_mul = 0; +}; + +struct TSXformDiv : public ITSXform +{ + TSXformDiv(const VecStr & params); + double Run(const TSFunBase & input, int idx, double valPrev) const override; + double Run(const EnjoLib::VecD & vals) const override; + double Invert(const EnjoLib::VecD & vals) const override; + + double m_div = 0; +}; + #endif // TSXFORMIMPL_H diff --git a/src/tsqsim-lib/src/TSXformType.h b/src/tsqsim-lib/src/TSXformType.h index 0439ccb..fceb14b 100644 --- a/src/tsqsim-lib/src/TSXformType.h +++ b/src/tsqsim-lib/src/TSXformType.h @@ -10,6 +10,8 @@ enum class TSXformType LOGS, //POW, TODO ADD, + MUL, + DIV, END }; diff --git a/src/tsqsim-lib/src/TSXformTypeString.cpp b/src/tsqsim-lib/src/TSXformTypeString.cpp index 10ad153..7d1db65 100644 --- a/src/tsqsim-lib/src/TSXformTypeString.cpp +++ b/src/tsqsim-lib/src/TSXformTypeString.cpp @@ -15,6 +15,8 @@ TSXformTypeString:: TSXformTypeString() case TSXformType::SQRTS: Add(i, "sqrts"); break; case TSXformType::LOGS: Add(i, "logs"); break; case TSXformType::ADD: Add(i, "add"); break; + case TSXformType::MUL: Add(i, "mul"); break; + case TSXformType::DIV: Add(i, "div"); break; //case TSXformType::POW: Add(i, "pow"); break; case TSXformType::END: Add(i, "end"); break; } diff --git a/tests/test-tsqsim/src/TSXformImplTest.cpp b/tests/test-tsqsim/src/TSXformImplTest.cpp index 23c30ce..af8ed08 100644 --- a/tests/test-tsqsim/src/TSXformImplTest.cpp +++ b/tests/test-tsqsim/src/TSXformImplTest.cpp @@ -37,15 +37,16 @@ TEST(Conv_inv) for (int itype = 0; itype < int(TSXformType::END); ++itype) { const TSXformType type = TSXformType(itype); - const Str xformStr = xform2str.at(itype); + Str xformStr = xform2str.at(itype); if (verbose) { LOGL << xformStr << Nl; } - if (type == TSXformType::ADD) + if (type == TSXformType::ADD || + type == TSXformType::MUL || + type == TSXformType::DIV ) { - /// TODO: Uses a different constructor - continue; + xformStr += " 3"; // Expects a parameter } CorPtr xform = TSXformFactory().Create(xformStr); @@ -56,8 +57,6 @@ TEST(Conv_inv) break; /// TODO: Probably the most important case TSXformType::FABS: break; - case TSXformType::ADD: - break; default: { for (int i = 0; i < int(inp.size()); ++i) @@ -82,7 +81,7 @@ TEST(Conv_diffs) /// TODO: TSXformType::DIFF: } -TEST(Conv_add) +TEST(Conv_fabs) { - /// TODO: TSXformType::ADD: + /// TODO: TSXformType::FABS: } \ No newline at end of file