10d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks// This file is automatically generated from
20d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks// frameworks/rs/tests/java_api/RSUnitTests/RSUnitTests.py
30d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks/*
40d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks * Copyright (C) 2017 The Android Open Source Project
50d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks *
60d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks * Licensed under the Apache License, Version 2.0 (the "License");
70d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks * you may not use this file except in compliance with the License.
80d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks * You may obtain a copy of the License at
90d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks *
100d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks *      http://www.apache.org/licenses/LICENSE-2.0
110d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks *
120d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks * Unless required by applicable law or agreed to in writing, software
130d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks * distributed under the License is distributed on an "AS IS" BASIS,
140d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
150d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks * See the License for the specific language governing permissions and
160d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks * limitations under the License.
170d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks */
180d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks
190d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks/* This is a much simpler version of UT_reduce.java that
200d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks * exercises pragmas after the functions (backward reference),
210d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks * whereas the other test case exercises the pragmas before the
220d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks * functions (forward reference).
230d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks */
240d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks
250d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubankspackage com.android.rs.unittest;
260d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks
270d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanksimport android.content.Context;
280d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanksimport android.support.v8.renderscript.Allocation;
290d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanksimport android.support.v8.renderscript.Element;
300d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanksimport android.support.v8.renderscript.Float2;
310d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanksimport android.support.v8.renderscript.Int2;
320d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanksimport android.support.v8.renderscript.Int3;
330d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanksimport android.support.v8.renderscript.RenderScript;
340d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanksimport android.support.v8.renderscript.ScriptIntrinsicHistogram;
350d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanksimport android.support.v8.renderscript.Type;
360d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanksimport android.util.Log;
370d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks
380d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanksimport java.util.Random;
390d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks
400d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubankspublic class UT_reduce_backward extends UnitTest {
410d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks    private static final String TAG = "reduce_backward";
420d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks
430d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks    public UT_reduce_backward(Context ctx) {
440d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks        super("reduce_backward", ctx);
450d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks    }
460d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks
470d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks    private byte[] createInputArrayByte(int len, int seed) {
480d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks        byte[] array = new byte[len];
490d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks        (new Random(seed)).nextBytes(array);
500d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks        return array;
510d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks    }
520d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks
530d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks    private float[] createInputArrayFloat(int len, int seed) {
540d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks        Random rand = new Random(seed);
550d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks        float[] array = new float[len];
560d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks        for (int i = 0; i < len; ++i)
570d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks            array[i] = rand.nextFloat();
580d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks        return array;
590d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks    }
600d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks
610d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks    private int[] createInputArrayInt(int len, int seed) {
620d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks        Random rand = new Random(seed);
630d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks        int[] array = new int[len];
640d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks        for (int i = 0; i < len; ++i)
650d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks            array[i] = rand.nextInt();
660d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks        return array;
670d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks    }
680d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks
690d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks    private int[] createInputArrayInt(int len, int seed, int eltRange) {
700d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks        Random rand = new Random(seed);
710d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks        int[] array = new int[len];
720d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks        for (int i = 0; i < len; ++i)
730d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks            array[i] = rand.nextInt(eltRange);
740d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks        return array;
750d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks    }
760d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks
770d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks    private <T extends Number> boolean result(String testName, T javaRslt, T rsRslt) {
780d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks        final boolean success = javaRslt.equals(rsRslt);
790d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks        Log.i(TAG,
800d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks                testName + ": java " + javaRslt + ", rs " + rsRslt + ": " +
810d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks                        (success ? "PASSED" : "FAILED"));
820d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks        return success;
830d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks    }
840d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks
850d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks    private boolean result(String testName, Float2 javaRslt, Float2 rsRslt) {
860d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks        final boolean success = (javaRslt.x == rsRslt.x) && (javaRslt.y == rsRslt.y);
870d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks        Log.i(TAG,
880d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks                testName +
890d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks                        ": java (" + javaRslt.x + ", " + javaRslt.y + ")" +
900d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks                        ", rs (" + rsRslt.x + ", " + rsRslt.y + ")" +
910d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks                        ": " + (success ? "PASSED" : "FAILED"));
920d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks        return success;
930d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks    }
940d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks
950d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks    private boolean result(String testName, Int2 javaRslt, Int2 rsRslt) {
960d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks        final boolean success = (javaRslt.x == rsRslt.x) && (javaRslt.y == rsRslt.y);
970d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks        Log.i(TAG,
980d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks                testName +
990d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks                        ": java (" + javaRslt.x + ", " + javaRslt.y + ")" +
1000d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks                        ", rs (" + rsRslt.x + ", " + rsRslt.y + ")" +
1010d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks                        ": " + (success ? "PASSED" : "FAILED"));
1020d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks        return success;
1030d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks    }
1040d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks
1050d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks    ///////////////////////////////////////////////////////////////////
1060d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks
1070d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks    private int addint(int[] input) {
1080d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks        int rslt = 0;
1090d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks        for (int idx = 0; idx < input.length; ++idx)
1100d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks            rslt += input[idx];
1110d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks        return rslt;
1120d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks    }
1130d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks
1140d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks    private boolean addint1D(RenderScript RS, ScriptC_reduce_backward s) {
1150d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks        final int[] input = createInputArrayInt(100000, 0, 1 << 13);
1160d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks
1170d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks        final int javaRslt = addint(input);
1180d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks        final int rsRslt = s.reduce_addint(input).get();
1190d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks
1200d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks        return result("addint1D", javaRslt, rsRslt);
1210d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks    }
1220d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks
1230d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks    private boolean addint2D(RenderScript RS, ScriptC_reduce_backward s) {
1240d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks        final int dimX = 450, dimY = 225;
1250d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks
1260d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks        final int[] inputArray = createInputArrayInt(dimX * dimY, 1, 1 << 13);
1270d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks        Type.Builder typeBuilder = new Type.Builder(RS, Element.I32(RS));
1280d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks        typeBuilder.setX(dimX).setY(dimY);
1290d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks        Allocation inputAllocation = Allocation.createTyped(RS, typeBuilder.create());
1300d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks        inputAllocation.copy2DRangeFrom(0, 0, dimX, dimY, inputArray);
1310d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks
1320d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks        final int javaRslt = addint(inputArray);
1330d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks        final int rsRslt = s.reduce_addint(inputAllocation).get();
1340d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks
1350d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks        return result("addint2D", javaRslt, rsRslt);
1360d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks    }
1370d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks
1380d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks    ///////////////////////////////////////////////////////////////////
1390d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks
1400d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks    private Int2 findMinAndMax(float[] input) {
1410d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks        float minVal = Float.POSITIVE_INFINITY;
1420d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks        int minIdx = -1;
1430d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks        float maxVal = Float.NEGATIVE_INFINITY;
1440d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks        int maxIdx = -1;
1450d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks
1460d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks        for (int idx = 0; idx < input.length; ++idx) {
1470d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks            if (input[idx] < minVal) {
1480d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks                minVal = input[idx];
1490d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks                minIdx = idx;
1500d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks            }
1510d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks            if (input[idx] > maxVal) {
1520d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks                maxVal = input[idx];
1530d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks                maxIdx = idx;
1540d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks            }
1550d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks        }
1560d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks
1570d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks        return new Int2(minIdx, maxIdx);
1580d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks    }
1590d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks
1600d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks    private boolean findMinAndMax(RenderScript RS, ScriptC_reduce_backward s) {
1610d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks        final float[] input = createInputArrayFloat(100000, 4);
1620d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks
1630d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks        final Int2 javaRslt = findMinAndMax(input);
1640d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks        final Int2 rsRslt = s.reduce_findMinAndMax(input).get();
1650d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks
1660d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks        // Note that the Java and RenderScript algorithms are not
1670d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks        // guaranteed to find the same cells -- but they should
1680d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks        // find cells of the same value.
1690d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks        final Float2 javaVal = new Float2(input[javaRslt.x], input[javaRslt.y]);
1700d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks        final Float2 rsVal = new Float2(input[rsRslt.x], input[rsRslt.y]);
1710d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks
1720d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks        return result("findMinAndMax", javaVal, rsVal);
1730d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks    }
1740d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks
1750d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks    ///////////////////////////////////////////////////////////////////
1760d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks
1770d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks    private boolean fz(RenderScript RS, ScriptC_reduce_backward s) {
1780d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks        final int inputLen = 100000;
1790d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks        int[] input = createInputArrayInt(inputLen, 5);
1800d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks        // just in case we got unlucky
1810d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks        input[(new Random(6)).nextInt(inputLen)] = 0;
1820d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks
1830d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks        final int rsRslt = s.reduce_fz(input).get();
1840d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks
1850d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks        final boolean success = (input[rsRslt] == 0);
1860d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks        Log.i(TAG,
1870d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks                "fz: input[" + rsRslt + "] == " + input[rsRslt] + ": " +
1880d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks                        (success ? "PASSED" : "FAILED"));
1890d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks        return success;
1900d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks    }
1910d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks
1920d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks    ///////////////////////////////////////////////////////////////////
1930d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks
1940d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks    private boolean fz2(RenderScript RS, ScriptC_reduce_backward s) {
1950d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks        final int dimX = 225, dimY = 450;
1960d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks        final int inputLen = dimX * dimY;
1970d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks
1980d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks        int[] inputArray = createInputArrayInt(inputLen, 7);
1990d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks        // just in case we got unlucky
2000d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks        inputArray[(new Random(8)).nextInt(inputLen)] = 0;
2010d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks
2020d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks        Type.Builder typeBuilder = new Type.Builder(RS, Element.I32(RS));
2030d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks        typeBuilder.setX(dimX).setY(dimY);
2040d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks        Allocation inputAllocation = Allocation.createTyped(RS, typeBuilder.create());
2050d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks        inputAllocation.copy2DRangeFrom(0, 0, dimX, dimY, inputArray);
2060d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks
2070d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks        final Int2 rsRslt = s.reduce_fz2(inputAllocation).get();
2080d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks
2090d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks        final int cellVal = inputArray[rsRslt.x + dimX * rsRslt.y];
2100d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks        final boolean success = (cellVal == 0);
2110d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks        Log.i(TAG,
2120d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks                "fz2: input[" + rsRslt.x + ", " + rsRslt.y + "] == " + cellVal + ": " +
2130d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks                        (success ? "PASSED" : "FAILED"));
2140d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks        return success;
2150d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks    }
2160d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks
2170d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks    ///////////////////////////////////////////////////////////////////
2180d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks
2190d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks    private boolean fz3(RenderScript RS, ScriptC_reduce_backward s) {
2200d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks        final int dimX = 59, dimY = 48, dimZ = 37;
2210d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks        final int inputLen = dimX * dimY * dimZ;
2220d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks
2230d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks        int[] inputArray = createInputArrayInt(inputLen, 9);
2240d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks        // just in case we got unlucky
2250d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks        inputArray[(new Random(10)).nextInt(inputLen)] = 0;
2260d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks
2270d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks        Type.Builder typeBuilder = new Type.Builder(RS, Element.I32(RS));
2280d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks        typeBuilder.setX(dimX).setY(dimY).setZ(dimZ);
2290d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks        Allocation inputAllocation = Allocation.createTyped(RS, typeBuilder.create());
2300d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks        inputAllocation.copy3DRangeFrom(0, 0, 0, dimX, dimY, dimZ, inputArray);
2310d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks
2320d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks        final Int3 rsRslt = s.reduce_fz3(inputAllocation).get();
2330d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks
2340d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks        final int cellVal = inputArray[rsRslt.x + dimX * rsRslt.y + dimX * dimY * rsRslt.z];
2350d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks        final boolean success = (cellVal == 0);
2360d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks        Log.i(TAG,
2370d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks                "fz3: input[" + rsRslt.x + ", " + rsRslt.y + ", " + rsRslt.z + "] == " + cellVal + ": " +
2380d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks                        (success ? "PASSED" : "FAILED"));
2390d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks        return success;
2400d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks    }
2410d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks
2420d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks    ///////////////////////////////////////////////////////////////////
2430d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks
2440d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks    private static final int histogramBucketCount = 256;
2450d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks
2460d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks    private long[] histogram(RenderScript RS, final byte[] inputArray) {
2470d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks        Allocation inputAllocation = Allocation.createSized(RS, Element.U8(RS), inputArray.length);
2480d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks        inputAllocation.copyFrom(inputArray);
2490d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks
2500d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks        Allocation outputAllocation = Allocation.createSized(RS, Element.U32(RS), histogramBucketCount);
2510d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks
2520d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks        ScriptIntrinsicHistogram scriptHsg = ScriptIntrinsicHistogram.create(RS, Element.U8(RS));
2530d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks        scriptHsg.setOutput(outputAllocation);
2540d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks        scriptHsg.forEach(inputAllocation);
2550d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks
2560d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks        int[] outputArrayMistyped = new int[histogramBucketCount];
2570d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks        outputAllocation.copyTo(outputArrayMistyped);
2580d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks
2590d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks        long[] outputArray = new long[histogramBucketCount];
2600d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks        for (int i = 0; i < histogramBucketCount; ++i)
2610d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks            outputArray[i] = outputArrayMistyped[i] & (long) 0xffffffff;
2620d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks        return outputArray;
2630d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks    }
2640d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks
2650d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks    private boolean histogram(RenderScript RS, ScriptC_reduce_backward s) {
2660d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks        final byte[] inputArray = createInputArrayByte(100000, 11);
2670d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks
2680d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks        final long[] javaRslt = histogram(RS, inputArray);
2690d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks        _RS_ASSERT("javaRslt unexpected length: " + javaRslt.length, javaRslt.length == histogramBucketCount);
2700d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks        final long[] rsRslt = s.reduce_histogram(inputArray).get();
2710d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks        _RS_ASSERT("rsRslt unexpected length: " + rsRslt.length, rsRslt.length == histogramBucketCount);
2720d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks
2730d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks        for (int i = 0; i < histogramBucketCount; ++i) {
2740d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks            if (javaRslt[i] != rsRslt[i]) {
2750d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks                Log.i(TAG,
2760d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks                        "histogram[" + i + "]: java " + javaRslt[i] + ", rs " + rsRslt[i] + ": FAILED");
2770d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks                return false;
2780d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks            }
2790d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks        }
2800d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks
2810d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks        Log.i(TAG, "histogram: PASSED");
2820d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks        return true;
2830d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks    }
2840d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks
2850d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks    //-----------------------------------------------------------------
2860d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks
2870d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks    private Int2 mode(RenderScript RS, final byte[] inputArray) {
2880d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks        long[] hsg = histogram(RS, inputArray);
2890d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks
2900d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks        int modeIdx = 0;
2910d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks        for (int i = 1; i < hsg.length; ++i)
2920d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks            if (hsg[i] > hsg[modeIdx]) modeIdx = i;
2930d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks        return new Int2(modeIdx, (int) hsg[modeIdx]);
2940d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks    }
2950d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks
2960d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks    private boolean mode(RenderScript RS, ScriptC_reduce_backward s) {
2970d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks        final byte[] inputArray = createInputArrayByte(100000, 12);
2980d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks
2990d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks        final Int2 javaRslt = mode(RS, inputArray);
3000d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks        final Int2 rsRslt = s.reduce_mode(inputArray).get();
3010d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks
3020d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks        return result("mode", javaRslt, rsRslt);
3030d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks    }
3040d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks
3050d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks    ///////////////////////////////////////////////////////////////////
3060d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks
3070d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks    public void run() {
3080d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks        RenderScript pRS = createRenderScript(false);
3090d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks        ScriptC_reduce_backward s = new ScriptC_reduce_backward(pRS);
3100d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks        s.set_negInf(Float.NEGATIVE_INFINITY);
3110d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks        s.set_posInf(Float.POSITIVE_INFINITY);
3120d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks
3130d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks        boolean pass = true;
3140d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks        pass &= addint1D(pRS, s);
3150d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks        pass &= addint2D(pRS, s);
3160d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks        pass &= findMinAndMax(pRS, s);
3170d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks        pass &= fz(pRS, s);
3180d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks        pass &= fz2(pRS, s);
3190d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks        pass &= fz3(pRS, s);
3200d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks        pass &= histogram(pRS, s);
3210d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks        pass &= mode(pRS, s);
3220d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks
3230d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks        pRS.finish();
3240d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks        pRS.destroy();
3250d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks
3260d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks        Log.i(TAG, pass ? "PASSED" : "FAILED");
3270d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks        if (pass)
3280d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks            passTest();
3290d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks        else
3300d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks            failTest();
3310d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks    }
3320d13f3929129bf7e34bde1ed3670195c37a180ebArthur Eubanks}
333