Просмотр исходного кода

Increased float comparison epsilon to pass tests.

SGrottel 4 лет назад
Родитель
Сommit
593b7cc36b
1 измененных файлов с 27 добавлено и 15 удалено
  1. 27 15
      test/gtx/gtx_pca.cpp

+ 27 - 15
test/gtx/gtx_pca.cpp

@@ -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;