testdistance.py 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185
  1. import cmsisdsp as dsp
  2. import numpy as np
  3. import scipy.spatial.distance as d
  4. from numpy.testing import assert_allclose
  5. a=[1,2,3]
  6. b=[1,5,2]
  7. print("\nBray-Curtis")
  8. ref=d.braycurtis(a,b)
  9. res=dsp.arm_braycurtis_distance_f32(a,b)
  10. print(ref)
  11. print(res)
  12. assert_allclose(ref,res,1e-6)
  13. print("\nCanberra")
  14. ref=d.canberra(a,b)
  15. res=dsp.arm_canberra_distance_f32(a,b)
  16. print(ref)
  17. print(res)
  18. assert_allclose(ref,res,1e-6)
  19. print("\nChebyshev")
  20. ref=d.chebyshev(a,b)
  21. res=dsp.arm_chebyshev_distance_f32(a,b)
  22. print(ref)
  23. print(res)
  24. assert_allclose(ref,res,1e-6)
  25. res=dsp.arm_chebyshev_distance_f64(a,b)
  26. print(res)
  27. assert_allclose(ref,res,1e-10)
  28. print("\nCity Block")
  29. ref=d.cityblock(a,b)
  30. res=dsp.arm_cityblock_distance_f32(a,b)
  31. print(ref)
  32. print(res)
  33. assert_allclose(ref,res,1e-6)
  34. res=dsp.arm_cityblock_distance_f64(a,b)
  35. print(res)
  36. assert_allclose(ref,res,1e-10)
  37. print("\nCorrelation")
  38. ref=d.correlation(a,b)
  39. res=dsp.arm_correlation_distance_f32(a,b)
  40. print(ref)
  41. print(res)
  42. assert_allclose(ref,res,1e-6)
  43. print("\nCosine")
  44. ref=d.cosine(a,b)
  45. res=dsp.arm_cosine_distance_f32(a,b)
  46. print(ref)
  47. print(res)
  48. assert_allclose(ref,res,1e-6)
  49. res=dsp.arm_cosine_distance_f64(a,b)
  50. print(res)
  51. assert_allclose(ref,res,1e-10)
  52. print("\nEuclidean")
  53. ref=d.euclidean(a,b)
  54. res=dsp.arm_euclidean_distance_f32(a,b)
  55. print(ref)
  56. print(res)
  57. assert_allclose(ref,res,1e-6)
  58. res=dsp.arm_euclidean_distance_f64(a,b)
  59. print(res)
  60. assert_allclose(ref,res,1e-10)
  61. print("\nJensen-Shannon")
  62. pa=a/np.sum(a)
  63. pb=b/np.sum(b)
  64. ref=d.jensenshannon(pa,pb)
  65. res=dsp.arm_jensenshannon_distance_f32(pa,pb)
  66. print(ref)
  67. print(res)
  68. assert_allclose(ref,res,1e-6)
  69. print("\nMinkowski")
  70. w=3
  71. ref=d.minkowski(a,b,w)
  72. res=dsp.arm_minkowski_distance_f32(a,b,w)
  73. print(ref)
  74. print(res)
  75. assert_allclose(ref,res,1e-6)
  76. # Int distance
  77. # For CMSIS-DSP the bool must be packed as bit arrays
  78. # Pack an array of boolean into uint32
  79. def packset(a):
  80. b = np.packbits(a)
  81. newSize = int(np.ceil(b.shape[0] / 4.0)) * 4
  82. c = np.copy(b)
  83. c.resize(newSize)
  84. #print(c)
  85. vecSize = round(newSize/4)
  86. c=c.reshape(vecSize,4)
  87. #print(c)
  88. r = np.zeros(vecSize)
  89. result = []
  90. for i in range(0,vecSize):
  91. #print(c[i,:])
  92. #print("%X %X %X %X" % (c[i,0],c[i,1],c[i,2],c[i,3]))
  93. d = (c[i,0] << 24) | (c[i,1] << 16) | (c[i,2] << 8) | c[i,3]
  94. result.append(np.uint32(d))
  95. return(result)
  96. nb = 34
  97. va = np.random.choice([0,1],nb)
  98. # Array of word32 containing all of our bits
  99. pva = packset(va)
  100. vb = np.random.choice([0,1],nb)
  101. # Array of word32 containing all of our bits
  102. pvb = packset(vb)
  103. print("\nDice")
  104. ref=d.dice(va,vb)
  105. res=dsp.arm_dice_distance(pva,pvb,nb)
  106. print(ref)
  107. print(res)
  108. assert_allclose(ref,res,1e-6)
  109. print("\nHamming")
  110. ref=d.hamming(va,vb)
  111. res=dsp.arm_hamming_distance(pva,pvb,nb)
  112. print(ref)
  113. print(res)
  114. assert_allclose(ref,res,1e-6)
  115. print("\nJaccard-Needham")
  116. ref=d.jaccard(va,vb)
  117. res=dsp.arm_jaccard_distance(pva,pvb,nb)
  118. print(ref)
  119. print(res)
  120. assert_allclose(ref,res,1e-6)
  121. print("\nKulsinski")
  122. ref=d.kulsinski(va,vb)
  123. res=dsp.arm_kulsinski_distance(pva,pvb,nb)
  124. print(ref)
  125. print(res)
  126. assert_allclose(ref,res,1e-6)
  127. print("\nRogers-Tanimoto")
  128. ref=d.rogerstanimoto(va,vb)
  129. res=dsp.arm_rogerstanimoto_distance(pva,pvb,nb)
  130. print(ref)
  131. print(res)
  132. assert_allclose(ref,res,1e-6)
  133. print("\nRussell-Rao")
  134. ref=d.russellrao(va,vb)
  135. res=dsp.arm_russellrao_distance(pva,pvb,nb)
  136. print(ref)
  137. print(res)
  138. assert_allclose(ref,res,1e-6)
  139. print("\nSokal-Michener")
  140. ref=d.sokalmichener(va,vb)
  141. res=dsp.arm_sokalmichener_distance(pva,pvb,nb)
  142. print(ref)
  143. print(res)
  144. assert_allclose(ref,res,1e-6)
  145. print("\nSokal-Sneath")
  146. ref=d.sokalsneath(va,vb)
  147. res=dsp.arm_sokalsneath_distance(pva,pvb,nb)
  148. print(ref)
  149. print(res)
  150. assert_allclose(ref,res,1e-6)
  151. print("\nYule")
  152. ref=d.yule(va,vb)
  153. res=dsp.arm_yule_distance(pva,pvb,nb)
  154. print(ref)
  155. print(res)
  156. assert_allclose(ref,res,1e-6)