Commit a24ebc99 authored by Alexander Alekhin's avatar Alexander Alekhin

Merge pull request #7840 from alalek:fix_test_rng

parents 7a3b5b30 ec859ceb
...@@ -51,7 +51,7 @@ using namespace cv; ...@@ -51,7 +51,7 @@ using namespace cv;
using namespace std; using namespace std;
ChessBoardGenerator::ChessBoardGenerator(const Size& _patternSize) : sensorWidth(32), sensorHeight(24), ChessBoardGenerator::ChessBoardGenerator(const Size& _patternSize) : sensorWidth(32), sensorHeight(24),
squareEdgePointsNum(200), min_cos(std::sqrt(2.f)*0.5f), cov(0.5), squareEdgePointsNum(200), min_cos(std::sqrt(3.f)*0.5f), cov(0.5),
patternSize(_patternSize), rendererResolutionMultiplier(4), tvec(Mat::zeros(1, 3, CV_32F)) patternSize(_patternSize), rendererResolutionMultiplier(4), tvec(Mat::zeros(1, 3, CV_32F))
{ {
Rodrigues(Mat::eye(3, 3, CV_32F), rvec); Rodrigues(Mat::eye(3, 3, CV_32F), rvec);
...@@ -85,8 +85,10 @@ void cv::ChessBoardGenerator::generateBasis(Point3f& pb1, Point3f& pb2) const ...@@ -85,8 +85,10 @@ void cv::ChessBoardGenerator::generateBasis(Point3f& pb1, Point3f& pb2) const
{ {
n[0] = rng.uniform(-1.f, 1.f); n[0] = rng.uniform(-1.f, 1.f);
n[1] = rng.uniform(-1.f, 1.f); n[1] = rng.uniform(-1.f, 1.f);
n[2] = rng.uniform(-1.f, 1.f); n[2] = rng.uniform(0.0f, 1.f);
float len = (float)norm(n); float len = (float)norm(n);
if (len < 1e-3)
continue;
n[0]/=len; n[0]/=len;
n[1]/=len; n[1]/=len;
n[2]/=len; n[2]/=len;
......
...@@ -120,15 +120,20 @@ TEST(Core_HAL, mathfuncs) ...@@ -120,15 +120,20 @@ TEST(Core_HAL, mathfuncs)
} }
} }
namespace {
enum enum
{ {
HAL_LU = 0, HAL_LU = 0,
HAL_CHOL = 1 HAL_CHOL = 1
}; };
TEST(Core_HAL, mat_decomp) typedef testing::TestWithParam<int> HAL;
TEST_P(HAL, mat_decomp)
{ {
for( int hcase = 0; hcase < 16; hcase++ ) int hcase = GetParam();
SCOPED_TRACE(cv::format("hcase=%d", hcase));
{ {
int depth = hcase % 2 == 0 ? CV_32F : CV_64F; int depth = hcase % 2 == 0 ? CV_32F : CV_64F;
int size = (hcase / 2) % 4; int size = (hcase / 2) % 4;
...@@ -137,7 +142,7 @@ TEST(Core_HAL, mat_decomp) ...@@ -137,7 +142,7 @@ TEST(Core_HAL, mat_decomp)
double eps = depth == CV_32F ? 1e-5 : 1e-10; double eps = depth == CV_32F ? 1e-5 : 1e-10;
if( size == 3 ) if( size == 3 )
continue; return; // TODO ???
Mat a0(size, size, depth), a(size, size, depth), b(size, 1, depth), x(size, 1, depth), x0(size, 1, depth); Mat a0(size, size, depth), a(size, size, depth), b(size, 1, depth), x(size, 1, depth), x0(size, 1, depth);
randu(a0, -1, 1); randu(a0, -1, 1);
...@@ -175,14 +180,19 @@ TEST(Core_HAL, mat_decomp) ...@@ -175,14 +180,19 @@ TEST(Core_HAL, mat_decomp)
min_hal_t = std::min(min_hal_t, t); min_hal_t = std::min(min_hal_t, t);
t = (double)getTickCount(); t = (double)getTickCount();
solve(a0, b, x0, (nfunc == HAL_LU ? DECOMP_LU : DECOMP_CHOLESKY)); bool solveStatus = solve(a0, b, x0, (nfunc == HAL_LU ? DECOMP_LU : DECOMP_CHOLESKY));
t = (double)getTickCount() - t; t = (double)getTickCount() - t;
EXPECT_TRUE(solveStatus);
min_ocv_t = std::min(min_ocv_t, t); min_ocv_t = std::min(min_ocv_t, t);
} }
//std::cout << "x: " << Mat(x.t()) << std::endl; //std::cout << "x: " << Mat(x.t()) << std::endl;
//std::cout << "x0: " << Mat(x0.t()) << std::endl; //std::cout << "x0: " << Mat(x0.t()) << std::endl;
EXPECT_LE(norm(x, x0, NORM_INF | NORM_RELATIVE), eps); EXPECT_LE(norm(x, x0, NORM_INF | NORM_RELATIVE), eps)
<< "x: " << Mat(x.t())
<< "\nx0: " << Mat(x0.t())
<< "\na0: " << a0
<< "\nb: " << b;
double freq = getTickFrequency(); double freq = getTickFrequency();
printf("%s (%d x %d, %s): hal time=%.2fusec, ocv time=%.2fusec\n", printf("%s (%d x %d, %s): hal time=%.2fusec, ocv time=%.2fusec\n",
...@@ -192,3 +202,7 @@ TEST(Core_HAL, mat_decomp) ...@@ -192,3 +202,7 @@ TEST(Core_HAL, mat_decomp)
min_hal_t*1e6/freq, min_ocv_t*1e6/freq); min_hal_t*1e6/freq, min_ocv_t*1e6/freq);
} }
} }
INSTANTIATE_TEST_CASE_P(Core, HAL, testing::Range(0, 16));
} // namespace
...@@ -539,11 +539,13 @@ protected: ...@@ -539,11 +539,13 @@ protected:
} }
}; };
extern uint64 param_seed;
struct CV_EXPORTS DefaultRngAuto struct CV_EXPORTS DefaultRngAuto
{ {
const uint64 old_state; const uint64 old_state;
DefaultRngAuto() : old_state(cv::theRNG().state) { cv::theRNG().state = (uint64)-1; } DefaultRngAuto() : old_state(cv::theRNG().state) { cv::theRNG().state = cvtest::param_seed; }
~DefaultRngAuto() { cv::theRNG().state = old_state; } ~DefaultRngAuto() { cv::theRNG().state = old_state; }
DefaultRngAuto& operator=(const DefaultRngAuto&); DefaultRngAuto& operator=(const DefaultRngAuto&);
......
...@@ -12,7 +12,9 @@ namespace cvtest { ...@@ -12,7 +12,9 @@ namespace cvtest {
void checkIppStatus(); void checkIppStatus();
} }
#define CV_TEST_INIT cv::ipp::setIppStatus(0); #define CV_TEST_INIT \
cv::ipp::setIppStatus(0); \
cv::theRNG().state = cvtest::param_seed;
#define CV_TEST_CLEANUP ::cvtest::checkIppStatus(); #define CV_TEST_CLEANUP ::cvtest::checkIppStatus();
#define CV_TEST_BODY_IMPL \ #define CV_TEST_BODY_IMPL \
{ \ { \
......
...@@ -80,6 +80,8 @@ ...@@ -80,6 +80,8 @@
namespace cvtest namespace cvtest
{ {
uint64 param_seed = 0x12345678; // real value is passed via parseCustomOptions function
static std::string path_join(const std::string& prefix, const std::string& subpath) static std::string path_join(const std::string& prefix, const std::string& subpath)
{ {
CV_Assert(subpath.empty() || subpath[0] != '/'); CV_Assert(subpath.empty() || subpath[0] != '/');
...@@ -695,6 +697,7 @@ void parseCustomOptions(int argc, char **argv) ...@@ -695,6 +697,7 @@ void parseCustomOptions(int argc, char **argv)
{ {
const char * const command_line_keys = const char * const command_line_keys =
"{ ipp test_ipp_check |false |check whether IPP works without failures }" "{ ipp test_ipp_check |false |check whether IPP works without failures }"
"{ test_seed |809564 |seed for random numbers generator }"
"{ h help |false |print help info }"; "{ h help |false |print help info }";
cv::CommandLineParser parser(argc, argv, command_line_keys); cv::CommandLineParser parser(argc, argv, command_line_keys);
...@@ -711,6 +714,8 @@ void parseCustomOptions(int argc, char **argv) ...@@ -711,6 +714,8 @@ void parseCustomOptions(int argc, char **argv)
#else #else
test_ipp_check = false; test_ipp_check = false;
#endif #endif
param_seed = parser.get<unsigned int>("test_seed");
} }
......
...@@ -38,7 +38,6 @@ static double param_max_outliers; ...@@ -38,7 +38,6 @@ static double param_max_outliers;
static double param_max_deviation; static double param_max_deviation;
static unsigned int param_min_samples; static unsigned int param_min_samples;
static unsigned int param_force_samples; static unsigned int param_force_samples;
static uint64 param_seed;
static double param_time_limit; static double param_time_limit;
static int param_threads; static int param_threads;
static bool param_write_sanity; static bool param_write_sanity;
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment