11a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks/*
21a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks * Copyright (C) 2017 The Android Open Source Project
31a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks *
41a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks * Licensed under the Apache License, Version 2.0 (the "License");
51a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks * you may not use this file except in compliance with the License.
61a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks * You may obtain a copy of the License at
71a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks *
81a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks *      http://www.apache.org/licenses/LICENSE-2.0
91a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks *
101a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks * Unless required by applicable law or agreed to in writing, software
111a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks * distributed under the License is distributed on an "AS IS" BASIS,
121a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
131a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks * See the License for the specific language governing permissions and
141a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks * limitations under the License.
151a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks */
161a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks
171a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks/* This is a much simpler version of UT_reduce.java that
181a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks * exercises pragmas after the functions (backward reference),
191a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks * whereas the other test case exercises the pragmas before the
201a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks * functions (forward reference).
211a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks */
221a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks
231a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubankspackage com.android.rs.unittest;
241a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks
251a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanksimport android.content.Context;
261a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanksimport android.renderscript.Allocation;
271a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanksimport android.renderscript.Element;
281a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanksimport android.renderscript.Float2;
291a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanksimport android.renderscript.Int2;
301a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanksimport android.renderscript.Int3;
311a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanksimport android.renderscript.RenderScript;
321a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanksimport android.renderscript.ScriptIntrinsicHistogram;
331a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanksimport android.renderscript.Type;
341a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanksimport android.util.Log;
351a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks
361a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanksimport java.util.Random;
371a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks
381a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubankspublic class UT_reduce_backward extends UnitTest {
391a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks    private static final String TAG = "reduce_backward";
401a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks
411a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks    public UT_reduce_backward(Context ctx) {
421a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks        super("reduce_backward", ctx);
431a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks    }
441a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks
451a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks    private byte[] createInputArrayByte(int len, int seed) {
461a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks        byte[] array = new byte[len];
471a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks        (new Random(seed)).nextBytes(array);
481a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks        return array;
491a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks    }
501a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks
511a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks    private float[] createInputArrayFloat(int len, int seed) {
521a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks        Random rand = new Random(seed);
531a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks        float[] array = new float[len];
541a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks        for (int i = 0; i < len; ++i)
551a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks            array[i] = rand.nextFloat();
561a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks        return array;
571a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks    }
581a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks
591a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks    private int[] createInputArrayInt(int len, int seed) {
601a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks        Random rand = new Random(seed);
611a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks        int[] array = new int[len];
621a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks        for (int i = 0; i < len; ++i)
631a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks            array[i] = rand.nextInt();
641a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks        return array;
651a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks    }
661a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks
671a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks    private int[] createInputArrayInt(int len, int seed, int eltRange) {
681a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks        Random rand = new Random(seed);
691a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks        int[] array = new int[len];
701a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks        for (int i = 0; i < len; ++i)
711a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks            array[i] = rand.nextInt(eltRange);
721a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks        return array;
731a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks    }
741a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks
751a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks    private <T extends Number> boolean result(String testName, T javaRslt, T rsRslt) {
761a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks        final boolean success = javaRslt.equals(rsRslt);
771a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks        Log.i(TAG,
781a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks                testName + ": java " + javaRslt + ", rs " + rsRslt + ": " +
791a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks                        (success ? "PASSED" : "FAILED"));
801a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks        return success;
811a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks    }
821a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks
831a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks    private boolean result(String testName, Float2 javaRslt, Float2 rsRslt) {
841a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks        final boolean success = (javaRslt.x == rsRslt.x) && (javaRslt.y == rsRslt.y);
851a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks        Log.i(TAG,
861a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks                testName +
871a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks                        ": java (" + javaRslt.x + ", " + javaRslt.y + ")" +
881a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks                        ", rs (" + rsRslt.x + ", " + rsRslt.y + ")" +
891a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks                        ": " + (success ? "PASSED" : "FAILED"));
901a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks        return success;
911a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks    }
921a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks
931a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks    private boolean result(String testName, Int2 javaRslt, Int2 rsRslt) {
941a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks        final boolean success = (javaRslt.x == rsRslt.x) && (javaRslt.y == rsRslt.y);
951a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks        Log.i(TAG,
961a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks                testName +
971a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks                        ": java (" + javaRslt.x + ", " + javaRslt.y + ")" +
981a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks                        ", rs (" + rsRslt.x + ", " + rsRslt.y + ")" +
991a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks                        ": " + (success ? "PASSED" : "FAILED"));
1001a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks        return success;
1011a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks    }
1021a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks
1031a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks    ///////////////////////////////////////////////////////////////////
1041a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks
1051a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks    private int addint(int[] input) {
1061a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks        int rslt = 0;
1071a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks        for (int idx = 0; idx < input.length; ++idx)
1081a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks            rslt += input[idx];
1091a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks        return rslt;
1101a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks    }
1111a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks
1121a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks    private boolean addint1D(RenderScript RS, ScriptC_reduce_backward s) {
1131a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks        final int[] input = createInputArrayInt(100000, 0, 1 << 13);
1141a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks
1151a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks        final int javaRslt = addint(input);
1161a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks        final int rsRslt = s.reduce_addint(input).get();
1171a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks
1181a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks        return result("addint1D", javaRslt, rsRslt);
1191a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks    }
1201a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks
1211a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks    private boolean addint2D(RenderScript RS, ScriptC_reduce_backward s) {
1221a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks        final int dimX = 450, dimY = 225;
1231a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks
1241a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks        final int[] inputArray = createInputArrayInt(dimX * dimY, 1, 1 << 13);
1251a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks        Type.Builder typeBuilder = new Type.Builder(RS, Element.I32(RS));
1261a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks        typeBuilder.setX(dimX).setY(dimY);
1271a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks        Allocation inputAllocation = Allocation.createTyped(RS, typeBuilder.create());
1281a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks        inputAllocation.copy2DRangeFrom(0, 0, dimX, dimY, inputArray);
1291a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks
1301a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks        final int javaRslt = addint(inputArray);
1311a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks        final int rsRslt = s.reduce_addint(inputAllocation).get();
1321a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks
1331a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks        return result("addint2D", javaRslt, rsRslt);
1341a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks    }
1351a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks
1361a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks    ///////////////////////////////////////////////////////////////////
1371a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks
1381a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks    private Int2 findMinAndMax(float[] input) {
1391a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks        float minVal = Float.POSITIVE_INFINITY;
1401a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks        int minIdx = -1;
1411a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks        float maxVal = Float.NEGATIVE_INFINITY;
1421a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks        int maxIdx = -1;
1431a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks
1441a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks        for (int idx = 0; idx < input.length; ++idx) {
1451a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks            if (input[idx] < minVal) {
1461a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks                minVal = input[idx];
1471a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks                minIdx = idx;
1481a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks            }
1491a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks            if (input[idx] > maxVal) {
1501a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks                maxVal = input[idx];
1511a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks                maxIdx = idx;
1521a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks            }
1531a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks        }
1541a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks
1551a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks        return new Int2(minIdx, maxIdx);
1561a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks    }
1571a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks
1581a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks    private boolean findMinAndMax(RenderScript RS, ScriptC_reduce_backward s) {
1591a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks        final float[] input = createInputArrayFloat(100000, 4);
1601a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks
1611a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks        final Int2 javaRslt = findMinAndMax(input);
1621a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks        final Int2 rsRslt = s.reduce_findMinAndMax(input).get();
1631a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks
1641a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks        // Note that the Java and RenderScript algorithms are not
1651a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks        // guaranteed to find the same cells -- but they should
1661a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks        // find cells of the same value.
1671a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks        final Float2 javaVal = new Float2(input[javaRslt.x], input[javaRslt.y]);
1681a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks        final Float2 rsVal = new Float2(input[rsRslt.x], input[rsRslt.y]);
1691a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks
1701a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks        return result("findMinAndMax", javaVal, rsVal);
1711a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks    }
1721a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks
1731a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks    ///////////////////////////////////////////////////////////////////
1741a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks
1751a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks    private boolean fz(RenderScript RS, ScriptC_reduce_backward s) {
1761a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks        final int inputLen = 100000;
1771a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks        int[] input = createInputArrayInt(inputLen, 5);
1781a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks        // just in case we got unlucky
1791a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks        input[(new Random(6)).nextInt(inputLen)] = 0;
1801a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks
1811a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks        final int rsRslt = s.reduce_fz(input).get();
1821a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks
1831a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks        final boolean success = (input[rsRslt] == 0);
1841a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks        Log.i(TAG,
1851a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks                "fz: input[" + rsRslt + "] == " + input[rsRslt] + ": " +
1861a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks                        (success ? "PASSED" : "FAILED"));
1871a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks        return success;
1881a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks    }
1891a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks
1901a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks    ///////////////////////////////////////////////////////////////////
1911a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks
1921a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks    private boolean fz2(RenderScript RS, ScriptC_reduce_backward s) {
1931a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks        final int dimX = 225, dimY = 450;
1941a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks        final int inputLen = dimX * dimY;
1951a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks
1961a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks        int[] inputArray = createInputArrayInt(inputLen, 7);
1971a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks        // just in case we got unlucky
1981a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks        inputArray[(new Random(8)).nextInt(inputLen)] = 0;
1991a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks
2001a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks        Type.Builder typeBuilder = new Type.Builder(RS, Element.I32(RS));
2011a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks        typeBuilder.setX(dimX).setY(dimY);
2021a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks        Allocation inputAllocation = Allocation.createTyped(RS, typeBuilder.create());
2031a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks        inputAllocation.copy2DRangeFrom(0, 0, dimX, dimY, inputArray);
2041a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks
2051a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks        final Int2 rsRslt = s.reduce_fz2(inputAllocation).get();
2061a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks
2071a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks        final int cellVal = inputArray[rsRslt.x + dimX * rsRslt.y];
2081a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks        final boolean success = (cellVal == 0);
2091a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks        Log.i(TAG,
2101a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks                "fz2: input[" + rsRslt.x + ", " + rsRslt.y + "] == " + cellVal + ": " +
2111a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks                        (success ? "PASSED" : "FAILED"));
2121a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks        return success;
2131a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks    }
2141a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks
2151a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks    ///////////////////////////////////////////////////////////////////
2161a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks
2171a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks    private boolean fz3(RenderScript RS, ScriptC_reduce_backward s) {
2181a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks        final int dimX = 59, dimY = 48, dimZ = 37;
2191a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks        final int inputLen = dimX * dimY * dimZ;
2201a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks
2211a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks        int[] inputArray = createInputArrayInt(inputLen, 9);
2221a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks        // just in case we got unlucky
2231a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks        inputArray[(new Random(10)).nextInt(inputLen)] = 0;
2241a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks
2251a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks        Type.Builder typeBuilder = new Type.Builder(RS, Element.I32(RS));
2261a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks        typeBuilder.setX(dimX).setY(dimY).setZ(dimZ);
2271a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks        Allocation inputAllocation = Allocation.createTyped(RS, typeBuilder.create());
2281a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks        inputAllocation.copy3DRangeFrom(0, 0, 0, dimX, dimY, dimZ, inputArray);
2291a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks
2301a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks        final Int3 rsRslt = s.reduce_fz3(inputAllocation).get();
2311a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks
2321a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks        final int cellVal = inputArray[rsRslt.x + dimX * rsRslt.y + dimX * dimY * rsRslt.z];
2331a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks        final boolean success = (cellVal == 0);
2341a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks        Log.i(TAG,
2351a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks                "fz3: input[" + rsRslt.x + ", " + rsRslt.y + ", " + rsRslt.z + "] == " + cellVal + ": " +
2361a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks                        (success ? "PASSED" : "FAILED"));
2371a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks        return success;
2381a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks    }
2391a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks
2401a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks    ///////////////////////////////////////////////////////////////////
2411a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks
2421a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks    private static final int histogramBucketCount = 256;
2431a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks
2441a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks    private long[] histogram(RenderScript RS, final byte[] inputArray) {
2451a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks        Allocation inputAllocation = Allocation.createSized(RS, Element.U8(RS), inputArray.length);
2461a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks        inputAllocation.copyFrom(inputArray);
2471a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks
2481a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks        Allocation outputAllocation = Allocation.createSized(RS, Element.U32(RS), histogramBucketCount);
2491a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks
2501a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks        ScriptIntrinsicHistogram scriptHsg = ScriptIntrinsicHistogram.create(RS, Element.U8(RS));
2511a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks        scriptHsg.setOutput(outputAllocation);
2521a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks        scriptHsg.forEach(inputAllocation);
2531a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks
2541a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks        int[] outputArrayMistyped = new int[histogramBucketCount];
2551a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks        outputAllocation.copyTo(outputArrayMistyped);
2561a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks
2571a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks        long[] outputArray = new long[histogramBucketCount];
2581a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks        for (int i = 0; i < histogramBucketCount; ++i)
2591a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks            outputArray[i] = outputArrayMistyped[i] & (long) 0xffffffff;
2601a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks        return outputArray;
2611a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks    }
2621a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks
2631a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks    private boolean histogram(RenderScript RS, ScriptC_reduce_backward s) {
2641a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks        final byte[] inputArray = createInputArrayByte(100000, 11);
2651a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks
2661a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks        final long[] javaRslt = histogram(RS, inputArray);
2671a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks        _RS_ASSERT("javaRslt unexpected length: " + javaRslt.length, javaRslt.length == histogramBucketCount);
2681a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks        final long[] rsRslt = s.reduce_histogram(inputArray).get();
2691a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks        _RS_ASSERT("rsRslt unexpected length: " + rsRslt.length, rsRslt.length == histogramBucketCount);
2701a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks
2711a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks        for (int i = 0; i < histogramBucketCount; ++i) {
2721a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks            if (javaRslt[i] != rsRslt[i]) {
2731a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks                Log.i(TAG,
2741a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks                        "histogram[" + i + "]: java " + javaRslt[i] + ", rs " + rsRslt[i] + ": FAILED");
2751a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks                return false;
2761a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks            }
2771a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks        }
2781a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks
2791a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks        Log.i(TAG, "histogram: PASSED");
2801a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks        return true;
2811a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks    }
2821a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks
2831a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks    //-----------------------------------------------------------------
2841a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks
2851a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks    private Int2 mode(RenderScript RS, final byte[] inputArray) {
2861a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks        long[] hsg = histogram(RS, inputArray);
2871a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks
2881a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks        int modeIdx = 0;
2891a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks        for (int i = 1; i < hsg.length; ++i)
2901a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks            if (hsg[i] > hsg[modeIdx]) modeIdx = i;
2911a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks        return new Int2(modeIdx, (int) hsg[modeIdx]);
2921a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks    }
2931a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks
2941a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks    private boolean mode(RenderScript RS, ScriptC_reduce_backward s) {
2951a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks        final byte[] inputArray = createInputArrayByte(100000, 12);
2961a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks
2971a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks        final Int2 javaRslt = mode(RS, inputArray);
2981a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks        final Int2 rsRslt = s.reduce_mode(inputArray).get();
2991a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks
3001a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks        return result("mode", javaRslt, rsRslt);
3011a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks    }
3021a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks
3031a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks    ///////////////////////////////////////////////////////////////////
3041a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks
3051a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks    public void run() {
3064cad330154b7df7c3adf126b9f4b2665191a23a4Arthur Eubanks        RenderScript pRS = createRenderScript(false);
3071a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks        ScriptC_reduce_backward s = new ScriptC_reduce_backward(pRS);
3081a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks        s.set_negInf(Float.NEGATIVE_INFINITY);
3091a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks        s.set_posInf(Float.POSITIVE_INFINITY);
3101a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks
3111a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks        boolean pass = true;
3121a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks        pass &= addint1D(pRS, s);
3131a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks        pass &= addint2D(pRS, s);
3141a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks        pass &= findMinAndMax(pRS, s);
3151a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks        pass &= fz(pRS, s);
3161a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks        pass &= fz2(pRS, s);
3171a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks        pass &= fz3(pRS, s);
3181a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks        pass &= histogram(pRS, s);
3191a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks        pass &= mode(pRS, s);
3201a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks
3211a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks        pRS.finish();
3221a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks        pRS.destroy();
3231a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks
3241a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks        Log.i(TAG, pass ? "PASSED" : "FAILED");
3251a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks        if (pass)
3261a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks            passTest();
3271a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks        else
3281a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks            failTest();
3291a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks    }
3301a3e97c3ab51f602927a67d4abc50ffa6ce5ccbaArthur Eubanks}
331