1 | // $Id: kernel_lookup_test.cc 559 2006-03-11 22:21:27Z peter $ |
---|
2 | |
---|
3 | #include <c++_tools/gslapi/matrix.h> |
---|
4 | #include <c++_tools/classifier/DataLookup1D.h> |
---|
5 | #include <c++_tools/classifier/KernelLookup.h> |
---|
6 | #include <c++_tools/classifier/Kernel_SEV.h> |
---|
7 | #include <c++_tools/classifier/MatrixLookup.h> |
---|
8 | #include <c++_tools/classifier/PolynomialKernelFunction.h> |
---|
9 | |
---|
10 | |
---|
11 | #include <fstream> |
---|
12 | #include <iostream> |
---|
13 | #include <vector> |
---|
14 | |
---|
15 | using namespace theplu; |
---|
16 | |
---|
17 | int main(const int argc,const char* argv[]) |
---|
18 | { |
---|
19 | using namespace theplu::classifier; |
---|
20 | |
---|
21 | std::ostream* error; |
---|
22 | if (argc>1 && argv[1]==std::string("-v")) |
---|
23 | error = &std::cerr; |
---|
24 | else { |
---|
25 | error = new std::ofstream("/dev/null"); |
---|
26 | if (argc>1) |
---|
27 | std::cout << "lookup_test -v : for printing extra information\n"; |
---|
28 | } |
---|
29 | |
---|
30 | bool ok =true; |
---|
31 | *error << "\nTesting KernelLookup" << std::endl; |
---|
32 | gslapi::matrix data_core(1,5); |
---|
33 | for (size_t i=0; i<data_core.columns(); i++) |
---|
34 | data_core(0,i)=i; |
---|
35 | classifier::MatrixLookup data(data_core); |
---|
36 | classifier::PolynomialKernelFunction kf; |
---|
37 | classifier::Kernel_SEV kernel(data,kf); |
---|
38 | |
---|
39 | *error << "KernelLookup::KernelLookup(const Kernel&)..."; |
---|
40 | classifier::KernelLookup k1(kernel); |
---|
41 | if (k1.rows()!=kernel.rows() || k1.columns()!=kernel.columns()) { |
---|
42 | ok =false; |
---|
43 | *error << "ERROR:" << std::endl; |
---|
44 | *error << "Dimensions do not agree." << std::endl; |
---|
45 | } |
---|
46 | else { |
---|
47 | for (size_t i=0; i<k1.rows(); i++) |
---|
48 | for (size_t j=0; j<k1.columns(); j++) |
---|
49 | if (k1(i,j)!=kernel(i,j)) { |
---|
50 | ok =false; |
---|
51 | *error << "ERROR:\n" |
---|
52 | << "KernelLookup::KernelLookup(const Kernel& data)" |
---|
53 | << std::endl; |
---|
54 | *error << "k(" << i << "," << j << ") is " << k1(i,j) |
---|
55 | << "expected " << kernel(i,j) << std::endl; |
---|
56 | } |
---|
57 | if (ok) |
---|
58 | *error << "Ok." << std::endl; |
---|
59 | } |
---|
60 | |
---|
61 | std::vector<size_t> index_odd; |
---|
62 | index_odd.push_back(1); |
---|
63 | index_odd.push_back(3); |
---|
64 | std::vector<size_t> index_even; |
---|
65 | index_even.push_back(2); |
---|
66 | index_even.push_back(0); |
---|
67 | index_even.push_back(4); |
---|
68 | *error << "KernelLookup::KernelLookup(const Kernel&,\n" |
---|
69 | << " const vector<size_t>&,\n" |
---|
70 | << " const vector<size_t>&)..."; |
---|
71 | classifier::KernelLookup k2(kernel,index_odd,index_even); |
---|
72 | if (k2.rows()!=index_odd.size() || k2.columns()!=index_even.size()) { |
---|
73 | ok =false; |
---|
74 | *error << "ERROR:" << std::endl; |
---|
75 | *error << "Dimensions do not agree." << std::endl; |
---|
76 | } |
---|
77 | for (size_t i=0; i<k2.rows(); i++) |
---|
78 | for (size_t j=0; j<k2.columns(); j++) |
---|
79 | if (k2(i,j)!=kernel(index_odd[i],index_even[j])) { |
---|
80 | ok =false; |
---|
81 | *error << "ERROR:\n" |
---|
82 | << "KernelLookup::KernelLookup(const Kernel& data)" |
---|
83 | << std::endl; |
---|
84 | *error << "k(" << i << "," << j << ") is " << k2(i,j) |
---|
85 | << "expected " << kernel(index_odd[i],index_even[j]) << std::endl; |
---|
86 | } |
---|
87 | if (ok) |
---|
88 | *error << "Ok." << std::endl; |
---|
89 | |
---|
90 | *error << "KernelLookup::KernelLookup(const KernelLookup&,\n" |
---|
91 | << " const vector<size_t>&,\n" |
---|
92 | << " const vector<size_t>&)..."; |
---|
93 | std::vector<size_t> one(1,1); |
---|
94 | classifier::KernelLookup k3(k2,one,one); |
---|
95 | if (k3.rows()!=one.size() || k3.columns()!=one.size()) { |
---|
96 | ok =false; |
---|
97 | *error << "ERROR:" << std::endl; |
---|
98 | *error << "Dimensions do not agree." << std::endl; |
---|
99 | } |
---|
100 | else if (k3(0,0)!=k2(1,1)){ |
---|
101 | ok = false; |
---|
102 | *error << "ERROR:\n k3(0,0) found to be " << k3(0,0) |
---|
103 | << " expected " << k2(1,1) << std::endl; |
---|
104 | } |
---|
105 | else |
---|
106 | *error << "Ok." << std::endl; |
---|
107 | |
---|
108 | *error << "KernelLookup::KernelLookup(const KernelLookup&)..."; |
---|
109 | classifier::KernelLookup k4(k2); |
---|
110 | if (k4.rows()!=k2.rows() || k4.columns()!=k2.columns()) { |
---|
111 | ok =false; |
---|
112 | *error << "ERROR:" << std::endl; |
---|
113 | *error << "Dimensions do not agree." << std::endl; |
---|
114 | *error << "Dimension: rows " << k4.rows() << " columns " << k4.columns() |
---|
115 | << "\nOriginal: rows " << k2.rows() << " columns " << k2.columns() |
---|
116 | << std::endl; |
---|
117 | } |
---|
118 | else { |
---|
119 | for (size_t i=0; i<k4.rows(); i++) |
---|
120 | for (size_t j=0; j<k4.columns(); j++) |
---|
121 | if (k4(i,j)!=k2(i,j)) { |
---|
122 | ok =false; |
---|
123 | *error << "ERROR:\n" |
---|
124 | << "KernelLookup::KernelLookup(const KernelLookup&)" |
---|
125 | << std::endl; |
---|
126 | *error << "k(" << i << "," << j << ") is " << k4(i,j) |
---|
127 | << "expected " << k2(i,j) << std::endl; |
---|
128 | } |
---|
129 | } |
---|
130 | |
---|
131 | KernelLookup k5(k1,index_even,index_even); |
---|
132 | std::vector<size_t> index5; |
---|
133 | index5.push_back(0); |
---|
134 | index5.push_back(2); |
---|
135 | const KernelLookup* k6 = k5.training_data(index5); |
---|
136 | for (size_t s=0; s<k6->rows(); s++) |
---|
137 | for (size_t t=0; t<k6->rows(); t++) |
---|
138 | ok = ok && ((*k6)(s,t)==(*k6)(t,s)); |
---|
139 | |
---|
140 | |
---|
141 | if (ok) |
---|
142 | *error << "Ok." << std::endl; |
---|
143 | |
---|
144 | if (ok) |
---|
145 | *error << "Test Ok." << std::endl; |
---|
146 | if (error!=&std::cerr) |
---|
147 | delete error; |
---|
148 | return (ok ? 0 : -1); |
---|
149 | } |
---|
150 | |
---|