|
|
@@ -10,11 +10,19 @@
|
|
|
#include <random>
|
|
|
#endif
|
|
|
|
|
|
+template<typename T>
|
|
|
+T myEpsilon();
|
|
|
+template<>
|
|
|
+GLM_INLINE GLM_CONSTEXPR float myEpsilon<float>() { return 0.000005f; }
|
|
|
+template<>
|
|
|
+GLM_INLINE GLM_CONSTEXPR double myEpsilon<double>() { return 0.000001; }
|
|
|
+
|
|
|
+
|
|
|
template<glm::length_t D, typename T, glm::qualifier Q>
|
|
|
bool vectorEpsilonEqual(glm::vec<D, T, Q> const& a, glm::vec<D, T, Q> const& b)
|
|
|
{
|
|
|
for (int c = 0; c < D; ++c)
|
|
|
- if (!glm::epsilonEqual(a[c], b[c], static_cast<T>(0.000001)))
|
|
|
+ if (!glm::epsilonEqual(a[c], b[c], myEpsilon<T>()))
|
|
|
return false;
|
|
|
return true;
|
|
|
}
|
|
|
@@ -24,7 +32,7 @@ bool matrixEpsilonEqual(glm::mat<D, D, T, Q> const& a, glm::mat<D, D, T, Q> cons
|
|
|
{
|
|
|
for (int c = 0; c < D; ++c)
|
|
|
for (int r = 0; r < D; ++r)
|
|
|
- if (!glm::epsilonEqual(a[c][r], b[c][r], static_cast<T>(0.000001)))
|
|
|
+ if (!glm::epsilonEqual(a[c][r], b[c][r], myEpsilon<T>()))
|
|
|
return false;
|
|
|
return true;
|
|
|
}
|
|
|
@@ -214,7 +222,7 @@ namespace _1aga
|
|
|
getExpectedCovarDataPtr(expectedCovarData);
|
|
|
for(glm::length_t x = 0; x < D; ++x)
|
|
|
for(glm::length_t y = 0; y < D; ++y)
|
|
|
- if(!glm::equal(covarMat[y][x], expectedCovarData[x * 4 + y], static_cast<T>(0.000001)))
|
|
|
+ if(!glm::equal(covarMat[y][x], expectedCovarData[x * 4 + y], myEpsilon<T>()))
|
|
|
{
|
|
|
fprintf(stderr, "E: %.15lf != %.15lf ; diff: %.20lf\n",
|
|
|
static_cast<double>(covarMat[y][x]),
|
|
|
@@ -316,12 +324,12 @@ namespace _1aga
|
|
|
getExpectedEigenvaluesEigenvectorsDataPtr<D, T>(expectedEvals, expectedEvecs);
|
|
|
|
|
|
for(int i = 0; i < D; ++i)
|
|
|
- if(!glm::equal(evals[i], expectedEvals[i], static_cast<T>(0.000001)))
|
|
|
+ if(!glm::equal(evals[i], expectedEvals[i], myEpsilon<T>()))
|
|
|
return failReport(__LINE__);
|
|
|
|
|
|
for (int i = 0; i < D; ++i)
|
|
|
for (int d = 0; d < D; ++d)
|
|
|
- if (!glm::equal(evecs[i][d], expectedEvecs[i * D + d], static_cast<T>(0.000001)))
|
|
|
+ if (!glm::equal(evecs[i][d], expectedEvecs[i * D + d], myEpsilon<T>()))
|
|
|
return failReport(__LINE__);
|
|
|
|
|
|
return 0;
|
|
|
@@ -432,7 +440,13 @@ int testEigenvalueSort()
|
|
|
|
|
|
// Test covariance matrix creation functions
|
|
|
template<glm::length_t D, typename T, glm::qualifier Q>
|
|
|
-int testCovar(glm::length_t dataSize, unsigned int randomEngineSeed)
|
|
|
+int testCovar(
|
|
|
+#if GLM_HAS_CXX11_STL == 1
|
|
|
+ glm::length_t dataSize, unsigned int randomEngineSeed
|
|
|
+#else // GLM_HAS_CXX11_STL == 1
|
|
|
+ glm::length_t, unsigned int
|
|
|
+#endif // GLM_HAS_CXX11_STL == 1
|
|
|
+)
|
|
|
{
|
|
|
typedef glm::vec<D, T, Q> vec;
|
|
|
typedef glm::mat<D, D, T, Q> mat;
|
|
|
@@ -483,8 +497,6 @@ int testCovar(glm::length_t dataSize, unsigned int randomEngineSeed)
|
|
|
return failReport(__LINE__);
|
|
|
if(!matrixEpsilonEqual(c1, c4))
|
|
|
return failReport(__LINE__);
|
|
|
-#else // GLM_HAS_CXX11_STL == 1
|
|
|
- printf("dummy: %d %d\n", static_cast<int>(randomEngineSeed), static_cast<int>(dataSize));
|
|
|
#endif // GLM_HAS_CXX11_STL == 1
|
|
|
return 0;
|
|
|
}
|
|
|
@@ -572,17 +584,17 @@ int rndTest(unsigned int randomEngineSeed)
|
|
|
// construct orthonormal system
|
|
|
glm::dvec3 x(normalDist(rndEng), normalDist(rndEng), normalDist(rndEng));
|
|
|
double l = glm::length(x);
|
|
|
- while(l < 0.000001)
|
|
|
+ while(l < myEpsilon<double>())
|
|
|
x = glm::dvec3(normalDist(rndEng), normalDist(rndEng), normalDist(rndEng));
|
|
|
x = glm::normalize(x);
|
|
|
glm::dvec3 y(normalDist(rndEng), normalDist(rndEng), normalDist(rndEng));
|
|
|
l = glm::length(y);
|
|
|
- while(l < 0.000001)
|
|
|
+ while(l < myEpsilon<double>())
|
|
|
y = glm::dvec3(normalDist(rndEng), normalDist(rndEng), normalDist(rndEng));
|
|
|
- while(glm::abs(glm::dot(x, y)) < 0.000001)
|
|
|
+ while(glm::abs(glm::dot(x, y)) < myEpsilon<double>())
|
|
|
{
|
|
|
y = glm::dvec3(normalDist(rndEng), normalDist(rndEng), normalDist(rndEng));
|
|
|
- while(l < 0.000001)
|
|
|
+ while(l < myEpsilon<double>())
|
|
|
y = glm::dvec3(normalDist(rndEng), normalDist(rndEng), normalDist(rndEng));
|
|
|
}
|
|
|
y = glm::normalize(y);
|
|
|
@@ -628,11 +640,11 @@ int rndTest(unsigned int randomEngineSeed)
|
|
|
//printf("evec2: %.10lf, %.10lf, %.10lf\n", evecs[2].x, evecs[2].y, evecs[2].z);
|
|
|
//printf("evec1: %.10lf, %.10lf, %.10lf\n", evecs[1].x, evecs[1].y, evecs[1].z);
|
|
|
|
|
|
- if(glm::length(glm::abs(x) - glm::abs(evecs[0])) > 0.000001)
|
|
|
+ if(glm::length(glm::abs(x) - glm::abs(evecs[0])) > myEpsilon<double>())
|
|
|
return failReport(__LINE__);
|
|
|
- if(glm::length(glm::abs(y) - glm::abs(evecs[2])) > 0.000001)
|
|
|
+ if(glm::length(glm::abs(y) - glm::abs(evecs[2])) > myEpsilon<double>())
|
|
|
return failReport(__LINE__);
|
|
|
- if(glm::length(glm::abs(z) - glm::abs(evecs[1])) > 0.000001)
|
|
|
+ if(glm::length(glm::abs(z) - glm::abs(evecs[1])) > myEpsilon<double>())
|
|
|
return failReport(__LINE__);
|
|
|
|
|
|
return 0;
|