1793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler#include "perf_precomp.hpp"
2793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
3793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslerusing namespace std;
4793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslerusing namespace cv;
5793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslerusing namespace perf;
6793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslerusing std::tr1::make_tuple;
7793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslerusing std::tr1::get;
8793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
9793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslertypedef perf::TestBaseWithParam<size_t> VectorLength;
10793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
11793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslertypedef std::tr1::tuple<int, int> MaxDim_MaxPoints_t;
12793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslertypedef perf::TestBaseWithParam<MaxDim_MaxPoints_t> MaxDim_MaxPoints;
13793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
14793ee12c6df9cad3806238d32528c49a3ff9331dNoah PreslerPERF_TEST_P(VectorLength, phase32f, testing::Values(128, 1000, 128*1024, 512*1024, 1024*1024))
15793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler{
16793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    size_t length = GetParam();
17793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    vector<float> X(length);
18793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    vector<float> Y(length);
19793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    vector<float> angle(length);
20793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
21793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    declare.in(X, Y, WARMUP_RNG).out(angle);
22793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
23793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    TEST_CYCLE_N(200) cv::phase(X, Y, angle, true);
24793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
25793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    SANITY_CHECK(angle, 5e-5);
26793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler}
27793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
28793ee12c6df9cad3806238d32528c49a3ff9331dNoah PreslerPERF_TEST_P( MaxDim_MaxPoints, kmeans,
29793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler             testing::Combine( testing::Values( 16, 32, 64 ),
30793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler                               testing::Values( 300, 400, 500) ) )
31793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler{
32793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    RNG& rng = theRNG();
33793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    const int MAX_DIM = get<0>(GetParam());
34793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    const int MAX_POINTS = get<1>(GetParam());
35793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    const int attempts = 5;
36793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
37793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    Mat labels, centers;
38793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    int i,  N = 0, N0 = 0, K = 0, dims = 0;
39793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    dims = rng.uniform(1, MAX_DIM+1);
40793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    N = rng.uniform(1, MAX_POINTS+1);
41793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    N0 = rng.uniform(1, MAX(N/10, 2));
42793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    K = rng.uniform(1, N+1);
43793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
44793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    Mat data0(N0, dims, CV_32F);
45793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    rng.fill(data0, RNG::UNIFORM, -1, 1);
46793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
47793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    Mat data(N, dims, CV_32F);
48793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    for( i = 0; i < N; i++ )
49793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        data0.row(rng.uniform(0, N0)).copyTo(data.row(i));
50793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
51793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    declare.in(data);
52793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
53793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    TEST_CYCLE()
54793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    {
55793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        kmeans(data, K, labels, TermCriteria(TermCriteria::MAX_ITER+TermCriteria::EPS, 30, 0),
56793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler               attempts, KMEANS_PP_CENTERS, centers);
57793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    }
58793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
59793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    Mat clusterPointsNumber = Mat::zeros(1, K, CV_32S);
60793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
61793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    for( i = 0; i < labels.rows; i++ )
62793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    {
63793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        int clusterIdx = labels.at<int>(i);
64793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler        clusterPointsNumber.at<int>(clusterIdx)++;
65793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    }
66793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
67793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    Mat sortedClusterPointsNumber;
68793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    cv::sort(clusterPointsNumber, sortedClusterPointsNumber, cv::SORT_EVERY_ROW + cv::SORT_ASCENDING);
69793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler
70793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler    SANITY_CHECK(sortedClusterPointsNumber);
71793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler}
72