|
|
|
@ -82,32 +82,53 @@ int CV_SLMLTest::validate_test_results( int testCaseIdx ) |
|
|
|
|
int code = cvtest::TS::OK; |
|
|
|
|
|
|
|
|
|
// 1. compare files
|
|
|
|
|
ifstream f1( fname1.c_str() ), f2( fname2.c_str() ); |
|
|
|
|
string s1, s2; |
|
|
|
|
int lineIdx = 0; |
|
|
|
|
CV_Assert( f1.is_open() && f2.is_open() ); |
|
|
|
|
for( ; !f1.eof() && !f2.eof(); lineIdx++ ) |
|
|
|
|
FILE *fs1 = fopen(fname1.c_str(), "rb"), *fs2 = fopen(fname2.c_str(), "rb"); |
|
|
|
|
size_t sz1 = 0, sz2 = 0; |
|
|
|
|
if( !fs1 || !fs2 ) |
|
|
|
|
code = cvtest::TS::FAIL_MISSING_TEST_DATA; |
|
|
|
|
if( code >= 0 ) |
|
|
|
|
{ |
|
|
|
|
getline( f1, s1 ); |
|
|
|
|
getline( f2, s2 ); |
|
|
|
|
if( s1.compare(s2) ) |
|
|
|
|
fseek(fs1, 0, SEEK_END); fseek(fs2, 0, SEEK_END); |
|
|
|
|
sz1 = ftell(fs1); |
|
|
|
|
sz2 = ftell(fs2); |
|
|
|
|
fseek(fs1, 0, SEEK_SET); fseek(fs2, 0, SEEK_SET); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
if( sz1 != sz2 ) |
|
|
|
|
code = cvtest::TS::FAIL_INVALID_OUTPUT; |
|
|
|
|
|
|
|
|
|
if( code >= 0 ) |
|
|
|
|
{ |
|
|
|
|
const int BUFSZ = 1024; |
|
|
|
|
uchar buf1[BUFSZ], buf2[BUFSZ]; |
|
|
|
|
for( size_t pos = 0; pos < sz1; ) |
|
|
|
|
{ |
|
|
|
|
size_t r1 = fread(buf1, 1, BUFSZ, fs1); |
|
|
|
|
size_t r2 = fread(buf2, 1, BUFSZ, fs2); |
|
|
|
|
if( r1 != r2 || memcmp(buf1, buf2, r1) != 0 ) |
|
|
|
|
{ |
|
|
|
|
ts->printf( cvtest::TS::LOG, "first and second saved files differ in %n-line; first %n line: %s; second %n-line: %s", |
|
|
|
|
lineIdx, lineIdx, s1.c_str(), lineIdx, s2.c_str() ); |
|
|
|
|
ts->printf( cvtest::TS::LOG, |
|
|
|
|
"in test case %d first (%s) and second (%s) saved files differ in %d-th kb\n", |
|
|
|
|
testCaseIdx, fname1.c_str(), fname2.c_str(), |
|
|
|
|
(int)pos ); |
|
|
|
|
code = cvtest::TS::FAIL_INVALID_OUTPUT; |
|
|
|
|
break; |
|
|
|
|
} |
|
|
|
|
pos += r1; |
|
|
|
|
} |
|
|
|
|
if( !f1.eof() || !f2.eof() ) |
|
|
|
|
{ |
|
|
|
|
ts->printf( cvtest::TS::LOG, "in test case %d first and second saved files differ in %n-line; first %n line: %s; second %n-line: %s", |
|
|
|
|
testCaseIdx, lineIdx, lineIdx, s1.c_str(), lineIdx, s2.c_str() ); |
|
|
|
|
code = cvtest::TS::FAIL_INVALID_OUTPUT; |
|
|
|
|
} |
|
|
|
|
f1.close(); |
|
|
|
|
f2.close(); |
|
|
|
|
|
|
|
|
|
if(fs1) |
|
|
|
|
fclose(fs1); |
|
|
|
|
if(fs2) |
|
|
|
|
fclose(fs2); |
|
|
|
|
|
|
|
|
|
// delete temporary files
|
|
|
|
|
if( code >= 0 ) |
|
|
|
|
{ |
|
|
|
|
remove( fname1.c_str() ); |
|
|
|
|
remove( fname2.c_str() ); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
// 2. compare responses
|
|
|
|
|
CV_Assert( test_resps1.size() == test_resps2.size() ); |
|
|
|
@ -133,4 +154,32 @@ TEST(ML_Boost, save_load) { CV_SLMLTest test( CV_BOOST ); test.safe_run(); } |
|
|
|
|
TEST(ML_RTrees, save_load) { CV_SLMLTest test( CV_RTREES ); test.safe_run(); } |
|
|
|
|
TEST(ML_ERTrees, save_load) { CV_SLMLTest test( CV_ERTREES ); test.safe_run(); } |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
TEST(DISABLED_ML_SVM, linear_save_load) |
|
|
|
|
{ |
|
|
|
|
CvSVM svm1, svm2, svm3; |
|
|
|
|
svm1.load("SVM45_X_38-1.xml"); |
|
|
|
|
svm2.load("SVM45_X_38-2.xml"); |
|
|
|
|
string tname = tempfile("a.xml"); |
|
|
|
|
svm2.save(tname.c_str()); |
|
|
|
|
svm3.load(tname.c_str()); |
|
|
|
|
|
|
|
|
|
ASSERT_EQ(svm1.get_var_count(), svm2.get_var_count()); |
|
|
|
|
ASSERT_EQ(svm1.get_var_count(), svm3.get_var_count()); |
|
|
|
|
|
|
|
|
|
int m = 10000, n = svm1.get_var_count(); |
|
|
|
|
Mat samples(m, n, CV_32F), r1, r2, r3; |
|
|
|
|
randu(samples, 0., 1.); |
|
|
|
|
|
|
|
|
|
svm1.predict(samples, r1); |
|
|
|
|
svm2.predict(samples, r2); |
|
|
|
|
svm3.predict(samples, r3); |
|
|
|
|
|
|
|
|
|
double eps = 1e-4; |
|
|
|
|
EXPECT_LE(norm(r1, r2, NORM_INF), eps); |
|
|
|
|
EXPECT_LE(norm(r1, r3, NORM_INF), eps); |
|
|
|
|
|
|
|
|
|
remove(tname.c_str()); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
/* End of file. */ |
|
|
|
|