Home | History | Annotate | Download | only in generated
      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 TestNativeDistance extends RSBaseCompute {
     29 
     30     private ScriptC_TestNativeDistance script;
     31     private ScriptC_TestNativeDistanceRelaxed scriptRelaxed;
     32 
     33     @Override
     34     protected void setUp() throws Exception {
     35         super.setUp();
     36         script = new ScriptC_TestNativeDistance(mRS);
     37         scriptRelaxed = new ScriptC_TestNativeDistanceRelaxed(mRS);
     38     }
     39 
     40     @Override
     41     protected void tearDown() throws Exception {
     42         script.destroy();
     43         scriptRelaxed.destroy();
     44         super.tearDown();
     45     }
     46 
     47     public class ArgumentsFloatFloatFloat {
     48         public float inLeftVector;
     49         public float inRightVector;
     50         public Target.Floaty out;
     51     }
     52 
     53     private void checkNativeDistanceFloatFloatFloat() {
     54         Allocation inLeftVector = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 1, 0xb61d5ec530ae2337l, false);
     55         Allocation inRightVector = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 1, 0x98c2c48c9b58b3c2l, false);
     56         try {
     57             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 1), INPUTSIZE);
     58             script.set_gAllocInRightVector(inRightVector);
     59             script.forEach_testNativeDistanceFloatFloatFloat(inLeftVector, out);
     60             verifyResultsNativeDistanceFloatFloatFloat(inLeftVector, inRightVector, out, false);
     61             out.destroy();
     62         } catch (Exception e) {
     63             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testNativeDistanceFloatFloatFloat: " + e.toString());
     64         }
     65         try {
     66             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 1), INPUTSIZE);
     67             scriptRelaxed.set_gAllocInRightVector(inRightVector);
     68             scriptRelaxed.forEach_testNativeDistanceFloatFloatFloat(inLeftVector, out);
     69             verifyResultsNativeDistanceFloatFloatFloat(inLeftVector, inRightVector, out, true);
     70             out.destroy();
     71         } catch (Exception e) {
     72             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testNativeDistanceFloatFloatFloat: " + e.toString());
     73         }
     74         inLeftVector.destroy();
     75         inRightVector.destroy();
     76     }
     77 
     78     private void verifyResultsNativeDistanceFloatFloatFloat(Allocation inLeftVector, Allocation inRightVector, Allocation out, boolean relaxed) {
     79         float[] arrayInLeftVector = new float[INPUTSIZE * 1];
     80         Arrays.fill(arrayInLeftVector, (float) 42);
     81         inLeftVector.copyTo(arrayInLeftVector);
     82         float[] arrayInRightVector = new float[INPUTSIZE * 1];
     83         Arrays.fill(arrayInRightVector, (float) 42);
     84         inRightVector.copyTo(arrayInRightVector);
     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             ArgumentsFloatFloatFloat args = new ArgumentsFloatFloatFloat();
     92             // Create the appropriate sized arrays in args
     93             // Fill args with the input values
     94             args.inLeftVector = arrayInLeftVector[i];
     95             args.inRightVector = arrayInRightVector[i];
     96             Target target = new Target(Target.FunctionType.NATIVE, Target.ReturnType.FLOAT, relaxed);
     97             CoreMathVerifier.computeNativeDistance(args, target);
     98 
     99             // Compare the expected outputs to the actual values returned by RS.
    100             boolean valid = true;
    101             if (!args.out.couldBe(arrayOut[i])) {
    102                 valid = false;
    103             }
    104             if (!valid) {
    105                 if (!errorFound) {
    106                     errorFound = true;
    107                     message.append("Input inLeftVector: ");
    108                     appendVariableToMessage(message, arrayInLeftVector[i]);
    109                     message.append("\n");
    110                     message.append("Input inRightVector: ");
    111                     appendVariableToMessage(message, arrayInRightVector[i]);
    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]);
    118                     if (!args.out.couldBe(arrayOut[i])) {
    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             }
    128         }
    129         assertFalse("Incorrect output for checkNativeDistanceFloatFloatFloat" +
    130                 (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
    131     }
    132 
    133     public class ArgumentsFloatNFloatNFloat {
    134         public float[] inLeftVector;
    135         public float[] inRightVector;
    136         public Target.Floaty out;
    137     }
    138 
    139     private void checkNativeDistanceFloat2Float2Float() {
    140         Allocation inLeftVector = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 2, 0xef86e1d727286713l, false);
    141         Allocation inRightVector = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 2, 0x3d7bc89101e219b6l, false);
    142         try {
    143             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 1), INPUTSIZE);
    144             script.set_gAllocInRightVector(inRightVector);
    145             script.forEach_testNativeDistanceFloat2Float2Float(inLeftVector, out);
    146             verifyResultsNativeDistanceFloat2Float2Float(inLeftVector, inRightVector, out, false);
    147             out.destroy();
    148         } catch (Exception e) {
    149             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testNativeDistanceFloat2Float2Float: " + e.toString());
    150         }
    151         try {
    152             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 1), INPUTSIZE);
    153             scriptRelaxed.set_gAllocInRightVector(inRightVector);
    154             scriptRelaxed.forEach_testNativeDistanceFloat2Float2Float(inLeftVector, out);
    155             verifyResultsNativeDistanceFloat2Float2Float(inLeftVector, inRightVector, out, true);
    156             out.destroy();
    157         } catch (Exception e) {
    158             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testNativeDistanceFloat2Float2Float: " + e.toString());
    159         }
    160         inLeftVector.destroy();
    161         inRightVector.destroy();
    162     }
    163 
    164     private void verifyResultsNativeDistanceFloat2Float2Float(Allocation inLeftVector, Allocation inRightVector, Allocation out, boolean relaxed) {
    165         float[] arrayInLeftVector = new float[INPUTSIZE * 2];
    166         Arrays.fill(arrayInLeftVector, (float) 42);
    167         inLeftVector.copyTo(arrayInLeftVector);
    168         float[] arrayInRightVector = new float[INPUTSIZE * 2];
    169         Arrays.fill(arrayInRightVector, (float) 42);
    170         inRightVector.copyTo(arrayInRightVector);
    171         float[] arrayOut = new float[INPUTSIZE * 1];
    172         Arrays.fill(arrayOut, (float) 42);
    173         out.copyTo(arrayOut);
    174         StringBuilder message = new StringBuilder();
    175         boolean errorFound = false;
    176         for (int i = 0; i < INPUTSIZE; i++) {
    177             ArgumentsFloatNFloatNFloat args = new ArgumentsFloatNFloatNFloat();
    178             // Create the appropriate sized arrays in args
    179             args.inLeftVector = new float[2];
    180             args.inRightVector = new float[2];
    181             // Fill args with the input values
    182             for (int j = 0; j < 2 ; j++) {
    183                 args.inLeftVector[j] = arrayInLeftVector[i * 2 + j];
    184             }
    185             for (int j = 0; j < 2 ; j++) {
    186                 args.inRightVector[j] = arrayInRightVector[i * 2 + j];
    187             }
    188             Target target = new Target(Target.FunctionType.NATIVE, Target.ReturnType.FLOAT, relaxed);
    189             CoreMathVerifier.computeNativeDistance(args, target);
    190 
    191             // Compare the expected outputs to the actual values returned by RS.
    192             boolean valid = true;
    193             if (!args.out.couldBe(arrayOut[i])) {
    194                 valid = false;
    195             }
    196             if (!valid) {
    197                 if (!errorFound) {
    198                     errorFound = true;
    199                     for (int j = 0; j < 2 ; j++) {
    200                         message.append("Input inLeftVector: ");
    201                         appendVariableToMessage(message, arrayInLeftVector[i * 2 + j]);
    202                         message.append("\n");
    203                     }
    204                     for (int j = 0; j < 2 ; j++) {
    205                         message.append("Input inRightVector: ");
    206                         appendVariableToMessage(message, arrayInRightVector[i * 2 + j]);
    207                         message.append("\n");
    208                     }
    209                     message.append("Expected output out: ");
    210                     appendVariableToMessage(message, args.out);
    211                     message.append("\n");
    212                     message.append("Actual   output out: ");
    213                     appendVariableToMessage(message, arrayOut[i]);
    214                     if (!args.out.couldBe(arrayOut[i])) {
    215                         message.append(" FAIL");
    216                     }
    217                     message.append("\n");
    218                     message.append("Errors at");
    219                 }
    220                 message.append(" [");
    221                 message.append(Integer.toString(i));
    222                 message.append("]");
    223             }
    224         }
    225         assertFalse("Incorrect output for checkNativeDistanceFloat2Float2Float" +
    226                 (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
    227     }
    228 
    229     private void checkNativeDistanceFloat3Float3Float() {
    230         Allocation inLeftVector = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 3, 0xbe30075548c71b61l, false);
    231         Allocation inRightVector = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 3, 0xf3e514c0a78a62d0l, false);
    232         try {
    233             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 1), INPUTSIZE);
    234             script.set_gAllocInRightVector(inRightVector);
    235             script.forEach_testNativeDistanceFloat3Float3Float(inLeftVector, out);
    236             verifyResultsNativeDistanceFloat3Float3Float(inLeftVector, inRightVector, out, false);
    237             out.destroy();
    238         } catch (Exception e) {
    239             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testNativeDistanceFloat3Float3Float: " + e.toString());
    240         }
    241         try {
    242             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 1), INPUTSIZE);
    243             scriptRelaxed.set_gAllocInRightVector(inRightVector);
    244             scriptRelaxed.forEach_testNativeDistanceFloat3Float3Float(inLeftVector, out);
    245             verifyResultsNativeDistanceFloat3Float3Float(inLeftVector, inRightVector, out, true);
    246             out.destroy();
    247         } catch (Exception e) {
    248             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testNativeDistanceFloat3Float3Float: " + e.toString());
    249         }
    250         inLeftVector.destroy();
    251         inRightVector.destroy();
    252     }
    253 
    254     private void verifyResultsNativeDistanceFloat3Float3Float(Allocation inLeftVector, Allocation inRightVector, Allocation out, boolean relaxed) {
    255         float[] arrayInLeftVector = new float[INPUTSIZE * 4];
    256         Arrays.fill(arrayInLeftVector, (float) 42);
    257         inLeftVector.copyTo(arrayInLeftVector);
    258         float[] arrayInRightVector = new float[INPUTSIZE * 4];
    259         Arrays.fill(arrayInRightVector, (float) 42);
    260         inRightVector.copyTo(arrayInRightVector);
    261         float[] arrayOut = new float[INPUTSIZE * 1];
    262         Arrays.fill(arrayOut, (float) 42);
    263         out.copyTo(arrayOut);
    264         StringBuilder message = new StringBuilder();
    265         boolean errorFound = false;
    266         for (int i = 0; i < INPUTSIZE; i++) {
    267             ArgumentsFloatNFloatNFloat args = new ArgumentsFloatNFloatNFloat();
    268             // Create the appropriate sized arrays in args
    269             args.inLeftVector = new float[3];
    270             args.inRightVector = new float[3];
    271             // Fill args with the input values
    272             for (int j = 0; j < 3 ; j++) {
    273                 args.inLeftVector[j] = arrayInLeftVector[i * 4 + j];
    274             }
    275             for (int j = 0; j < 3 ; j++) {
    276                 args.inRightVector[j] = arrayInRightVector[i * 4 + j];
    277             }
    278             Target target = new Target(Target.FunctionType.NATIVE, Target.ReturnType.FLOAT, relaxed);
    279             CoreMathVerifier.computeNativeDistance(args, target);
    280 
    281             // Compare the expected outputs to the actual values returned by RS.
    282             boolean valid = true;
    283             if (!args.out.couldBe(arrayOut[i])) {
    284                 valid = false;
    285             }
    286             if (!valid) {
    287                 if (!errorFound) {
    288                     errorFound = true;
    289                     for (int j = 0; j < 3 ; j++) {
    290                         message.append("Input inLeftVector: ");
    291                         appendVariableToMessage(message, arrayInLeftVector[i * 4 + j]);
    292                         message.append("\n");
    293                     }
    294                     for (int j = 0; j < 3 ; j++) {
    295                         message.append("Input inRightVector: ");
    296                         appendVariableToMessage(message, arrayInRightVector[i * 4 + j]);
    297                         message.append("\n");
    298                     }
    299                     message.append("Expected output out: ");
    300                     appendVariableToMessage(message, args.out);
    301                     message.append("\n");
    302                     message.append("Actual   output out: ");
    303                     appendVariableToMessage(message, arrayOut[i]);
    304                     if (!args.out.couldBe(arrayOut[i])) {
    305                         message.append(" FAIL");
    306                     }
    307                     message.append("\n");
    308                     message.append("Errors at");
    309                 }
    310                 message.append(" [");
    311                 message.append(Integer.toString(i));
    312                 message.append("]");
    313             }
    314         }
    315         assertFalse("Incorrect output for checkNativeDistanceFloat3Float3Float" +
    316                 (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
    317     }
    318 
    319     private void checkNativeDistanceFloat4Float4Float() {
    320         Allocation inLeftVector = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 4, 0x8cd92cd36a65cfafl, false);
    321         Allocation inRightVector = createRandomAllocation(mRS, Element.DataType.FLOAT_32, 4, 0xaa4e60f04d32abeal, false);
    322         try {
    323             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 1), INPUTSIZE);
    324             script.set_gAllocInRightVector(inRightVector);
    325             script.forEach_testNativeDistanceFloat4Float4Float(inLeftVector, out);
    326             verifyResultsNativeDistanceFloat4Float4Float(inLeftVector, inRightVector, out, false);
    327             out.destroy();
    328         } catch (Exception e) {
    329             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testNativeDistanceFloat4Float4Float: " + e.toString());
    330         }
    331         try {
    332             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_32, 1), INPUTSIZE);
    333             scriptRelaxed.set_gAllocInRightVector(inRightVector);
    334             scriptRelaxed.forEach_testNativeDistanceFloat4Float4Float(inLeftVector, out);
    335             verifyResultsNativeDistanceFloat4Float4Float(inLeftVector, inRightVector, out, true);
    336             out.destroy();
    337         } catch (Exception e) {
    338             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testNativeDistanceFloat4Float4Float: " + e.toString());
    339         }
    340         inLeftVector.destroy();
    341         inRightVector.destroy();
    342     }
    343 
    344     private void verifyResultsNativeDistanceFloat4Float4Float(Allocation inLeftVector, Allocation inRightVector, Allocation out, boolean relaxed) {
    345         float[] arrayInLeftVector = new float[INPUTSIZE * 4];
    346         Arrays.fill(arrayInLeftVector, (float) 42);
    347         inLeftVector.copyTo(arrayInLeftVector);
    348         float[] arrayInRightVector = new float[INPUTSIZE * 4];
    349         Arrays.fill(arrayInRightVector, (float) 42);
    350         inRightVector.copyTo(arrayInRightVector);
    351         float[] arrayOut = new float[INPUTSIZE * 1];
    352         Arrays.fill(arrayOut, (float) 42);
    353         out.copyTo(arrayOut);
    354         StringBuilder message = new StringBuilder();
    355         boolean errorFound = false;
    356         for (int i = 0; i < INPUTSIZE; i++) {
    357             ArgumentsFloatNFloatNFloat args = new ArgumentsFloatNFloatNFloat();
    358             // Create the appropriate sized arrays in args
    359             args.inLeftVector = new float[4];
    360             args.inRightVector = new float[4];
    361             // Fill args with the input values
    362             for (int j = 0; j < 4 ; j++) {
    363                 args.inLeftVector[j] = arrayInLeftVector[i * 4 + j];
    364             }
    365             for (int j = 0; j < 4 ; j++) {
    366                 args.inRightVector[j] = arrayInRightVector[i * 4 + j];
    367             }
    368             Target target = new Target(Target.FunctionType.NATIVE, Target.ReturnType.FLOAT, relaxed);
    369             CoreMathVerifier.computeNativeDistance(args, target);
    370 
    371             // Compare the expected outputs to the actual values returned by RS.
    372             boolean valid = true;
    373             if (!args.out.couldBe(arrayOut[i])) {
    374                 valid = false;
    375             }
    376             if (!valid) {
    377                 if (!errorFound) {
    378                     errorFound = true;
    379                     for (int j = 0; j < 4 ; j++) {
    380                         message.append("Input inLeftVector: ");
    381                         appendVariableToMessage(message, arrayInLeftVector[i * 4 + j]);
    382                         message.append("\n");
    383                     }
    384                     for (int j = 0; j < 4 ; j++) {
    385                         message.append("Input inRightVector: ");
    386                         appendVariableToMessage(message, arrayInRightVector[i * 4 + j]);
    387                         message.append("\n");
    388                     }
    389                     message.append("Expected output out: ");
    390                     appendVariableToMessage(message, args.out);
    391                     message.append("\n");
    392                     message.append("Actual   output out: ");
    393                     appendVariableToMessage(message, arrayOut[i]);
    394                     if (!args.out.couldBe(arrayOut[i])) {
    395                         message.append(" FAIL");
    396                     }
    397                     message.append("\n");
    398                     message.append("Errors at");
    399                 }
    400                 message.append(" [");
    401                 message.append(Integer.toString(i));
    402                 message.append("]");
    403             }
    404         }
    405         assertFalse("Incorrect output for checkNativeDistanceFloat4Float4Float" +
    406                 (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
    407     }
    408 
    409     public class ArgumentsHalfHalfHalf {
    410         public short inLeftVector;
    411         public double inLeftVectorDouble;
    412         public short inRightVector;
    413         public double inRightVectorDouble;
    414         public Target.Floaty out;
    415     }
    416 
    417     private void checkNativeDistanceHalfHalfHalf() {
    418         Allocation inLeftVector = createRandomAllocation(mRS, Element.DataType.FLOAT_16, 1, 0x2682794a4093c950l, false);
    419         Allocation inRightVector = createRandomAllocation(mRS, Element.DataType.FLOAT_16, 1, 0x79be38e646eb99f5l, false);
    420         try {
    421             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_16, 1), INPUTSIZE);
    422             script.set_gAllocInRightVector(inRightVector);
    423             script.forEach_testNativeDistanceHalfHalfHalf(inLeftVector, out);
    424             verifyResultsNativeDistanceHalfHalfHalf(inLeftVector, inRightVector, out, false);
    425             out.destroy();
    426         } catch (Exception e) {
    427             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testNativeDistanceHalfHalfHalf: " + e.toString());
    428         }
    429         try {
    430             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_16, 1), INPUTSIZE);
    431             scriptRelaxed.set_gAllocInRightVector(inRightVector);
    432             scriptRelaxed.forEach_testNativeDistanceHalfHalfHalf(inLeftVector, out);
    433             verifyResultsNativeDistanceHalfHalfHalf(inLeftVector, inRightVector, out, true);
    434             out.destroy();
    435         } catch (Exception e) {
    436             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testNativeDistanceHalfHalfHalf: " + e.toString());
    437         }
    438         inLeftVector.destroy();
    439         inRightVector.destroy();
    440     }
    441 
    442     private void verifyResultsNativeDistanceHalfHalfHalf(Allocation inLeftVector, Allocation inRightVector, Allocation out, boolean relaxed) {
    443         short[] arrayInLeftVector = new short[INPUTSIZE * 1];
    444         Arrays.fill(arrayInLeftVector, (short) 42);
    445         inLeftVector.copyTo(arrayInLeftVector);
    446         short[] arrayInRightVector = new short[INPUTSIZE * 1];
    447         Arrays.fill(arrayInRightVector, (short) 42);
    448         inRightVector.copyTo(arrayInRightVector);
    449         short[] arrayOut = new short[INPUTSIZE * 1];
    450         Arrays.fill(arrayOut, (short) 42);
    451         out.copyTo(arrayOut);
    452         StringBuilder message = new StringBuilder();
    453         boolean errorFound = false;
    454         for (int i = 0; i < INPUTSIZE; i++) {
    455             ArgumentsHalfHalfHalf args = new ArgumentsHalfHalfHalf();
    456             // Create the appropriate sized arrays in args
    457             // Fill args with the input values
    458             args.inLeftVector = arrayInLeftVector[i];
    459             args.inLeftVectorDouble = Float16Utils.convertFloat16ToDouble(args.inLeftVector);
    460             args.inRightVector = arrayInRightVector[i];
    461             args.inRightVectorDouble = Float16Utils.convertFloat16ToDouble(args.inRightVector);
    462             Target target = new Target(Target.FunctionType.NATIVE, Target.ReturnType.HALF, relaxed);
    463             CoreMathVerifier.computeNativeDistance(args, target);
    464 
    465             // Compare the expected outputs to the actual values returned by RS.
    466             boolean valid = true;
    467             if (!args.out.couldBe(Float16Utils.convertFloat16ToDouble(arrayOut[i]))) {
    468                 valid = false;
    469             }
    470             if (!valid) {
    471                 if (!errorFound) {
    472                     errorFound = true;
    473                     message.append("Input inLeftVector: ");
    474                     appendVariableToMessage(message, arrayInLeftVector[i]);
    475                     message.append("\n");
    476                     message.append("Input inRightVector: ");
    477                     appendVariableToMessage(message, arrayInRightVector[i]);
    478                     message.append("\n");
    479                     message.append("Expected output out: ");
    480                     appendVariableToMessage(message, args.out);
    481                     message.append("\n");
    482                     message.append("Actual   output out: ");
    483                     appendVariableToMessage(message, arrayOut[i]);
    484                     message.append("\n");
    485                     message.append("Actual   output out (in double): ");
    486                     appendVariableToMessage(message, Float16Utils.convertFloat16ToDouble(arrayOut[i]));
    487                     if (!args.out.couldBe(Float16Utils.convertFloat16ToDouble(arrayOut[i]))) {
    488                         message.append(" FAIL");
    489                     }
    490                     message.append("\n");
    491                     message.append("Errors at");
    492                 }
    493                 message.append(" [");
    494                 message.append(Integer.toString(i));
    495                 message.append("]");
    496             }
    497         }
    498         assertFalse("Incorrect output for checkNativeDistanceHalfHalfHalf" +
    499                 (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
    500     }
    501 
    502     public class ArgumentsHalfNHalfNHalf {
    503         public short[] inLeftVector;
    504         public double[] inLeftVectorDouble;
    505         public short[] inRightVector;
    506         public double[] inRightVectorDouble;
    507         public Target.Floaty out;
    508     }
    509 
    510     private void checkNativeDistanceHalf2Half2Half() {
    511         Allocation inLeftVector = createRandomAllocation(mRS, Element.DataType.FLOAT_16, 2, 0x928c0c6f0030493el, false);
    512         Allocation inRightVector = createRandomAllocation(mRS, Element.DataType.FLOAT_16, 2, 0x9f59f012763516efl, false);
    513         try {
    514             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_16, 1), INPUTSIZE);
    515             script.set_gAllocInRightVector(inRightVector);
    516             script.forEach_testNativeDistanceHalf2Half2Half(inLeftVector, out);
    517             verifyResultsNativeDistanceHalf2Half2Half(inLeftVector, inRightVector, out, false);
    518             out.destroy();
    519         } catch (Exception e) {
    520             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testNativeDistanceHalf2Half2Half: " + e.toString());
    521         }
    522         try {
    523             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_16, 1), INPUTSIZE);
    524             scriptRelaxed.set_gAllocInRightVector(inRightVector);
    525             scriptRelaxed.forEach_testNativeDistanceHalf2Half2Half(inLeftVector, out);
    526             verifyResultsNativeDistanceHalf2Half2Half(inLeftVector, inRightVector, out, true);
    527             out.destroy();
    528         } catch (Exception e) {
    529             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testNativeDistanceHalf2Half2Half: " + e.toString());
    530         }
    531         inLeftVector.destroy();
    532         inRightVector.destroy();
    533     }
    534 
    535     private void verifyResultsNativeDistanceHalf2Half2Half(Allocation inLeftVector, Allocation inRightVector, Allocation out, boolean relaxed) {
    536         short[] arrayInLeftVector = new short[INPUTSIZE * 2];
    537         Arrays.fill(arrayInLeftVector, (short) 42);
    538         inLeftVector.copyTo(arrayInLeftVector);
    539         short[] arrayInRightVector = new short[INPUTSIZE * 2];
    540         Arrays.fill(arrayInRightVector, (short) 42);
    541         inRightVector.copyTo(arrayInRightVector);
    542         short[] arrayOut = new short[INPUTSIZE * 1];
    543         Arrays.fill(arrayOut, (short) 42);
    544         out.copyTo(arrayOut);
    545         StringBuilder message = new StringBuilder();
    546         boolean errorFound = false;
    547         for (int i = 0; i < INPUTSIZE; i++) {
    548             ArgumentsHalfNHalfNHalf args = new ArgumentsHalfNHalfNHalf();
    549             // Create the appropriate sized arrays in args
    550             args.inLeftVector = new short[2];
    551             args.inLeftVectorDouble = new double[2];
    552             args.inRightVector = new short[2];
    553             args.inRightVectorDouble = new double[2];
    554             // Fill args with the input values
    555             for (int j = 0; j < 2 ; j++) {
    556                 args.inLeftVector[j] = arrayInLeftVector[i * 2 + j];
    557                 args.inLeftVectorDouble[j] = Float16Utils.convertFloat16ToDouble(args.inLeftVector[j]);
    558             }
    559             for (int j = 0; j < 2 ; j++) {
    560                 args.inRightVector[j] = arrayInRightVector[i * 2 + j];
    561                 args.inRightVectorDouble[j] = Float16Utils.convertFloat16ToDouble(args.inRightVector[j]);
    562             }
    563             Target target = new Target(Target.FunctionType.NATIVE, Target.ReturnType.HALF, relaxed);
    564             CoreMathVerifier.computeNativeDistance(args, target);
    565 
    566             // Compare the expected outputs to the actual values returned by RS.
    567             boolean valid = true;
    568             if (!args.out.couldBe(Float16Utils.convertFloat16ToDouble(arrayOut[i]))) {
    569                 valid = false;
    570             }
    571             if (!valid) {
    572                 if (!errorFound) {
    573                     errorFound = true;
    574                     for (int j = 0; j < 2 ; j++) {
    575                         message.append("Input inLeftVector: ");
    576                         appendVariableToMessage(message, arrayInLeftVector[i * 2 + j]);
    577                         message.append("\n");
    578                     }
    579                     for (int j = 0; j < 2 ; j++) {
    580                         message.append("Input inRightVector: ");
    581                         appendVariableToMessage(message, arrayInRightVector[i * 2 + j]);
    582                         message.append("\n");
    583                     }
    584                     message.append("Expected output out: ");
    585                     appendVariableToMessage(message, args.out);
    586                     message.append("\n");
    587                     message.append("Actual   output out: ");
    588                     appendVariableToMessage(message, arrayOut[i]);
    589                     message.append("\n");
    590                     message.append("Actual   output out (in double): ");
    591                     appendVariableToMessage(message, Float16Utils.convertFloat16ToDouble(arrayOut[i]));
    592                     if (!args.out.couldBe(Float16Utils.convertFloat16ToDouble(arrayOut[i]))) {
    593                         message.append(" FAIL");
    594                     }
    595                     message.append("\n");
    596                     message.append("Errors at");
    597                 }
    598                 message.append(" [");
    599                 message.append(Integer.toString(i));
    600                 message.append("]");
    601             }
    602         }
    603         assertFalse("Incorrect output for checkNativeDistanceHalf2Half2Half" +
    604                 (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
    605     }
    606 
    607     private void checkNativeDistanceHalf3Half3Half() {
    608         Allocation inLeftVector = createRandomAllocation(mRS, Element.DataType.FLOAT_16, 3, 0x404559c2ca7541fal, false);
    609         Allocation inRightVector = createRandomAllocation(mRS, Element.DataType.FLOAT_16, 3, 0xcd79ed256fcade83l, false);
    610         try {
    611             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_16, 1), INPUTSIZE);
    612             script.set_gAllocInRightVector(inRightVector);
    613             script.forEach_testNativeDistanceHalf3Half3Half(inLeftVector, out);
    614             verifyResultsNativeDistanceHalf3Half3Half(inLeftVector, inRightVector, out, false);
    615             out.destroy();
    616         } catch (Exception e) {
    617             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testNativeDistanceHalf3Half3Half: " + e.toString());
    618         }
    619         try {
    620             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_16, 1), INPUTSIZE);
    621             scriptRelaxed.set_gAllocInRightVector(inRightVector);
    622             scriptRelaxed.forEach_testNativeDistanceHalf3Half3Half(inLeftVector, out);
    623             verifyResultsNativeDistanceHalf3Half3Half(inLeftVector, inRightVector, out, true);
    624             out.destroy();
    625         } catch (Exception e) {
    626             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testNativeDistanceHalf3Half3Half: " + e.toString());
    627         }
    628         inLeftVector.destroy();
    629         inRightVector.destroy();
    630     }
    631 
    632     private void verifyResultsNativeDistanceHalf3Half3Half(Allocation inLeftVector, Allocation inRightVector, Allocation out, boolean relaxed) {
    633         short[] arrayInLeftVector = new short[INPUTSIZE * 4];
    634         Arrays.fill(arrayInLeftVector, (short) 42);
    635         inLeftVector.copyTo(arrayInLeftVector);
    636         short[] arrayInRightVector = new short[INPUTSIZE * 4];
    637         Arrays.fill(arrayInRightVector, (short) 42);
    638         inRightVector.copyTo(arrayInRightVector);
    639         short[] arrayOut = new short[INPUTSIZE * 1];
    640         Arrays.fill(arrayOut, (short) 42);
    641         out.copyTo(arrayOut);
    642         StringBuilder message = new StringBuilder();
    643         boolean errorFound = false;
    644         for (int i = 0; i < INPUTSIZE; i++) {
    645             ArgumentsHalfNHalfNHalf args = new ArgumentsHalfNHalfNHalf();
    646             // Create the appropriate sized arrays in args
    647             args.inLeftVector = new short[3];
    648             args.inLeftVectorDouble = new double[3];
    649             args.inRightVector = new short[3];
    650             args.inRightVectorDouble = new double[3];
    651             // Fill args with the input values
    652             for (int j = 0; j < 3 ; j++) {
    653                 args.inLeftVector[j] = arrayInLeftVector[i * 4 + j];
    654                 args.inLeftVectorDouble[j] = Float16Utils.convertFloat16ToDouble(args.inLeftVector[j]);
    655             }
    656             for (int j = 0; j < 3 ; j++) {
    657                 args.inRightVector[j] = arrayInRightVector[i * 4 + j];
    658                 args.inRightVectorDouble[j] = Float16Utils.convertFloat16ToDouble(args.inRightVector[j]);
    659             }
    660             Target target = new Target(Target.FunctionType.NATIVE, Target.ReturnType.HALF, relaxed);
    661             CoreMathVerifier.computeNativeDistance(args, target);
    662 
    663             // Compare the expected outputs to the actual values returned by RS.
    664             boolean valid = true;
    665             if (!args.out.couldBe(Float16Utils.convertFloat16ToDouble(arrayOut[i]))) {
    666                 valid = false;
    667             }
    668             if (!valid) {
    669                 if (!errorFound) {
    670                     errorFound = true;
    671                     for (int j = 0; j < 3 ; j++) {
    672                         message.append("Input inLeftVector: ");
    673                         appendVariableToMessage(message, arrayInLeftVector[i * 4 + j]);
    674                         message.append("\n");
    675                     }
    676                     for (int j = 0; j < 3 ; j++) {
    677                         message.append("Input inRightVector: ");
    678                         appendVariableToMessage(message, arrayInRightVector[i * 4 + j]);
    679                         message.append("\n");
    680                     }
    681                     message.append("Expected output out: ");
    682                     appendVariableToMessage(message, args.out);
    683                     message.append("\n");
    684                     message.append("Actual   output out: ");
    685                     appendVariableToMessage(message, arrayOut[i]);
    686                     message.append("\n");
    687                     message.append("Actual   output out (in double): ");
    688                     appendVariableToMessage(message, Float16Utils.convertFloat16ToDouble(arrayOut[i]));
    689                     if (!args.out.couldBe(Float16Utils.convertFloat16ToDouble(arrayOut[i]))) {
    690                         message.append(" FAIL");
    691                     }
    692                     message.append("\n");
    693                     message.append("Errors at");
    694                 }
    695                 message.append(" [");
    696                 message.append(Integer.toString(i));
    697                 message.append("]");
    698             }
    699         }
    700         assertFalse("Incorrect output for checkNativeDistanceHalf3Half3Half" +
    701                 (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
    702     }
    703 
    704     private void checkNativeDistanceHalf4Half4Half() {
    705         Allocation inLeftVector = createRandomAllocation(mRS, Element.DataType.FLOAT_16, 4, 0xedfea71694ba3ab6l, false);
    706         Allocation inRightVector = createRandomAllocation(mRS, Element.DataType.FLOAT_16, 4, 0xfb99ea386960a617l, false);
    707         try {
    708             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_16, 1), INPUTSIZE);
    709             script.set_gAllocInRightVector(inRightVector);
    710             script.forEach_testNativeDistanceHalf4Half4Half(inLeftVector, out);
    711             verifyResultsNativeDistanceHalf4Half4Half(inLeftVector, inRightVector, out, false);
    712             out.destroy();
    713         } catch (Exception e) {
    714             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testNativeDistanceHalf4Half4Half: " + e.toString());
    715         }
    716         try {
    717             Allocation out = Allocation.createSized(mRS, getElement(mRS, Element.DataType.FLOAT_16, 1), INPUTSIZE);
    718             scriptRelaxed.set_gAllocInRightVector(inRightVector);
    719             scriptRelaxed.forEach_testNativeDistanceHalf4Half4Half(inLeftVector, out);
    720             verifyResultsNativeDistanceHalf4Half4Half(inLeftVector, inRightVector, out, true);
    721             out.destroy();
    722         } catch (Exception e) {
    723             throw new RSRuntimeException("RenderScript. Can't invoke forEach_testNativeDistanceHalf4Half4Half: " + e.toString());
    724         }
    725         inLeftVector.destroy();
    726         inRightVector.destroy();
    727     }
    728 
    729     private void verifyResultsNativeDistanceHalf4Half4Half(Allocation inLeftVector, Allocation inRightVector, Allocation out, boolean relaxed) {
    730         short[] arrayInLeftVector = new short[INPUTSIZE * 4];
    731         Arrays.fill(arrayInLeftVector, (short) 42);
    732         inLeftVector.copyTo(arrayInLeftVector);
    733         short[] arrayInRightVector = new short[INPUTSIZE * 4];
    734         Arrays.fill(arrayInRightVector, (short) 42);
    735         inRightVector.copyTo(arrayInRightVector);
    736         short[] arrayOut = new short[INPUTSIZE * 1];
    737         Arrays.fill(arrayOut, (short) 42);
    738         out.copyTo(arrayOut);
    739         StringBuilder message = new StringBuilder();
    740         boolean errorFound = false;
    741         for (int i = 0; i < INPUTSIZE; i++) {
    742             ArgumentsHalfNHalfNHalf args = new ArgumentsHalfNHalfNHalf();
    743             // Create the appropriate sized arrays in args
    744             args.inLeftVector = new short[4];
    745             args.inLeftVectorDouble = new double[4];
    746             args.inRightVector = new short[4];
    747             args.inRightVectorDouble = new double[4];
    748             // Fill args with the input values
    749             for (int j = 0; j < 4 ; j++) {
    750                 args.inLeftVector[j] = arrayInLeftVector[i * 4 + j];
    751                 args.inLeftVectorDouble[j] = Float16Utils.convertFloat16ToDouble(args.inLeftVector[j]);
    752             }
    753             for (int j = 0; j < 4 ; j++) {
    754                 args.inRightVector[j] = arrayInRightVector[i * 4 + j];
    755                 args.inRightVectorDouble[j] = Float16Utils.convertFloat16ToDouble(args.inRightVector[j]);
    756             }
    757             Target target = new Target(Target.FunctionType.NATIVE, Target.ReturnType.HALF, relaxed);
    758             CoreMathVerifier.computeNativeDistance(args, target);
    759 
    760             // Compare the expected outputs to the actual values returned by RS.
    761             boolean valid = true;
    762             if (!args.out.couldBe(Float16Utils.convertFloat16ToDouble(arrayOut[i]))) {
    763                 valid = false;
    764             }
    765             if (!valid) {
    766                 if (!errorFound) {
    767                     errorFound = true;
    768                     for (int j = 0; j < 4 ; j++) {
    769                         message.append("Input inLeftVector: ");
    770                         appendVariableToMessage(message, arrayInLeftVector[i * 4 + j]);
    771                         message.append("\n");
    772                     }
    773                     for (int j = 0; j < 4 ; j++) {
    774                         message.append("Input inRightVector: ");
    775                         appendVariableToMessage(message, arrayInRightVector[i * 4 + j]);
    776                         message.append("\n");
    777                     }
    778                     message.append("Expected output out: ");
    779                     appendVariableToMessage(message, args.out);
    780                     message.append("\n");
    781                     message.append("Actual   output out: ");
    782                     appendVariableToMessage(message, arrayOut[i]);
    783                     message.append("\n");
    784                     message.append("Actual   output out (in double): ");
    785                     appendVariableToMessage(message, Float16Utils.convertFloat16ToDouble(arrayOut[i]));
    786                     if (!args.out.couldBe(Float16Utils.convertFloat16ToDouble(arrayOut[i]))) {
    787                         message.append(" FAIL");
    788                     }
    789                     message.append("\n");
    790                     message.append("Errors at");
    791                 }
    792                 message.append(" [");
    793                 message.append(Integer.toString(i));
    794                 message.append("]");
    795             }
    796         }
    797         assertFalse("Incorrect output for checkNativeDistanceHalf4Half4Half" +
    798                 (relaxed ? "_relaxed" : "") + ":\n" + message.toString(), errorFound);
    799     }
    800 
    801     public void testNativeDistance() {
    802         checkNativeDistanceFloatFloatFloat();
    803         checkNativeDistanceFloat2Float2Float();
    804         checkNativeDistanceFloat3Float3Float();
    805         checkNativeDistanceFloat4Float4Float();
    806         checkNativeDistanceHalfHalfHalf();
    807         checkNativeDistanceHalf2Half2Half();
    808         checkNativeDistanceHalf3Half3Half();
    809         checkNativeDistanceHalf4Half4Half();
    810     }
    811 }
    812