Distance.py 7.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278
  1. import os.path
  2. import itertools
  3. import Tools
  4. import random
  5. import numpy as np
  6. import scipy.spatial
  7. NBTESTSAMPLES = 10
  8. VECDIM = [35,14,20]
  9. query=np.array([ 0.08387197, 0.68082274, 1.06756417, 0.88914541, 0.42513398, -0.3259053,
  10. -0.80934885, -0.90979435, -0.64026483, 0.06923695])
  11. template=np.array([ 1.00000000e+00, 7.96326711e-04, -9.99998732e-01, -2.38897811e-03,
  12. 9.99994927e-01])
  13. def euclidean(xa,xb):
  14. r = scipy.spatial.distance.euclidean(xa,xb)
  15. return(r)
  16. def braycurtis(xa,xb):
  17. r = scipy.spatial.distance.braycurtis(xa,xb)
  18. return(r)
  19. def canberra(xa,xb):
  20. r = scipy.spatial.distance.canberra(xa,xb)
  21. return(r)
  22. def chebyshev(xa,xb):
  23. r = scipy.spatial.distance.chebyshev(xa,xb)
  24. return(r)
  25. def cityblock(xa,xb):
  26. r = scipy.spatial.distance.cityblock(xa,xb)
  27. return(r)
  28. def correlation(xa,xb):
  29. r = scipy.spatial.distance.correlation (xa,xb)
  30. return(r)
  31. def cosine(xa,xb):
  32. r = scipy.spatial.distance.cosine (xa,xb)
  33. return(r)
  34. def jensenshannon(xa,xb):
  35. r = scipy.spatial.distance.jensenshannon (xa,xb)
  36. return(r)
  37. def minkowski (xa,xb,dim):
  38. r = scipy.spatial.distance.minkowski(xa,xb,p=dim)
  39. return(r)
  40. def dice(xa,xb):
  41. r = scipy.spatial.distance.dice (xa,xb)
  42. return(r)
  43. def hamming(xa,xb):
  44. r = scipy.spatial.distance.hamming (xa,xb)
  45. return(r)
  46. def jaccard(xa,xb):
  47. r = scipy.spatial.distance.jaccard (xa,xb)
  48. return(r)
  49. def kulsinski(xa,xb):
  50. r = scipy.spatial.distance.kulsinski (xa,xb)
  51. return(r)
  52. def rogerstanimoto(xa,xb):
  53. r = scipy.spatial.distance.rogerstanimoto (xa,xb)
  54. return(r)
  55. def russellrao(xa,xb):
  56. r = scipy.spatial.distance.russellrao (xa,xb)
  57. return(r)
  58. def sokalmichener(xa,xb):
  59. r = scipy.spatial.distance.sokalmichener (xa,xb)
  60. return(r)
  61. def sokalsneath(xa,xb):
  62. r = scipy.spatial.distance.sokalsneath (xa,xb)
  63. return(r)
  64. def yule(xa,xb):
  65. r = scipy.spatial.distance.yule (xa,xb)
  66. return(r)
  67. def writeDTW(config):
  68. config.setOverwrite(True)
  69. config.writeInput(10, query,"Query")
  70. config.writeInput(10, template,"Template")
  71. query_index = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 9]
  72. template_index = [0, 0, 0, 0, 0, 1, 2, 2, 2, 3, 4]
  73. path = np.array(list(zip(query_index,template_index))).flatten()
  74. config.writeReferenceS16(10,path ,"PathRef")
  75. # Distance computed with different windows
  76. references=[0.29962325787495825,
  77. 0.41319151913793334,
  78. 0.6170999383691333
  79. ]
  80. config.writeReference(10, references,"DTWRef")
  81. config.setOverwrite(False)
  82. def writeFTest(config,funcList):
  83. dims=[]
  84. dimsM=[]
  85. inputsA=[]
  86. inputsB=[]
  87. inputsAJ=[]
  88. inputsBJ=[]
  89. outputs=[]
  90. outputMin=[]
  91. outputJen=[]
  92. for i in range(0,len(funcList)):
  93. outputs.append([])
  94. vecDim = VECDIM[0]
  95. dims.append(NBTESTSAMPLES)
  96. dims.append(vecDim)
  97. dimsM.append(NBTESTSAMPLES)
  98. dimsM.append(vecDim)
  99. for _ in range(0,NBTESTSAMPLES):
  100. normDim = np.random.choice([2,3,4])
  101. dimsM.append(normDim)
  102. va = np.random.randn(vecDim)
  103. # Normalization for distance assuming probability distribution in entry
  104. vb = np.random.randn(vecDim)
  105. for i in range(0,len(funcList)):
  106. func = funcList[i]
  107. outputs[i].append(func(va,vb))
  108. outputMin.append(minkowski(va,vb,normDim))
  109. inputsA += list(va)
  110. inputsB += list(vb)
  111. va = np.abs(va)
  112. va = va / np.sum(va)
  113. vb = np.abs(vb)
  114. vb = vb / np.sum(vb)
  115. inputsAJ += list(va)
  116. inputsBJ += list(vb)
  117. outputJen.append(jensenshannon(va,vb))
  118. inputsA=np.array(inputsA)
  119. inputsB=np.array(inputsB)
  120. for i in range(0,len(funcList)):
  121. outputs[i]=np.array(outputs[i])
  122. config.writeInput(1, inputsA,"InputA")
  123. config.writeInput(1, inputsB,"InputB")
  124. config.writeInput(8, inputsAJ,"InputA")
  125. config.writeInput(8, inputsBJ,"InputB")
  126. config.writeInputS16(1, dims,"Dims")
  127. config.writeInputS16(9, dimsM,"Dims")
  128. for i in range(0,len(funcList)):
  129. config.writeReference(i+1, outputs[i],"Ref")
  130. config.writeReference(8, outputJen,"Ref")
  131. config.writeReference(9, outputMin,"Ref")
  132. writeDTW(config)
  133. def writeBTest(config,funcList):
  134. dims=[]
  135. inputsA=[]
  136. inputsB=[]
  137. outputs=[]
  138. for i in range(0,len(funcList)):
  139. outputs.append([])
  140. vecDim = VECDIM[0]
  141. dims.append(NBTESTSAMPLES)
  142. dims.append(vecDim)
  143. va = np.random.choice([0,1],vecDim)
  144. # Number of word32 containing all of our bits
  145. pva = Tools.packset(va)
  146. dims.append(len(pva))
  147. for _ in range(0,NBTESTSAMPLES):
  148. va = np.random.choice([0,1],vecDim)
  149. vb = np.random.choice([0,1],vecDim)
  150. # Boolean arrays are packed for the C code
  151. pva = Tools.packset(va)
  152. pvb = Tools.packset(vb)
  153. for i in range(0,len(funcList)):
  154. func = funcList[i]
  155. outputs[i].append(func(va,vb))
  156. inputsA += pva
  157. inputsB += pvb
  158. inputsA=np.array(inputsA)
  159. inputsB=np.array(inputsB)
  160. for i in range(0,len(funcList)):
  161. outputs[i]=np.array(outputs[i])
  162. config.writeInput(1, inputsA,"InputA")
  163. config.writeInput(1, inputsB,"InputB")
  164. config.writeInputS16(1, dims,"Dims")
  165. for i in range(0,len(funcList)):
  166. config.writeReferenceF32(i+1, outputs[i],"Ref")
  167. def writeFTests(config):
  168. writeFTest(config,[braycurtis,canberra,chebyshev,cityblock,correlation,cosine,euclidean])
  169. def writeBTests(config):
  170. writeBTest(config,[dice,hamming,jaccard,kulsinski,rogerstanimoto,russellrao,sokalmichener,sokalsneath,yule])
  171. def writeFBenchmark(config):
  172. NBSAMPLES=256
  173. va = np.random.randn(NBSAMPLES)
  174. vb = np.random.randn(NBSAMPLES)
  175. inputsA = list(va)
  176. inputsB = list(vb)
  177. va = np.abs(va)
  178. va = list(va / np.sum(va))
  179. vb = np.abs(vb)
  180. vb = list(vb / np.sum(vb))
  181. config.writeInput(1, inputsA,"InputBenchA")
  182. config.writeInput(1, inputsB,"InputBenchB")
  183. config.writeInput(1, va,"InputBenchProbaA")
  184. config.writeInput(1, vb,"InputBenchProbaB")
  185. def writeUBenchmark(config):
  186. NBSAMPLES=256*32
  187. va = np.random.choice([0,1],NBSAMPLES)
  188. vb = np.random.choice([0,1],NBSAMPLES)
  189. pva = list(Tools.packset(va))
  190. pvb = list(Tools.packset(vb))
  191. config.writeInput(1, pva,"InputBenchA")
  192. config.writeInput(1, pvb,"InputBenchB")
  193. def generatePatterns():
  194. PATTERNDIR = os.path.join("Patterns","DSP","Distance","Distance")
  195. PARAMDIR = os.path.join("Parameters","DSP","Distance","Distance")
  196. configf64=Tools.Config(PATTERNDIR,PARAMDIR,"f64")
  197. configf32=Tools.Config(PATTERNDIR,PARAMDIR,"f32")
  198. configf16=Tools.Config(PATTERNDIR,PARAMDIR,"f16")
  199. configu32=Tools.Config(PATTERNDIR,PARAMDIR,"u32")
  200. configf64.setOverwrite(False)
  201. configf32.setOverwrite(False)
  202. configf16.setOverwrite(False)
  203. configu32.setOverwrite(False)
  204. writeFTests(configf64)
  205. writeFTests(configf32)
  206. writeFTests(configf16)
  207. writeBTests(configu32)
  208. writeFBenchmark(configf32)
  209. writeFBenchmark(configf16)
  210. writeUBenchmark(configu32)
  211. if __name__ == '__main__':
  212. generatePatterns()