upgrade opencv to 3.3.1, complete patch similarity
[trackerpp.git] / test / TestHungarian.cpp
1 #include "hungarian.h"
2 #include "gtest/gtest.h"
3 #include <cmath>
4 #include <vector>
5
6 using namespace std;
7 using namespace Eigen;
8
9 TEST(Hungarian, 3x3)
10 {
11     Matrix3i C;
12     C << 1, 2, 3,
13          2, 4, 6,
14          3, 6, 9;
15
16     VectorXi row_ind, col_ind;
17     int ret = linear_sum_assignment(C, row_ind, col_ind);
18     cout << "row: [" << row_ind.transpose() << "], col: [" << col_ind.transpose() << "]" << endl;
19     Vector3i expect_row_ind, expect_col_ind;
20
21     expect_row_ind << 0, 1, 2;
22     expect_col_ind << 2, 1, 0;
23
24     EXPECT_EQ(ret, 10);
25     EXPECT_TRUE(expect_row_ind == row_ind);
26     EXPECT_TRUE(expect_col_ind == col_ind);
27 }
28
29 TEST(Hungarian, 4x3)
30 {
31     MatrixXi C(4, 3);
32
33     C << 4, 1, 3,
34          2, 4, 2,
35          3, 6, 9,
36          2, 6, 3;
37
38     VectorXi row_ind, col_ind;
39     int ret = linear_sum_assignment(C, row_ind, col_ind);
40     Vector3i expect_row_ind, expect_col_ind;
41
42     expect_row_ind << 0, 1, 3;
43     expect_col_ind << 1, 2, 0;
44
45     EXPECT_EQ(ret, 5);
46     EXPECT_TRUE(expect_row_ind == row_ind);
47     EXPECT_TRUE(expect_col_ind == col_ind);
48 }
49
50 TEST(Hungarian, 0x0)
51 {
52     MatrixXi C = MatrixXi::Zero(0, 0);
53     VectorXi row_ind, col_ind;
54     int ret = linear_sum_assignment(C, row_ind, col_ind);
55     EXPECT_EQ(ret, 0);
56 }
57
58
59 TEST(Distance, consine)
60 {
61     Vector3d u, v;
62     u << 1, 0, 0;
63     v << 0, 1, 0;
64     double d = distance_cosine(u, v);
65     EXPECT_DOUBLE_EQ(d, 1.0);
66
67     u << 100, 0, 0;
68     v << 0, 1, 0;
69     d = distance_cosine(u, v);
70     EXPECT_DOUBLE_EQ(d, 1.0);
71
72     u << 1, 1, 0;
73     v << 0, 1, 0;
74     d = distance_cosine(u, v);
75     EXPECT_TRUE(std::abs(d - 0.2928932) < 0.0001);
76 }
77
78 TEST(Distance, euclidean)
79 {
80     Vector3d u, v;
81     u << 1, 0, 0;
82     v << 0, 1, 0;
83     double d = distance_euclidean(u, v);
84     EXPECT_TRUE(std::abs(d - 1.41421356) < 0.0001);
85
86     u << 1, 1, 0;
87     v << 0, 1, 0;
88     d = distance_euclidean(u, v);
89     EXPECT_DOUBLE_EQ(d, 1.0);
90 }
91
92 TEST(Distance, vector)
93 {
94     std::vector<int> sv = {1, 2, 3, 4, 5, 6};
95     VectorXi v1;
96     VectorXi b = Eigen::Map<VectorXi>(sv.data(), sv.size());
97     std::cout << b << std::endl;
98     std::vector<float> f1_hog = { 0.1, 0.2, 0,3};
99 //                                    Eigen::Map<Eigen::VectorXd>(f2_hog.data(), f2_hog.size())
100
101     //VectorXd mf = Map<VectorXd, 0, InnerStride<2> >(sv.data(), sv.size());
102     std::vector<double> sd = {1, 2, 3, 4, 5, 6};
103     VectorXd mm = Map<VectorXd>(sd.data(), sd.size());
104     VectorXd xd = Map<VectorXd, 0, InnerStride<2> >(sd.data(), sd.size());
105     cout << Map<VectorXd, 0, InnerStride<2> >(sd.data(), sd.size()) << endl;
106
107     int array[12];
108     for(int i = 0; i < 12; ++i) array[i] = i;
109     cout << Map<VectorXi, 0, InnerStride<2> >(sv.data(), sv.size()) // the inner stride has already been passed as template parameter
110                       << endl;
111
112
113     //Vector3d v = Vector3d::Random();
114     //std::cout << v << std::endl;
115
116 }
117
118