1 /*
2  * Copyright (C) 2016 The Android Open Source Project
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *      http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 
17 // Don't edit this file!  It is auto-generated by frameworks/rs/api/generate.sh.
18 
19 package android.renderscript.cts;
20 
21 import android.renderscript.Allocation;
22 import android.renderscript.RSRuntimeException;
23 import android.renderscript.Element;
24 import android.renderscript.cts.Target;
25 
26 import java.util.Arrays;
27 
28 public class TestLength extends RSBaseCompute {
29 
30     private ScriptC_TestLength script;
31     private ScriptC_TestLengthRelaxed scriptRelaxed;
32 
33     @Override
setUp()34     protected void setUp() throws Exception {
35         super.setUp();
36         script = new ScriptC_TestLength(mRS);
37         scriptRelaxed = new ScriptC_TestLengthRelaxed(mRS);
38     }
39 
40     @Override
tearDown()41     protected void tearDown() throws Exception {
42         script.destroy();
43         scriptRelaxed.destroy();
44         super.tearDown();
45     }
46 
47     public class ArgumentsFloatFloat {
48         public float inV;
49         public Target.Floaty out;
50     }
51 
checkLengthFloatFloat()52     private void checkLengthFloatFloat() {
53         Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 1, 0x8119352509f7cc9fl, false);
54         try {
55             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 1), INPUTSIZE);
56             script.forEach_testLengthFloatFloat(inV, out);
57             verifyResultsLengthFloatFloat(inV, out, false);
58             out.destroy();
59         } catch (Exception e) {
60             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testLengthFloatFloat: " + e.toString());
61         }
62         try {
63             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 1), INPUTSIZE);
64             scriptRelaxed.forEach_testLengthFloatFloat(inV, out);
65             verifyResultsLengthFloatFloat(inV, out, true);
66             out.destroy();
67         } catch (Exception e) {
68             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testLengthFloatFloat: " + e.toString());
69         }
70         inV.destroy();
71     }
72 
verifyResultsLengthFloatFloat(Allocation inV, Allocation out, boolean relaxed)73     private void verifyResultsLengthFloatFloat(Allocation inV, Allocation out, boolean relaxed) {
74         float[] arrayInV = new float[INPUTSIZE * 1];
75         Arrays.fill(arrayInV, (float) 42);
76         inV.copyTo(arrayInV);
77         float[] arrayOut = new float[INPUTSIZE * 1];
78         Arrays.fill(arrayOut, (float) 42);
79         out.copyTo(arrayOut);
80         StringBuilder message = new StringBuilder();
81         boolean errorFound = false;
82         for (int i = 0; i < INPUTSIZE; i++) {
83             ArgumentsFloatFloat args = new ArgumentsFloatFloat();
84             // Create the appropriate sized arrays in args
85             // Fill args with the input values
86             args.inV = arrayInV[i];
87             Target target = new Target(Target.FunctionType.NORMAL, Target.ReturnType.FLOAT, relaxed);
88             CoreMathVerifier.computeLength(args, target);
89 
90             // Compare the expected outputs to the actual values returned by RS.
91             boolean valid = true;
92             if (!args.out.couldBe(arrayOut[i])) {
93                 valid = false;
94             }
95             if (!valid) {
96                 if (!errorFound) {
97                     errorFound = true;
98                     message.append("Input inV: ");
99                     appendVariableToMessage(message, arrayInV[i]);
100                     message.append("\n");
101                     message.append("Expected output out: ");
102                     appendVariableToMessage(message, args.out);
103                     message.append("\n");
104                     message.append("Actual   output out: ");
105                     appendVariableToMessage(message, arrayOut[i]);
106                     if (!args.out.couldBe(arrayOut[i])) {
107                         message.append(" FAIL");
108                     }
109                     message.append("\n");
110                     message.append("Errors at");
111                 }
112                 message.append(" [");
113                 message.append(Integer.toString(i));
114                 message.append("]");
115             }
116         }
117         assertFalse("Incorrect output for checkLengthFloatFloat" +
118                 (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
119     }
120 
121     public class ArgumentsFloatNFloat {
122         public float[] inV;
123         public Target.Floaty out;
124     }
125 
checkLengthFloat2Float()126     private void checkLengthFloat2Float() {
127         Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 2, 0xaf3b0f345dd9595dl, false);
128         try {
129             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 1), INPUTSIZE);
130             script.forEach_testLengthFloat2Float(inV, out);
131             verifyResultsLengthFloat2Float(inV, out, false);
132             out.destroy();
133         } catch (Exception e) {
134             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testLengthFloat2Float: " + e.toString());
135         }
136         try {
137             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 1), INPUTSIZE);
138             scriptRelaxed.forEach_testLengthFloat2Float(inV, out);
139             verifyResultsLengthFloat2Float(inV, out, true);
140             out.destroy();
141         } catch (Exception e) {
142             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testLengthFloat2Float: " + e.toString());
143         }
144         inV.destroy();
145     }
146 
verifyResultsLengthFloat2Float(Allocation inV, Allocation out, boolean relaxed)147     private void verifyResultsLengthFloat2Float(Allocation inV, Allocation out, boolean relaxed) {
148         float[] arrayInV = new float[INPUTSIZE * 2];
149         Arrays.fill(arrayInV, (float) 42);
150         inV.copyTo(arrayInV);
151         float[] arrayOut = new float[INPUTSIZE * 1];
152         Arrays.fill(arrayOut, (float) 42);
153         out.copyTo(arrayOut);
154         StringBuilder message = new StringBuilder();
155         boolean errorFound = false;
156         for (int i = 0; i < INPUTSIZE; i++) {
157             ArgumentsFloatNFloat args = new ArgumentsFloatNFloat();
158             // Create the appropriate sized arrays in args
159             args.inV = new float[2];
160             // Fill args with the input values
161             for (int j = 0; j < 2 ; j++) {
162                 args.inV[j] = arrayInV[i * 2 + j];
163             }
164             Target target = new Target(Target.FunctionType.NORMAL, Target.ReturnType.FLOAT, relaxed);
165             CoreMathVerifier.computeLength(args, target);
166 
167             // Compare the expected outputs to the actual values returned by RS.
168             boolean valid = true;
169             if (!args.out.couldBe(arrayOut[i])) {
170                 valid = false;
171             }
172             if (!valid) {
173                 if (!errorFound) {
174                     errorFound = true;
175                     for (int j = 0; j < 2 ; j++) {
176                         message.append("Input inV: ");
177                         appendVariableToMessage(message, arrayInV[i * 2 + j]);
178                         message.append("\n");
179                     }
180                     message.append("Expected output out: ");
181                     appendVariableToMessage(message, args.out);
182                     message.append("\n");
183                     message.append("Actual   output out: ");
184                     appendVariableToMessage(message, arrayOut[i]);
185                     if (!args.out.couldBe(arrayOut[i])) {
186                         message.append(" FAIL");
187                     }
188                     message.append("\n");
189                     message.append("Errors at");
190                 }
191                 message.append(" [");
192                 message.append(Integer.toString(i));
193                 message.append("]");
194             }
195         }
196         assertFalse("Incorrect output for checkLengthFloat2Float" +
197                 (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
198     }
199 
checkLengthFloat3Float()200     private void checkLengthFloat3Float() {
201         Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 3, 0xaf3b19d5bcdfe7bel, false);
202         try {
203             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 1), INPUTSIZE);
204             script.forEach_testLengthFloat3Float(inV, out);
205             verifyResultsLengthFloat3Float(inV, out, false);
206             out.destroy();
207         } catch (Exception e) {
208             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testLengthFloat3Float: " + e.toString());
209         }
210         try {
211             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 1), INPUTSIZE);
212             scriptRelaxed.forEach_testLengthFloat3Float(inV, out);
213             verifyResultsLengthFloat3Float(inV, out, true);
214             out.destroy();
215         } catch (Exception e) {
216             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testLengthFloat3Float: " + e.toString());
217         }
218         inV.destroy();
219     }
220 
verifyResultsLengthFloat3Float(Allocation inV, Allocation out, boolean relaxed)221     private void verifyResultsLengthFloat3Float(Allocation inV, Allocation out, boolean relaxed) {
222         float[] arrayInV = new float[INPUTSIZE * 4];
223         Arrays.fill(arrayInV, (float) 42);
224         inV.copyTo(arrayInV);
225         float[] arrayOut = new float[INPUTSIZE * 1];
226         Arrays.fill(arrayOut, (float) 42);
227         out.copyTo(arrayOut);
228         StringBuilder message = new StringBuilder();
229         boolean errorFound = false;
230         for (int i = 0; i < INPUTSIZE; i++) {
231             ArgumentsFloatNFloat args = new ArgumentsFloatNFloat();
232             // Create the appropriate sized arrays in args
233             args.inV = new float[3];
234             // Fill args with the input values
235             for (int j = 0; j < 3 ; j++) {
236                 args.inV[j] = arrayInV[i * 4 + j];
237             }
238             Target target = new Target(Target.FunctionType.NORMAL, Target.ReturnType.FLOAT, relaxed);
239             CoreMathVerifier.computeLength(args, target);
240 
241             // Compare the expected outputs to the actual values returned by RS.
242             boolean valid = true;
243             if (!args.out.couldBe(arrayOut[i])) {
244                 valid = false;
245             }
246             if (!valid) {
247                 if (!errorFound) {
248                     errorFound = true;
249                     for (int j = 0; j < 3 ; j++) {
250                         message.append("Input inV: ");
251                         appendVariableToMessage(message, arrayInV[i * 4 + j]);
252                         message.append("\n");
253                     }
254                     message.append("Expected output out: ");
255                     appendVariableToMessage(message, args.out);
256                     message.append("\n");
257                     message.append("Actual   output out: ");
258                     appendVariableToMessage(message, arrayOut[i]);
259                     if (!args.out.couldBe(arrayOut[i])) {
260                         message.append(" FAIL");
261                     }
262                     message.append("\n");
263                     message.append("Errors at");
264                 }
265                 message.append(" [");
266                 message.append(Integer.toString(i));
267                 message.append("]");
268             }
269         }
270         assertFalse("Incorrect output for checkLengthFloat3Float" +
271                 (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
272     }
273 
checkLengthFloat4Float()274     private void checkLengthFloat4Float() {
275         Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 4, 0xaf3b24771be6761fl, false);
276         try {
277             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 1), INPUTSIZE);
278             script.forEach_testLengthFloat4Float(inV, out);
279             verifyResultsLengthFloat4Float(inV, out, false);
280             out.destroy();
281         } catch (Exception e) {
282             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testLengthFloat4Float: " + e.toString());
283         }
284         try {
285             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 1), INPUTSIZE);
286             scriptRelaxed.forEach_testLengthFloat4Float(inV, out);
287             verifyResultsLengthFloat4Float(inV, out, true);
288             out.destroy();
289         } catch (Exception e) {
290             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testLengthFloat4Float: " + e.toString());
291         }
292         inV.destroy();
293     }
294 
verifyResultsLengthFloat4Float(Allocation inV, Allocation out, boolean relaxed)295     private void verifyResultsLengthFloat4Float(Allocation inV, Allocation out, boolean relaxed) {
296         float[] arrayInV = new float[INPUTSIZE * 4];
297         Arrays.fill(arrayInV, (float) 42);
298         inV.copyTo(arrayInV);
299         float[] arrayOut = new float[INPUTSIZE * 1];
300         Arrays.fill(arrayOut, (float) 42);
301         out.copyTo(arrayOut);
302         StringBuilder message = new StringBuilder();
303         boolean errorFound = false;
304         for (int i = 0; i < INPUTSIZE; i++) {
305             ArgumentsFloatNFloat args = new ArgumentsFloatNFloat();
306             // Create the appropriate sized arrays in args
307             args.inV = new float[4];
308             // Fill args with the input values
309             for (int j = 0; j < 4 ; j++) {
310                 args.inV[j] = arrayInV[i * 4 + j];
311             }
312             Target target = new Target(Target.FunctionType.NORMAL, Target.ReturnType.FLOAT, relaxed);
313             CoreMathVerifier.computeLength(args, target);
314 
315             // Compare the expected outputs to the actual values returned by RS.
316             boolean valid = true;
317             if (!args.out.couldBe(arrayOut[i])) {
318                 valid = false;
319             }
320             if (!valid) {
321                 if (!errorFound) {
322                     errorFound = true;
323                     for (int j = 0; j < 4 ; j++) {
324                         message.append("Input inV: ");
325                         appendVariableToMessage(message, arrayInV[i * 4 + j]);
326                         message.append("\n");
327                     }
328                     message.append("Expected output out: ");
329                     appendVariableToMessage(message, args.out);
330                     message.append("\n");
331                     message.append("Actual   output out: ");
332                     appendVariableToMessage(message, arrayOut[i]);
333                     if (!args.out.couldBe(arrayOut[i])) {
334                         message.append(" FAIL");
335                     }
336                     message.append("\n");
337                     message.append("Errors at");
338                 }
339                 message.append(" [");
340                 message.append(Integer.toString(i));
341                 message.append("]");
342             }
343         }
344         assertFalse("Incorrect output for checkLengthFloat4Float" +
345                 (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
346     }
347 
348     public class ArgumentsHalfHalf {
349         public short inV;
350         public double inVDouble;
351         public Target.Floaty out;
352     }
353 
checkLengthHalfHalf()354     private void checkLengthHalfHalf() {
355         Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_16, 1, 0xd70e76bc6dc47281l, false);
356         try {
357             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_16, 1), INPUTSIZE);
358             script.forEach_testLengthHalfHalf(inV, out);
359             verifyResultsLengthHalfHalf(inV, out, false);
360             out.destroy();
361         } catch (Exception e) {
362             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testLengthHalfHalf: " + e.toString());
363         }
364         try {
365             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_16, 1), INPUTSIZE);
366             scriptRelaxed.forEach_testLengthHalfHalf(inV, out);
367             verifyResultsLengthHalfHalf(inV, out, true);
368             out.destroy();
369         } catch (Exception e) {
370             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testLengthHalfHalf: " + e.toString());
371         }
372         inV.destroy();
373     }
374 
verifyResultsLengthHalfHalf(Allocation inV, Allocation out, boolean relaxed)375     private void verifyResultsLengthHalfHalf(Allocation inV, Allocation out, boolean relaxed) {
376         short[] arrayInV = new short[INPUTSIZE * 1];
377         Arrays.fill(arrayInV, (short) 42);
378         inV.copyTo(arrayInV);
379         short[] arrayOut = new short[INPUTSIZE * 1];
380         Arrays.fill(arrayOut, (short) 42);
381         out.copyTo(arrayOut);
382         StringBuilder message = new StringBuilder();
383         boolean errorFound = false;
384         for (int i = 0; i < INPUTSIZE; i++) {
385             ArgumentsHalfHalf args = new ArgumentsHalfHalf();
386             // Create the appropriate sized arrays in args
387             // Fill args with the input values
388             args.inV = arrayInV[i];
389             args.inVDouble = Float16Utils.convertFloat16ToDouble(args.inV);
390             Target target = new Target(Target.FunctionType.NORMAL, Target.ReturnType.HALF, relaxed);
391             CoreMathVerifier.computeLength(args, target);
392 
393             // Compare the expected outputs to the actual values returned by RS.
394             boolean valid = true;
395             if (!args.out.couldBe(Float16Utils.convertFloat16ToDouble(arrayOut[i]))) {
396                 valid = false;
397             }
398             if (!valid) {
399                 if (!errorFound) {
400                     errorFound = true;
401                     message.append("Input inV: ");
402                     appendVariableToMessage(message, arrayInV[i]);
403                     message.append("\n");
404                     message.append("Expected output out: ");
405                     appendVariableToMessage(message, args.out);
406                     message.append("\n");
407                     message.append("Actual   output out: ");
408                     appendVariableToMessage(message, arrayOut[i]);
409                     message.append("\n");
410                     message.append("Actual   output out (in double): ");
411                     appendVariableToMessage(message, Float16Utils.convertFloat16ToDouble(arrayOut[i]));
412                     if (!args.out.couldBe(Float16Utils.convertFloat16ToDouble(arrayOut[i]))) {
413                         message.append(" FAIL");
414                     }
415                     message.append("\n");
416                     message.append("Errors at");
417                 }
418                 message.append(" [");
419                 message.append(Integer.toString(i));
420                 message.append("]");
421             }
422         }
423         assertFalse("Incorrect output for checkLengthHalfHalf" +
424                 (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
425     }
426 
427     public class ArgumentsHalfNHalf {
428         public short[] inV;
429         public double[] inVDouble;
430         public Target.Floaty out;
431     }
432 
checkLengthHalf2Half()433     private void checkLengthHalf2Half() {
434         Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_16, 2, 0x1f6dec10f0ea410dl, false);
435         try {
436             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_16, 1), INPUTSIZE);
437             script.forEach_testLengthHalf2Half(inV, out);
438             verifyResultsLengthHalf2Half(inV, out, false);
439             out.destroy();
440         } catch (Exception e) {
441             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testLengthHalf2Half: " + e.toString());
442         }
443         try {
444             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_16, 1), INPUTSIZE);
445             scriptRelaxed.forEach_testLengthHalf2Half(inV, out);
446             verifyResultsLengthHalf2Half(inV, out, true);
447             out.destroy();
448         } catch (Exception e) {
449             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testLengthHalf2Half: " + e.toString());
450         }
451         inV.destroy();
452     }
453 
verifyResultsLengthHalf2Half(Allocation inV, Allocation out, boolean relaxed)454     private void verifyResultsLengthHalf2Half(Allocation inV, Allocation out, boolean relaxed) {
455         short[] arrayInV = new short[INPUTSIZE * 2];
456         Arrays.fill(arrayInV, (short) 42);
457         inV.copyTo(arrayInV);
458         short[] arrayOut = new short[INPUTSIZE * 1];
459         Arrays.fill(arrayOut, (short) 42);
460         out.copyTo(arrayOut);
461         StringBuilder message = new StringBuilder();
462         boolean errorFound = false;
463         for (int i = 0; i < INPUTSIZE; i++) {
464             ArgumentsHalfNHalf args = new ArgumentsHalfNHalf();
465             // Create the appropriate sized arrays in args
466             args.inV = new short[2];
467             args.inVDouble = new double[2];
468             // Fill args with the input values
469             for (int j = 0; j < 2 ; j++) {
470                 args.inV[j] = arrayInV[i * 2 + j];
471                 args.inVDouble[j] = Float16Utils.convertFloat16ToDouble(args.inV[j]);
472             }
473             Target target = new Target(Target.FunctionType.NORMAL, Target.ReturnType.HALF, relaxed);
474             CoreMathVerifier.computeLength(args, target);
475 
476             // Compare the expected outputs to the actual values returned by RS.
477             boolean valid = true;
478             if (!args.out.couldBe(Float16Utils.convertFloat16ToDouble(arrayOut[i]))) {
479                 valid = false;
480             }
481             if (!valid) {
482                 if (!errorFound) {
483                     errorFound = true;
484                     for (int j = 0; j < 2 ; j++) {
485                         message.append("Input inV: ");
486                         appendVariableToMessage(message, arrayInV[i * 2 + j]);
487                         message.append("\n");
488                     }
489                     message.append("Expected output out: ");
490                     appendVariableToMessage(message, args.out);
491                     message.append("\n");
492                     message.append("Actual   output out: ");
493                     appendVariableToMessage(message, arrayOut[i]);
494                     message.append("\n");
495                     message.append("Actual   output out (in double): ");
496                     appendVariableToMessage(message, Float16Utils.convertFloat16ToDouble(arrayOut[i]));
497                     if (!args.out.couldBe(Float16Utils.convertFloat16ToDouble(arrayOut[i]))) {
498                         message.append(" FAIL");
499                     }
500                     message.append("\n");
501                     message.append("Errors at");
502                 }
503                 message.append(" [");
504                 message.append(Integer.toString(i));
505                 message.append("]");
506             }
507         }
508         assertFalse("Incorrect output for checkLengthHalf2Half" +
509                 (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
510     }
511 
checkLengthHalf3Half()512     private void checkLengthHalf3Half() {
513         Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_16, 3, 0x1f6dec503a911ab0l, false);
514         try {
515             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_16, 1), INPUTSIZE);
516             script.forEach_testLengthHalf3Half(inV, out);
517             verifyResultsLengthHalf3Half(inV, out, false);
518             out.destroy();
519         } catch (Exception e) {
520             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testLengthHalf3Half: " + e.toString());
521         }
522         try {
523             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_16, 1), INPUTSIZE);
524             scriptRelaxed.forEach_testLengthHalf3Half(inV, out);
525             verifyResultsLengthHalf3Half(inV, out, true);
526             out.destroy();
527         } catch (Exception e) {
528             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testLengthHalf3Half: " + e.toString());
529         }
530         inV.destroy();
531     }
532 
verifyResultsLengthHalf3Half(Allocation inV, Allocation out, boolean relaxed)533     private void verifyResultsLengthHalf3Half(Allocation inV, Allocation out, boolean relaxed) {
534         short[] arrayInV = new short[INPUTSIZE * 4];
535         Arrays.fill(arrayInV, (short) 42);
536         inV.copyTo(arrayInV);
537         short[] arrayOut = new short[INPUTSIZE * 1];
538         Arrays.fill(arrayOut, (short) 42);
539         out.copyTo(arrayOut);
540         StringBuilder message = new StringBuilder();
541         boolean errorFound = false;
542         for (int i = 0; i < INPUTSIZE; i++) {
543             ArgumentsHalfNHalf args = new ArgumentsHalfNHalf();
544             // Create the appropriate sized arrays in args
545             args.inV = new short[3];
546             args.inVDouble = new double[3];
547             // Fill args with the input values
548             for (int j = 0; j < 3 ; j++) {
549                 args.inV[j] = arrayInV[i * 4 + j];
550                 args.inVDouble[j] = Float16Utils.convertFloat16ToDouble(args.inV[j]);
551             }
552             Target target = new Target(Target.FunctionType.NORMAL, Target.ReturnType.HALF, relaxed);
553             CoreMathVerifier.computeLength(args, target);
554 
555             // Compare the expected outputs to the actual values returned by RS.
556             boolean valid = true;
557             if (!args.out.couldBe(Float16Utils.convertFloat16ToDouble(arrayOut[i]))) {
558                 valid = false;
559             }
560             if (!valid) {
561                 if (!errorFound) {
562                     errorFound = true;
563                     for (int j = 0; j < 3 ; j++) {
564                         message.append("Input inV: ");
565                         appendVariableToMessage(message, arrayInV[i * 4 + j]);
566                         message.append("\n");
567                     }
568                     message.append("Expected output out: ");
569                     appendVariableToMessage(message, args.out);
570                     message.append("\n");
571                     message.append("Actual   output out: ");
572                     appendVariableToMessage(message, arrayOut[i]);
573                     message.append("\n");
574                     message.append("Actual   output out (in double): ");
575                     appendVariableToMessage(message, Float16Utils.convertFloat16ToDouble(arrayOut[i]));
576                     if (!args.out.couldBe(Float16Utils.convertFloat16ToDouble(arrayOut[i]))) {
577                         message.append(" FAIL");
578                     }
579                     message.append("\n");
580                     message.append("Errors at");
581                 }
582                 message.append(" [");
583                 message.append(Integer.toString(i));
584                 message.append("]");
585             }
586         }
587         assertFalse("Incorrect output for checkLengthHalf3Half" +
588                 (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
589     }
590 
checkLengthHalf4Half()591     private void checkLengthHalf4Half() {
592         Allocation inV = createRandomAllocation(mRS, Element.DataType.FLOAT_16, 4, 0x1f6dec8f8437f453l, false);
593         try {
594             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_16, 1), INPUTSIZE);
595             script.forEach_testLengthHalf4Half(inV, out);
596             verifyResultsLengthHalf4Half(inV, out, false);
597             out.destroy();
598         } catch (Exception e) {
599             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testLengthHalf4Half: " + e.toString());
600         }
601         try {
602             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_16, 1), INPUTSIZE);
603             scriptRelaxed.forEach_testLengthHalf4Half(inV, out);
604             verifyResultsLengthHalf4Half(inV, out, true);
605             out.destroy();
606         } catch (Exception e) {
607             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testLengthHalf4Half: " + e.toString());
608         }
609         inV.destroy();
610     }
611 
verifyResultsLengthHalf4Half(Allocation inV, Allocation out, boolean relaxed)612     private void verifyResultsLengthHalf4Half(Allocation inV, Allocation out, boolean relaxed) {
613         short[] arrayInV = new short[INPUTSIZE * 4];
614         Arrays.fill(arrayInV, (short) 42);
615         inV.copyTo(arrayInV);
616         short[] arrayOut = new short[INPUTSIZE * 1];
617         Arrays.fill(arrayOut, (short) 42);
618         out.copyTo(arrayOut);
619         StringBuilder message = new StringBuilder();
620         boolean errorFound = false;
621         for (int i = 0; i < INPUTSIZE; i++) {
622             ArgumentsHalfNHalf args = new ArgumentsHalfNHalf();
623             // Create the appropriate sized arrays in args
624             args.inV = new short[4];
625             args.inVDouble = new double[4];
626             // Fill args with the input values
627             for (int j = 0; j < 4 ; j++) {
628                 args.inV[j] = arrayInV[i * 4 + j];
629                 args.inVDouble[j] = Float16Utils.convertFloat16ToDouble(args.inV[j]);
630             }
631             Target target = new Target(Target.FunctionType.NORMAL, Target.ReturnType.HALF, relaxed);
632             CoreMathVerifier.computeLength(args, target);
633 
634             // Compare the expected outputs to the actual values returned by RS.
635             boolean valid = true;
636             if (!args.out.couldBe(Float16Utils.convertFloat16ToDouble(arrayOut[i]))) {
637                 valid = false;
638             }
639             if (!valid) {
640                 if (!errorFound) {
641                     errorFound = true;
642                     for (int j = 0; j < 4 ; j++) {
643                         message.append("Input inV: ");
644                         appendVariableToMessage(message, arrayInV[i * 4 + j]);
645                         message.append("\n");
646                     }
647                     message.append("Expected output out: ");
648                     appendVariableToMessage(message, args.out);
649                     message.append("\n");
650                     message.append("Actual   output out: ");
651                     appendVariableToMessage(message, arrayOut[i]);
652                     message.append("\n");
653                     message.append("Actual   output out (in double): ");
654                     appendVariableToMessage(message, Float16Utils.convertFloat16ToDouble(arrayOut[i]));
655                     if (!args.out.couldBe(Float16Utils.convertFloat16ToDouble(arrayOut[i]))) {
656                         message.append(" FAIL");
657                     }
658                     message.append("\n");
659                     message.append("Errors at");
660                 }
661                 message.append(" [");
662                 message.append(Integer.toString(i));
663                 message.append("]");
664             }
665         }
666         assertFalse("Incorrect output for checkLengthHalf4Half" +
667                 (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
668     }
669 
testLength()670     public void testLength() {
671         checkLengthFloatFloat();
672         checkLengthFloat2Float();
673         checkLengthFloat3Float();
674         checkLengthFloat4Float();
675         checkLengthHalfHalf();
676         checkLengthHalf2Half();
677         checkLengthHalf3Half();
678         checkLengthHalf4Half();
679     }
680 }
681