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