|
|
@@ -32,8 +32,7 @@ bool matrixEpsilonEqual(glm::mat<D, D, T, Q> const& a, glm::mat<D, D, T, Q> cons
|
|
|
template<typename T>
|
|
|
T failReport(T line)
|
|
|
{
|
|
|
- printf("I:Failed in line %d\n", static_cast<int>(line));
|
|
|
- fprintf(stderr, "E:Failed in line %d\n", static_cast<int>(line));
|
|
|
+ fprintf(stderr, "Failed in line %d\n", static_cast<int>(line));
|
|
|
return line;
|
|
|
}
|
|
|
|
|
|
@@ -211,12 +210,19 @@ namespace _1aga
|
|
|
template<glm::length_t D, typename T, glm::qualifier Q>
|
|
|
int checkCovarMat(glm::mat<D, D, T, Q> const& covarMat)
|
|
|
{
|
|
|
- const T* expectedCovarData = nullptr;
|
|
|
+ const T* expectedCovarData = GLM_NULLPTR;
|
|
|
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)))
|
|
|
+ {
|
|
|
+ fprintf(stderr, "E: %.15lf != %.15lf ; diff: %.20lf\n",
|
|
|
+ static_cast<double>(covarMat[y][x]),
|
|
|
+ static_cast<double>(expectedCovarData[x * 4 + y]),
|
|
|
+ static_cast<double>(covarMat[y][x] - expectedCovarData[x * 4 + y])
|
|
|
+ );
|
|
|
return failReport(__LINE__);
|
|
|
+ }
|
|
|
return 0;
|
|
|
}
|
|
|
|
|
|
@@ -305,8 +311,8 @@ namespace _1aga
|
|
|
glm::vec<D, T, Q> const& evals,
|
|
|
glm::mat<D, D, T, Q> const& evecs)
|
|
|
{
|
|
|
- const T* expectedEvals = nullptr;
|
|
|
- const T* expectedEvecs = nullptr;
|
|
|
+ const T* expectedEvals = GLM_NULLPTR;
|
|
|
+ const T* expectedEvecs = GLM_NULLPTR;
|
|
|
getExpectedEigenvaluesEigenvectorsDataPtr<D, T>(expectedEvals, expectedEvecs);
|
|
|
|
|
|
for(int i = 0; i < D; ++i)
|
|
|
@@ -441,8 +447,7 @@ int testCovar(glm::length_t dataSize, unsigned int randomEngineSeed)
|
|
|
mat covarMat = glm::computeCovarianceMatrix(testData.data(), testData.size(), center);
|
|
|
if(_1aga::checkCovarMat(covarMat))
|
|
|
{
|
|
|
- fprintf(stdout, "I:Reconstructed covarMat:\n%s\n", glm::to_string(covarMat).c_str());
|
|
|
- fprintf(stderr, "E:Reconstructed covarMat:\n%s\n", glm::to_string(covarMat).c_str());
|
|
|
+ fprintf(stderr, "Reconstructed covarMat:\n%s\n", glm::to_string(covarMat).c_str());
|
|
|
return failReport(__LINE__);
|
|
|
}
|
|
|
|
|
|
@@ -636,6 +641,7 @@ int rndTest(unsigned int randomEngineSeed)
|
|
|
|
|
|
int main()
|
|
|
{
|
|
|
+ int error(0);
|
|
|
|
|
|
// A small smoke test to fail early with most problems
|
|
|
if(smokeTest())
|
|
|
@@ -643,54 +649,62 @@ int main()
|
|
|
|
|
|
// test sorting utility.
|
|
|
if(testEigenvalueSort<2, float, glm::defaultp>() != 0)
|
|
|
- return failReport(__LINE__);
|
|
|
+ error = failReport(__LINE__);
|
|
|
if(testEigenvalueSort<2, double, glm::defaultp>() != 0)
|
|
|
- return failReport(__LINE__);
|
|
|
+ error = failReport(__LINE__);
|
|
|
if(testEigenvalueSort<3, float, glm::defaultp>() != 0)
|
|
|
- return failReport(__LINE__);
|
|
|
+ error = failReport(__LINE__);
|
|
|
if(testEigenvalueSort<3, double, glm::defaultp>() != 0)
|
|
|
- return failReport(__LINE__);
|
|
|
+ error = failReport(__LINE__);
|
|
|
if(testEigenvalueSort<4, float, glm::defaultp>() != 0)
|
|
|
- return failReport(__LINE__);
|
|
|
+ error = failReport(__LINE__);
|
|
|
if(testEigenvalueSort<4, double, glm::defaultp>() != 0)
|
|
|
- return failReport(__LINE__);
|
|
|
+ error = failReport(__LINE__);
|
|
|
+ if (error != 0)
|
|
|
+ return error;
|
|
|
|
|
|
// Note: the random engine uses a fixed seed to create consistent and reproducible test data
|
|
|
// test covariance matrix computation from different data sources
|
|
|
if(testCovar<2, float, glm::defaultp>(100, 12345) != 0)
|
|
|
- return failReport(__LINE__);
|
|
|
+ error = failReport(__LINE__);
|
|
|
if(testCovar<2, double, glm::defaultp>(100, 42) != 0)
|
|
|
- return failReport(__LINE__);
|
|
|
+ error = failReport(__LINE__);
|
|
|
if(testCovar<3, float, glm::defaultp>(100, 2021) != 0)
|
|
|
- return failReport(__LINE__);
|
|
|
+ error = failReport(__LINE__);
|
|
|
if(testCovar<3, double, glm::defaultp>(100, 815) != 0)
|
|
|
- return failReport(__LINE__);
|
|
|
+ error = failReport(__LINE__);
|
|
|
if(testCovar<4, float, glm::defaultp>(100, 3141) != 0)
|
|
|
- return failReport(__LINE__);
|
|
|
+ error = failReport(__LINE__);
|
|
|
if(testCovar<4, double, glm::defaultp>(100, 174) != 0)
|
|
|
- return failReport(__LINE__);
|
|
|
+ error = failReport(__LINE__);
|
|
|
+ if (error != 0)
|
|
|
+ return error;
|
|
|
|
|
|
// test PCA eigen vector reconstruction
|
|
|
if(testEigenvectors<2, float, glm::defaultp>() != 0)
|
|
|
- return failReport(__LINE__);
|
|
|
+ error = failReport(__LINE__);
|
|
|
if(testEigenvectors<2, double, glm::defaultp>() != 0)
|
|
|
- return failReport(__LINE__);
|
|
|
+ error = failReport(__LINE__);
|
|
|
if(testEigenvectors<3, float, glm::defaultp>() != 0)
|
|
|
- return failReport(__LINE__);
|
|
|
+ error = failReport(__LINE__);
|
|
|
if(testEigenvectors<3, double, glm::defaultp>() != 0)
|
|
|
- return failReport(__LINE__);
|
|
|
- if (testEigenvectors<4, float, glm::defaultp>() != 0)
|
|
|
- return failReport(__LINE__);
|
|
|
- if (testEigenvectors<4, double, glm::defaultp>() != 0)
|
|
|
- return failReport(__LINE__);
|
|
|
+ error = failReport(__LINE__);
|
|
|
+ if(testEigenvectors<4, float, glm::defaultp>() != 0)
|
|
|
+ error = failReport(__LINE__);
|
|
|
+ if(testEigenvectors<4, double, glm::defaultp>() != 0)
|
|
|
+ error = failReport(__LINE__);
|
|
|
+ if(error != 0)
|
|
|
+ return error;
|
|
|
|
|
|
// Final tests with randomized data
|
|
|
#if GLM_HAS_CXX11_STL == 1
|
|
|
if(rndTest(12345) != 0)
|
|
|
- return failReport(__LINE__);
|
|
|
+ error = failReport(__LINE__);
|
|
|
if(rndTest(42) != 0)
|
|
|
- return failReport(__LINE__);
|
|
|
+ error = failReport(__LINE__);
|
|
|
+ if (error != 0)
|
|
|
+ return error;
|
|
|
#endif // GLM_HAS_CXX11_STL == 1
|
|
|
|
|
|
- return 0;
|
|
|
+ return error;
|
|
|
}
|