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 TestCopysign extends RSBaseCompute {
29 
30     private ScriptC_TestCopysign script;
31     private ScriptC_TestCopysignRelaxed scriptRelaxed;
32 
33     @Override
setUp()34     protected void setUp() throws Exception {
35         super.setUp();
36         script = new ScriptC_TestCopysign(mRS);
37         scriptRelaxed = new ScriptC_TestCopysignRelaxed(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 ArgumentsFloatFloatFloat {
48         public float inMagnitudeValue;
49         public float inSignValue;
50         public Target.Floaty out;
51     }
52 
checkCopysignFloatFloatFloat()53     private void checkCopysignFloatFloatFloat() {
54         Allocation inMagnitudeValue = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 1, 0x4218ae4ccf086614l, false);
55         Allocation inSignValue = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 1, 0xd95dacad9d8d3ef5l, false);
56         try {
57             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 1), INPUTSIZE);
58             script.set_gAllocInSignValue(inSignValue);
59             script.forEach_testCopysignFloatFloatFloat(inMagnitudeValue, out);
60             verifyResultsCopysignFloatFloatFloat(inMagnitudeValue, inSignValue, out, false);
61             out.destroy();
62         } catch (Exception e) {
63             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testCopysignFloatFloatFloat: " + e.toString());
64         }
65         try {
66             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 1), INPUTSIZE);
67             scriptRelaxed.set_gAllocInSignValue(inSignValue);
68             scriptRelaxed.forEach_testCopysignFloatFloatFloat(inMagnitudeValue, out);
69             verifyResultsCopysignFloatFloatFloat(inMagnitudeValue, inSignValue, out, true);
70             out.destroy();
71         } catch (Exception e) {
72             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testCopysignFloatFloatFloat: " + e.toString());
73         }
74         inMagnitudeValue.destroy();
75         inSignValue.destroy();
76     }
77 
verifyResultsCopysignFloatFloatFloat(Allocation inMagnitudeValue, Allocation inSignValue, Allocation out, boolean relaxed)78     private void verifyResultsCopysignFloatFloatFloat(Allocation inMagnitudeValue, Allocation inSignValue, Allocation out, boolean relaxed) {
79         float[] arrayInMagnitudeValue = new float[INPUTSIZE * 1];
80         Arrays.fill(arrayInMagnitudeValue, (float) 42);
81         inMagnitudeValue.copyTo(arrayInMagnitudeValue);
82         float[] arrayInSignValue = new float[INPUTSIZE * 1];
83         Arrays.fill(arrayInSignValue, (float) 42);
84         inSignValue.copyTo(arrayInSignValue);
85         float[] arrayOut = new float[INPUTSIZE * 1];
86         Arrays.fill(arrayOut, (float) 42);
87         out.copyTo(arrayOut);
88         StringBuilder message = new StringBuilder();
89         boolean errorFound = false;
90         for (int i = 0; i < INPUTSIZE; i++) {
91             for (int j = 0; j < 1 ; j++) {
92                 // Extract the inputs.
93                 ArgumentsFloatFloatFloat args = new ArgumentsFloatFloatFloat();
94                 args.inMagnitudeValue = arrayInMagnitudeValue[i];
95                 args.inSignValue = arrayInSignValue[i];
96                 // Figure out what the outputs should have been.
97                 Target target = new Target(Target.FunctionType.NORMAL, Target.ReturnType.FLOAT, relaxed);
98                 CoreMathVerifier.computeCopysign(args, target);
99                 // Validate the outputs.
100                 boolean valid = true;
101                 if (!args.out.couldBe(arrayOut[i * 1 + j])) {
102                     valid = false;
103                 }
104                 if (!valid) {
105                     if (!errorFound) {
106                         errorFound = true;
107                         message.append("Input inMagnitudeValue: ");
108                         appendVariableToMessage(message, args.inMagnitudeValue);
109                         message.append("\n");
110                         message.append("Input inSignValue: ");
111                         appendVariableToMessage(message, args.inSignValue);
112                         message.append("\n");
113                         message.append("Expected output out: ");
114                         appendVariableToMessage(message, args.out);
115                         message.append("\n");
116                         message.append("Actual   output out: ");
117                         appendVariableToMessage(message, arrayOut[i * 1 + j]);
118                         if (!args.out.couldBe(arrayOut[i * 1 + j])) {
119                             message.append(" FAIL");
120                         }
121                         message.append("\n");
122                         message.append("Errors at");
123                     }
124                     message.append(" [");
125                     message.append(Integer.toString(i));
126                     message.append(", ");
127                     message.append(Integer.toString(j));
128                     message.append("]");
129                 }
130             }
131         }
132         assertFalse("Incorrect output for checkCopysignFloatFloatFloat" +
133                 (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
134     }
135 
checkCopysignFloat2Float2Float2()136     private void checkCopysignFloat2Float2Float2() {
137         Allocation inMagnitudeValue = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 2, 0x8efe093722e9f786l, false);
138         Allocation inSignValue = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 2, 0xb33b4a8420cec72bl, false);
139         try {
140             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 2), INPUTSIZE);
141             script.set_gAllocInSignValue(inSignValue);
142             script.forEach_testCopysignFloat2Float2Float2(inMagnitudeValue, out);
143             verifyResultsCopysignFloat2Float2Float2(inMagnitudeValue, inSignValue, out, false);
144             out.destroy();
145         } catch (Exception e) {
146             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testCopysignFloat2Float2Float2: " + e.toString());
147         }
148         try {
149             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 2), INPUTSIZE);
150             scriptRelaxed.set_gAllocInSignValue(inSignValue);
151             scriptRelaxed.forEach_testCopysignFloat2Float2Float2(inMagnitudeValue, out);
152             verifyResultsCopysignFloat2Float2Float2(inMagnitudeValue, inSignValue, out, true);
153             out.destroy();
154         } catch (Exception e) {
155             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testCopysignFloat2Float2Float2: " + e.toString());
156         }
157         inMagnitudeValue.destroy();
158         inSignValue.destroy();
159     }
160 
verifyResultsCopysignFloat2Float2Float2(Allocation inMagnitudeValue, Allocation inSignValue, Allocation out, boolean relaxed)161     private void verifyResultsCopysignFloat2Float2Float2(Allocation inMagnitudeValue, Allocation inSignValue, Allocation out, boolean relaxed) {
162         float[] arrayInMagnitudeValue = new float[INPUTSIZE * 2];
163         Arrays.fill(arrayInMagnitudeValue, (float) 42);
164         inMagnitudeValue.copyTo(arrayInMagnitudeValue);
165         float[] arrayInSignValue = new float[INPUTSIZE * 2];
166         Arrays.fill(arrayInSignValue, (float) 42);
167         inSignValue.copyTo(arrayInSignValue);
168         float[] arrayOut = new float[INPUTSIZE * 2];
169         Arrays.fill(arrayOut, (float) 42);
170         out.copyTo(arrayOut);
171         StringBuilder message = new StringBuilder();
172         boolean errorFound = false;
173         for (int i = 0; i < INPUTSIZE; i++) {
174             for (int j = 0; j < 2 ; j++) {
175                 // Extract the inputs.
176                 ArgumentsFloatFloatFloat args = new ArgumentsFloatFloatFloat();
177                 args.inMagnitudeValue = arrayInMagnitudeValue[i * 2 + j];
178                 args.inSignValue = arrayInSignValue[i * 2 + j];
179                 // Figure out what the outputs should have been.
180                 Target target = new Target(Target.FunctionType.NORMAL, Target.ReturnType.FLOAT, relaxed);
181                 CoreMathVerifier.computeCopysign(args, target);
182                 // Validate the outputs.
183                 boolean valid = true;
184                 if (!args.out.couldBe(arrayOut[i * 2 + j])) {
185                     valid = false;
186                 }
187                 if (!valid) {
188                     if (!errorFound) {
189                         errorFound = true;
190                         message.append("Input inMagnitudeValue: ");
191                         appendVariableToMessage(message, args.inMagnitudeValue);
192                         message.append("\n");
193                         message.append("Input inSignValue: ");
194                         appendVariableToMessage(message, args.inSignValue);
195                         message.append("\n");
196                         message.append("Expected output out: ");
197                         appendVariableToMessage(message, args.out);
198                         message.append("\n");
199                         message.append("Actual   output out: ");
200                         appendVariableToMessage(message, arrayOut[i * 2 + j]);
201                         if (!args.out.couldBe(arrayOut[i * 2 + j])) {
202                             message.append(" FAIL");
203                         }
204                         message.append("\n");
205                         message.append("Errors at");
206                     }
207                     message.append(" [");
208                     message.append(Integer.toString(i));
209                     message.append(", ");
210                     message.append(Integer.toString(j));
211                     message.append("]");
212                 }
213             }
214         }
215         assertFalse("Incorrect output for checkCopysignFloat2Float2Float2" +
216                 (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
217     }
218 
checkCopysignFloat3Float3Float3()219     private void checkCopysignFloat3Float3Float3() {
220         Allocation inMagnitudeValue = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 3, 0x9a9db55e1b468741l, false);
221         Allocation inSignValue = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 3, 0x8ec9f3bdc39ab32cl, false);
222         try {
223             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 3), INPUTSIZE);
224             script.set_gAllocInSignValue(inSignValue);
225             script.forEach_testCopysignFloat3Float3Float3(inMagnitudeValue, out);
226             verifyResultsCopysignFloat3Float3Float3(inMagnitudeValue, inSignValue, out, false);
227             out.destroy();
228         } catch (Exception e) {
229             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testCopysignFloat3Float3Float3: " + e.toString());
230         }
231         try {
232             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 3), INPUTSIZE);
233             scriptRelaxed.set_gAllocInSignValue(inSignValue);
234             scriptRelaxed.forEach_testCopysignFloat3Float3Float3(inMagnitudeValue, out);
235             verifyResultsCopysignFloat3Float3Float3(inMagnitudeValue, inSignValue, out, true);
236             out.destroy();
237         } catch (Exception e) {
238             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testCopysignFloat3Float3Float3: " + e.toString());
239         }
240         inMagnitudeValue.destroy();
241         inSignValue.destroy();
242     }
243 
verifyResultsCopysignFloat3Float3Float3(Allocation inMagnitudeValue, Allocation inSignValue, Allocation out, boolean relaxed)244     private void verifyResultsCopysignFloat3Float3Float3(Allocation inMagnitudeValue, Allocation inSignValue, Allocation out, boolean relaxed) {
245         float[] arrayInMagnitudeValue = new float[INPUTSIZE * 4];
246         Arrays.fill(arrayInMagnitudeValue, (float) 42);
247         inMagnitudeValue.copyTo(arrayInMagnitudeValue);
248         float[] arrayInSignValue = new float[INPUTSIZE * 4];
249         Arrays.fill(arrayInSignValue, (float) 42);
250         inSignValue.copyTo(arrayInSignValue);
251         float[] arrayOut = new float[INPUTSIZE * 4];
252         Arrays.fill(arrayOut, (float) 42);
253         out.copyTo(arrayOut);
254         StringBuilder message = new StringBuilder();
255         boolean errorFound = false;
256         for (int i = 0; i < INPUTSIZE; i++) {
257             for (int j = 0; j < 3 ; j++) {
258                 // Extract the inputs.
259                 ArgumentsFloatFloatFloat args = new ArgumentsFloatFloatFloat();
260                 args.inMagnitudeValue = arrayInMagnitudeValue[i * 4 + j];
261                 args.inSignValue = arrayInSignValue[i * 4 + j];
262                 // Figure out what the outputs should have been.
263                 Target target = new Target(Target.FunctionType.NORMAL, Target.ReturnType.FLOAT, relaxed);
264                 CoreMathVerifier.computeCopysign(args, target);
265                 // Validate the outputs.
266                 boolean valid = true;
267                 if (!args.out.couldBe(arrayOut[i * 4 + j])) {
268                     valid = false;
269                 }
270                 if (!valid) {
271                     if (!errorFound) {
272                         errorFound = true;
273                         message.append("Input inMagnitudeValue: ");
274                         appendVariableToMessage(message, args.inMagnitudeValue);
275                         message.append("\n");
276                         message.append("Input inSignValue: ");
277                         appendVariableToMessage(message, args.inSignValue);
278                         message.append("\n");
279                         message.append("Expected output out: ");
280                         appendVariableToMessage(message, args.out);
281                         message.append("\n");
282                         message.append("Actual   output out: ");
283                         appendVariableToMessage(message, arrayOut[i * 4 + j]);
284                         if (!args.out.couldBe(arrayOut[i * 4 + j])) {
285                             message.append(" FAIL");
286                         }
287                         message.append("\n");
288                         message.append("Errors at");
289                     }
290                     message.append(" [");
291                     message.append(Integer.toString(i));
292                     message.append(", ");
293                     message.append(Integer.toString(j));
294                     message.append("]");
295                 }
296             }
297         }
298         assertFalse("Incorrect output for checkCopysignFloat3Float3Float3" +
299                 (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
300     }
301 
checkCopysignFloat4Float4Float4()302     private void checkCopysignFloat4Float4Float4() {
303         Allocation inMagnitudeValue = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 4, 0xa63d618513a316fcl, false);
304         Allocation inSignValue = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 4, 0x6a589cf766669f2dl, false);
305         try {
306             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 4), INPUTSIZE);
307             script.set_gAllocInSignValue(inSignValue);
308             script.forEach_testCopysignFloat4Float4Float4(inMagnitudeValue, out);
309             verifyResultsCopysignFloat4Float4Float4(inMagnitudeValue, inSignValue, out, false);
310             out.destroy();
311         } catch (Exception e) {
312             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testCopysignFloat4Float4Float4: " + e.toString());
313         }
314         try {
315             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 4), INPUTSIZE);
316             scriptRelaxed.set_gAllocInSignValue(inSignValue);
317             scriptRelaxed.forEach_testCopysignFloat4Float4Float4(inMagnitudeValue, out);
318             verifyResultsCopysignFloat4Float4Float4(inMagnitudeValue, inSignValue, out, true);
319             out.destroy();
320         } catch (Exception e) {
321             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testCopysignFloat4Float4Float4: " + e.toString());
322         }
323         inMagnitudeValue.destroy();
324         inSignValue.destroy();
325     }
326 
verifyResultsCopysignFloat4Float4Float4(Allocation inMagnitudeValue, Allocation inSignValue, Allocation out, boolean relaxed)327     private void verifyResultsCopysignFloat4Float4Float4(Allocation inMagnitudeValue, Allocation inSignValue, Allocation out, boolean relaxed) {
328         float[] arrayInMagnitudeValue = new float[INPUTSIZE * 4];
329         Arrays.fill(arrayInMagnitudeValue, (float) 42);
330         inMagnitudeValue.copyTo(arrayInMagnitudeValue);
331         float[] arrayInSignValue = new float[INPUTSIZE * 4];
332         Arrays.fill(arrayInSignValue, (float) 42);
333         inSignValue.copyTo(arrayInSignValue);
334         float[] arrayOut = new float[INPUTSIZE * 4];
335         Arrays.fill(arrayOut, (float) 42);
336         out.copyTo(arrayOut);
337         StringBuilder message = new StringBuilder();
338         boolean errorFound = false;
339         for (int i = 0; i < INPUTSIZE; i++) {
340             for (int j = 0; j < 4 ; j++) {
341                 // Extract the inputs.
342                 ArgumentsFloatFloatFloat args = new ArgumentsFloatFloatFloat();
343                 args.inMagnitudeValue = arrayInMagnitudeValue[i * 4 + j];
344                 args.inSignValue = arrayInSignValue[i * 4 + j];
345                 // Figure out what the outputs should have been.
346                 Target target = new Target(Target.FunctionType.NORMAL, Target.ReturnType.FLOAT, relaxed);
347                 CoreMathVerifier.computeCopysign(args, target);
348                 // Validate the outputs.
349                 boolean valid = true;
350                 if (!args.out.couldBe(arrayOut[i * 4 + j])) {
351                     valid = false;
352                 }
353                 if (!valid) {
354                     if (!errorFound) {
355                         errorFound = true;
356                         message.append("Input inMagnitudeValue: ");
357                         appendVariableToMessage(message, args.inMagnitudeValue);
358                         message.append("\n");
359                         message.append("Input inSignValue: ");
360                         appendVariableToMessage(message, args.inSignValue);
361                         message.append("\n");
362                         message.append("Expected output out: ");
363                         appendVariableToMessage(message, args.out);
364                         message.append("\n");
365                         message.append("Actual   output out: ");
366                         appendVariableToMessage(message, arrayOut[i * 4 + j]);
367                         if (!args.out.couldBe(arrayOut[i * 4 + j])) {
368                             message.append(" FAIL");
369                         }
370                         message.append("\n");
371                         message.append("Errors at");
372                     }
373                     message.append(" [");
374                     message.append(Integer.toString(i));
375                     message.append(", ");
376                     message.append(Integer.toString(j));
377                     message.append("]");
378                 }
379             }
380         }
381         assertFalse("Incorrect output for checkCopysignFloat4Float4Float4" +
382                 (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
383     }
384 
385     public class ArgumentsHalfHalfHalf {
386         public short inMagnitudeValue;
387         public double inMagnitudeValueDouble;
388         public short inSignValue;
389         public double inSignValueDouble;
390         public Target.Floaty out;
391     }
392 
checkCopysignHalfHalfHalf()393     private void checkCopysignHalfHalfHalf() {
394         Allocation inMagnitudeValue = createRandomAllocation(mRS, Element.DataType.FLOAT_16, 1, 0x8e7128339e87c031l, false);
395         Allocation inSignValue = createRandomAllocation(mRS, Element.DataType.FLOAT_16, 1, 0x366d1274523236fcl, false);
396         try {
397             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_16, 1), INPUTSIZE);
398             script.set_gAllocInSignValue(inSignValue);
399             script.forEach_testCopysignHalfHalfHalf(inMagnitudeValue, out);
400             verifyResultsCopysignHalfHalfHalf(inMagnitudeValue, inSignValue, out, false);
401             out.destroy();
402         } catch (Exception e) {
403             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testCopysignHalfHalfHalf: " + e.toString());
404         }
405         try {
406             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_16, 1), INPUTSIZE);
407             scriptRelaxed.set_gAllocInSignValue(inSignValue);
408             scriptRelaxed.forEach_testCopysignHalfHalfHalf(inMagnitudeValue, out);
409             verifyResultsCopysignHalfHalfHalf(inMagnitudeValue, inSignValue, out, true);
410             out.destroy();
411         } catch (Exception e) {
412             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testCopysignHalfHalfHalf: " + e.toString());
413         }
414         inMagnitudeValue.destroy();
415         inSignValue.destroy();
416     }
417 
verifyResultsCopysignHalfHalfHalf(Allocation inMagnitudeValue, Allocation inSignValue, Allocation out, boolean relaxed)418     private void verifyResultsCopysignHalfHalfHalf(Allocation inMagnitudeValue, Allocation inSignValue, Allocation out, boolean relaxed) {
419         short[] arrayInMagnitudeValue = new short[INPUTSIZE * 1];
420         Arrays.fill(arrayInMagnitudeValue, (short) 42);
421         inMagnitudeValue.copyTo(arrayInMagnitudeValue);
422         short[] arrayInSignValue = new short[INPUTSIZE * 1];
423         Arrays.fill(arrayInSignValue, (short) 42);
424         inSignValue.copyTo(arrayInSignValue);
425         short[] arrayOut = new short[INPUTSIZE * 1];
426         Arrays.fill(arrayOut, (short) 42);
427         out.copyTo(arrayOut);
428         StringBuilder message = new StringBuilder();
429         boolean errorFound = false;
430         for (int i = 0; i < INPUTSIZE; i++) {
431             for (int j = 0; j < 1 ; j++) {
432                 // Extract the inputs.
433                 ArgumentsHalfHalfHalf args = new ArgumentsHalfHalfHalf();
434                 args.inMagnitudeValue = arrayInMagnitudeValue[i];
435                 args.inMagnitudeValueDouble = Float16Utils.convertFloat16ToDouble(args.inMagnitudeValue);
436                 args.inSignValue = arrayInSignValue[i];
437                 args.inSignValueDouble = Float16Utils.convertFloat16ToDouble(args.inSignValue);
438                 // Figure out what the outputs should have been.
439                 Target target = new Target(Target.FunctionType.NORMAL, Target.ReturnType.HALF, relaxed);
440                 CoreMathVerifier.computeCopysign(args, target);
441                 // Validate the outputs.
442                 boolean valid = true;
443                 if (!args.out.couldBe(Float16Utils.convertFloat16ToDouble(arrayOut[i * 1 + j]))) {
444                     valid = false;
445                 }
446                 if (!valid) {
447                     if (!errorFound) {
448                         errorFound = true;
449                         message.append("Input inMagnitudeValue: ");
450                         appendVariableToMessage(message, args.inMagnitudeValue);
451                         message.append("\n");
452                         message.append("Input inSignValue: ");
453                         appendVariableToMessage(message, args.inSignValue);
454                         message.append("\n");
455                         message.append("Expected output out: ");
456                         appendVariableToMessage(message, args.out);
457                         message.append("\n");
458                         message.append("Actual   output out: ");
459                         appendVariableToMessage(message, arrayOut[i * 1 + j]);
460                         message.append("\n");
461                         message.append("Actual   output out (in double): ");
462                         appendVariableToMessage(message, Float16Utils.convertFloat16ToDouble(arrayOut[i * 1 + j]));
463                         if (!args.out.couldBe(Float16Utils.convertFloat16ToDouble(arrayOut[i * 1 + j]))) {
464                             message.append(" FAIL");
465                         }
466                         message.append("\n");
467                         message.append("Errors at");
468                     }
469                     message.append(" [");
470                     message.append(Integer.toString(i));
471                     message.append(", ");
472                     message.append(Integer.toString(j));
473                     message.append("]");
474                 }
475             }
476         }
477         assertFalse("Incorrect output for checkCopysignHalfHalfHalf" +
478                 (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
479     }
480 
checkCopysignHalf2Half2Half2()481     private void checkCopysignHalf2Half2Half2() {
482         Allocation inMagnitudeValue = createRandomAllocation(mRS, Element.DataType.FLOAT_16, 2, 0x5b9a5dd65c704fabl, false);
483         Allocation inSignValue = createRandomAllocation(mRS, Element.DataType.FLOAT_16, 2, 0xa119f9e5a73ce4cal, false);
484         try {
485             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_16, 2), INPUTSIZE);
486             script.set_gAllocInSignValue(inSignValue);
487             script.forEach_testCopysignHalf2Half2Half2(inMagnitudeValue, out);
488             verifyResultsCopysignHalf2Half2Half2(inMagnitudeValue, inSignValue, out, false);
489             out.destroy();
490         } catch (Exception e) {
491             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testCopysignHalf2Half2Half2: " + e.toString());
492         }
493         try {
494             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_16, 2), INPUTSIZE);
495             scriptRelaxed.set_gAllocInSignValue(inSignValue);
496             scriptRelaxed.forEach_testCopysignHalf2Half2Half2(inMagnitudeValue, out);
497             verifyResultsCopysignHalf2Half2Half2(inMagnitudeValue, inSignValue, out, true);
498             out.destroy();
499         } catch (Exception e) {
500             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testCopysignHalf2Half2Half2: " + e.toString());
501         }
502         inMagnitudeValue.destroy();
503         inSignValue.destroy();
504     }
505 
verifyResultsCopysignHalf2Half2Half2(Allocation inMagnitudeValue, Allocation inSignValue, Allocation out, boolean relaxed)506     private void verifyResultsCopysignHalf2Half2Half2(Allocation inMagnitudeValue, Allocation inSignValue, Allocation out, boolean relaxed) {
507         short[] arrayInMagnitudeValue = new short[INPUTSIZE * 2];
508         Arrays.fill(arrayInMagnitudeValue, (short) 42);
509         inMagnitudeValue.copyTo(arrayInMagnitudeValue);
510         short[] arrayInSignValue = new short[INPUTSIZE * 2];
511         Arrays.fill(arrayInSignValue, (short) 42);
512         inSignValue.copyTo(arrayInSignValue);
513         short[] arrayOut = new short[INPUTSIZE * 2];
514         Arrays.fill(arrayOut, (short) 42);
515         out.copyTo(arrayOut);
516         StringBuilder message = new StringBuilder();
517         boolean errorFound = false;
518         for (int i = 0; i < INPUTSIZE; i++) {
519             for (int j = 0; j < 2 ; j++) {
520                 // Extract the inputs.
521                 ArgumentsHalfHalfHalf args = new ArgumentsHalfHalfHalf();
522                 args.inMagnitudeValue = arrayInMagnitudeValue[i * 2 + j];
523                 args.inMagnitudeValueDouble = Float16Utils.convertFloat16ToDouble(args.inMagnitudeValue);
524                 args.inSignValue = arrayInSignValue[i * 2 + j];
525                 args.inSignValueDouble = Float16Utils.convertFloat16ToDouble(args.inSignValue);
526                 // Figure out what the outputs should have been.
527                 Target target = new Target(Target.FunctionType.NORMAL, Target.ReturnType.HALF, relaxed);
528                 CoreMathVerifier.computeCopysign(args, target);
529                 // Validate the outputs.
530                 boolean valid = true;
531                 if (!args.out.couldBe(Float16Utils.convertFloat16ToDouble(arrayOut[i * 2 + j]))) {
532                     valid = false;
533                 }
534                 if (!valid) {
535                     if (!errorFound) {
536                         errorFound = true;
537                         message.append("Input inMagnitudeValue: ");
538                         appendVariableToMessage(message, args.inMagnitudeValue);
539                         message.append("\n");
540                         message.append("Input inSignValue: ");
541                         appendVariableToMessage(message, args.inSignValue);
542                         message.append("\n");
543                         message.append("Expected output out: ");
544                         appendVariableToMessage(message, args.out);
545                         message.append("\n");
546                         message.append("Actual   output out: ");
547                         appendVariableToMessage(message, arrayOut[i * 2 + j]);
548                         message.append("\n");
549                         message.append("Actual   output out (in double): ");
550                         appendVariableToMessage(message, Float16Utils.convertFloat16ToDouble(arrayOut[i * 2 + j]));
551                         if (!args.out.couldBe(Float16Utils.convertFloat16ToDouble(arrayOut[i * 2 + j]))) {
552                             message.append(" FAIL");
553                         }
554                         message.append("\n");
555                         message.append("Errors at");
556                     }
557                     message.append(" [");
558                     message.append(Integer.toString(i));
559                     message.append(", ");
560                     message.append(Integer.toString(j));
561                     message.append("]");
562                 }
563             }
564         }
565         assertFalse("Incorrect output for checkCopysignHalf2Half2Half2" +
566                 (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
567     }
568 
checkCopysignHalf3Half3Half3()569     private void checkCopysignHalf3Half3Half3() {
570         Allocation inMagnitudeValue = createRandomAllocation(mRS, Element.DataType.FLOAT_16, 3, 0x13bcaf2d038955c0l, false);
571         Allocation inSignValue = createRandomAllocation(mRS, Element.DataType.FLOAT_16, 3, 0x5bb8caf4f2af1539l, false);
572         try {
573             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_16, 3), INPUTSIZE);
574             script.set_gAllocInSignValue(inSignValue);
575             script.forEach_testCopysignHalf3Half3Half3(inMagnitudeValue, out);
576             verifyResultsCopysignHalf3Half3Half3(inMagnitudeValue, inSignValue, out, false);
577             out.destroy();
578         } catch (Exception e) {
579             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testCopysignHalf3Half3Half3: " + e.toString());
580         }
581         try {
582             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_16, 3), INPUTSIZE);
583             scriptRelaxed.set_gAllocInSignValue(inSignValue);
584             scriptRelaxed.forEach_testCopysignHalf3Half3Half3(inMagnitudeValue, out);
585             verifyResultsCopysignHalf3Half3Half3(inMagnitudeValue, inSignValue, out, true);
586             out.destroy();
587         } catch (Exception e) {
588             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testCopysignHalf3Half3Half3: " + e.toString());
589         }
590         inMagnitudeValue.destroy();
591         inSignValue.destroy();
592     }
593 
verifyResultsCopysignHalf3Half3Half3(Allocation inMagnitudeValue, Allocation inSignValue, Allocation out, boolean relaxed)594     private void verifyResultsCopysignHalf3Half3Half3(Allocation inMagnitudeValue, Allocation inSignValue, Allocation out, boolean relaxed) {
595         short[] arrayInMagnitudeValue = new short[INPUTSIZE * 4];
596         Arrays.fill(arrayInMagnitudeValue, (short) 42);
597         inMagnitudeValue.copyTo(arrayInMagnitudeValue);
598         short[] arrayInSignValue = new short[INPUTSIZE * 4];
599         Arrays.fill(arrayInSignValue, (short) 42);
600         inSignValue.copyTo(arrayInSignValue);
601         short[] arrayOut = new short[INPUTSIZE * 4];
602         Arrays.fill(arrayOut, (short) 42);
603         out.copyTo(arrayOut);
604         StringBuilder message = new StringBuilder();
605         boolean errorFound = false;
606         for (int i = 0; i < INPUTSIZE; i++) {
607             for (int j = 0; j < 3 ; j++) {
608                 // Extract the inputs.
609                 ArgumentsHalfHalfHalf args = new ArgumentsHalfHalfHalf();
610                 args.inMagnitudeValue = arrayInMagnitudeValue[i * 4 + j];
611                 args.inMagnitudeValueDouble = Float16Utils.convertFloat16ToDouble(args.inMagnitudeValue);
612                 args.inSignValue = arrayInSignValue[i * 4 + j];
613                 args.inSignValueDouble = Float16Utils.convertFloat16ToDouble(args.inSignValue);
614                 // Figure out what the outputs should have been.
615                 Target target = new Target(Target.FunctionType.NORMAL, Target.ReturnType.HALF, relaxed);
616                 CoreMathVerifier.computeCopysign(args, target);
617                 // Validate the outputs.
618                 boolean valid = true;
619                 if (!args.out.couldBe(Float16Utils.convertFloat16ToDouble(arrayOut[i * 4 + j]))) {
620                     valid = false;
621                 }
622                 if (!valid) {
623                     if (!errorFound) {
624                         errorFound = true;
625                         message.append("Input inMagnitudeValue: ");
626                         appendVariableToMessage(message, args.inMagnitudeValue);
627                         message.append("\n");
628                         message.append("Input inSignValue: ");
629                         appendVariableToMessage(message, args.inSignValue);
630                         message.append("\n");
631                         message.append("Expected output out: ");
632                         appendVariableToMessage(message, args.out);
633                         message.append("\n");
634                         message.append("Actual   output out: ");
635                         appendVariableToMessage(message, arrayOut[i * 4 + j]);
636                         message.append("\n");
637                         message.append("Actual   output out (in double): ");
638                         appendVariableToMessage(message, Float16Utils.convertFloat16ToDouble(arrayOut[i * 4 + j]));
639                         if (!args.out.couldBe(Float16Utils.convertFloat16ToDouble(arrayOut[i * 4 + j]))) {
640                             message.append(" FAIL");
641                         }
642                         message.append("\n");
643                         message.append("Errors at");
644                     }
645                     message.append(" [");
646                     message.append(Integer.toString(i));
647                     message.append(", ");
648                     message.append(Integer.toString(j));
649                     message.append("]");
650                 }
651             }
652         }
653         assertFalse("Incorrect output for checkCopysignHalf3Half3Half3" +
654                 (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
655     }
656 
checkCopysignHalf4Half4Half4()657     private void checkCopysignHalf4Half4Half4() {
658         Allocation inMagnitudeValue = createRandomAllocation(mRS, Element.DataType.FLOAT_16, 4, 0xcbdf0083aaa25bd5l, false);
659         Allocation inSignValue = createRandomAllocation(mRS, Element.DataType.FLOAT_16, 4, 0x16579c043e2145a8l, false);
660         try {
661             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_16, 4), INPUTSIZE);
662             script.set_gAllocInSignValue(inSignValue);
663             script.forEach_testCopysignHalf4Half4Half4(inMagnitudeValue, out);
664             verifyResultsCopysignHalf4Half4Half4(inMagnitudeValue, inSignValue, out, false);
665             out.destroy();
666         } catch (Exception e) {
667             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testCopysignHalf4Half4Half4: " + e.toString());
668         }
669         try {
670             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_16, 4), INPUTSIZE);
671             scriptRelaxed.set_gAllocInSignValue(inSignValue);
672             scriptRelaxed.forEach_testCopysignHalf4Half4Half4(inMagnitudeValue, out);
673             verifyResultsCopysignHalf4Half4Half4(inMagnitudeValue, inSignValue, out, true);
674             out.destroy();
675         } catch (Exception e) {
676             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testCopysignHalf4Half4Half4: " + e.toString());
677         }
678         inMagnitudeValue.destroy();
679         inSignValue.destroy();
680     }
681 
verifyResultsCopysignHalf4Half4Half4(Allocation inMagnitudeValue, Allocation inSignValue, Allocation out, boolean relaxed)682     private void verifyResultsCopysignHalf4Half4Half4(Allocation inMagnitudeValue, Allocation inSignValue, Allocation out, boolean relaxed) {
683         short[] arrayInMagnitudeValue = new short[INPUTSIZE * 4];
684         Arrays.fill(arrayInMagnitudeValue, (short) 42);
685         inMagnitudeValue.copyTo(arrayInMagnitudeValue);
686         short[] arrayInSignValue = new short[INPUTSIZE * 4];
687         Arrays.fill(arrayInSignValue, (short) 42);
688         inSignValue.copyTo(arrayInSignValue);
689         short[] arrayOut = new short[INPUTSIZE * 4];
690         Arrays.fill(arrayOut, (short) 42);
691         out.copyTo(arrayOut);
692         StringBuilder message = new StringBuilder();
693         boolean errorFound = false;
694         for (int i = 0; i < INPUTSIZE; i++) {
695             for (int j = 0; j < 4 ; j++) {
696                 // Extract the inputs.
697                 ArgumentsHalfHalfHalf args = new ArgumentsHalfHalfHalf();
698                 args.inMagnitudeValue = arrayInMagnitudeValue[i * 4 + j];
699                 args.inMagnitudeValueDouble = Float16Utils.convertFloat16ToDouble(args.inMagnitudeValue);
700                 args.inSignValue = arrayInSignValue[i * 4 + j];
701                 args.inSignValueDouble = Float16Utils.convertFloat16ToDouble(args.inSignValue);
702                 // Figure out what the outputs should have been.
703                 Target target = new Target(Target.FunctionType.NORMAL, Target.ReturnType.HALF, relaxed);
704                 CoreMathVerifier.computeCopysign(args, target);
705                 // Validate the outputs.
706                 boolean valid = true;
707                 if (!args.out.couldBe(Float16Utils.convertFloat16ToDouble(arrayOut[i * 4 + j]))) {
708                     valid = false;
709                 }
710                 if (!valid) {
711                     if (!errorFound) {
712                         errorFound = true;
713                         message.append("Input inMagnitudeValue: ");
714                         appendVariableToMessage(message, args.inMagnitudeValue);
715                         message.append("\n");
716                         message.append("Input inSignValue: ");
717                         appendVariableToMessage(message, args.inSignValue);
718                         message.append("\n");
719                         message.append("Expected output out: ");
720                         appendVariableToMessage(message, args.out);
721                         message.append("\n");
722                         message.append("Actual   output out: ");
723                         appendVariableToMessage(message, arrayOut[i * 4 + j]);
724                         message.append("\n");
725                         message.append("Actual   output out (in double): ");
726                         appendVariableToMessage(message, Float16Utils.convertFloat16ToDouble(arrayOut[i * 4 + j]));
727                         if (!args.out.couldBe(Float16Utils.convertFloat16ToDouble(arrayOut[i * 4 + j]))) {
728                             message.append(" FAIL");
729                         }
730                         message.append("\n");
731                         message.append("Errors at");
732                     }
733                     message.append(" [");
734                     message.append(Integer.toString(i));
735                     message.append(", ");
736                     message.append(Integer.toString(j));
737                     message.append("]");
738                 }
739             }
740         }
741         assertFalse("Incorrect output for checkCopysignHalf4Half4Half4" +
742                 (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
743     }
744 
testCopysign()745     public void testCopysign() {
746         checkCopysignFloatFloatFloat();
747         checkCopysignFloat2Float2Float2();
748         checkCopysignFloat3Float3Float3();
749         checkCopysignFloat4Float4Float4();
750         checkCopysignHalfHalfHalf();
751         checkCopysignHalf2Half2Half2();
752         checkCopysignHalf3Half3Half3();
753         checkCopysignHalf4Half4Half4();
754     }
755 }
756