Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion externals/EnjoLib
5 changes: 0 additions & 5 deletions src/tsqsim-lib/src/ITSXform.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -7,8 +7,3 @@ unsigned ITSXform::MaxShift() const
{
return 0;
}

double ITSXform::Invert(const EnjoLib::VecD & vals) const
{
return vals.at(0);
}
3 changes: 2 additions & 1 deletion src/tsqsim-lib/src/ITSXform.h
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,8 @@ struct ITSXform
virtual ~ITSXform();

virtual double Run(const TSFunBase & input, int idx, double valPrev) const = 0;
virtual double Invert(const EnjoLib::VecD & vals) const;
virtual double Run(const EnjoLib::VecD & vals) const = 0;
virtual double Invert(const EnjoLib::VecD & vals) const = 0;

/// virtual double Invert(const TSFunBase & input, int idx, double valPrev) const = 0; /// TODO HI
virtual unsigned MaxShift() const;
Expand Down
1 change: 0 additions & 1 deletion src/tsqsim-lib/src/TSXformFactory.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -40,7 +40,6 @@ CorPtr<ITSXform> TSXformFactory::Create(const Str & name) const
{
case TSXformType::DIFF: return CorPtr<ITSXform>(new TSXformDiff());
case TSXformType::FABS: return CorPtr<ITSXform>(new TSXformFabs());
case TSXformType::SQRT: return CorPtr<ITSXform>(new TSXformSqrt());
case TSXformType::SQRTS: return CorPtr<ITSXform>(new TSXformSqrtSafe());
case TSXformType::LOGS: return CorPtr<ITSXform>(new TSXformLogSafe());
case TSXformType::ADD: return CorPtr<ITSXform>(new TSXformAdd(params));
Expand Down
54 changes: 42 additions & 12 deletions src/tsqsim-lib/src/TSXformImpl.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,11 @@ double TSXformDiff::Run(const TSFunBase & input, int idx, double valPrev) const
const double diff = canCurr.GetClose() - canPrev.GetClose();
return diff;
}
double TSXformDiff::Run(const EnjoLib::VecD & vals) const
{
const double diff = vals.at(0) - vals.at(1);
return diff;
}
/// TODO: Unit test all the inversions with CHECK_CLOSE()
double TSXformDiff::Invert(const EnjoLib::VecD & vals) const
{
Expand All @@ -31,14 +36,22 @@ double TSXformFabs::Run(const TSFunBase & input, int idx, double valPrev) const
{
return GeneralMath().Fabs(valPrev);
}

double TSXformSqrt::Run(const TSFunBase & input, int idx, double valPrev) const
double TSXformFabs::Run(const EnjoLib::VecD & vals) const
{
return GeneralMath().Fabs(vals.at(0));
}
double TSXformFabs::Invert(const EnjoLib::VecD & vals) const
{
return GeneralMath().Sqrt(valPrev);
return vals.at(0);
}

double TSXformSqrtSafe::Run(const TSFunBase & input, int idx, double valPrev) const
{
return Run(VecD(1, valPrev));
}
double TSXformSqrtSafe::Run(const EnjoLib::VecD & vals) const
{
const double valPrev = vals.at(0);
const GMat gmat;
if (valPrev > 0)
{
Expand All @@ -53,24 +66,36 @@ double TSXformSqrtSafe::Run(const TSFunBase & input, int idx, double valPrev) co
return -gmat.Sqrt(-valPrev);
}
}
double TSXformSqrtSafe::Invert(const EnjoLib::VecD & vals) const
{
const double valPrev = vals.at(0);
const GMat gmat;
const double pow = gmat.Pow(valPrev, 2);
return valPrev < 0 ? -pow : pow;
}

double TSXformLogSafe::Run(const TSFunBase & input, int idx, double valPrev) const
{
return Run(VecD(1, valPrev));
}
double TSXformLogSafe::Run(const EnjoLib::VecD & vals) const
{
const double valPrev = vals.at(0);
const GMat gmat;
if (valPrev > 0)
if (valPrev > VAL_BORDER)
{
return gmat.Log(valPrev);
}
else if (valPrev == 0)
else if (valPrev == VAL_BORDER)
{
return 0;
}
else
{
return -gmat.Log(-valPrev); /// TODO: Call Log only once (after UTs)
const double diff = gmat.Fabs(VAL_BORDER - valPrev);
return -gmat.Log(diff + VAL_BORDER); /// TODO: Call Log only once (after UTs)
}
}

double TSXformLogSafe::Invert(const EnjoLib::VecD & vals) const
{
const double val = vals.at(0);
Expand All @@ -79,13 +104,9 @@ double TSXformLogSafe::Invert(const EnjoLib::VecD & vals) const
{
return gmat.Exp(val);
}
else if (val == 0)
{
return 0;
}
else
{
return -gmat.Exp(-val); /// TODO: Call Exp only once (after UTs)
return -gmat.Exp(-val) + 2* VAL_BORDER; /// TODO: Call Exp only once (after UTs)
}
}

Expand All @@ -98,3 +119,12 @@ double TSXformAdd::Run(const TSFunBase & input, int idx, double valPrev) const
{
return valPrev + m_add;
}
double TSXformAdd::Run(const EnjoLib::VecD & vals) const
{
return vals.at(0) + m_add;
}
double TSXformAdd::Invert(const EnjoLib::VecD & vals) const
{
return vals.at(0);
}

15 changes: 10 additions & 5 deletions src/tsqsim-lib/src/TSXformImpl.h
Original file line number Diff line number Diff line change
Expand Up @@ -7,35 +7,40 @@
struct TSXformDiff : public ITSXform
{
double Run(const TSFunBase & input, int idx, double valPrev) const override;
double Run(const EnjoLib::VecD & vals) const override;
unsigned MaxShift() const override;
double Invert(const EnjoLib::VecD & vals) const override;
};

struct TSXformFabs : public ITSXform
{
double Run(const TSFunBase & input, int idx, double valPrev) const override;
};

struct TSXformSqrt : public ITSXform
{
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;
};

struct TSXformSqrtSafe : public ITSXform
{
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;
};

struct TSXformLogSafe : public ITSXform
{
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;

static constexpr double VAL_BORDER = 1;
};

struct TSXformAdd : public ITSXform
{
TSXformAdd(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_add = 0;
};
Expand Down
1 change: 0 additions & 1 deletion src/tsqsim-lib/src/TSXformType.h
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,6 @@ enum class TSXformType
{
DIFF,
FABS,
SQRT,
SQRTS,
LOGS,
//POW, TODO
Expand Down
1 change: 0 additions & 1 deletion src/tsqsim-lib/src/TSXformTypeString.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,6 @@ TSXformTypeString:: TSXformTypeString()
{
case TSXformType::DIFF: Add(i, "diff"); break;
case TSXformType::FABS: Add(i, "fabs"); break;
case TSXformType::SQRT: Add(i, "sqrt"); break;
case TSXformType::SQRTS: Add(i, "sqrts"); break;
case TSXformType::LOGS: Add(i, "logs"); break;
case TSXformType::ADD: Add(i, "add"); break;
Expand Down
1 change: 1 addition & 0 deletions tests/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@ cmake_minimum_required(VERSION 3.5.1)

add_subdirectory(test-common)
add_subdirectory(test-base)
add_subdirectory(test-tsqsim)
if (BUILD_QT)
add_subdirectory(qt-test)
endif()
19 changes: 19 additions & 0 deletions tests/test-tsqsim/CMakeLists.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
# Create a library called "Hello" which includes the source file "hello.cxx".
# The extension is already found. Any number of sources could be listed here.
cmake_minimum_required(VERSION 3.5.1)
include(../../cmake/util.cmake)
include(../../cmake/stock-includes.cmake)
project( test-tsqsim )

file( GLOB SRCS src/*.cpp */*.h */*.hpp)

add_executable(${PROJECT_NAME} ${SRCS})
add_test(${PROJECT_NAME} ${PROJECT_NAME})
enjoSetupTarget(${PROJECT_NAME})
target_link_libraries(${PROJECT_NAME} tsqsim-lib test-common)

enjo_target_unity(${PROJECT_NAME})

# Make sure the compiler can find include files for our Hello library
# when other libraries or executables link to Hello
target_include_directories (${PROJECT_NAME} PUBLIC ${CMAKE_CURRENT_SOURCE_DIR})
88 changes: 88 additions & 0 deletions tests/test-tsqsim/src/TSXformImplTest.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,88 @@
#include "pch_test.h"


#include "TSXformFactory.h"
#include "TSXformType.h"
#include "TSXformTypeString.h"

#include <Util/CoutBuf.hpp>

#include <UnitTest++/UnitTest++.h>

using namespace EnjoLib;
TEST(Conv_Log)
{
TSXformTypeString xform2str;
const TSXformType type = TSXformType::LOGS;
const Str xformStr = xform2str.at(int(type));
CorPtr<ITSXform> xform = TSXformFactory().Create(xformStr);

CHECK_CLOSE(-xform->Run(VecD(1, 1.5)), xform->Run(VecD(1, 0.5)), 0.01);
}

TEST(Conv_inv)
{
bool verbose = false;
//verbose = true;
VecD inp;
inp.Add(-11);
inp.Add(-2);
inp.Add(-0.5);
inp.Add(0);
inp.Add(0.5);
inp.Add(1);
inp.Add(1.5);
inp.Add(10);
TSXformTypeString xform2str;
for (int itype = 0; itype < int(TSXformType::END); ++itype)
{
const TSXformType type = TSXformType(itype);
const Str xformStr = xform2str.at(itype);
if (verbose)
{
LOGL << xformStr << Nl;
}
if (type == TSXformType::ADD)
{
/// TODO: Uses a different constructor
continue;
}
CorPtr<ITSXform> xform = TSXformFactory().Create(xformStr);

switch (type)
{
/// TODO: Service exceptions
case TSXformType::DIFF:
break; /// TODO: Probably the most important
case TSXformType::FABS:
break;
case TSXformType::ADD:
break;
default:
{
for (int i = 0; i < int(inp.size()); ++i)
{
const double valIn = inp.at(i);
const double res = xform->Run( VecD(1, valIn));
const double inv = xform->Invert(VecD(1, res));
if (verbose)
{
LOGL << "in = " << valIn << ", res = " << res << ", inv = " << inv << Nl;
}
CHECK_CLOSE(valIn, inv, 0.01);
}

}
}
}
}

TEST(Conv_diffs)
{
/// TODO: TSXformType::DIFF:
}

TEST(Conv_add)
{
/// TODO: TSXformType::ADD:
}
12 changes: 12 additions & 0 deletions tests/test-tsqsim/src/main.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
#include "pch_test.h"

#include <UnitTest++/UnitTest++.h>
#include <Util/CoutBuf.hpp>

using namespace std;

int main()
{
LOGL << "Running tests!" << EnjoLib::Nl;
return UnitTest::RunAllTests();
}