UnaryTestsF64.cpp 18 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596
  1. #include "UnaryTestsF64.h"
  2. #include "Error.h"
  3. #define SNR_THRESHOLD 120
  4. /*
  5. Reference patterns are generated with
  6. a double precision computation.
  7. */
  8. #define REL_ERROR (1.0e-6)
  9. #define ABS_ERROR (1.0e-5)
  10. /*
  11. Comparison for Cholesky
  12. */
  13. #define SNR_THRESHOLD_CHOL 270
  14. #define REL_ERROR_CHOL (1.0e-9)
  15. #define ABS_ERROR_CHOL (1.0e-9)
  16. /* LDLT comparison */
  17. #define REL_ERROR_LDLT (1e-5)
  18. #define ABS_ERROR_LDLT (1e-5)
  19. /* Upper bound of maximum matrix dimension used by Python */
  20. #define MAXMATRIXDIM 40
  21. #define LOADDATA2() \
  22. const float64_t *inp1=input1.ptr(); \
  23. const float64_t *inp2=input2.ptr(); \
  24. \
  25. float64_t *ap=a.ptr(); \
  26. float64_t *bp=b.ptr(); \
  27. \
  28. float64_t *outp=output.ptr(); \
  29. int16_t *dimsp = dims.ptr(); \
  30. int nbMatrixes = dims.nbSamples() >> 1;\
  31. int rows,columns; \
  32. int i;
  33. #define LOADDATA1() \
  34. const float64_t *inp1=input1.ptr(); \
  35. \
  36. float64_t *ap=a.ptr(); \
  37. \
  38. float64_t *outp=output.ptr(); \
  39. int16_t *dimsp = dims.ptr(); \
  40. int nbMatrixes = dims.nbSamples() >> 1;\
  41. int rows,columns; \
  42. int i;
  43. #define PREPAREDATA2() \
  44. in1.numRows=rows; \
  45. in1.numCols=columns; \
  46. memcpy((void*)ap,(const void*)inp1,sizeof(float64_t)*rows*columns);\
  47. in1.pData = ap; \
  48. \
  49. in2.numRows=rows; \
  50. in2.numCols=columns; \
  51. memcpy((void*)bp,(const void*)inp2,sizeof(float64_t)*rows*columns);\
  52. in2.pData = bp; \
  53. \
  54. out.numRows=rows; \
  55. out.numCols=columns; \
  56. out.pData = outp;
  57. #define PREPAREDATA1(TRANSPOSED) \
  58. in1.numRows=rows; \
  59. in1.numCols=columns; \
  60. memcpy((void*)ap,(const void*)inp1,sizeof(float64_t)*rows*columns);\
  61. in1.pData = ap; \
  62. \
  63. if (TRANSPOSED) \
  64. { \
  65. out.numRows=columns; \
  66. out.numCols=rows; \
  67. } \
  68. else \
  69. { \
  70. out.numRows=rows; \
  71. out.numCols=columns; \
  72. } \
  73. out.pData = outp;
  74. #define PREPAREDATALL1() \
  75. in1.numRows=rows; \
  76. in1.numCols=columns; \
  77. memcpy((void*)ap,(const void*)inp1,sizeof(float64_t)*rows*columns);\
  78. in1.pData = ap; \
  79. \
  80. outll.numRows=rows; \
  81. outll.numCols=columns; \
  82. \
  83. outll.pData = outllp;
  84. #define SWAP_ROWS(A,i,j) \
  85. for(int w=0;w < n; w++) \
  86. { \
  87. float64_t tmp; \
  88. tmp = A[i*n + w]; \
  89. A[i*n + w] = A[j*n + w];\
  90. A[j*n + w] = tmp; \
  91. }
  92. void UnaryTestsF64::test_mat_add_f64()
  93. {
  94. }
  95. void UnaryTestsF64::test_mat_sub_f64()
  96. {
  97. LOADDATA2();
  98. arm_status status;
  99. for(i=0;i < nbMatrixes ; i ++)
  100. {
  101. rows = *dimsp++;
  102. columns = *dimsp++;
  103. PREPAREDATA2();
  104. status=arm_mat_sub_f64(&this->in1,&this->in2,&this->out);
  105. ASSERT_TRUE(status==ARM_MATH_SUCCESS);
  106. outp += (rows * columns);
  107. }
  108. ASSERT_EMPTY_TAIL(output);
  109. ASSERT_SNR(output,ref,(float64_t)SNR_THRESHOLD);
  110. ASSERT_CLOSE_ERROR(output,ref,ABS_ERROR,REL_ERROR);
  111. }
  112. void UnaryTestsF64::test_mat_scale_f64()
  113. {
  114. }
  115. void UnaryTestsF64::test_mat_trans_f64()
  116. {
  117. LOADDATA1();
  118. arm_status status;
  119. for(i=0;i < nbMatrixes ; i ++)
  120. {
  121. rows = *dimsp++;
  122. columns = *dimsp++;
  123. PREPAREDATA1(true);
  124. status=arm_mat_trans_f64(&this->in1,&this->out);
  125. ASSERT_TRUE(status==ARM_MATH_SUCCESS);
  126. outp += (rows * columns);
  127. }
  128. ASSERT_EMPTY_TAIL(output);
  129. ASSERT_SNR(output,ref,(float32_t)SNR_THRESHOLD);
  130. ASSERT_CLOSE_ERROR(output,ref,ABS_ERROR,REL_ERROR);
  131. }
  132. void UnaryTestsF64::test_mat_inverse_f64()
  133. {
  134. const float64_t *inp1=input1.ptr();
  135. float64_t *ap=a.ptr();
  136. float64_t *outp=output.ptr();
  137. int16_t *dimsp = dims.ptr();
  138. int nbMatrixes = dims.nbSamples();
  139. int rows,columns;
  140. int i;
  141. arm_status status;
  142. for(i=0;i < nbMatrixes ; i ++)
  143. {
  144. rows = *dimsp++;
  145. columns = rows;
  146. PREPAREDATA1(false);
  147. status=arm_mat_inverse_f64(&this->in1,&this->out);
  148. ASSERT_TRUE(status==ARM_MATH_SUCCESS);
  149. outp += (rows * columns);
  150. inp1 += (rows * columns);
  151. }
  152. ASSERT_EMPTY_TAIL(output);
  153. ASSERT_SNR(output,ref,(float64_t)SNR_THRESHOLD);
  154. ASSERT_CLOSE_ERROR(output,ref,ABS_ERROR,REL_ERROR);
  155. }
  156. void UnaryTestsF64::test_mat_cholesky_dpo_f64()
  157. {
  158. float64_t *ap=a.ptr();
  159. const float64_t *inp1=input1.ptr();
  160. float64_t *outp=output.ptr();
  161. int16_t *dimsp = dims.ptr();
  162. int nbMatrixes = dims.nbSamples();
  163. int rows,columns;
  164. int i;
  165. arm_status status;
  166. for(i=0;i < nbMatrixes ; i ++)
  167. {
  168. rows = *dimsp++;
  169. columns = rows;
  170. PREPAREDATA1(false);
  171. status=arm_mat_cholesky_f64(&this->in1,&this->out);
  172. ASSERT_TRUE(status==ARM_MATH_SUCCESS);
  173. outp += (rows * columns);
  174. inp1 += (rows * columns);
  175. }
  176. ASSERT_EMPTY_TAIL(output);
  177. ASSERT_SNR(output,ref,(float64_t)SNR_THRESHOLD_CHOL);
  178. ASSERT_CLOSE_ERROR(ref,output,ABS_ERROR_CHOL,REL_ERROR_CHOL);
  179. }
  180. void UnaryTestsF64::test_solve_upper_triangular_f64()
  181. {
  182. float64_t *ap=a.ptr();
  183. const float64_t *inp1=input1.ptr();
  184. float64_t *bp=b.ptr();
  185. const float64_t *inp2=input2.ptr();
  186. float64_t *outp=output.ptr();
  187. int16_t *dimsp = dims.ptr();
  188. int nbMatrixes = dims.nbSamples();
  189. int rows,columns;
  190. int i;
  191. arm_status status;
  192. for(i=0;i < nbMatrixes ; i ++)
  193. {
  194. rows = *dimsp++;
  195. columns = rows;
  196. PREPAREDATA2();
  197. status=arm_mat_solve_upper_triangular_f64(&this->in1,&this->in2,&this->out);
  198. ASSERT_TRUE(status==ARM_MATH_SUCCESS);
  199. outp += (rows * columns);
  200. inp1 += (rows * columns);
  201. inp2 += (rows * columns);
  202. }
  203. ASSERT_EMPTY_TAIL(output);
  204. ASSERT_SNR(output,ref,(float64_t)SNR_THRESHOLD);
  205. ASSERT_CLOSE_ERROR(ref,output,ABS_ERROR,REL_ERROR);
  206. }
  207. void UnaryTestsF64::test_solve_lower_triangular_f64()
  208. {
  209. float64_t *ap=a.ptr();
  210. const float64_t *inp1=input1.ptr();
  211. float64_t *bp=b.ptr();
  212. const float64_t *inp2=input2.ptr();
  213. float64_t *outp=output.ptr();
  214. int16_t *dimsp = dims.ptr();
  215. int nbMatrixes = dims.nbSamples();
  216. int rows,columns;
  217. int i;
  218. arm_status status;
  219. for(i=0;i < nbMatrixes ; i ++)
  220. {
  221. rows = *dimsp++;
  222. columns = rows;
  223. PREPAREDATA2();
  224. status=arm_mat_solve_lower_triangular_f64(&this->in1,&this->in2,&this->out);
  225. ASSERT_TRUE(status==ARM_MATH_SUCCESS);
  226. outp += (rows * columns);
  227. inp1 += (rows * columns);
  228. inp2 += (rows * columns);
  229. }
  230. ASSERT_EMPTY_TAIL(output);
  231. ASSERT_SNR(output,ref,(float64_t)SNR_THRESHOLD);
  232. ASSERT_CLOSE_ERROR(ref,output,ABS_ERROR,REL_ERROR);
  233. }
  234. static void trans_f64(const float64_t *src, float64_t *dst, int n)
  235. {
  236. for(int r=0; r<n ; r++)
  237. {
  238. for(int c=0; c<n ; c++)
  239. {
  240. dst[c*n+r] = src[r*n+c];
  241. }
  242. }
  243. }
  244. static void mult_f64_f64(const float64_t *srcA, const float64_t *srcB, float64_t *dst,int n)
  245. {
  246. for(int r=0; r<n ; r++)
  247. {
  248. for(int c=0; c<n ; c++)
  249. {
  250. float64_t sum=0.0;
  251. for(int k=0; k < n ; k++)
  252. {
  253. sum += srcA[r*n+k] * srcB[k*n+c];
  254. }
  255. dst[r*n+c] = sum;
  256. }
  257. }
  258. }
  259. void UnaryTestsF64::compute_ldlt_error(const int n,const int16_t *outpp)
  260. {
  261. float64_t *tmpa = tmpapat.ptr() ;
  262. float64_t *tmpb = tmpbpat.ptr() ;
  263. float64_t *tmpc = tmpcpat.ptr() ;
  264. /* Compute P A P^t */
  265. // Create identiy matrix
  266. for(int r=0; r < n; r++)
  267. {
  268. for(int c=0; c < n; c++)
  269. {
  270. if (r == c)
  271. {
  272. tmpa[r*n+c] = 1.0;
  273. }
  274. else
  275. {
  276. tmpa[r*n+c] = 0.0;
  277. }
  278. }
  279. }
  280. // Create permutation matrix
  281. for(int r=0;r < n; r++)
  282. {
  283. SWAP_ROWS(tmpa,r,outpp[r]);
  284. }
  285. trans_f64((const float64_t*)tmpa,tmpb,n);
  286. mult_f64_f64((const float64_t*)this->in1.pData,(const float64_t*)tmpb,tmpc,n);
  287. mult_f64_f64((const float64_t*)tmpa,(const float64_t*)tmpc,outa,n);
  288. /* Compute L D L^t */
  289. trans_f64((const float64_t*)this->outll.pData,tmpc,n);
  290. mult_f64_f64((const float64_t*)this->outd.pData,(const float64_t*)tmpc,tmpa,n);
  291. mult_f64_f64((const float64_t*)this->outll.pData,(const float64_t*)tmpa,outb,n);
  292. }
  293. void UnaryTestsF64::test_mat_ldl_f64()
  294. {
  295. float64_t *ap=a.ptr();
  296. const float64_t *inp1=input1.ptr();
  297. float64_t *outllp=outputll.ptr();
  298. float64_t *outdp=outputd.ptr();
  299. int16_t *outpp=outputp.ptr();
  300. outa=outputa.ptr();
  301. outb=outputb.ptr();
  302. int16_t *dimsp = dims.ptr();
  303. int nbMatrixes = dims.nbSamples();
  304. int rows,columns;
  305. int i;
  306. arm_status status;
  307. int nb=0;
  308. for(i=0;i < nbMatrixes ; i ++)
  309. {
  310. rows = *dimsp++;
  311. columns = rows;
  312. PREPAREDATALL1();
  313. outd.numRows=rows;
  314. outd.numCols=columns;
  315. outd.pData=outdp;
  316. memset(outpp,0,rows*sizeof(uint16_t));
  317. memset(outdp,0,columns*rows*sizeof(float64_t));
  318. status=arm_mat_ldlt_f64(&this->in1,&this->outll,&this->outd,(uint16_t*)outpp);
  319. ASSERT_TRUE(status==ARM_MATH_SUCCESS);
  320. compute_ldlt_error(rows,outpp);
  321. outllp += (rows * columns);
  322. outdp += (rows * columns);
  323. outpp += rows;
  324. outa += (rows * columns);
  325. outb +=(rows * columns);
  326. inp1 += (rows * columns);
  327. nb += (rows * columns);
  328. }
  329. ASSERT_EMPTY_TAIL(outputll);
  330. ASSERT_EMPTY_TAIL(outputd);
  331. ASSERT_EMPTY_TAIL(outputp);
  332. ASSERT_EMPTY_TAIL(outputa);
  333. ASSERT_EMPTY_TAIL(outputb);
  334. ASSERT_CLOSE_ERROR(outputa,outputb,ABS_ERROR_LDLT,REL_ERROR_LDLT);
  335. }
  336. void UnaryTestsF64::setUp(Testing::testID_t id,std::vector<Testing::param_t>& params,Client::PatternMgr *mgr)
  337. {
  338. (void)params;
  339. switch(id)
  340. {
  341. case TEST_MAT_SUB_F64_2:
  342. input1.reload(UnaryTestsF64::INPUTS1_F64_ID,mgr);
  343. input2.reload(UnaryTestsF64::INPUTS2_F64_ID,mgr);
  344. dims.reload(UnaryTestsF64::DIMSUNARY1_S16_ID,mgr);
  345. ref.reload(UnaryTestsF64::REFSUB1_F64_ID,mgr);
  346. output.create(ref.nbSamples(),UnaryTestsF64::OUT_F64_ID,mgr);
  347. a.create(MAXMATRIXDIM*MAXMATRIXDIM,UnaryTestsF64::TMPA_F64_ID,mgr);
  348. b.create(MAXMATRIXDIM*MAXMATRIXDIM,UnaryTestsF64::TMPB_F64_ID,mgr);
  349. break;
  350. case TEST_MAT_TRANS_F64_4:
  351. input1.reload(UnaryTestsF64::INPUTS1_F64_ID,mgr);
  352. dims.reload(UnaryTestsF64::DIMSUNARY1_S16_ID,mgr);
  353. ref.reload(UnaryTestsF64::REFTRANS1_F64_ID,mgr);
  354. output.create(ref.nbSamples(),UnaryTestsF64::OUT_F64_ID,mgr);
  355. a.create(MAXMATRIXDIM*MAXMATRIXDIM,UnaryTestsF64::TMPA_F64_ID,mgr);
  356. break;
  357. case TEST_MAT_INVERSE_F64_5:
  358. input1.reload(UnaryTestsF64::INPUTSINV_F64_ID,mgr);
  359. dims.reload(UnaryTestsF64::DIMSINVERT1_S16_ID,mgr);
  360. ref.reload(UnaryTestsF64::REFINV1_F64_ID,mgr);
  361. output.create(ref.nbSamples(),UnaryTestsF64::OUT_F64_ID,mgr);
  362. a.create(ref.nbSamples(),UnaryTestsF64::TMPA_F64_ID,mgr);
  363. break;
  364. case TEST_MAT_CHOLESKY_DPO_F64_6:
  365. input1.reload(UnaryTestsF64::INPUTSCHOLESKY1_DPO_F64_ID,mgr);
  366. dims.reload(UnaryTestsF64::DIMSCHOLESKY1_DPO_S16_ID,mgr);
  367. ref.reload(UnaryTestsF64::REFCHOLESKY1_DPO_F64_ID,mgr);
  368. output.create(ref.nbSamples(),UnaryTestsF64::OUT_F64_ID,mgr);
  369. a.create(MAXMATRIXDIM*MAXMATRIXDIM,UnaryTestsF64::TMPA_F64_ID,mgr);
  370. break;
  371. case TEST_SOLVE_UPPER_TRIANGULAR_F64_7:
  372. input1.reload(UnaryTestsF64::INPUT_UT_DPO_F64_ID,mgr);
  373. dims.reload(UnaryTestsF64::DIMSCHOLESKY1_DPO_S16_ID,mgr);
  374. input2.reload(UnaryTestsF64::INPUT_RNDA_DPO_F64_ID,mgr);
  375. ref.reload(UnaryTestsF64::REF_UTINV_DPO_F64_ID,mgr);
  376. output.create(ref.nbSamples(),UnaryTestsF64::OUT_F64_ID,mgr);
  377. a.create(MAXMATRIXDIM*MAXMATRIXDIM,UnaryTestsF64::TMPA_F64_ID,mgr);
  378. b.create(MAXMATRIXDIM*MAXMATRIXDIM,UnaryTestsF64::TMPB_F64_ID,mgr);
  379. break;
  380. case TEST_SOLVE_LOWER_TRIANGULAR_F64_8:
  381. input1.reload(UnaryTestsF64::INPUT_LT_DPO_F64_ID,mgr);
  382. dims.reload(UnaryTestsF64::DIMSCHOLESKY1_DPO_S16_ID,mgr);
  383. input2.reload(UnaryTestsF64::INPUT_RNDA_DPO_F64_ID,mgr);
  384. ref.reload(UnaryTestsF64::REF_LTINV_DPO_F64_ID,mgr);
  385. output.create(ref.nbSamples(),UnaryTestsF64::OUT_F64_ID,mgr);
  386. a.create(MAXMATRIXDIM*MAXMATRIXDIM,UnaryTestsF64::TMPA_F64_ID,mgr);
  387. b.create(MAXMATRIXDIM*MAXMATRIXDIM,UnaryTestsF64::TMPB_F64_ID,mgr);
  388. break;
  389. case TEST_MAT_LDL_F64_9:
  390. // Definite positive test
  391. input1.reload(UnaryTestsF64::INPUTSCHOLESKY1_DPO_F64_ID,mgr);
  392. dims.reload(UnaryTestsF64::DIMSCHOLESKY1_DPO_S16_ID,mgr);
  393. outputll.create(input1.nbSamples(),UnaryTestsF64::LL_F64_ID,mgr);
  394. outputd.create(input1.nbSamples(),UnaryTestsF64::D_F64_ID,mgr);
  395. outputp.create(input1.nbSamples(),UnaryTestsF64::PERM_S16_ID,mgr);
  396. outputa.create(input1.nbSamples(),UnaryTestsF64::OUTA_F64_ID,mgr);
  397. outputb.create(input1.nbSamples(),UnaryTestsF64::OUTA_F64_ID,mgr);
  398. a.create(MAXMATRIXDIM*MAXMATRIXDIM,UnaryTestsF64::TMPA_F64_ID,mgr);
  399. tmpapat.create(MAXMATRIXDIM*MAXMATRIXDIM,UnaryTestsF64::TMPDB_F64_ID,mgr);
  400. tmpbpat.create(MAXMATRIXDIM*MAXMATRIXDIM,UnaryTestsF64::TMPDC_F64_ID,mgr);
  401. tmpcpat.create(MAXMATRIXDIM*MAXMATRIXDIM,UnaryTestsF64::TMPDD_F64_ID,mgr);
  402. break;
  403. case TEST_MAT_LDL_F64_10:
  404. // Semi definite positive test
  405. input1.reload(UnaryTestsF64::INPUTSCHOLESKY1_SDPO_F64_ID,mgr);
  406. dims.reload(UnaryTestsF64::DIMSCHOLESKY1_SDPO_S16_ID,mgr);
  407. outputll.create(input1.nbSamples(),UnaryTestsF64::LL_F64_ID,mgr);
  408. outputd.create(input1.nbSamples(),UnaryTestsF64::D_F64_ID,mgr);
  409. outputp.create(input1.nbSamples(),UnaryTestsF64::PERM_S16_ID,mgr);
  410. outputa.create(input1.nbSamples(),UnaryTestsF64::OUTA_F64_ID,mgr);
  411. outputb.create(input1.nbSamples(),UnaryTestsF64::OUTA_F64_ID,mgr);
  412. a.create(MAXMATRIXDIM*MAXMATRIXDIM,UnaryTestsF64::TMPA_F64_ID,mgr);
  413. tmpapat.create(MAXMATRIXDIM*MAXMATRIXDIM,UnaryTestsF64::TMPDB_F64_ID,mgr);
  414. tmpbpat.create(MAXMATRIXDIM*MAXMATRIXDIM,UnaryTestsF64::TMPDC_F64_ID,mgr);
  415. tmpcpat.create(MAXMATRIXDIM*MAXMATRIXDIM,UnaryTestsF64::TMPDD_F64_ID,mgr);
  416. break;
  417. }
  418. }
  419. void UnaryTestsF64::tearDown(Testing::testID_t id,Client::PatternMgr *mgr)
  420. {
  421. (void)id;
  422. //output.dump(mgr);
  423. (void)mgr;
  424. }