DistanceTestsF16.cpp 8.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303
  1. #include "DistanceTestsF16.h"
  2. #include <stdio.h>
  3. #include "Error.h"
  4. #include "Test.h"
  5. #define REL_ERROR (5e-3)
  6. #define REL_JS_ERROR (3e-2)
  7. #define REL_MK_ERROR (1e-2)
  8. void DistanceTestsF16::test_braycurtis_distance_f16()
  9. {
  10. const float16_t *inpA = inputA.ptr();
  11. const float16_t *inpB = inputB.ptr();
  12. float16_t *outp = output.ptr();
  13. for(int i=0; i < this->nbPatterns ; i ++)
  14. {
  15. *outp = arm_braycurtis_distance_f16(inpA, inpB, this->vecDim);
  16. inpA += this->vecDim;
  17. inpB += this->vecDim;
  18. outp ++;
  19. }
  20. ASSERT_REL_ERROR(output,ref,REL_ERROR);
  21. }
  22. void DistanceTestsF16::test_canberra_distance_f16()
  23. {
  24. const float16_t *inpA = inputA.ptr();
  25. const float16_t *inpB = inputB.ptr();
  26. float16_t *outp = output.ptr();
  27. for(int i=0; i < this->nbPatterns ; i ++)
  28. {
  29. *outp = arm_canberra_distance_f16(inpA, inpB, this->vecDim);
  30. inpA += this->vecDim;
  31. inpB += this->vecDim;
  32. outp ++;
  33. }
  34. ASSERT_REL_ERROR(output,ref,REL_ERROR);
  35. }
  36. void DistanceTestsF16::test_chebyshev_distance_f16()
  37. {
  38. const float16_t *inpA = inputA.ptr();
  39. const float16_t *inpB = inputB.ptr();
  40. float16_t *outp = output.ptr();
  41. for(int i=0; i < this->nbPatterns ; i ++)
  42. {
  43. *outp = arm_chebyshev_distance_f16(inpA, inpB, this->vecDim);
  44. inpA += this->vecDim;
  45. inpB += this->vecDim;
  46. outp ++;
  47. }
  48. ASSERT_REL_ERROR(output,ref,REL_ERROR);
  49. }
  50. void DistanceTestsF16::test_cityblock_distance_f16()
  51. {
  52. const float16_t *inpA = inputA.ptr();
  53. const float16_t *inpB = inputB.ptr();
  54. float16_t *outp = output.ptr();
  55. for(int i=0; i < this->nbPatterns ; i ++)
  56. {
  57. *outp = arm_cityblock_distance_f16(inpA, inpB, this->vecDim);
  58. inpA += this->vecDim;
  59. inpB += this->vecDim;
  60. outp ++;
  61. }
  62. ASSERT_REL_ERROR(output,ref,REL_ERROR);
  63. }
  64. void DistanceTestsF16::test_correlation_distance_f16()
  65. {
  66. const float16_t *inpA = inputA.ptr();
  67. const float16_t *inpB = inputB.ptr();
  68. float16_t *tmpap = tmpA.ptr();
  69. float16_t *tmpbp = tmpB.ptr();
  70. float16_t *outp = output.ptr();
  71. for(int i=0; i < this->nbPatterns ; i ++)
  72. {
  73. memcpy(tmpap, inpA, sizeof(float16_t) * this->vecDim);
  74. memcpy(tmpbp, inpB, sizeof(float16_t) * this->vecDim);
  75. *outp = arm_correlation_distance_f16(tmpap, tmpbp, this->vecDim);
  76. inpA += this->vecDim;
  77. inpB += this->vecDim;
  78. outp ++;
  79. }
  80. ASSERT_REL_ERROR(output,ref,REL_ERROR);
  81. }
  82. void DistanceTestsF16::test_cosine_distance_f16()
  83. {
  84. const float16_t *inpA = inputA.ptr();
  85. const float16_t *inpB = inputB.ptr();
  86. float16_t *outp = output.ptr();
  87. for(int i=0; i < this->nbPatterns ; i ++)
  88. {
  89. *outp = arm_cosine_distance_f16(inpA, inpB, this->vecDim);
  90. inpA += this->vecDim;
  91. inpB += this->vecDim;
  92. outp ++;
  93. }
  94. ASSERT_REL_ERROR(output,ref,REL_ERROR);
  95. }
  96. void DistanceTestsF16::test_euclidean_distance_f16()
  97. {
  98. const float16_t *inpA = inputA.ptr();
  99. const float16_t *inpB = inputB.ptr();
  100. float16_t *outp = output.ptr();
  101. for(int i=0; i < this->nbPatterns ; i ++)
  102. {
  103. *outp = arm_euclidean_distance_f16(inpA, inpB, this->vecDim);
  104. inpA += this->vecDim;
  105. inpB += this->vecDim;
  106. outp ++;
  107. }
  108. ASSERT_REL_ERROR(output,ref,REL_ERROR);
  109. }
  110. void DistanceTestsF16::test_jensenshannon_distance_f16()
  111. {
  112. const float16_t *inpA = inputA.ptr();
  113. const float16_t *inpB = inputB.ptr();
  114. float16_t *outp = output.ptr();
  115. for(int i=0; i < this->nbPatterns ; i ++)
  116. {
  117. *outp = arm_jensenshannon_distance_f16(inpA, inpB, this->vecDim);
  118. inpA += this->vecDim;
  119. inpB += this->vecDim;
  120. outp ++;
  121. }
  122. ASSERT_REL_ERROR(output,ref,REL_JS_ERROR);
  123. }
  124. void DistanceTestsF16::test_minkowski_distance_f16()
  125. {
  126. const float16_t *inpA = inputA.ptr();
  127. const float16_t *inpB = inputB.ptr();
  128. const int16_t *dimsp= dims.ptr();
  129. dimsp += 2;
  130. float16_t *outp = output.ptr();
  131. for(int i=0; i < this->nbPatterns ; i ++)
  132. {
  133. *outp = arm_minkowski_distance_f16(inpA, inpB, *dimsp,this->vecDim);
  134. inpA += this->vecDim;
  135. inpB += this->vecDim;
  136. outp ++;
  137. dimsp ++;
  138. }
  139. ASSERT_REL_ERROR(output,ref,REL_MK_ERROR);
  140. }
  141. void DistanceTestsF16::setUp(Testing::testID_t id,std::vector<Testing::param_t>& paramsArgs,Client::PatternMgr *mgr)
  142. {
  143. (void)paramsArgs;
  144. if ((id != DistanceTestsF16::TEST_MINKOWSKI_DISTANCE_F16_9) && (id != DistanceTestsF16::TEST_JENSENSHANNON_DISTANCE_F16_8))
  145. {
  146. inputA.reload(DistanceTestsF16::INPUTA_F16_ID,mgr);
  147. inputB.reload(DistanceTestsF16::INPUTB_F16_ID,mgr);
  148. dims.reload(DistanceTestsF16::DIMS_S16_ID,mgr);
  149. const int16_t *dimsp = dims.ptr();
  150. this->nbPatterns=dimsp[0];
  151. this->vecDim=dimsp[1];
  152. output.create(this->nbPatterns,DistanceTestsF16::OUT_F16_ID,mgr);
  153. }
  154. switch(id)
  155. {
  156. case DistanceTestsF16::TEST_BRAYCURTIS_DISTANCE_F16_1:
  157. {
  158. ref.reload(DistanceTestsF16::REF1_F16_ID,mgr);
  159. }
  160. break;
  161. case DistanceTestsF16::TEST_CANBERRA_DISTANCE_F16_2:
  162. {
  163. ref.reload(DistanceTestsF16::REF2_F16_ID,mgr);
  164. }
  165. break;
  166. case DistanceTestsF16::TEST_CHEBYSHEV_DISTANCE_F16_3:
  167. {
  168. ref.reload(DistanceTestsF16::REF3_F16_ID,mgr);
  169. }
  170. break;
  171. case DistanceTestsF16::TEST_CITYBLOCK_DISTANCE_F16_4:
  172. {
  173. ref.reload(DistanceTestsF16::REF4_F16_ID,mgr);
  174. }
  175. break;
  176. case DistanceTestsF16::TEST_CORRELATION_DISTANCE_F16_5:
  177. {
  178. ref.reload(DistanceTestsF16::REF5_F16_ID,mgr);
  179. tmpA.create(this->vecDim,DistanceTestsF16::TMPA_F16_ID,mgr);
  180. tmpB.create(this->vecDim,DistanceTestsF16::TMPB_F16_ID,mgr);
  181. }
  182. break;
  183. case DistanceTestsF16::TEST_COSINE_DISTANCE_F16_6:
  184. {
  185. ref.reload(DistanceTestsF16::REF6_F16_ID,mgr);
  186. }
  187. break;
  188. case DistanceTestsF16::TEST_EUCLIDEAN_DISTANCE_F16_7:
  189. {
  190. ref.reload(DistanceTestsF16::REF7_F16_ID,mgr);
  191. }
  192. break;
  193. case DistanceTestsF16::TEST_JENSENSHANNON_DISTANCE_F16_8:
  194. {
  195. inputA.reload(DistanceTestsF16::INPUTA_JEN_F16_ID,mgr);
  196. inputB.reload(DistanceTestsF16::INPUTB_JEN_F16_ID,mgr);
  197. dims.reload(DistanceTestsF16::DIMS_S16_ID,mgr);
  198. const int16_t *dimsp = dims.ptr();
  199. this->nbPatterns=dimsp[0];
  200. this->vecDim=dimsp[1];
  201. output.create(this->nbPatterns,DistanceTestsF16::OUT_F16_ID,mgr);
  202. ref.reload(DistanceTestsF16::REF8_F16_ID,mgr);
  203. }
  204. break;
  205. case DistanceTestsF16::TEST_MINKOWSKI_DISTANCE_F16_9:
  206. {
  207. inputA.reload(DistanceTestsF16::INPUTA_F16_ID,mgr);
  208. inputB.reload(DistanceTestsF16::INPUTB_F16_ID,mgr);
  209. dims.reload(DistanceTestsF16::DIMS_MINKOWSKI_S16_ID,mgr);
  210. const int16_t *dimsp = dims.ptr();
  211. this->nbPatterns=dimsp[0];
  212. this->vecDim=dimsp[1];
  213. output.create(this->nbPatterns,DistanceTestsF16::OUT_F16_ID,mgr);
  214. ref.reload(DistanceTestsF16::REF9_F16_ID,mgr);
  215. }
  216. break;
  217. }
  218. }
  219. void DistanceTestsF16::tearDown(Testing::testID_t id,Client::PatternMgr *mgr)
  220. {
  221. (void)id;
  222. output.dump(mgr);
  223. }