TestFastHIK.cpp 23 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812
  1. #ifdef NICE_USELIB_CPPUNIT
  2. #include <string>
  3. #include <exception>
  4. #include <core/algebra/ILSConjugateGradients.h>
  5. #include <core/algebra/GMStandard.h>
  6. #include <core/basics/Timer.h>
  7. #include <gp-hik-core/tools.h>
  8. #include <gp-hik-core/kernels/IntersectionKernelFunction.h>
  9. #include <gp-hik-core/kernels/GeneralizedIntersectionKernelFunction.h>
  10. #include <gp-hik-core/parameterizedFunctions/ParameterizedFunction.h>
  11. #include <gp-hik-core/parameterizedFunctions/PFAbsExp.h>
  12. #include "TestFastHIK.h"
  13. const bool b_debug = false;
  14. const bool verbose = false;
  15. const bool verboseStartEnd = true;
  16. const bool solveLinWithoutRand = false;
  17. const uint n = 30;//1500;//1500;//10;
  18. const uint d = 5;//200;//2;
  19. const uint numBins = 11;//1001;//1001;
  20. const uint solveLinMaxIterations = 1000;
  21. const double sparse_prob = 0.6;
  22. const bool smallTest = false;
  23. bool compareVVector(const NICE::VVector & A, const NICE::VVector & B, const double & tolerance = 10e-8)
  24. {
  25. bool result(true);
  26. // std::cerr << "A.size(): " << A.size() << " B.size(): " << B.size() << std::endl;
  27. NICE::VVector::const_iterator itA = A.begin();
  28. NICE::VVector::const_iterator itB = B.begin();
  29. while ( (itA != A.end()) && ( itB != B.end()) )
  30. {
  31. if (itA->size() != itB->size())
  32. {
  33. result = false;
  34. break;
  35. }
  36. for(uint i = 0; (i < itA->size()) && (i < itB->size()); i++)
  37. {
  38. if (fabs((*itA)[i] - (*itB)[i]) > tolerance)
  39. {
  40. result = false;
  41. break;
  42. }
  43. }
  44. if (result == false)
  45. break;
  46. itA++;
  47. itB++;
  48. }
  49. return result;
  50. }
  51. bool compareLUTs(const double* LUT1, const double* LUT2, const int & size, const double & tolerance = 10e-8)
  52. {
  53. bool result = true;
  54. for (int i = 0; i < size; i++)
  55. {
  56. if ( fabs(LUT1[i] - LUT2[i]) > tolerance)
  57. {
  58. result = false;
  59. std::cerr << "problem in : " << i << " / " << size << " LUT1: " << LUT1[i] << " LUT2: " << LUT2[i] << std::endl;
  60. break;
  61. }
  62. }
  63. return result;
  64. }
  65. using namespace NICE;
  66. using namespace std;
  67. CPPUNIT_TEST_SUITE_REGISTRATION( TestFastHIK );
  68. void TestFastHIK::setUp() {
  69. }
  70. void TestFastHIK::tearDown() {
  71. }
  72. void TestFastHIK::testKernelMultiplication()
  73. {
  74. if (verboseStartEnd)
  75. std::cerr << "================== TestFastHIK::testKernelMultiplication ===================== " << std::endl;
  76. vector< vector<double> > dataMatrix;
  77. generateRandomFeatures ( d, n, dataMatrix );
  78. int nrZeros(0);
  79. for ( uint i = 0 ; i < d; i++ )
  80. {
  81. for ( uint k = 0; k < n; k++ )
  82. if ( drand48() < sparse_prob )
  83. {
  84. dataMatrix[i][k] = 0.0;
  85. nrZeros++;
  86. }
  87. }
  88. if ( verbose ) {
  89. cerr << "data matrix: " << endl;
  90. printMatrix ( dataMatrix );
  91. cerr << endl;
  92. }
  93. double noise = 1.0;
  94. FastMinKernel fmk ( dataMatrix, noise );
  95. if ( (n*d)>0)
  96. {
  97. CPPUNIT_ASSERT_DOUBLES_EQUAL(fmk.getSparsityRatio(), (double)nrZeros/(double)(n*d), 1e-8);
  98. if (verbose)
  99. std::cerr << "fmk.getSparsityRatio(): " << fmk.getSparsityRatio() << " (double)nrZeros/(double)(n*d): " << (double)nrZeros/(double)(n*d) << std::endl;
  100. }
  101. GMHIKernel gmk ( &fmk );
  102. if (verbose)
  103. gmk.setVerbose(true); //we want to see the size of size(A)+size(B) for non-sparse vs sparse solution
  104. else
  105. gmk.setVerbose(false); //we don't want to see the size of size(A)+size(B) for non-sparse vs sparse solution
  106. Vector y ( n );
  107. for ( uint i = 0; i < y.size(); i++ )
  108. y[i] = sin(i);
  109. Vector alpha;
  110. gmk.multiply ( alpha, y );
  111. NICE::IntersectionKernelFunction<double> hikSlow;
  112. // tic
  113. time_t slow_start = clock();
  114. std::vector<std::vector<double> > dataMatrix_transposed (dataMatrix);
  115. transposeVectorOfVectors(dataMatrix_transposed);
  116. NICE::Matrix K (hikSlow.computeKernelMatrix(dataMatrix_transposed, noise));
  117. //toc
  118. float time_slowComputation = (float) (clock() - slow_start);
  119. if (verbose)
  120. std::cerr << "Time for computing the kernel matrix without using sparsity: " << time_slowComputation/CLOCKS_PER_SEC << " s" << std::endl;
  121. // tic
  122. time_t slow_sparse_start = clock();
  123. NICE::Matrix KSparseCalculated (hikSlow.computeKernelMatrix(fmk.featureMatrix(), noise));
  124. //toc
  125. float time_slowComputation_usingSparsity = (float) (clock() - slow_sparse_start);
  126. if (verbose)
  127. std::cerr << "Time for computing the kernel matrix using sparsity: " << time_slowComputation_usingSparsity/CLOCKS_PER_SEC << " s" << std::endl;
  128. if ( verbose )
  129. cerr << "K = " << K << endl;
  130. // check the trace calculation
  131. //CPPUNIT_ASSERT_DOUBLES_EQUAL( K.trace(), fmk.featureMatrix().hikTrace() + noise*n, 1e-12 );
  132. CPPUNIT_ASSERT_DOUBLES_EQUAL( K.trace(), fmk.featureMatrix().hikTrace() + noise*n, 1e-8 );
  133. // let us compute the kernel multiplication with the slow version
  134. Vector alpha_slow = K*y;
  135. if (verbose)
  136. std::cerr << "Sparse multiplication [alpha, alpha_slow]: " << std::endl << alpha << std::endl << alpha_slow << std::endl << std::endl;
  137. CPPUNIT_ASSERT_DOUBLES_EQUAL((alpha-alpha_slow).normL1(), 0.0, 1e-8);
  138. // test the case, where we first transform and then use the multiply stuff
  139. NICE::GeneralizedIntersectionKernelFunction<double> ghikSlow ( 1.2 );
  140. NICE::Matrix gK ( ghikSlow.computeKernelMatrix(dataMatrix_transposed, noise) );
  141. ParameterizedFunction *pf = new PFAbsExp( 1.2 );
  142. fmk.applyFunctionToFeatureMatrix( pf );
  143. // pf->applyFunctionToFeatureMatrix ( fmk.featureMatrix() );
  144. Vector galpha;
  145. gmk.multiply ( galpha, y );
  146. Vector galpha_slow = gK * y;
  147. CPPUNIT_ASSERT_DOUBLES_EQUAL((galpha-galpha_slow).normL1(), 0.0, 1e-8);
  148. if (verboseStartEnd)
  149. std::cerr << "================== TestFastHIK::testKernelMultiplication done ===================== " << std::endl;
  150. }
  151. void TestFastHIK::testKernelMultiplicationFast()
  152. {
  153. if (verboseStartEnd)
  154. std::cerr << "================== TestFastHIK::testKernelMultiplicationFast ===================== " << std::endl;
  155. Quantization q_gen ( numBins );
  156. Quantization q ( 2*numBins -1);
  157. // data is generated, such that there is no approximation error
  158. vector< vector<double> > dataMatrix;
  159. for ( uint i = 0; i < d ; i++ )
  160. {
  161. vector<double> v;
  162. v.resize(n);
  163. for ( uint k = 0; k < n; k++ ) {
  164. if ( drand48() < sparse_prob ) {
  165. v[k] = 0;
  166. } else {
  167. v[k] = q_gen.getPrototype( (rand() % numBins) );
  168. }
  169. }
  170. dataMatrix.push_back(v);
  171. }
  172. if ( verbose ) {
  173. cerr << "data matrix: " << endl;
  174. printMatrix ( dataMatrix );
  175. cerr << endl;
  176. }
  177. double noise = 1.0;
  178. FastMinKernel fmk ( dataMatrix, noise );
  179. GMHIKernel gmk ( &fmk );
  180. if (verbose)
  181. gmk.setVerbose(true); //we want to see the size of size(A)+size(B) for non-sparse vs sparse solution
  182. else
  183. gmk.setVerbose(false); //we don't want to see the size of size(A)+size(B) for non-sparse vs sparse solution
  184. Vector y ( n );
  185. for ( uint i = 0; i < y.size(); i++ )
  186. y[i] = sin(i);
  187. ParameterizedFunction *pf = new PFAbsExp ( 1.0 );
  188. GMHIKernel gmkFast ( &fmk, pf, &q );
  189. // pf.applyFunctionToFeatureMatrix ( fmk.featureMatrix() );
  190. Vector alpha;
  191. gmk.multiply ( alpha, y );
  192. Vector alphaFast;
  193. gmkFast.multiply ( alphaFast, y );
  194. NICE::IntersectionKernelFunction<double> hikSlow;
  195. std::vector<std::vector<double> > dataMatrix_transposed (dataMatrix);
  196. transposeVectorOfVectors(dataMatrix_transposed);
  197. NICE::Matrix K (hikSlow.computeKernelMatrix(dataMatrix_transposed, noise));
  198. if ( verbose )
  199. cerr << "K = " << K << endl;
  200. // check the trace calculation
  201. //CPPUNIT_ASSERT_DOUBLES_EQUAL( K.trace(), fmk.featureMatrix().hikTrace() + noise*n, 1e-12 );
  202. CPPUNIT_ASSERT_DOUBLES_EQUAL( K.trace(), fmk.featureMatrix().hikTrace() + noise*n, 1e-8 );
  203. // let us compute the kernel multiplication with the slow version
  204. Vector alpha_slow = K*y;
  205. if ( verbose )
  206. std::cerr << "Sparse multiplication [alpha, alphaFast, alpha_slow]: " << std::endl << alpha << std::endl << alphaFast << std::endl << alpha_slow << std::endl << std::endl;
  207. CPPUNIT_ASSERT_DOUBLES_EQUAL(0.0, (alphaFast-alpha_slow).normL1(), 1e-8);
  208. // test the case, where we first transform and then use the multiply stuff
  209. NICE::GeneralizedIntersectionKernelFunction<double> ghikSlow ( 1.2 );
  210. NICE::Matrix gK ( ghikSlow.computeKernelMatrix(dataMatrix_transposed, noise) );
  211. pf->parameters()[0] = 1.2;
  212. fmk.applyFunctionToFeatureMatrix( pf );
  213. // pf->applyFunctionToFeatureMatrix ( fmk.featureMatrix() );
  214. Vector galphaFast;
  215. gmkFast.multiply ( galphaFast, y );
  216. Vector galpha;
  217. gmk.multiply ( galpha, y );
  218. Vector galpha_slow = gK * y;
  219. if (verbose)
  220. std::cerr << "Sparse multiplication [galpha, galphaFast, galpha_slow]: " << std::endl << galpha << std::endl << galphaFast << std::endl << galpha_slow << std::endl << std::endl;
  221. CPPUNIT_ASSERT_DOUBLES_EQUAL((galphaFast-galpha_slow).normL1(), 0.0, 1e-8);
  222. if (verboseStartEnd)
  223. std::cerr << "================== TestFastHIK::testKernelMultiplicationFast done ===================== " << std::endl;
  224. }
  225. void TestFastHIK::testKernelSum()
  226. {
  227. if (verboseStartEnd)
  228. std::cerr << "================== TestFastHIK::testKernelSum ===================== " << std::endl;
  229. vector< vector<double> > dataMatrix;
  230. generateRandomFeatures ( d, n, dataMatrix );
  231. int nrZeros(0);
  232. for ( uint i = 0 ; i < d; i++ )
  233. {
  234. for ( uint k = 0; k < n; k++ )
  235. if ( drand48() < sparse_prob )
  236. {
  237. dataMatrix[i][k] = 0.0;
  238. nrZeros++;
  239. }
  240. }
  241. if ( verbose ) {
  242. cerr << "data matrix: " << endl;
  243. printMatrix ( dataMatrix );
  244. cerr << endl;
  245. }
  246. double noise = 1.0;
  247. FastMinKernel fmk ( dataMatrix, noise );
  248. Vector alpha = Vector::UniformRandom( n, 0.0, 1.0, 0 );
  249. NICE::VVector ASparse;
  250. NICE::VVector BSparse;
  251. fmk.hik_prepare_alpha_multiplications ( alpha, ASparse, BSparse );
  252. Vector xstar (d);
  253. for ( uint i = 0 ; i < d ; i++ )
  254. if ( drand48() < sparse_prob ) {
  255. xstar[i] = 0.0;
  256. } else {
  257. xstar[i] = rand();
  258. }
  259. SparseVector xstarSparse ( xstar );
  260. double betaSparse;
  261. fmk.hik_kernel_sum ( ASparse, BSparse, xstarSparse, betaSparse );
  262. if (verbose)
  263. std::cerr << "kernelSumSparse done, now do the thing without exploiting sparsity" << std::endl;
  264. // checking the result
  265. std::vector<std::vector<double> > dataMatrix_transposed (dataMatrix);
  266. transposeVectorOfVectors(dataMatrix_transposed);
  267. NICE::IntersectionKernelFunction<double> hikSlow;
  268. std::vector<double> xstar_stl;
  269. xstar_stl.resize(d);
  270. for ( uint i = 0 ; i < d; i++ )
  271. xstar_stl[i] = xstar[i];
  272. std::vector<double> kstar_stl = hikSlow.computeKernelVector ( dataMatrix_transposed, xstar_stl );
  273. double beta_slow = 0.0;
  274. for ( uint i = 0 ; i < n; i++ )
  275. beta_slow += kstar_stl[i] * alpha[i];
  276. if (verbose)
  277. std::cerr << "difference of beta_slow and betaSparse: " << fabs(beta_slow - betaSparse) << std::endl;
  278. CPPUNIT_ASSERT_DOUBLES_EQUAL(beta_slow, betaSparse, 1e-8);
  279. if (verboseStartEnd)
  280. std::cerr << "================== TestFastHIK::testKernelSum done ===================== " << std::endl;
  281. }
  282. void TestFastHIK::testKernelSumFast()
  283. {
  284. if (verboseStartEnd)
  285. std::cerr << "================== TestFastHIK::testKernelSumFast ===================== " << std::endl;
  286. Quantization q ( numBins );
  287. // data is generated, such that there is no approximation error
  288. vector< vector<double> > dataMatrix;
  289. for ( uint i = 0; i < d ; i++ )
  290. {
  291. vector<double> v;
  292. v.resize(n);
  293. for ( uint k = 0; k < n; k++ ) {
  294. if ( drand48() < sparse_prob ) {
  295. v[k] = 0;
  296. } else {
  297. v[k] = q.getPrototype( (rand() % numBins) );
  298. }
  299. }
  300. dataMatrix.push_back(v);
  301. }
  302. if ( verbose ) {
  303. cerr << "data matrix: " << endl;
  304. printMatrix ( dataMatrix );
  305. cerr << endl;
  306. }
  307. double noise = 1.0;
  308. FastMinKernel fmk ( dataMatrix, noise );
  309. Vector alpha = Vector::UniformRandom( n, 0.0, 1.0, 0 );
  310. if ( verbose )
  311. std::cerr << "alpha = " << alpha << endl;
  312. // generate xstar
  313. Vector xstar (d);
  314. for ( uint i = 0 ; i < d ; i++ )
  315. if ( drand48() < sparse_prob ) {
  316. xstar[i] = 0;
  317. } else {
  318. xstar[i] = q.getPrototype( (rand() % numBins) );
  319. }
  320. // convert to STL vector
  321. vector<double> xstar_stl;
  322. xstar_stl.resize(d);
  323. for ( uint i = 0 ; i < d; i++ )
  324. xstar_stl[i] = xstar[i];
  325. if ( verbose )
  326. cerr << "xstar = " << xstar << endl;
  327. for ( double gamma = 1.0 ; gamma < 2.0; gamma += 0.5 )
  328. {
  329. if (verbose)
  330. std::cerr << "testing hik_kernel_sum_fast with ghik parameter: " << gamma << endl;
  331. PFAbsExp pf ( gamma );
  332. // pf.applyFunctionToFeatureMatrix ( fmk.featureMatrix() );
  333. fmk.applyFunctionToFeatureMatrix( &pf );
  334. NICE::VVector A;
  335. NICE::VVector B;
  336. if (verbose)
  337. std::cerr << "fmk.hik_prepare_alpha_multiplications ( alpha, A, B ) " << std::endl;
  338. fmk.hik_prepare_alpha_multiplications ( alpha, A, B );
  339. if (verbose)
  340. //std::cerr << "double *Tlookup = fmk.hik_prepare_alpha_multiplications_fast( A, B, q )" << std::endl;
  341. std::cerr << "double *Tlookup = fmk.hik_prepare_alpha_multiplications_fast_alltogether( alpha, q, &pf )" << std::endl;
  342. double *TlookupOld = fmk.hik_prepare_alpha_multiplications_fast( A, B, q, &pf );
  343. double *TlookupNew = fmk.hikPrepareLookupTable( alpha, q, &pf );
  344. int maxAcces(numBins*d);
  345. if (verbose)
  346. {
  347. std::cerr << "TlookupOld: " << std::endl;
  348. for (int i = 0; i < maxAcces; i++)
  349. {
  350. std::cerr << TlookupOld[i] << " ";
  351. if ( (i%numBins) == (numBins-1))
  352. std::cerr << std::endl;
  353. }
  354. std::cerr << "TlookupNew: " << std::endl;
  355. for (int i = 0; i < maxAcces; i++)
  356. {
  357. std::cerr << TlookupNew[i] << " ";
  358. if ( (i%numBins) == (numBins-1))
  359. std::cerr << std::endl;
  360. }
  361. }
  362. if (verbose)
  363. std::cerr << "fmk.hik_kernel_sum_fast ( Tlookup, q, xstar, beta_fast )" << std::endl;
  364. double beta_fast;
  365. fmk.hik_kernel_sum_fast ( TlookupNew, q, xstar, beta_fast );
  366. NICE::SparseVector xstar_sparse(xstar);
  367. double beta_fast_sparse;
  368. fmk.hik_kernel_sum_fast ( TlookupNew, q, xstar_sparse, beta_fast_sparse );
  369. double betaSparse;
  370. fmk.hik_kernel_sum ( A, B, xstar_sparse, betaSparse, &pf );
  371. // checking the result
  372. std::vector<std::vector<double> > dataMatrix_transposed (dataMatrix);
  373. transposeVectorOfVectors(dataMatrix_transposed);
  374. NICE::GeneralizedIntersectionKernelFunction<double> hikSlow (gamma);
  375. vector<double> kstar_stl = hikSlow.computeKernelVector ( dataMatrix_transposed, xstar_stl );
  376. double beta_slow = 0.0;
  377. for ( uint i = 0 ; i < n; i++ )
  378. beta_slow += kstar_stl[i] * alpha[i];
  379. if (verbose)
  380. std::cerr << "beta_slow: " << beta_slow << std::endl << "beta_fast: " << beta_fast << std::endl << "beta_fast_sparse: " << beta_fast_sparse << std::endl << "betaSparse: " << betaSparse<< std::endl;
  381. CPPUNIT_ASSERT_DOUBLES_EQUAL(beta_slow, beta_fast_sparse, 1e-8);
  382. delete [] TlookupNew;
  383. delete [] TlookupOld;
  384. }
  385. if (verboseStartEnd)
  386. std::cerr << "================== TestFastHIK::testKernelSumFast done ===================== " << std::endl;
  387. }
  388. void TestFastHIK::testLUTUpdate()
  389. {
  390. if (verboseStartEnd)
  391. std::cerr << "================== TestFastHIK::testLUTUpdate ===================== " << std::endl;
  392. Quantization q ( numBins );
  393. // data is generated, such that there is no approximation error
  394. vector< vector<double> > dataMatrix;
  395. for ( uint i = 0; i < d ; i++ )
  396. {
  397. vector<double> v;
  398. v.resize(n);
  399. for ( uint k = 0; k < n; k++ ) {
  400. if ( drand48() < sparse_prob ) {
  401. v[k] = 0;
  402. } else {
  403. v[k] = q.getPrototype( (rand() % numBins) );
  404. }
  405. }
  406. dataMatrix.push_back(v);
  407. }
  408. if ( verbose ) {
  409. cerr << "data matrix: " << endl;
  410. printMatrix ( dataMatrix );
  411. cerr << endl;
  412. }
  413. double noise = 1.0;
  414. FastMinKernel fmk ( dataMatrix, noise );
  415. ParameterizedFunction *pf = new PFAbsExp ( 1.0 );
  416. Vector alpha ( n );
  417. for ( uint i = 0; i < alpha.size(); i++ )
  418. alpha[i] = sin(i);
  419. if (verbose)
  420. std::cerr << "prepare LUT" << std::endl;
  421. double * T = fmk.hikPrepareLookupTable(alpha, q, pf);
  422. if (verbose)
  423. std::cerr << "preparation done -- printing T" << std::endl;
  424. int maxAcces(numBins*d);
  425. if (verbose)
  426. {
  427. for (int i = 0; i < maxAcces; i++)
  428. {
  429. std::cerr << T[i] << " ";
  430. if ( (i%numBins) == (numBins-1))
  431. std::cerr << std::endl;
  432. }
  433. }
  434. //lets change index 2
  435. int idx(2);
  436. double valAlphaOld(alpha[idx]);
  437. double valAlphaNew(1.2); //this value is definitely different from the previous one
  438. Vector alphaNew(alpha);
  439. alphaNew[idx] = valAlphaNew;
  440. double * TNew = fmk.hikPrepareLookupTable(alphaNew, q, pf);
  441. if (verbose)
  442. std::cerr << "calculated the new LUT, no print it: " << std::endl;
  443. if (verbose)
  444. {
  445. for (int i = 0; i < maxAcces; i++)
  446. {
  447. std::cerr << TNew[i] << " ";
  448. if ( (i%numBins) == (numBins-1))
  449. std::cerr << std::endl;
  450. }
  451. }
  452. if (verbose)
  453. std::cerr << "change the old LUT by a new value for alpha_i" << std::endl;
  454. fmk.hikUpdateLookupTable(T, valAlphaNew, valAlphaOld, idx, q, pf );
  455. if (verbose)
  456. std::cerr << "update is done, now print the updated version: " << std::endl;
  457. if (verbose)
  458. {
  459. for (int i = 0; i < maxAcces; i++)
  460. {
  461. std::cerr << T[i] << " ";
  462. if ( (i%numBins) == (numBins-1))
  463. std::cerr << std::endl;
  464. }
  465. }
  466. bool equal = compareLUTs(T, TNew, q.size()*d, 10e-8);
  467. if (verbose)
  468. {
  469. if (equal)
  470. std::cerr << "LUTs are equal :) " << std::endl;
  471. else
  472. {
  473. std::cerr << "T are not equal :( " << std::endl;
  474. for (uint i = 0; i < q.size()*d; i++)
  475. {
  476. if ( (i % q.size()) == 0)
  477. std::cerr << std::endl;
  478. std::cerr << T[i] << " ";
  479. }
  480. std::cerr << "TNew: "<< std::endl;
  481. for (uint i = 0; i < q.size()*d; i++)
  482. {
  483. if ( (i % q.size()) == 0)
  484. std::cerr << std::endl;
  485. std::cerr << TNew[i] << " ";
  486. }
  487. }
  488. }
  489. CPPUNIT_ASSERT(equal == true);
  490. if (verboseStartEnd)
  491. std::cerr << "================== TestFastHIK::testLUTUpdate done ===================== " << std::endl;
  492. delete [] T;
  493. delete [] TNew;
  494. }
  495. void TestFastHIK::testLinSolve()
  496. {
  497. if (verboseStartEnd)
  498. std::cerr << "================== TestFastHIK::testLinSolve ===================== " << std::endl;
  499. NICE::Quantization q ( numBins );
  500. // data is generated, such that there is no approximation error
  501. std::vector< std::vector<double> > dataMatrix;
  502. for ( uint i = 0; i < d ; i++ )
  503. {
  504. std::vector<double> v;
  505. v.resize(n);
  506. for ( uint k = 0; k < n; k++ ) {
  507. if ( drand48() < sparse_prob ) {
  508. v[k] = 0;
  509. } else {
  510. v[k] = q.getPrototype( (rand() % numBins) );
  511. }
  512. }
  513. dataMatrix.push_back(v);
  514. }
  515. if ( verbose ) {
  516. std::cerr << "data matrix: " << std::endl;
  517. printMatrix ( dataMatrix );
  518. std::cerr << std::endl;
  519. }
  520. double noise = 1.0;
  521. NICE::FastMinKernel fmk ( dataMatrix, noise );
  522. NICE::ParameterizedFunction *pf = new NICE::PFAbsExp ( 1.0 );
  523. fmk.applyFunctionToFeatureMatrix( pf );
  524. NICE::Vector y ( n );
  525. for ( uint i = 0; i < y.size(); i++ )
  526. y[i] = sin(i);
  527. NICE::Vector alpha;
  528. NICE::Vector alphaRandomized;
  529. if ( verbose )
  530. std::cerr << "solveLin with randomization" << std::endl;
  531. // tic
  532. NICE::Timer t;
  533. t.start();
  534. //let's try to do 10.000 iterations and sample in each iteration 30 examples randomly
  535. fmk.solveLin(y,alphaRandomized,q,pf,true,solveLinMaxIterations,30);
  536. //toc
  537. t.stop();
  538. float time_randomizedSolving = t.getLast();
  539. if ( verbose )
  540. std::cerr << "Time for solving with random subsets: " << time_randomizedSolving << " s" << std::endl;
  541. // test the case, where we first transform and then use the multiply stuff
  542. std::vector<std::vector<double> > dataMatrix_transposed (dataMatrix);
  543. transposeVectorOfVectors(dataMatrix_transposed);
  544. NICE::GeneralizedIntersectionKernelFunction<double> ghikSlow ( 1.0 );
  545. NICE::Matrix gK ( ghikSlow.computeKernelMatrix(dataMatrix_transposed, noise) );
  546. Vector K_alphaRandomized;
  547. K_alphaRandomized.multiply(gK, alphaRandomized);
  548. if (solveLinWithoutRand)
  549. {
  550. if ( verbose )
  551. std::cerr << "solveLin without randomization" << std::endl;
  552. fmk.solveLin(y,alpha,q,pf,false,1000);
  553. Vector K_alpha;
  554. K_alpha.multiply(gK, alpha);
  555. if ( verbose )
  556. {
  557. std::cerr << "now assert that K_alpha == y" << std::endl;
  558. std::cerr << "(K_alpha-y).normL1(): " << (K_alpha-y).normL1() << std::endl;
  559. }
  560. }
  561. // std::cerr << "alpha: " << alpha << std::endl;
  562. // std::cerr << "K_times_alpha: " << K_alpha << std::endl;
  563. // std::cerr << "y: " << y << std::endl;
  564. //
  565. // Vector test_alpha;
  566. // ILSConjugateGradients cgm;
  567. // cgm.solveLin( GMStandard(gK),y,test_alpha);
  568. //
  569. // K_alpha.multiply( gK, test_alpha);
  570. //
  571. // std::cerr << "test_alpha (CGM): " << test_alpha << std::endl;
  572. // std::cerr << "K_times_alpha (CGM): " << K_alpha << std::endl;
  573. if ( verbose )
  574. {
  575. std::cerr << "now assert that K_alphaRandomized == y" << std::endl;
  576. std::cerr << "(K_alphaRandomized-y).normL1(): " << (K_alphaRandomized-y).normL1() << std::endl;
  577. }
  578. // CPPUNIT_ASSERT_DOUBLES_EQUAL((K_alphaRandomized-y).normL1(), 0.0, 1e-6);
  579. if (verboseStartEnd)
  580. std::cerr << "================== TestFastHIK::testLinSolve done ===================== " << std::endl;
  581. }
  582. void TestFastHIK::testKernelVector()
  583. {
  584. if (verboseStartEnd)
  585. std::cerr << "================== TestFastHIK::testKernelVector ===================== " << std::endl;
  586. std::vector< std::vector<double> > dataMatrix;
  587. std::vector<double> dim1; dim1.push_back(0.2);dim1.push_back(0.1);dim1.push_back(0.0);dim1.push_back(0.0);dim1.push_back(0.4); dataMatrix.push_back(dim1);
  588. std::vector<double> dim2; dim2.push_back(0.3);dim2.push_back(0.6);dim2.push_back(1.0);dim2.push_back(0.4);dim2.push_back(0.3); dataMatrix.push_back(dim2);
  589. std::vector<double> dim3; dim3.push_back(0.5);dim3.push_back(0.3);dim3.push_back(0.0);dim3.push_back(0.6);dim3.push_back(0.3); dataMatrix.push_back(dim3);
  590. if ( verbose ) {
  591. std::cerr << "data matrix: " << std::endl;
  592. printMatrix ( dataMatrix );
  593. std::cerr << endl;
  594. }
  595. double noise = 1.0;
  596. FastMinKernel fmk ( dataMatrix, noise, b_debug );
  597. std::vector<double> xStar; xStar.push_back(0.2);xStar.push_back(0.7);xStar.push_back(0.1);
  598. NICE::Vector xStarVec (xStar);
  599. std::vector<double> x2; x2.push_back(0.7);x2.push_back(0.3);xStar.push_back(0.0);
  600. NICE::Vector x2Vec (x2);
  601. NICE::SparseVector xStarsparse( xStarVec );
  602. NICE::SparseVector x2sparse( x2Vec );
  603. if ( b_debug )
  604. {
  605. fmk.store ( std::cerr );
  606. xStarsparse.store ( std::cerr );
  607. }
  608. NICE::Vector k1;
  609. fmk.hikComputeKernelVector( xStarsparse, k1 );
  610. NICE::Vector k2;
  611. fmk.hikComputeKernelVector( x2sparse, k2 );
  612. NICE::Vector k1GT(5); k1GT[0] = 0.6; k1GT[1] = 0.8; k1GT[2] = 0.7; k1GT[3] = 0.5; k1GT[4] = 0.6;
  613. NICE::Vector k2GT(5); k2GT[0] = 0.5; k2GT[1] = 0.4; k2GT[2] = 0.3; k2GT[3] = 0.3; k2GT[4] = 0.7;
  614. if (verbose)
  615. {
  616. std::cerr << "k1: " << k1 << std::endl;
  617. std::cerr << "GT: " << k1GT << std::endl;
  618. std::cerr << "k2: " << k2 << std::endl;
  619. std::cerr << "GT: " << k2GT << std::endl;
  620. }
  621. for (int i = 0; i < 5; i++)
  622. {
  623. CPPUNIT_ASSERT_DOUBLES_EQUAL(k1[i]-k1GT[i], 0.0, 1e-6);
  624. CPPUNIT_ASSERT_DOUBLES_EQUAL(k2[i]-k2GT[i], 0.0, 1e-6);
  625. }
  626. if (verboseStartEnd)
  627. std::cerr << "================== TestFastHIK::testKernelVector done ===================== " << std::endl;
  628. }
  629. #endif