1import os.path
2import itertools
3import Tools
4import random
5import numpy as np
6
7NBTESTSAMPLES = 10
8
9# Nb vectors for barycenter
10NBVECTORS = [4,10,16]
11
12VECDIM = [12,14,20]
13
14def genWsum(config,f,nb):
15    DIM=50
16    inputs=[]
17    weights=[]
18    output=[]
19
20
21    va = np.random.rand(DIM)
22    vb = np.random.rand(DIM)
23    inputs += list(va)
24    weights += list(vb)
25
26    nbiters = Tools.loopnb(f,Tools.TAILONLY)
27    e = np.sum(va[0:nbiters].T * vb[0:nbiters]) / np.sum(vb[0:nbiters])
28    output.append(e)
29
30    nbiters = Tools.loopnb(f,Tools.BODYONLY)
31    e = np.sum(va[0:nbiters].T * vb[0:nbiters]) / np.sum(vb[0:nbiters])
32    output.append(e)
33
34    nbiters = Tools.loopnb(f,Tools.BODYANDTAIL)
35    e = np.sum(va[0:nbiters].T * vb[0:nbiters]) / np.sum(vb[0:nbiters])
36    output.append(e)
37
38    inputs=np.array(inputs)
39    weights=np.array(weights)
40    output=np.array(output)
41    config.writeInput(nb, inputs,"Inputs")
42    config.writeInput(nb, weights,"Weights")
43    config.writeReference(nb, output,"Ref")
44
45def genBarycenter(config,nb,nbTests,nbVecsArray,vecDimArray):
46    dims=[]
47    inputs=[]
48    weights=[]
49    output=[]
50
51    dims.append(nbTests)
52
53
54    for i in range(0,nbTests):
55      nbVecs = nbVecsArray[i % len(nbVecsArray)]
56      vecDim = vecDimArray[i % len(vecDimArray)]
57      dims.append(nbVecs )
58      dims.append(vecDim)
59
60      vecs = []
61      b = np.zeros(vecDim)
62      coefs = np.random.rand(nbVecs)
63
64      for i in range(nbVecs):
65            va = np.random.rand(vecDim)
66            b += va * coefs[i]
67            vecs += list(va)
68
69      b = b / np.sum(coefs)
70
71      inputs += list(vecs)
72      weights += list(coefs)
73      output += list(b)
74    inputs=np.array(inputs)
75    weights=np.array(weights)
76    output=np.array(output)
77    config.writeInput(nb, inputs,"Inputs")
78    config.writeInputS16(nb, dims,"Dims")
79    config.writeInput(nb, weights,"Weights")
80    config.writeReference(nb, output,"Ref")
81
82# Gen samples for datatype conversions
83def genSamples(nb):
84    va = np.random.rand(nb)
85    va = Tools.normalize(va)
86    sat = np.array([-1.0,1.0,-2.1,2.1])
87    va = np.hstack([va,sat])
88    return(va)
89
90def writeTestsF64(config):
91    NBSAMPLES=256
92    va = genSamples(NBSAMPLES)
93
94    config.writeInput(1,va,"Samples")
95    config.writeInputF32(6,va,"Samples")
96    config.writeInputQ31(4,va,"Samples")
97    config.writeInputQ15(3,va,"Samples")
98    config.writeInputQ7(5,va,"Samples")
99    config.writeInputF16(11,va,"Samples")
100
101def writeTestsF32(config):
102    NBSAMPLES=256
103
104    va = genSamples(NBSAMPLES)
105    config.writeInput(1,va,"Samples")
106    config.writeInputF64(6,va,"Samples")
107    config.writeInputQ15(3,va,"Samples")
108    config.writeInputQ31(4,va,"Samples")
109    config.writeInputQ7(5,va,"Samples")
110
111
112    # This is for benchmarking the weighted sum and we use only one test pattern
113    genWsum(config,Tools.F32,6)
114
115
116def writeTestsF16(config):
117    NBSAMPLES=256
118
119    va = genSamples(NBSAMPLES)
120    config.writeInputF16(11,va,"Samples")
121    config.writeInputF32(1,va,"Samples")
122    config.writeInputF64(6,va,"Samples")
123    config.writeInputQ15(3,va,"Samples")
124
125    # This is for benchmarking the weighted sum and we use only one test pattern
126    genWsum(config,Tools.F16,6)
127
128def writeTestsQ31(config):
129    NBSAMPLES=256
130
131    va = genSamples(NBSAMPLES)
132    config.writeInputF32(1,va,"Samples")
133    config.writeInputF64(6,va,"Samples")
134    config.writeInputQ15(3,va,"Samples")
135    config.writeInput(4,va,"Samples")
136    config.writeInputQ7(5,va,"Samples")
137
138
139def writeTestsQ15(config):
140    NBSAMPLES=256
141
142    va = genSamples(NBSAMPLES)
143    config.writeInputF32(1,va,"Samples")
144    config.writeInputF64(6,va,"Samples")
145    config.writeInput(3,va,"Samples")
146    config.writeInputQ31(4,va,"Samples")
147    config.writeInputQ7(5,va,"Samples")
148    config.writeInputF16(11,va,"Samples")
149
150def writeTestsQ7(config):
151    NBSAMPLES=256
152
153    va = genSamples(NBSAMPLES)
154    config.writeInputF32(1,va,"Samples")
155    config.writeInputF64(6,va,"Samples")
156    config.writeInputQ15(3,va,"Samples")
157    config.writeInputQ31(4,va,"Samples")
158    config.writeInput(5,va,"Samples")
159
160def writeBarTests(config):
161    # For testing
162    NBSAMPLES = 10
163    nbVecsArray = [4,8,9]
164    vecDimArray = [4,4,4,8,8,8,9,9,9]
165    genBarycenter(config,1,NBTESTSAMPLES,nbVecsArray,vecDimArray)
166
167    # For benchmarks
168    va = np.random.rand(128*15)
169    vb = np.random.rand(128)
170    config.writeInput(1,va,"Samples")
171    config.writeInput(1,vb,"Coefs")
172
173def writeTests2(config, format):
174
175    data = np.random.randn(11)
176    data = Tools.normalize(data)
177    config.writeInput(7, data)
178    ref = np.sort(data)
179    config.writeReference(7, ref)
180
181    data = np.random.randn(16)
182    data = Tools.normalize(data)
183    config.writeInput(8, data)
184    ref = np.sort(data)
185    config.writeReference(8, ref)
186
187    data = np.random.randn(32)
188    data = Tools.normalize(data)
189    config.writeInput(9, data)
190    ref = np.sort(data)
191    config.writeReference(9, ref)
192
193    data = np.full((16), np.random.randn(1))
194    data = Tools.normalize(data)
195    config.writeInput(10, data)
196    ref = np.sort(data)
197    config.writeReference(10, ref)
198
199
200def generatePatterns():
201    PATTERNDIR = os.path.join("Patterns","DSP","Support","Support")
202    PARAMDIR = os.path.join("Parameters","DSP","Support","Support")
203
204    configf64=Tools.Config(PATTERNDIR,PARAMDIR,"f64")
205    configf32=Tools.Config(PATTERNDIR,PARAMDIR,"f32")
206    configf16=Tools.Config(PATTERNDIR,PARAMDIR,"f16")
207    configq31=Tools.Config(PATTERNDIR,PARAMDIR,"q31")
208    configq15=Tools.Config(PATTERNDIR,PARAMDIR,"q15")
209    configq7=Tools.Config(PATTERNDIR,PARAMDIR,"q7")
210
211    configf64.setOverwrite(False)
212    configf32.setOverwrite(False)
213    configf16.setOverwrite(True)
214    configq31.setOverwrite(False)
215    configq15.setOverwrite(False)
216    configq7.setOverwrite(False)
217
218
219    writeTestsF64(configf64)
220    writeTestsF32(configf32)
221    writeTestsF16(configf16)
222    writeTestsQ31(configq31)
223    writeTestsQ15(configq15)
224    writeTestsQ7(configq7)
225
226    configf64.setOverwrite(False)
227    configf32.setOverwrite(False)
228    configf16.setOverwrite(False)
229    configq31.setOverwrite(False)
230    configq15.setOverwrite(False)
231    configq7.setOverwrite(False)
232
233    writeTests2(configf32,0)
234
235
236
237    # For benchmarking we need to vary number of vectors and vector dimension separately
238    PATTERNBARDIR = os.path.join("Patterns","DSP","SupportBar")
239    PARAMBARDIR = os.path.join("Parameters","DSP","SupportBar")
240
241    configBarf32=Tools.Config(PATTERNBARDIR,PARAMBARDIR,"f32")
242    configBarf16=Tools.Config(PATTERNBARDIR,PARAMBARDIR,"f16")
243
244    writeBarTests(configBarf32)
245    writeBarTests(configBarf16)
246
247if __name__ == '__main__':
248  generatePatterns()
249