1 #include "UnaryTestsQ7.h"
2 #include <stdio.h>
3 #include "Error.h"
4 
5 #define SNR_THRESHOLD 20
6 #define SNR_LOW_THRESHOLD 11
7 
8 /*
9 
10 Reference patterns are generated with
11 a double precision computation.
12 
13 */
14 #define ABS_ERROR_Q7 ((q7_t)2)
15 #define ABS_ERROR_Q63 ((q63_t)(1<<16))
16 
17 #define ONEHALF 0x4000
18 
19 /* Upper bound of maximum matrix dimension used by Python */
20 #define MAXMATRIXDIM 47
21 
checkInnerTail(q7_t * b)22 static void checkInnerTail(q7_t *b)
23 {
24     ASSERT_TRUE(b[0] == 0);
25     ASSERT_TRUE(b[1] == 0);
26     ASSERT_TRUE(b[2] == 0);
27     ASSERT_TRUE(b[3] == 0);
28     ASSERT_TRUE(b[4] == 0);
29     ASSERT_TRUE(b[5] == 0);
30     ASSERT_TRUE(b[6] == 0);
31     ASSERT_TRUE(b[7] == 0);
32 
33     ASSERT_TRUE(b[8] == 0);
34     ASSERT_TRUE(b[9] == 0);
35     ASSERT_TRUE(b[10] == 0);
36     ASSERT_TRUE(b[11] == 0);
37     ASSERT_TRUE(b[12] == 0);
38     ASSERT_TRUE(b[13] == 0);
39     ASSERT_TRUE(b[14] == 0);
40     ASSERT_TRUE(b[15] == 0);
41 }
42 
43 #define LOADDATA2()                          \
44       const q7_t *inp1=input1.ptr();    \
45       const q7_t *inp2=input2.ptr();    \
46                                              \
47       q7_t *ap=a.ptr();                 \
48       q7_t *bp=b.ptr();                 \
49                                              \
50       q7_t *outp=output.ptr();          \
51       int16_t *dimsp = dims.ptr();           \
52       int nbMatrixes = dims.nbSamples() >> 1;\
53       int rows,columns;                      \
54       int i;
55 
56 #define LOADDATA1()                          \
57       const q7_t *inp1=input1.ptr();    \
58                                              \
59       q7_t *ap=a.ptr();                 \
60                                              \
61       q7_t *outp=output.ptr();          \
62       int16_t *dimsp = dims.ptr();           \
63       int nbMatrixes = dims.nbSamples() >> 1;\
64       int rows,columns;                      \
65       int i;
66 
67 #define PREPAREDATA2()                                                   \
68       in1.numRows=rows;                                                  \
69       in1.numCols=columns;                                               \
70       memcpy((void*)ap,(const void*)inp1,sizeof(q7_t)*rows*columns);\
71       in1.pData = ap;                                                    \
72                                                                          \
73       in2.numRows=rows;                                                  \
74       in2.numCols=columns;                                               \
75       memcpy((void*)bp,(const void*)inp2,sizeof(q7_t)*rows*columns);\
76       in2.pData = bp;                                                    \
77                                                                          \
78       out.numRows=rows;                                                  \
79       out.numCols=columns;                                               \
80       out.pData = outp;
81 
82 #define PREPAREDATA1(TRANSPOSED)                                         \
83       in1.numRows=rows;                                                  \
84       in1.numCols=columns;                                               \
85       memcpy((void*)ap,(const void*)inp1,sizeof(q7_t)*rows*columns);\
86       in1.pData = ap;                                                    \
87                                                                          \
88       if (TRANSPOSED)                                                    \
89       {                                                                  \
90          out.numRows=columns;                                            \
91          out.numCols=rows;                                               \
92       }                                                                  \
93       else                                                               \
94       {                                                                  \
95       out.numRows=rows;                                                  \
96       out.numCols=columns;                                               \
97       }                                                                  \
98       out.pData = outp;
99 
100 
101 #define LOADVECDATA2()                          \
102       const q7_t *inp1=input1.ptr();    \
103       const q7_t *inp2=input2.ptr();    \
104                                              \
105       q7_t *ap=a.ptr();                 \
106       q7_t *bp=b.ptr();                 \
107                                              \
108       q7_t *outp=output.ptr();          \
109       int16_t *dimsp = dims.ptr();           \
110       int nbMatrixes = dims.nbSamples() / 2;\
111       int rows,internal;                      \
112       int i;
113 
114 #define PREPAREVECDATA2()                                            \
115       in1.numRows=rows;                                              \
116       in1.numCols=internal;                                          \
117       memcpy((void*)ap,(const void*)inp1,sizeof(q7_t)*rows*internal);\
118       in1.pData = ap;                                                \
119                                                                      \
120       memcpy((void*)bp,(const void*)inp2,sizeof(q7_t)*internal);
121 
test_mat_vec_mult_q7()122   void UnaryTestsQ7::test_mat_vec_mult_q7()
123     {
124       LOADVECDATA2();
125 
126       for(i=0;i < nbMatrixes ; i ++)
127       {
128           rows = *dimsp++;
129           internal = *dimsp++;
130 
131           PREPAREVECDATA2();
132 
133           arm_mat_vec_mult_q7(&this->in1, bp, outp);
134 
135           outp += rows ;
136           checkInnerTail(outp);
137 
138       }
139 
140       ASSERT_EMPTY_TAIL(output);
141 
142       ASSERT_SNR(output,ref,(q7_t)SNR_LOW_THRESHOLD);
143 
144       ASSERT_NEAR_EQ(output,ref,ABS_ERROR_Q7);
145 
146     }
147 
test_mat_trans_q7()148 void UnaryTestsQ7::test_mat_trans_q7()
149     {
150       LOADDATA1();
151       arm_status status;
152 
153       for(i=0;i < nbMatrixes ; i ++)
154       {
155           rows = *dimsp++;
156           columns = *dimsp++;
157           PREPAREDATA1(true);
158 
159           status=arm_mat_trans_q7(&this->in1,&this->out);
160           ASSERT_TRUE(status==ARM_MATH_SUCCESS);
161 
162           outp += (rows * columns);
163           checkInnerTail(outp);
164 
165       }
166 
167       ASSERT_EMPTY_TAIL(output);
168 
169       ASSERT_SNR(output,ref,(q7_t)SNR_THRESHOLD);
170 
171       ASSERT_NEAR_EQ(output,ref,ABS_ERROR_Q7);
172 
173     }
174 
175 
setUp(Testing::testID_t id,std::vector<Testing::param_t> & params,Client::PatternMgr * mgr)176     void UnaryTestsQ7::setUp(Testing::testID_t id,std::vector<Testing::param_t>& params,Client::PatternMgr *mgr)
177     {
178 
179 
180       (void)params;
181       switch(id)
182       {
183 
184          case TEST_MAT_TRANS_Q7_1:
185             input1.reload(UnaryTestsQ7::INPUTS1_Q7_ID,mgr);
186             dims.reload(UnaryTestsQ7::DIMSUNARY1_S16_ID,mgr);
187 
188             ref.reload(UnaryTestsQ7::REFTRANS1_Q7_ID,mgr);
189 
190             output.create(ref.nbSamples(),UnaryTestsQ7::OUT_Q7_ID,mgr);
191             a.create(MAXMATRIXDIM*MAXMATRIXDIM,UnaryTestsQ7::TMPA_Q7_ID,mgr);
192          break;
193 
194 
195 
196 
197        case TEST_MAT_VEC_MULT_Q7_2:
198             input1.reload(UnaryTestsQ7::INPUTS1_Q7_ID,mgr);
199             input2.reload(UnaryTestsQ7::INPUTVEC1_Q7_ID,mgr);
200             dims.reload(UnaryTestsQ7::DIMSUNARY1_S16_ID,mgr);
201 
202             ref.reload(UnaryTestsQ7::REFVECMUL1_Q7_ID,mgr);
203 
204             output.create(ref.nbSamples(),UnaryTestsQ7::OUT_Q7_ID,mgr);
205             a.create(MAXMATRIXDIM*MAXMATRIXDIM,UnaryTestsQ7::TMPA_Q7_ID,mgr);
206             b.create(MAXMATRIXDIM,UnaryTestsQ7::TMPB_Q7_ID,mgr);
207          break;
208        }
209 
210 
211     }
212 
tearDown(Testing::testID_t id,Client::PatternMgr * mgr)213     void UnaryTestsQ7::tearDown(Testing::testID_t id,Client::PatternMgr *mgr)
214     {
215        (void)id;
216        output.dump(mgr);
217     }
218