// Copyright (C) 2010 Davis E. King (davis@dlib.net) // License: Boost Software License See LICENSE.txt for the full license. #include #include #include #include #include #include #include "tester.h" namespace { using namespace test; using namespace dlib; using namespace std; logger dlog("test.statistics"); class statistics_tester : public tester { public: statistics_tester ( ) : tester ("test_statistics", "Runs tests on the statistics component.") {} void test_random_subset_selector () { random_subset_selector rand_set; for (int j = 0; j < 30; ++j) { print_spinner(); running_stats rs, rs2; rand_set.set_max_size(1000); for (double i = 0; i < 100000; ++i) { rs.add(i); rand_set.add(i); } for (unsigned long i = 0; i < rand_set.size(); ++i) rs2.add(rand_set[i]); dlog << LDEBUG << "true mean: " << rs.mean(); dlog << LDEBUG << "true sampled: " << rs2.mean(); double ratio = rs.mean()/rs2.mean(); DLIB_TEST_MSG(0.96 < ratio && ratio < 1.04, " ratio: " << ratio); } } void test_random_subset_selector2 () { random_subset_selector rand_set; DLIB_TEST(rand_set.next_add_accepts() == false); DLIB_TEST(rand_set.size() == 0); DLIB_TEST(rand_set.max_size() == 0); for (int j = 0; j < 30; ++j) { print_spinner(); running_stats rs, rs2; rand_set.set_max_size(1000); DLIB_TEST(rand_set.next_add_accepts() == true); for (double i = 0; i < 100000; ++i) { rs.add(i); if (rand_set.next_add_accepts()) rand_set.add(i); else rand_set.add(); } DLIB_TEST(rand_set.size() == 1000); DLIB_TEST(rand_set.max_size() == 1000); for (unsigned long i = 0; i < rand_set.size(); ++i) rs2.add(rand_set[i]); dlog << LDEBUG << "true mean: " << rs.mean(); dlog << LDEBUG << "true sampled: " << rs2.mean(); double ratio = rs.mean()/rs2.mean(); DLIB_TEST_MSG(0.96 < ratio && ratio < 1.04, " ratio: " << ratio); } } void test_running_covariance ( ) { dlib::rand::float_1a rnd; std::vector > vects; running_covariance > cov, cov2; DLIB_TEST(cov.in_vector_size() == 0); for (unsigned long dims = 1; dims < 5; ++dims) { for (unsigned long samps = 2; samps < 10; ++samps) { vects.clear(); cov.clear(); DLIB_TEST(cov.in_vector_size() == 0); for (unsigned long i = 0; i < samps; ++i) { vects.push_back(randm(dims,1,rnd)); cov.add(vects.back()); } DLIB_TEST(cov.in_vector_size() == dims); DLIB_TEST(equal(mean(vector_to_matrix(vects)), cov.mean())); DLIB_TEST_MSG(equal(covariance(vector_to_matrix(vects)), cov.covariance()), max(abs(covariance(vector_to_matrix(vects)) - cov.covariance())) << " dims = " << dims << " samps = " << samps ); } } for (unsigned long dims = 1; dims < 5; ++dims) { for (unsigned long samps = 2; samps < 10; ++samps) { vects.clear(); cov.clear(); cov2.clear(); DLIB_TEST(cov.in_vector_size() == 0); for (unsigned long i = 0; i < samps; ++i) { vects.push_back(randm(dims,1,rnd)); if ((i%2) == 0) cov.add(vects.back()); else cov2.add(vects.back()); } DLIB_TEST((cov+cov2).in_vector_size() == dims); DLIB_TEST(equal(mean(vector_to_matrix(vects)), (cov+cov2).mean())); DLIB_TEST_MSG(equal(covariance(vector_to_matrix(vects)), (cov+cov2).covariance()), max(abs(covariance(vector_to_matrix(vects)) - (cov+cov2).covariance())) << " dims = " << dims << " samps = " << samps ); } } } void perform_test ( ) { test_random_subset_selector(); test_random_subset_selector2(); test_running_covariance(); } } a; }