/*
 * Copyright (C) 2011-2014 The Android Open Source Project
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

/*
 * This file is auto-generated. DO NOT MODIFY!
 * The source Renderscript file: reduce_general_result.rs
 */

package result;

import android.renderscript.*;
import result.reduce_general_resultBitCode;

/**
 * @hide
 */
public class ScriptC_reduce_general_result extends ScriptC {
    private static final String __rs_resource_name = "reduce_general_result";
    // Constructor
    public  ScriptC_reduce_general_result(RenderScript rs) {
        super(rs,
              __rs_resource_name,
              reduce_general_resultBitCode.getBitCode32(),
              reduce_general_resultBitCode.getBitCode64());
        mRSLocal = rs;
        __F16 = Element.F16(rs);
        __F16_2 = Element.F16_2(rs);
        __F16_4 = Element.F16_4(rs);
        __F32 = Element.F32(rs);
        __F32_2 = Element.F32_2(rs);
        __F32_4 = Element.F32_4(rs);
        __F64 = Element.F64(rs);
        __F64_2 = Element.F64_2(rs);
        __F64_4 = Element.F64_4(rs);
        __I8 = Element.I8(rs);
        __I8_2 = Element.I8_2(rs);
        __I8_4 = Element.I8_4(rs);
        __I16 = Element.I16(rs);
        __I16_2 = Element.I16_2(rs);
        __I16_4 = Element.I16_4(rs);
        __I32 = Element.I32(rs);
        __I32_2 = Element.I32_2(rs);
        __I32_4 = Element.I32_4(rs);
        __I64 = Element.I64(rs);
        __I64_2 = Element.I64_2(rs);
        __I64_4 = Element.I64_4(rs);
        __U8 = Element.U8(rs);
        __U8_2 = Element.U8_2(rs);
        __U8_4 = Element.U8_4(rs);
        __U16 = Element.U16(rs);
        __U16_2 = Element.U16_2(rs);
        __U16_4 = Element.U16_4(rs);
        __U32 = Element.U32(rs);
        __U32_2 = Element.U32_2(rs);
        __U32_4 = Element.U32_4(rs);
        __U64 = Element.U64(rs);
        __U64_2 = Element.U64_2(rs);
        __U64_4 = Element.U64_4(rs);
        __BOOLEAN = Element.BOOLEAN(rs);
    }

    private Element __BOOLEAN;
    private Element __F16;
    private Element __F16_2;
    private Element __F16_4;
    private Element __F32;
    private Element __F32_2;
    private Element __F32_4;
    private Element __F64;
    private Element __F64_2;
    private Element __F64_4;
    private Element __I16;
    private Element __I16_2;
    private Element __I16_4;
    private Element __I32;
    private Element __I32_2;
    private Element __I32_4;
    private Element __I64;
    private Element __I64_2;
    private Element __I64_4;
    private Element __I8;
    private Element __I8_2;
    private Element __I8_4;
    private Element __U16;
    private Element __U16_2;
    private Element __U16_4;
    private Element __U32;
    private Element __U32_2;
    private Element __U32_4;
    private Element __U64;
    private Element __U64_2;
    private Element __U64_4;
    private Element __U8;
    private Element __U8_2;
    private Element __U8_4;
    private RenderScript mRSLocal;
    // To obtain the result, invoke get(), which blocks
    // until the asynchronously-launched operation has completed.
    public static class resultArray7_bool {
        public boolean[] get() {
            if (!mGotResult) {
                byte[] outArray = new byte[7];
                mOut.copyTo(outArray);
                boolean[] result = new boolean[7];
                for (int Idx = 0; Idx < 7; ++Idx) {
                    result[Idx] = outArray[Idx] != 0;
                }

                mResult = result;
                mOut.destroy();
                mOut = null;  // make Java object eligible for garbage collection
                if (mTempIns != null) {
                    for (Allocation tempIn : mTempIns) {
                        tempIn.destroy();
                    }

                    mTempIns = null;  // make Java objects eligible for garbage collection
                }

                mGotResult = true;
            }

            return mResult;
        }

        private  resultArray7_bool(Allocation out) {
            mTempIns = null;
            mOut = out;
            mGotResult = false;
        }

        private Allocation[] mTempIns;
        private Allocation mOut;
        private boolean mGotResult;
        private boolean[] mResult;
    }

    // To obtain the result, invoke get(), which blocks
    // until the asynchronously-launched operation has completed.
    public static class resultArray7_char {
        public byte[] get() {
            if (!mGotResult) {
                byte[] outArray = new byte[7];
                mOut.copyTo(outArray);
                mResult = outArray;
                mOut.destroy();
                mOut = null;  // make Java object eligible for garbage collection
                if (mTempIns != null) {
                    for (Allocation tempIn : mTempIns) {
                        tempIn.destroy();
                    }

                    mTempIns = null;  // make Java objects eligible for garbage collection
                }

                mGotResult = true;
            }

            return mResult;
        }

        private  resultArray7_char(Allocation out) {
            mTempIns = null;
            mOut = out;
            mGotResult = false;
        }

        private Allocation[] mTempIns;
        private Allocation mOut;
        private boolean mGotResult;
        private byte[] mResult;
    }

    // To obtain the result, invoke get(), which blocks
    // until the asynchronously-launched operation has completed.
    public static class resultArray7_char2 {
        public Byte2[] get() {
            if (!mGotResult) {
                byte[] outArray = new byte[14];
                mOut.copyTo(outArray);
                Byte2[] result = new Byte2[7];
                for (int Idx = 0; Idx < 7; ++Idx) {
                    result[Idx] = new Byte2(outArray[2*Idx+0], outArray[2*Idx+1]);
                }

                mResult = result;
                mOut.destroy();
                mOut = null;  // make Java object eligible for garbage collection
                if (mTempIns != null) {
                    for (Allocation tempIn : mTempIns) {
                        tempIn.destroy();
                    }

                    mTempIns = null;  // make Java objects eligible for garbage collection
                }

                mGotResult = true;
            }

            return mResult;
        }

        private  resultArray7_char2(Allocation out) {
            mTempIns = null;
            mOut = out;
            mGotResult = false;
        }

        private Allocation[] mTempIns;
        private Allocation mOut;
        private boolean mGotResult;
        private Byte2[] mResult;
    }

    // To obtain the result, invoke get(), which blocks
    // until the asynchronously-launched operation has completed.
    public static class resultArray7_char4 {
        public Byte4[] get() {
            if (!mGotResult) {
                byte[] outArray = new byte[28];
                mOut.copyTo(outArray);
                Byte4[] result = new Byte4[7];
                for (int Idx = 0; Idx < 7; ++Idx) {
                    result[Idx] = new Byte4(outArray[4*Idx+0], outArray[4*Idx+1], outArray[4*Idx+2], outArray[4*Idx+3]);
                }

                mResult = result;
                mOut.destroy();
                mOut = null;  // make Java object eligible for garbage collection
                if (mTempIns != null) {
                    for (Allocation tempIn : mTempIns) {
                        tempIn.destroy();
                    }

                    mTempIns = null;  // make Java objects eligible for garbage collection
                }

                mGotResult = true;
            }

            return mResult;
        }

        private  resultArray7_char4(Allocation out) {
            mTempIns = null;
            mOut = out;
            mGotResult = false;
        }

        private Allocation[] mTempIns;
        private Allocation mOut;
        private boolean mGotResult;
        private Byte4[] mResult;
    }

    // To obtain the result, invoke get(), which blocks
    // until the asynchronously-launched operation has completed.
    public static class resultArray7_double {
        public double[] get() {
            if (!mGotResult) {
                double[] outArray = new double[7];
                mOut.copyTo(outArray);
                mResult = outArray;
                mOut.destroy();
                mOut = null;  // make Java object eligible for garbage collection
                if (mTempIns != null) {
                    for (Allocation tempIn : mTempIns) {
                        tempIn.destroy();
                    }

                    mTempIns = null;  // make Java objects eligible for garbage collection
                }

                mGotResult = true;
            }

            return mResult;
        }

        private  resultArray7_double(Allocation out) {
            mTempIns = null;
            mOut = out;
            mGotResult = false;
        }

        private Allocation[] mTempIns;
        private Allocation mOut;
        private boolean mGotResult;
        private double[] mResult;
    }

    // To obtain the result, invoke get(), which blocks
    // until the asynchronously-launched operation has completed.
    public static class resultArray7_double2 {
        public Double2[] get() {
            if (!mGotResult) {
                double[] outArray = new double[14];
                mOut.copyTo(outArray);
                Double2[] result = new Double2[7];
                for (int Idx = 0; Idx < 7; ++Idx) {
                    result[Idx] = new Double2(outArray[2*Idx+0], outArray[2*Idx+1]);
                }

                mResult = result;
                mOut.destroy();
                mOut = null;  // make Java object eligible for garbage collection
                if (mTempIns != null) {
                    for (Allocation tempIn : mTempIns) {
                        tempIn.destroy();
                    }

                    mTempIns = null;  // make Java objects eligible for garbage collection
                }

                mGotResult = true;
            }

            return mResult;
        }

        private  resultArray7_double2(Allocation out) {
            mTempIns = null;
            mOut = out;
            mGotResult = false;
        }

        private Allocation[] mTempIns;
        private Allocation mOut;
        private boolean mGotResult;
        private Double2[] mResult;
    }

    // To obtain the result, invoke get(), which blocks
    // until the asynchronously-launched operation has completed.
    public static class resultArray7_double4 {
        public Double4[] get() {
            if (!mGotResult) {
                double[] outArray = new double[28];
                mOut.copyTo(outArray);
                Double4[] result = new Double4[7];
                for (int Idx = 0; Idx < 7; ++Idx) {
                    result[Idx] = new Double4(outArray[4*Idx+0], outArray[4*Idx+1], outArray[4*Idx+2], outArray[4*Idx+3]);
                }

                mResult = result;
                mOut.destroy();
                mOut = null;  // make Java object eligible for garbage collection
                if (mTempIns != null) {
                    for (Allocation tempIn : mTempIns) {
                        tempIn.destroy();
                    }

                    mTempIns = null;  // make Java objects eligible for garbage collection
                }

                mGotResult = true;
            }

            return mResult;
        }

        private  resultArray7_double4(Allocation out) {
            mTempIns = null;
            mOut = out;
            mGotResult = false;
        }

        private Allocation[] mTempIns;
        private Allocation mOut;
        private boolean mGotResult;
        private Double4[] mResult;
    }

    // To obtain the result, invoke get(), which blocks
    // until the asynchronously-launched operation has completed.
    public static class resultArray7_float {
        public float[] get() {
            if (!mGotResult) {
                float[] outArray = new float[7];
                mOut.copyTo(outArray);
                mResult = outArray;
                mOut.destroy();
                mOut = null;  // make Java object eligible for garbage collection
                if (mTempIns != null) {
                    for (Allocation tempIn : mTempIns) {
                        tempIn.destroy();
                    }

                    mTempIns = null;  // make Java objects eligible for garbage collection
                }

                mGotResult = true;
            }

            return mResult;
        }

        private  resultArray7_float(Allocation out) {
            mTempIns = null;
            mOut = out;
            mGotResult = false;
        }

        private Allocation[] mTempIns;
        private Allocation mOut;
        private boolean mGotResult;
        private float[] mResult;
    }

    // To obtain the result, invoke get(), which blocks
    // until the asynchronously-launched operation has completed.
    public static class resultArray7_float2 {
        public Float2[] get() {
            if (!mGotResult) {
                float[] outArray = new float[14];
                mOut.copyTo(outArray);
                Float2[] result = new Float2[7];
                for (int Idx = 0; Idx < 7; ++Idx) {
                    result[Idx] = new Float2(outArray[2*Idx+0], outArray[2*Idx+1]);
                }

                mResult = result;
                mOut.destroy();
                mOut = null;  // make Java object eligible for garbage collection
                if (mTempIns != null) {
                    for (Allocation tempIn : mTempIns) {
                        tempIn.destroy();
                    }

                    mTempIns = null;  // make Java objects eligible for garbage collection
                }

                mGotResult = true;
            }

            return mResult;
        }

        private  resultArray7_float2(Allocation out) {
            mTempIns = null;
            mOut = out;
            mGotResult = false;
        }

        private Allocation[] mTempIns;
        private Allocation mOut;
        private boolean mGotResult;
        private Float2[] mResult;
    }

    // To obtain the result, invoke get(), which blocks
    // until the asynchronously-launched operation has completed.
    public static class resultArray7_float4 {
        public Float4[] get() {
            if (!mGotResult) {
                float[] outArray = new float[28];
                mOut.copyTo(outArray);
                Float4[] result = new Float4[7];
                for (int Idx = 0; Idx < 7; ++Idx) {
                    result[Idx] = new Float4(outArray[4*Idx+0], outArray[4*Idx+1], outArray[4*Idx+2], outArray[4*Idx+3]);
                }

                mResult = result;
                mOut.destroy();
                mOut = null;  // make Java object eligible for garbage collection
                if (mTempIns != null) {
                    for (Allocation tempIn : mTempIns) {
                        tempIn.destroy();
                    }

                    mTempIns = null;  // make Java objects eligible for garbage collection
                }

                mGotResult = true;
            }

            return mResult;
        }

        private  resultArray7_float4(Allocation out) {
            mTempIns = null;
            mOut = out;
            mGotResult = false;
        }

        private Allocation[] mTempIns;
        private Allocation mOut;
        private boolean mGotResult;
        private Float4[] mResult;
    }

    // To obtain the result, invoke get(), which blocks
    // until the asynchronously-launched operation has completed.
    public static class resultArray7_half {
        public short[] get() {
            if (!mGotResult) {
                short[] outArray = new short[7];
                mOut.copyTo(outArray);
                mResult = outArray;
                mOut.destroy();
                mOut = null;  // make Java object eligible for garbage collection
                if (mTempIns != null) {
                    for (Allocation tempIn : mTempIns) {
                        tempIn.destroy();
                    }

                    mTempIns = null;  // make Java objects eligible for garbage collection
                }

                mGotResult = true;
            }

            return mResult;
        }

        private  resultArray7_half(Allocation out) {
            mTempIns = null;
            mOut = out;
            mGotResult = false;
        }

        private Allocation[] mTempIns;
        private Allocation mOut;
        private boolean mGotResult;
        private short[] mResult;
    }

    // To obtain the result, invoke get(), which blocks
    // until the asynchronously-launched operation has completed.
    public static class resultArray7_half2 {
        public Short2[] get() {
            if (!mGotResult) {
                short[] outArray = new short[14];
                mOut.copyTo(outArray);
                Short2[] result = new Short2[7];
                for (int Idx = 0; Idx < 7; ++Idx) {
                    result[Idx] = new Short2(outArray[2*Idx+0], outArray[2*Idx+1]);
                }

                mResult = result;
                mOut.destroy();
                mOut = null;  // make Java object eligible for garbage collection
                if (mTempIns != null) {
                    for (Allocation tempIn : mTempIns) {
                        tempIn.destroy();
                    }

                    mTempIns = null;  // make Java objects eligible for garbage collection
                }

                mGotResult = true;
            }

            return mResult;
        }

        private  resultArray7_half2(Allocation out) {
            mTempIns = null;
            mOut = out;
            mGotResult = false;
        }

        private Allocation[] mTempIns;
        private Allocation mOut;
        private boolean mGotResult;
        private Short2[] mResult;
    }

    // To obtain the result, invoke get(), which blocks
    // until the asynchronously-launched operation has completed.
    public static class resultArray7_half4 {
        public Short4[] get() {
            if (!mGotResult) {
                short[] outArray = new short[28];
                mOut.copyTo(outArray);
                Short4[] result = new Short4[7];
                for (int Idx = 0; Idx < 7; ++Idx) {
                    result[Idx] = new Short4(outArray[4*Idx+0], outArray[4*Idx+1], outArray[4*Idx+2], outArray[4*Idx+3]);
                }

                mResult = result;
                mOut.destroy();
                mOut = null;  // make Java object eligible for garbage collection
                if (mTempIns != null) {
                    for (Allocation tempIn : mTempIns) {
                        tempIn.destroy();
                    }

                    mTempIns = null;  // make Java objects eligible for garbage collection
                }

                mGotResult = true;
            }

            return mResult;
        }

        private  resultArray7_half4(Allocation out) {
            mTempIns = null;
            mOut = out;
            mGotResult = false;
        }

        private Allocation[] mTempIns;
        private Allocation mOut;
        private boolean mGotResult;
        private Short4[] mResult;
    }

    // To obtain the result, invoke get(), which blocks
    // until the asynchronously-launched operation has completed.
    public static class resultArray7_int {
        public int[] get() {
            if (!mGotResult) {
                int[] outArray = new int[7];
                mOut.copyTo(outArray);
                mResult = outArray;
                mOut.destroy();
                mOut = null;  // make Java object eligible for garbage collection
                if (mTempIns != null) {
                    for (Allocation tempIn : mTempIns) {
                        tempIn.destroy();
                    }

                    mTempIns = null;  // make Java objects eligible for garbage collection
                }

                mGotResult = true;
            }

            return mResult;
        }

        private  resultArray7_int(Allocation out) {
            mTempIns = null;
            mOut = out;
            mGotResult = false;
        }

        private Allocation[] mTempIns;
        private Allocation mOut;
        private boolean mGotResult;
        private int[] mResult;
    }

    // To obtain the result, invoke get(), which blocks
    // until the asynchronously-launched operation has completed.
    public static class resultArray7_int2 {
        public Int2[] get() {
            if (!mGotResult) {
                int[] outArray = new int[14];
                mOut.copyTo(outArray);
                Int2[] result = new Int2[7];
                for (int Idx = 0; Idx < 7; ++Idx) {
                    result[Idx] = new Int2(outArray[2*Idx+0], outArray[2*Idx+1]);
                }

                mResult = result;
                mOut.destroy();
                mOut = null;  // make Java object eligible for garbage collection
                if (mTempIns != null) {
                    for (Allocation tempIn : mTempIns) {
                        tempIn.destroy();
                    }

                    mTempIns = null;  // make Java objects eligible for garbage collection
                }

                mGotResult = true;
            }

            return mResult;
        }

        private  resultArray7_int2(Allocation out) {
            mTempIns = null;
            mOut = out;
            mGotResult = false;
        }

        private Allocation[] mTempIns;
        private Allocation mOut;
        private boolean mGotResult;
        private Int2[] mResult;
    }

    // To obtain the result, invoke get(), which blocks
    // until the asynchronously-launched operation has completed.
    public static class resultArray7_int4 {
        public Int4[] get() {
            if (!mGotResult) {
                int[] outArray = new int[28];
                mOut.copyTo(outArray);
                Int4[] result = new Int4[7];
                for (int Idx = 0; Idx < 7; ++Idx) {
                    result[Idx] = new Int4(outArray[4*Idx+0], outArray[4*Idx+1], outArray[4*Idx+2], outArray[4*Idx+3]);
                }

                mResult = result;
                mOut.destroy();
                mOut = null;  // make Java object eligible for garbage collection
                if (mTempIns != null) {
                    for (Allocation tempIn : mTempIns) {
                        tempIn.destroy();
                    }

                    mTempIns = null;  // make Java objects eligible for garbage collection
                }

                mGotResult = true;
            }

            return mResult;
        }

        private  resultArray7_int4(Allocation out) {
            mTempIns = null;
            mOut = out;
            mGotResult = false;
        }

        private Allocation[] mTempIns;
        private Allocation mOut;
        private boolean mGotResult;
        private Int4[] mResult;
    }

    // To obtain the result, invoke get(), which blocks
    // until the asynchronously-launched operation has completed.
    public static class resultArray7_long {
        public long[] get() {
            if (!mGotResult) {
                long[] outArray = new long[7];
                mOut.copyTo(outArray);
                mResult = outArray;
                mOut.destroy();
                mOut = null;  // make Java object eligible for garbage collection
                if (mTempIns != null) {
                    for (Allocation tempIn : mTempIns) {
                        tempIn.destroy();
                    }

                    mTempIns = null;  // make Java objects eligible for garbage collection
                }

                mGotResult = true;
            }

            return mResult;
        }

        private  resultArray7_long(Allocation out) {
            mTempIns = null;
            mOut = out;
            mGotResult = false;
        }

        private Allocation[] mTempIns;
        private Allocation mOut;
        private boolean mGotResult;
        private long[] mResult;
    }

    // To obtain the result, invoke get(), which blocks
    // until the asynchronously-launched operation has completed.
    public static class resultArray7_long2 {
        public Long2[] get() {
            if (!mGotResult) {
                long[] outArray = new long[14];
                mOut.copyTo(outArray);
                Long2[] result = new Long2[7];
                for (int Idx = 0; Idx < 7; ++Idx) {
                    result[Idx] = new Long2(outArray[2*Idx+0], outArray[2*Idx+1]);
                }

                mResult = result;
                mOut.destroy();
                mOut = null;  // make Java object eligible for garbage collection
                if (mTempIns != null) {
                    for (Allocation tempIn : mTempIns) {
                        tempIn.destroy();
                    }

                    mTempIns = null;  // make Java objects eligible for garbage collection
                }

                mGotResult = true;
            }

            return mResult;
        }

        private  resultArray7_long2(Allocation out) {
            mTempIns = null;
            mOut = out;
            mGotResult = false;
        }

        private Allocation[] mTempIns;
        private Allocation mOut;
        private boolean mGotResult;
        private Long2[] mResult;
    }

    // To obtain the result, invoke get(), which blocks
    // until the asynchronously-launched operation has completed.
    public static class resultArray7_long4 {
        public Long4[] get() {
            if (!mGotResult) {
                long[] outArray = new long[28];
                mOut.copyTo(outArray);
                Long4[] result = new Long4[7];
                for (int Idx = 0; Idx < 7; ++Idx) {
                    result[Idx] = new Long4(outArray[4*Idx+0], outArray[4*Idx+1], outArray[4*Idx+2], outArray[4*Idx+3]);
                }

                mResult = result;
                mOut.destroy();
                mOut = null;  // make Java object eligible for garbage collection
                if (mTempIns != null) {
                    for (Allocation tempIn : mTempIns) {
                        tempIn.destroy();
                    }

                    mTempIns = null;  // make Java objects eligible for garbage collection
                }

                mGotResult = true;
            }

            return mResult;
        }

        private  resultArray7_long4(Allocation out) {
            mTempIns = null;
            mOut = out;
            mGotResult = false;
        }

        private Allocation[] mTempIns;
        private Allocation mOut;
        private boolean mGotResult;
        private Long4[] mResult;
    }

    // To obtain the result, invoke get(), which blocks
    // until the asynchronously-launched operation has completed.
    public static class resultArray7_short {
        public short[] get() {
            if (!mGotResult) {
                short[] outArray = new short[7];
                mOut.copyTo(outArray);
                mResult = outArray;
                mOut.destroy();
                mOut = null;  // make Java object eligible for garbage collection
                if (mTempIns != null) {
                    for (Allocation tempIn : mTempIns) {
                        tempIn.destroy();
                    }

                    mTempIns = null;  // make Java objects eligible for garbage collection
                }

                mGotResult = true;
            }

            return mResult;
        }

        private  resultArray7_short(Allocation out) {
            mTempIns = null;
            mOut = out;
            mGotResult = false;
        }

        private Allocation[] mTempIns;
        private Allocation mOut;
        private boolean mGotResult;
        private short[] mResult;
    }

    // To obtain the result, invoke get(), which blocks
    // until the asynchronously-launched operation has completed.
    public static class resultArray7_short2 {
        public Short2[] get() {
            if (!mGotResult) {
                short[] outArray = new short[14];
                mOut.copyTo(outArray);
                Short2[] result = new Short2[7];
                for (int Idx = 0; Idx < 7; ++Idx) {
                    result[Idx] = new Short2(outArray[2*Idx+0], outArray[2*Idx+1]);
                }

                mResult = result;
                mOut.destroy();
                mOut = null;  // make Java object eligible for garbage collection
                if (mTempIns != null) {
                    for (Allocation tempIn : mTempIns) {
                        tempIn.destroy();
                    }

                    mTempIns = null;  // make Java objects eligible for garbage collection
                }

                mGotResult = true;
            }

            return mResult;
        }

        private  resultArray7_short2(Allocation out) {
            mTempIns = null;
            mOut = out;
            mGotResult = false;
        }

        private Allocation[] mTempIns;
        private Allocation mOut;
        private boolean mGotResult;
        private Short2[] mResult;
    }

    // To obtain the result, invoke get(), which blocks
    // until the asynchronously-launched operation has completed.
    public static class resultArray7_short4 {
        public Short4[] get() {
            if (!mGotResult) {
                short[] outArray = new short[28];
                mOut.copyTo(outArray);
                Short4[] result = new Short4[7];
                for (int Idx = 0; Idx < 7; ++Idx) {
                    result[Idx] = new Short4(outArray[4*Idx+0], outArray[4*Idx+1], outArray[4*Idx+2], outArray[4*Idx+3]);
                }

                mResult = result;
                mOut.destroy();
                mOut = null;  // make Java object eligible for garbage collection
                if (mTempIns != null) {
                    for (Allocation tempIn : mTempIns) {
                        tempIn.destroy();
                    }

                    mTempIns = null;  // make Java objects eligible for garbage collection
                }

                mGotResult = true;
            }

            return mResult;
        }

        private  resultArray7_short4(Allocation out) {
            mTempIns = null;
            mOut = out;
            mGotResult = false;
        }

        private Allocation[] mTempIns;
        private Allocation mOut;
        private boolean mGotResult;
        private Short4[] mResult;
    }

    // To obtain the result, invoke get(), which blocks
    // until the asynchronously-launched operation has completed.
    public static class resultArray7_uchar {
        public short[] get() {
            if (!mGotResult) {
                byte[] outArray = new byte[7];
                mOut.copyTo(outArray);
                short[] result = new short[7];
                for (int Idx = 0; Idx < 7; ++Idx) {
                    result[Idx] = ((short) ((outArray[Idx]) & (short) 0xff));
                }

                mResult = result;
                mOut.destroy();
                mOut = null;  // make Java object eligible for garbage collection
                if (mTempIns != null) {
                    for (Allocation tempIn : mTempIns) {
                        tempIn.destroy();
                    }

                    mTempIns = null;  // make Java objects eligible for garbage collection
                }

                mGotResult = true;
            }

            return mResult;
        }

        private  resultArray7_uchar(Allocation out) {
            mTempIns = null;
            mOut = out;
            mGotResult = false;
        }

        private Allocation[] mTempIns;
        private Allocation mOut;
        private boolean mGotResult;
        private short[] mResult;
    }

    // To obtain the result, invoke get(), which blocks
    // until the asynchronously-launched operation has completed.
    public static class resultArray7_uchar2 {
        public Short2[] get() {
            if (!mGotResult) {
                byte[] outArray = new byte[14];
                mOut.copyTo(outArray);
                Short2[] result = new Short2[7];
                for (int Idx = 0; Idx < 7; ++Idx) {
                    result[Idx] = new Short2(((short) ((outArray[2*Idx+0]) & (short) 0xff)), ((short) ((outArray[2*Idx+1]) & (short) 0xff)));
                }

                mResult = result;
                mOut.destroy();
                mOut = null;  // make Java object eligible for garbage collection
                if (mTempIns != null) {
                    for (Allocation tempIn : mTempIns) {
                        tempIn.destroy();
                    }

                    mTempIns = null;  // make Java objects eligible for garbage collection
                }

                mGotResult = true;
            }

            return mResult;
        }

        private  resultArray7_uchar2(Allocation out) {
            mTempIns = null;
            mOut = out;
            mGotResult = false;
        }

        private Allocation[] mTempIns;
        private Allocation mOut;
        private boolean mGotResult;
        private Short2[] mResult;
    }

    // To obtain the result, invoke get(), which blocks
    // until the asynchronously-launched operation has completed.
    public static class resultArray7_uchar4 {
        public Short4[] get() {
            if (!mGotResult) {
                byte[] outArray = new byte[28];
                mOut.copyTo(outArray);
                Short4[] result = new Short4[7];
                for (int Idx = 0; Idx < 7; ++Idx) {
                    result[Idx] = new Short4(((short) ((outArray[4*Idx+0]) & (short) 0xff)), ((short) ((outArray[4*Idx+1]) & (short) 0xff)), ((short) ((outArray[4*Idx+2]) & (short) 0xff)), ((short) ((outArray[4*Idx+3]) & (short) 0xff)));
                }

                mResult = result;
                mOut.destroy();
                mOut = null;  // make Java object eligible for garbage collection
                if (mTempIns != null) {
                    for (Allocation tempIn : mTempIns) {
                        tempIn.destroy();
                    }

                    mTempIns = null;  // make Java objects eligible for garbage collection
                }

                mGotResult = true;
            }

            return mResult;
        }

        private  resultArray7_uchar4(Allocation out) {
            mTempIns = null;
            mOut = out;
            mGotResult = false;
        }

        private Allocation[] mTempIns;
        private Allocation mOut;
        private boolean mGotResult;
        private Short4[] mResult;
    }

    // To obtain the result, invoke get(), which blocks
    // until the asynchronously-launched operation has completed.
    public static class resultArray7_uint {
        public long[] get() {
            if (!mGotResult) {
                int[] outArray = new int[7];
                mOut.copyTo(outArray);
                long[] result = new long[7];
                for (int Idx = 0; Idx < 7; ++Idx) {
                    result[Idx] = ((long) ((outArray[Idx]) & 0xffffffffL));
                }

                mResult = result;
                mOut.destroy();
                mOut = null;  // make Java object eligible for garbage collection
                if (mTempIns != null) {
                    for (Allocation tempIn : mTempIns) {
                        tempIn.destroy();
                    }

                    mTempIns = null;  // make Java objects eligible for garbage collection
                }

                mGotResult = true;
            }

            return mResult;
        }

        private  resultArray7_uint(Allocation out) {
            mTempIns = null;
            mOut = out;
            mGotResult = false;
        }

        private Allocation[] mTempIns;
        private Allocation mOut;
        private boolean mGotResult;
        private long[] mResult;
    }

    // To obtain the result, invoke get(), which blocks
    // until the asynchronously-launched operation has completed.
    public static class resultArray7_uint2 {
        public Long2[] get() {
            if (!mGotResult) {
                int[] outArray = new int[14];
                mOut.copyTo(outArray);
                Long2[] result = new Long2[7];
                for (int Idx = 0; Idx < 7; ++Idx) {
                    result[Idx] = new Long2(((long) ((outArray[2*Idx+0]) & 0xffffffffL)), ((long) ((outArray[2*Idx+1]) & 0xffffffffL)));
                }

                mResult = result;
                mOut.destroy();
                mOut = null;  // make Java object eligible for garbage collection
                if (mTempIns != null) {
                    for (Allocation tempIn : mTempIns) {
                        tempIn.destroy();
                    }

                    mTempIns = null;  // make Java objects eligible for garbage collection
                }

                mGotResult = true;
            }

            return mResult;
        }

        private  resultArray7_uint2(Allocation out) {
            mTempIns = null;
            mOut = out;
            mGotResult = false;
        }

        private Allocation[] mTempIns;
        private Allocation mOut;
        private boolean mGotResult;
        private Long2[] mResult;
    }

    // To obtain the result, invoke get(), which blocks
    // until the asynchronously-launched operation has completed.
    public static class resultArray7_uint4 {
        public Long4[] get() {
            if (!mGotResult) {
                int[] outArray = new int[28];
                mOut.copyTo(outArray);
                Long4[] result = new Long4[7];
                for (int Idx = 0; Idx < 7; ++Idx) {
                    result[Idx] = new Long4(((long) ((outArray[4*Idx+0]) & 0xffffffffL)), ((long) ((outArray[4*Idx+1]) & 0xffffffffL)), ((long) ((outArray[4*Idx+2]) & 0xffffffffL)), ((long) ((outArray[4*Idx+3]) & 0xffffffffL)));
                }

                mResult = result;
                mOut.destroy();
                mOut = null;  // make Java object eligible for garbage collection
                if (mTempIns != null) {
                    for (Allocation tempIn : mTempIns) {
                        tempIn.destroy();
                    }

                    mTempIns = null;  // make Java objects eligible for garbage collection
                }

                mGotResult = true;
            }

            return mResult;
        }

        private  resultArray7_uint4(Allocation out) {
            mTempIns = null;
            mOut = out;
            mGotResult = false;
        }

        private Allocation[] mTempIns;
        private Allocation mOut;
        private boolean mGotResult;
        private Long4[] mResult;
    }

    // To obtain the result, invoke get(), which blocks
    // until the asynchronously-launched operation has completed.
    public static class resultArray7_ulong {
        public long[] get() {
            if (!mGotResult) {
                long[] outArray = new long[7];
                mOut.copyTo(outArray);
                for (int Idx = 0; Idx < 7; ++Idx) {
                    if (outArray[Idx] < 0)
                        throw new RSRuntimeException("Result is not representible in Java");
                }

                mResult = outArray;
                mOut.destroy();
                mOut = null;  // make Java object eligible for garbage collection
                if (mTempIns != null) {
                    for (Allocation tempIn : mTempIns) {
                        tempIn.destroy();
                    }

                    mTempIns = null;  // make Java objects eligible for garbage collection
                }

                mGotResult = true;
            }

            return mResult;
        }

        private  resultArray7_ulong(Allocation out) {
            mTempIns = null;
            mOut = out;
            mGotResult = false;
        }

        private Allocation[] mTempIns;
        private Allocation mOut;
        private boolean mGotResult;
        private long[] mResult;
    }

    // To obtain the result, invoke get(), which blocks
    // until the asynchronously-launched operation has completed.
    public static class resultArray7_ulong2 {
        public Long2[] get() {
            if (!mGotResult) {
                long[] outArray = new long[14];
                mOut.copyTo(outArray);
                for (int Idx = 0; Idx < 14; ++Idx) {
                    if (outArray[Idx] < 0)
                        throw new RSRuntimeException("Result is not representible in Java");
                }

                Long2[] result = new Long2[7];
                for (int Idx = 0; Idx < 7; ++Idx) {
                    result[Idx] = new Long2(outArray[2*Idx+0], outArray[2*Idx+1]);
                }

                mResult = result;
                mOut.destroy();
                mOut = null;  // make Java object eligible for garbage collection
                if (mTempIns != null) {
                    for (Allocation tempIn : mTempIns) {
                        tempIn.destroy();
                    }

                    mTempIns = null;  // make Java objects eligible for garbage collection
                }

                mGotResult = true;
            }

            return mResult;
        }

        private  resultArray7_ulong2(Allocation out) {
            mTempIns = null;
            mOut = out;
            mGotResult = false;
        }

        private Allocation[] mTempIns;
        private Allocation mOut;
        private boolean mGotResult;
        private Long2[] mResult;
    }

    // To obtain the result, invoke get(), which blocks
    // until the asynchronously-launched operation has completed.
    public static class resultArray7_ulong4 {
        public Long4[] get() {
            if (!mGotResult) {
                long[] outArray = new long[28];
                mOut.copyTo(outArray);
                for (int Idx = 0; Idx < 28; ++Idx) {
                    if (outArray[Idx] < 0)
                        throw new RSRuntimeException("Result is not representible in Java");
                }

                Long4[] result = new Long4[7];
                for (int Idx = 0; Idx < 7; ++Idx) {
                    result[Idx] = new Long4(outArray[4*Idx+0], outArray[4*Idx+1], outArray[4*Idx+2], outArray[4*Idx+3]);
                }

                mResult = result;
                mOut.destroy();
                mOut = null;  // make Java object eligible for garbage collection
                if (mTempIns != null) {
                    for (Allocation tempIn : mTempIns) {
                        tempIn.destroy();
                    }

                    mTempIns = null;  // make Java objects eligible for garbage collection
                }

                mGotResult = true;
            }

            return mResult;
        }

        private  resultArray7_ulong4(Allocation out) {
            mTempIns = null;
            mOut = out;
            mGotResult = false;
        }

        private Allocation[] mTempIns;
        private Allocation mOut;
        private boolean mGotResult;
        private Long4[] mResult;
    }

    // To obtain the result, invoke get(), which blocks
    // until the asynchronously-launched operation has completed.
    public static class resultArray7_ushort {
        public int[] get() {
            if (!mGotResult) {
                short[] outArray = new short[7];
                mOut.copyTo(outArray);
                int[] result = new int[7];
                for (int Idx = 0; Idx < 7; ++Idx) {
                    result[Idx] = ((int) ((outArray[Idx]) & 0xffff));
                }

                mResult = result;
                mOut.destroy();
                mOut = null;  // make Java object eligible for garbage collection
                if (mTempIns != null) {
                    for (Allocation tempIn : mTempIns) {
                        tempIn.destroy();
                    }

                    mTempIns = null;  // make Java objects eligible for garbage collection
                }

                mGotResult = true;
            }

            return mResult;
        }

        private  resultArray7_ushort(Allocation out) {
            mTempIns = null;
            mOut = out;
            mGotResult = false;
        }

        private Allocation[] mTempIns;
        private Allocation mOut;
        private boolean mGotResult;
        private int[] mResult;
    }

    // To obtain the result, invoke get(), which blocks
    // until the asynchronously-launched operation has completed.
    public static class resultArray7_ushort2 {
        public Int2[] get() {
            if (!mGotResult) {
                short[] outArray = new short[14];
                mOut.copyTo(outArray);
                Int2[] result = new Int2[7];
                for (int Idx = 0; Idx < 7; ++Idx) {
                    result[Idx] = new Int2(((int) ((outArray[2*Idx+0]) & 0xffff)), ((int) ((outArray[2*Idx+1]) & 0xffff)));
                }

                mResult = result;
                mOut.destroy();
                mOut = null;  // make Java object eligible for garbage collection
                if (mTempIns != null) {
                    for (Allocation tempIn : mTempIns) {
                        tempIn.destroy();
                    }

                    mTempIns = null;  // make Java objects eligible for garbage collection
                }

                mGotResult = true;
            }

            return mResult;
        }

        private  resultArray7_ushort2(Allocation out) {
            mTempIns = null;
            mOut = out;
            mGotResult = false;
        }

        private Allocation[] mTempIns;
        private Allocation mOut;
        private boolean mGotResult;
        private Int2[] mResult;
    }

    // To obtain the result, invoke get(), which blocks
    // until the asynchronously-launched operation has completed.
    public static class resultArray7_ushort4 {
        public Int4[] get() {
            if (!mGotResult) {
                short[] outArray = new short[28];
                mOut.copyTo(outArray);
                Int4[] result = new Int4[7];
                for (int Idx = 0; Idx < 7; ++Idx) {
                    result[Idx] = new Int4(((int) ((outArray[4*Idx+0]) & 0xffff)), ((int) ((outArray[4*Idx+1]) & 0xffff)), ((int) ((outArray[4*Idx+2]) & 0xffff)), ((int) ((outArray[4*Idx+3]) & 0xffff)));
                }

                mResult = result;
                mOut.destroy();
                mOut = null;  // make Java object eligible for garbage collection
                if (mTempIns != null) {
                    for (Allocation tempIn : mTempIns) {
                        tempIn.destroy();
                    }

                    mTempIns = null;  // make Java objects eligible for garbage collection
                }

                mGotResult = true;
            }

            return mResult;
        }

        private  resultArray7_ushort4(Allocation out) {
            mTempIns = null;
            mOut = out;
            mGotResult = false;
        }

        private Allocation[] mTempIns;
        private Allocation mOut;
        private boolean mGotResult;
        private Int4[] mResult;
    }

    // To obtain the result, invoke get(), which blocks
    // until the asynchronously-launched operation has completed.
    public static class result_bool {
        public boolean get() {
            if (!mGotResult) {
                byte[] outArray = new byte[1];
                mOut.copyTo(outArray);
                mResult = outArray[0] != 0;
                mOut.destroy();
                mOut = null;  // make Java object eligible for garbage collection
                if (mTempIns != null) {
                    for (Allocation tempIn : mTempIns) {
                        tempIn.destroy();
                    }

                    mTempIns = null;  // make Java objects eligible for garbage collection
                }

                mGotResult = true;
            }

            return mResult;
        }

        private  result_bool(Allocation out) {
            mTempIns = null;
            mOut = out;
            mGotResult = false;
        }

        private Allocation[] mTempIns;
        private Allocation mOut;
        private boolean mGotResult;
        private boolean mResult;
    }

    // To obtain the result, invoke get(), which blocks
    // until the asynchronously-launched operation has completed.
    public static class result_char {
        public byte get() {
            if (!mGotResult) {
                byte[] outArray = new byte[1];
                mOut.copyTo(outArray);
                mResult = outArray[0];
                mOut.destroy();
                mOut = null;  // make Java object eligible for garbage collection
                if (mTempIns != null) {
                    for (Allocation tempIn : mTempIns) {
                        tempIn.destroy();
                    }

                    mTempIns = null;  // make Java objects eligible for garbage collection
                }

                mGotResult = true;
            }

            return mResult;
        }

        private  result_char(Allocation out) {
            mTempIns = null;
            mOut = out;
            mGotResult = false;
        }

        private Allocation[] mTempIns;
        private Allocation mOut;
        private boolean mGotResult;
        private byte mResult;
    }

    // To obtain the result, invoke get(), which blocks
    // until the asynchronously-launched operation has completed.
    public static class result_char2 {
        public Byte2 get() {
            if (!mGotResult) {
                byte[] outArray = new byte[2];
                mOut.copyTo(outArray);
                mResult = new Byte2(outArray[0], outArray[1]);
                mOut.destroy();
                mOut = null;  // make Java object eligible for garbage collection
                if (mTempIns != null) {
                    for (Allocation tempIn : mTempIns) {
                        tempIn.destroy();
                    }

                    mTempIns = null;  // make Java objects eligible for garbage collection
                }

                mGotResult = true;
            }

            return mResult;
        }

        private  result_char2(Allocation out) {
            mTempIns = null;
            mOut = out;
            mGotResult = false;
        }

        private Allocation[] mTempIns;
        private Allocation mOut;
        private boolean mGotResult;
        private Byte2 mResult;
    }

    // To obtain the result, invoke get(), which blocks
    // until the asynchronously-launched operation has completed.
    public static class result_char4 {
        public Byte4 get() {
            if (!mGotResult) {
                byte[] outArray = new byte[4];
                mOut.copyTo(outArray);
                mResult = new Byte4(outArray[0], outArray[1], outArray[2], outArray[3]);
                mOut.destroy();
                mOut = null;  // make Java object eligible for garbage collection
                if (mTempIns != null) {
                    for (Allocation tempIn : mTempIns) {
                        tempIn.destroy();
                    }

                    mTempIns = null;  // make Java objects eligible for garbage collection
                }

                mGotResult = true;
            }

            return mResult;
        }

        private  result_char4(Allocation out) {
            mTempIns = null;
            mOut = out;
            mGotResult = false;
        }

        private Allocation[] mTempIns;
        private Allocation mOut;
        private boolean mGotResult;
        private Byte4 mResult;
    }

    // To obtain the result, invoke get(), which blocks
    // until the asynchronously-launched operation has completed.
    public static class result_double {
        public double get() {
            if (!mGotResult) {
                double[] outArray = new double[1];
                mOut.copyTo(outArray);
                mResult = outArray[0];
                mOut.destroy();
                mOut = null;  // make Java object eligible for garbage collection
                if (mTempIns != null) {
                    for (Allocation tempIn : mTempIns) {
                        tempIn.destroy();
                    }

                    mTempIns = null;  // make Java objects eligible for garbage collection
                }

                mGotResult = true;
            }

            return mResult;
        }

        private  result_double(Allocation out) {
            mTempIns = null;
            mOut = out;
            mGotResult = false;
        }

        private Allocation[] mTempIns;
        private Allocation mOut;
        private boolean mGotResult;
        private double mResult;
    }

    // To obtain the result, invoke get(), which blocks
    // until the asynchronously-launched operation has completed.
    public static class result_double2 {
        public Double2 get() {
            if (!mGotResult) {
                double[] outArray = new double[2];
                mOut.copyTo(outArray);
                mResult = new Double2(outArray[0], outArray[1]);
                mOut.destroy();
                mOut = null;  // make Java object eligible for garbage collection
                if (mTempIns != null) {
                    for (Allocation tempIn : mTempIns) {
                        tempIn.destroy();
                    }

                    mTempIns = null;  // make Java objects eligible for garbage collection
                }

                mGotResult = true;
            }

            return mResult;
        }

        private  result_double2(Allocation out) {
            mTempIns = null;
            mOut = out;
            mGotResult = false;
        }

        private Allocation[] mTempIns;
        private Allocation mOut;
        private boolean mGotResult;
        private Double2 mResult;
    }

    // To obtain the result, invoke get(), which blocks
    // until the asynchronously-launched operation has completed.
    public static class result_double4 {
        public Double4 get() {
            if (!mGotResult) {
                double[] outArray = new double[4];
                mOut.copyTo(outArray);
                mResult = new Double4(outArray[0], outArray[1], outArray[2], outArray[3]);
                mOut.destroy();
                mOut = null;  // make Java object eligible for garbage collection
                if (mTempIns != null) {
                    for (Allocation tempIn : mTempIns) {
                        tempIn.destroy();
                    }

                    mTempIns = null;  // make Java objects eligible for garbage collection
                }

                mGotResult = true;
            }

            return mResult;
        }

        private  result_double4(Allocation out) {
            mTempIns = null;
            mOut = out;
            mGotResult = false;
        }

        private Allocation[] mTempIns;
        private Allocation mOut;
        private boolean mGotResult;
        private Double4 mResult;
    }

    // To obtain the result, invoke get(), which blocks
    // until the asynchronously-launched operation has completed.
    public static class result_float {
        public float get() {
            if (!mGotResult) {
                float[] outArray = new float[1];
                mOut.copyTo(outArray);
                mResult = outArray[0];
                mOut.destroy();
                mOut = null;  // make Java object eligible for garbage collection
                if (mTempIns != null) {
                    for (Allocation tempIn : mTempIns) {
                        tempIn.destroy();
                    }

                    mTempIns = null;  // make Java objects eligible for garbage collection
                }

                mGotResult = true;
            }

            return mResult;
        }

        private  result_float(Allocation out) {
            mTempIns = null;
            mOut = out;
            mGotResult = false;
        }

        private Allocation[] mTempIns;
        private Allocation mOut;
        private boolean mGotResult;
        private float mResult;
    }

    // To obtain the result, invoke get(), which blocks
    // until the asynchronously-launched operation has completed.
    public static class result_float2 {
        public Float2 get() {
            if (!mGotResult) {
                float[] outArray = new float[2];
                mOut.copyTo(outArray);
                mResult = new Float2(outArray[0], outArray[1]);
                mOut.destroy();
                mOut = null;  // make Java object eligible for garbage collection
                if (mTempIns != null) {
                    for (Allocation tempIn : mTempIns) {
                        tempIn.destroy();
                    }

                    mTempIns = null;  // make Java objects eligible for garbage collection
                }

                mGotResult = true;
            }

            return mResult;
        }

        private  result_float2(Allocation out) {
            mTempIns = null;
            mOut = out;
            mGotResult = false;
        }

        private Allocation[] mTempIns;
        private Allocation mOut;
        private boolean mGotResult;
        private Float2 mResult;
    }

    // To obtain the result, invoke get(), which blocks
    // until the asynchronously-launched operation has completed.
    public static class result_float4 {
        public Float4 get() {
            if (!mGotResult) {
                float[] outArray = new float[4];
                mOut.copyTo(outArray);
                mResult = new Float4(outArray[0], outArray[1], outArray[2], outArray[3]);
                mOut.destroy();
                mOut = null;  // make Java object eligible for garbage collection
                if (mTempIns != null) {
                    for (Allocation tempIn : mTempIns) {
                        tempIn.destroy();
                    }

                    mTempIns = null;  // make Java objects eligible for garbage collection
                }

                mGotResult = true;
            }

            return mResult;
        }

        private  result_float4(Allocation out) {
            mTempIns = null;
            mOut = out;
            mGotResult = false;
        }

        private Allocation[] mTempIns;
        private Allocation mOut;
        private boolean mGotResult;
        private Float4 mResult;
    }

    // To obtain the result, invoke get(), which blocks
    // until the asynchronously-launched operation has completed.
    public static class result_half {
        public short get() {
            if (!mGotResult) {
                short[] outArray = new short[1];
                mOut.copyTo(outArray);
                mResult = outArray[0];
                mOut.destroy();
                mOut = null;  // make Java object eligible for garbage collection
                if (mTempIns != null) {
                    for (Allocation tempIn : mTempIns) {
                        tempIn.destroy();
                    }

                    mTempIns = null;  // make Java objects eligible for garbage collection
                }

                mGotResult = true;
            }

            return mResult;
        }

        private  result_half(Allocation out) {
            mTempIns = null;
            mOut = out;
            mGotResult = false;
        }

        private Allocation[] mTempIns;
        private Allocation mOut;
        private boolean mGotResult;
        private short mResult;
    }

    // To obtain the result, invoke get(), which blocks
    // until the asynchronously-launched operation has completed.
    public static class result_half2 {
        public Short2 get() {
            if (!mGotResult) {
                short[] outArray = new short[2];
                mOut.copyTo(outArray);
                mResult = new Short2(outArray[0], outArray[1]);
                mOut.destroy();
                mOut = null;  // make Java object eligible for garbage collection
                if (mTempIns != null) {
                    for (Allocation tempIn : mTempIns) {
                        tempIn.destroy();
                    }

                    mTempIns = null;  // make Java objects eligible for garbage collection
                }

                mGotResult = true;
            }

            return mResult;
        }

        private  result_half2(Allocation out) {
            mTempIns = null;
            mOut = out;
            mGotResult = false;
        }

        private Allocation[] mTempIns;
        private Allocation mOut;
        private boolean mGotResult;
        private Short2 mResult;
    }

    // To obtain the result, invoke get(), which blocks
    // until the asynchronously-launched operation has completed.
    public static class result_half4 {
        public Short4 get() {
            if (!mGotResult) {
                short[] outArray = new short[4];
                mOut.copyTo(outArray);
                mResult = new Short4(outArray[0], outArray[1], outArray[2], outArray[3]);
                mOut.destroy();
                mOut = null;  // make Java object eligible for garbage collection
                if (mTempIns != null) {
                    for (Allocation tempIn : mTempIns) {
                        tempIn.destroy();
                    }

                    mTempIns = null;  // make Java objects eligible for garbage collection
                }

                mGotResult = true;
            }

            return mResult;
        }

        private  result_half4(Allocation out) {
            mTempIns = null;
            mOut = out;
            mGotResult = false;
        }

        private Allocation[] mTempIns;
        private Allocation mOut;
        private boolean mGotResult;
        private Short4 mResult;
    }

    // To obtain the result, invoke get(), which blocks
    // until the asynchronously-launched operation has completed.
    public static class result_int {
        public int get() {
            if (!mGotResult) {
                int[] outArray = new int[1];
                mOut.copyTo(outArray);
                mResult = outArray[0];
                mOut.destroy();
                mOut = null;  // make Java object eligible for garbage collection
                if (mTempIns != null) {
                    for (Allocation tempIn : mTempIns) {
                        tempIn.destroy();
                    }

                    mTempIns = null;  // make Java objects eligible for garbage collection
                }

                mGotResult = true;
            }

            return mResult;
        }

        private  result_int(Allocation out) {
            mTempIns = null;
            mOut = out;
            mGotResult = false;
        }

        private Allocation[] mTempIns;
        private Allocation mOut;
        private boolean mGotResult;
        private int mResult;
    }

    // To obtain the result, invoke get(), which blocks
    // until the asynchronously-launched operation has completed.
    public static class result_int2 {
        public Int2 get() {
            if (!mGotResult) {
                int[] outArray = new int[2];
                mOut.copyTo(outArray);
                mResult = new Int2(outArray[0], outArray[1]);
                mOut.destroy();
                mOut = null;  // make Java object eligible for garbage collection
                if (mTempIns != null) {
                    for (Allocation tempIn : mTempIns) {
                        tempIn.destroy();
                    }

                    mTempIns = null;  // make Java objects eligible for garbage collection
                }

                mGotResult = true;
            }

            return mResult;
        }

        private  result_int2(Allocation out) {
            mTempIns = null;
            mOut = out;
            mGotResult = false;
        }

        private Allocation[] mTempIns;
        private Allocation mOut;
        private boolean mGotResult;
        private Int2 mResult;
    }

    // To obtain the result, invoke get(), which blocks
    // until the asynchronously-launched operation has completed.
    public static class result_int4 {
        public Int4 get() {
            if (!mGotResult) {
                int[] outArray = new int[4];
                mOut.copyTo(outArray);
                mResult = new Int4(outArray[0], outArray[1], outArray[2], outArray[3]);
                mOut.destroy();
                mOut = null;  // make Java object eligible for garbage collection
                if (mTempIns != null) {
                    for (Allocation tempIn : mTempIns) {
                        tempIn.destroy();
                    }

                    mTempIns = null;  // make Java objects eligible for garbage collection
                }

                mGotResult = true;
            }

            return mResult;
        }

        private  result_int4(Allocation out) {
            mTempIns = null;
            mOut = out;
            mGotResult = false;
        }

        private Allocation[] mTempIns;
        private Allocation mOut;
        private boolean mGotResult;
        private Int4 mResult;
    }

    // To obtain the result, invoke get(), which blocks
    // until the asynchronously-launched operation has completed.
    public static class result_long {
        public long get() {
            if (!mGotResult) {
                long[] outArray = new long[1];
                mOut.copyTo(outArray);
                mResult = outArray[0];
                mOut.destroy();
                mOut = null;  // make Java object eligible for garbage collection
                if (mTempIns != null) {
                    for (Allocation tempIn : mTempIns) {
                        tempIn.destroy();
                    }

                    mTempIns = null;  // make Java objects eligible for garbage collection
                }

                mGotResult = true;
            }

            return mResult;
        }

        private  result_long(Allocation out) {
            mTempIns = null;
            mOut = out;
            mGotResult = false;
        }

        private Allocation[] mTempIns;
        private Allocation mOut;
        private boolean mGotResult;
        private long mResult;
    }

    // To obtain the result, invoke get(), which blocks
    // until the asynchronously-launched operation has completed.
    public static class result_long2 {
        public Long2 get() {
            if (!mGotResult) {
                long[] outArray = new long[2];
                mOut.copyTo(outArray);
                mResult = new Long2(outArray[0], outArray[1]);
                mOut.destroy();
                mOut = null;  // make Java object eligible for garbage collection
                if (mTempIns != null) {
                    for (Allocation tempIn : mTempIns) {
                        tempIn.destroy();
                    }

                    mTempIns = null;  // make Java objects eligible for garbage collection
                }

                mGotResult = true;
            }

            return mResult;
        }

        private  result_long2(Allocation out) {
            mTempIns = null;
            mOut = out;
            mGotResult = false;
        }

        private Allocation[] mTempIns;
        private Allocation mOut;
        private boolean mGotResult;
        private Long2 mResult;
    }

    // To obtain the result, invoke get(), which blocks
    // until the asynchronously-launched operation has completed.
    public static class result_long4 {
        public Long4 get() {
            if (!mGotResult) {
                long[] outArray = new long[4];
                mOut.copyTo(outArray);
                mResult = new Long4(outArray[0], outArray[1], outArray[2], outArray[3]);
                mOut.destroy();
                mOut = null;  // make Java object eligible for garbage collection
                if (mTempIns != null) {
                    for (Allocation tempIn : mTempIns) {
                        tempIn.destroy();
                    }

                    mTempIns = null;  // make Java objects eligible for garbage collection
                }

                mGotResult = true;
            }

            return mResult;
        }

        private  result_long4(Allocation out) {
            mTempIns = null;
            mOut = out;
            mGotResult = false;
        }

        private Allocation[] mTempIns;
        private Allocation mOut;
        private boolean mGotResult;
        private Long4 mResult;
    }

    // To obtain the result, invoke get(), which blocks
    // until the asynchronously-launched operation has completed.
    public static class result_short {
        public short get() {
            if (!mGotResult) {
                short[] outArray = new short[1];
                mOut.copyTo(outArray);
                mResult = outArray[0];
                mOut.destroy();
                mOut = null;  // make Java object eligible for garbage collection
                if (mTempIns != null) {
                    for (Allocation tempIn : mTempIns) {
                        tempIn.destroy();
                    }

                    mTempIns = null;  // make Java objects eligible for garbage collection
                }

                mGotResult = true;
            }

            return mResult;
        }

        private  result_short(Allocation out) {
            mTempIns = null;
            mOut = out;
            mGotResult = false;
        }

        private Allocation[] mTempIns;
        private Allocation mOut;
        private boolean mGotResult;
        private short mResult;
    }

    // To obtain the result, invoke get(), which blocks
    // until the asynchronously-launched operation has completed.
    public static class result_short2 {
        public Short2 get() {
            if (!mGotResult) {
                short[] outArray = new short[2];
                mOut.copyTo(outArray);
                mResult = new Short2(outArray[0], outArray[1]);
                mOut.destroy();
                mOut = null;  // make Java object eligible for garbage collection
                if (mTempIns != null) {
                    for (Allocation tempIn : mTempIns) {
                        tempIn.destroy();
                    }

                    mTempIns = null;  // make Java objects eligible for garbage collection
                }

                mGotResult = true;
            }

            return mResult;
        }

        private  result_short2(Allocation out) {
            mTempIns = null;
            mOut = out;
            mGotResult = false;
        }

        private Allocation[] mTempIns;
        private Allocation mOut;
        private boolean mGotResult;
        private Short2 mResult;
    }

    // To obtain the result, invoke get(), which blocks
    // until the asynchronously-launched operation has completed.
    public static class result_short4 {
        public Short4 get() {
            if (!mGotResult) {
                short[] outArray = new short[4];
                mOut.copyTo(outArray);
                mResult = new Short4(outArray[0], outArray[1], outArray[2], outArray[3]);
                mOut.destroy();
                mOut = null;  // make Java object eligible for garbage collection
                if (mTempIns != null) {
                    for (Allocation tempIn : mTempIns) {
                        tempIn.destroy();
                    }

                    mTempIns = null;  // make Java objects eligible for garbage collection
                }

                mGotResult = true;
            }

            return mResult;
        }

        private  result_short4(Allocation out) {
            mTempIns = null;
            mOut = out;
            mGotResult = false;
        }

        private Allocation[] mTempIns;
        private Allocation mOut;
        private boolean mGotResult;
        private Short4 mResult;
    }

    // To obtain the result, invoke get(), which blocks
    // until the asynchronously-launched operation has completed.
    public static class result_uchar {
        public short get() {
            if (!mGotResult) {
                byte[] outArray = new byte[1];
                mOut.copyTo(outArray);
                mResult = ((short) ((outArray[0]) & (short) 0xff));
                mOut.destroy();
                mOut = null;  // make Java object eligible for garbage collection
                if (mTempIns != null) {
                    for (Allocation tempIn : mTempIns) {
                        tempIn.destroy();
                    }

                    mTempIns = null;  // make Java objects eligible for garbage collection
                }

                mGotResult = true;
            }

            return mResult;
        }

        private  result_uchar(Allocation out) {
            mTempIns = null;
            mOut = out;
            mGotResult = false;
        }

        private Allocation[] mTempIns;
        private Allocation mOut;
        private boolean mGotResult;
        private short mResult;
    }

    // To obtain the result, invoke get(), which blocks
    // until the asynchronously-launched operation has completed.
    public static class result_uchar2 {
        public Short2 get() {
            if (!mGotResult) {
                byte[] outArray = new byte[2];
                mOut.copyTo(outArray);
                mResult = new Short2(((short) ((outArray[0]) & (short) 0xff)), ((short) ((outArray[1]) & (short) 0xff)));
                mOut.destroy();
                mOut = null;  // make Java object eligible for garbage collection
                if (mTempIns != null) {
                    for (Allocation tempIn : mTempIns) {
                        tempIn.destroy();
                    }

                    mTempIns = null;  // make Java objects eligible for garbage collection
                }

                mGotResult = true;
            }

            return mResult;
        }

        private  result_uchar2(Allocation out) {
            mTempIns = null;
            mOut = out;
            mGotResult = false;
        }

        private Allocation[] mTempIns;
        private Allocation mOut;
        private boolean mGotResult;
        private Short2 mResult;
    }

    // To obtain the result, invoke get(), which blocks
    // until the asynchronously-launched operation has completed.
    public static class result_uchar4 {
        public Short4 get() {
            if (!mGotResult) {
                byte[] outArray = new byte[4];
                mOut.copyTo(outArray);
                mResult = new Short4(((short) ((outArray[0]) & (short) 0xff)), ((short) ((outArray[1]) & (short) 0xff)), ((short) ((outArray[2]) & (short) 0xff)), ((short) ((outArray[3]) & (short) 0xff)));
                mOut.destroy();
                mOut = null;  // make Java object eligible for garbage collection
                if (mTempIns != null) {
                    for (Allocation tempIn : mTempIns) {
                        tempIn.destroy();
                    }

                    mTempIns = null;  // make Java objects eligible for garbage collection
                }

                mGotResult = true;
            }

            return mResult;
        }

        private  result_uchar4(Allocation out) {
            mTempIns = null;
            mOut = out;
            mGotResult = false;
        }

        private Allocation[] mTempIns;
        private Allocation mOut;
        private boolean mGotResult;
        private Short4 mResult;
    }

    // To obtain the result, invoke get(), which blocks
    // until the asynchronously-launched operation has completed.
    public static class result_uint {
        public long get() {
            if (!mGotResult) {
                int[] outArray = new int[1];
                mOut.copyTo(outArray);
                mResult = ((long) ((outArray[0]) & 0xffffffffL));
                mOut.destroy();
                mOut = null;  // make Java object eligible for garbage collection
                if (mTempIns != null) {
                    for (Allocation tempIn : mTempIns) {
                        tempIn.destroy();
                    }

                    mTempIns = null;  // make Java objects eligible for garbage collection
                }

                mGotResult = true;
            }

            return mResult;
        }

        private  result_uint(Allocation out) {
            mTempIns = null;
            mOut = out;
            mGotResult = false;
        }

        private Allocation[] mTempIns;
        private Allocation mOut;
        private boolean mGotResult;
        private long mResult;
    }

    // To obtain the result, invoke get(), which blocks
    // until the asynchronously-launched operation has completed.
    public static class result_uint2 {
        public Long2 get() {
            if (!mGotResult) {
                int[] outArray = new int[2];
                mOut.copyTo(outArray);
                mResult = new Long2(((long) ((outArray[0]) & 0xffffffffL)), ((long) ((outArray[1]) & 0xffffffffL)));
                mOut.destroy();
                mOut = null;  // make Java object eligible for garbage collection
                if (mTempIns != null) {
                    for (Allocation tempIn : mTempIns) {
                        tempIn.destroy();
                    }

                    mTempIns = null;  // make Java objects eligible for garbage collection
                }

                mGotResult = true;
            }

            return mResult;
        }

        private  result_uint2(Allocation out) {
            mTempIns = null;
            mOut = out;
            mGotResult = false;
        }

        private Allocation[] mTempIns;
        private Allocation mOut;
        private boolean mGotResult;
        private Long2 mResult;
    }

    // To obtain the result, invoke get(), which blocks
    // until the asynchronously-launched operation has completed.
    public static class result_uint4 {
        public Long4 get() {
            if (!mGotResult) {
                int[] outArray = new int[4];
                mOut.copyTo(outArray);
                mResult = new Long4(((long) ((outArray[0]) & 0xffffffffL)), ((long) ((outArray[1]) & 0xffffffffL)), ((long) ((outArray[2]) & 0xffffffffL)), ((long) ((outArray[3]) & 0xffffffffL)));
                mOut.destroy();
                mOut = null;  // make Java object eligible for garbage collection
                if (mTempIns != null) {
                    for (Allocation tempIn : mTempIns) {
                        tempIn.destroy();
                    }

                    mTempIns = null;  // make Java objects eligible for garbage collection
                }

                mGotResult = true;
            }

            return mResult;
        }

        private  result_uint4(Allocation out) {
            mTempIns = null;
            mOut = out;
            mGotResult = false;
        }

        private Allocation[] mTempIns;
        private Allocation mOut;
        private boolean mGotResult;
        private Long4 mResult;
    }

    // To obtain the result, invoke get(), which blocks
    // until the asynchronously-launched operation has completed.
    public static class result_ulong {
        public long get() {
            if (!mGotResult) {
                long[] outArray = new long[1];
                mOut.copyTo(outArray);
                if (outArray[0] < 0)
                    throw new RSRuntimeException("Result is not representible in Java");
                mResult = outArray[0];
                mOut.destroy();
                mOut = null;  // make Java object eligible for garbage collection
                if (mTempIns != null) {
                    for (Allocation tempIn : mTempIns) {
                        tempIn.destroy();
                    }

                    mTempIns = null;  // make Java objects eligible for garbage collection
                }

                mGotResult = true;
            }

            return mResult;
        }

        private  result_ulong(Allocation out) {
            mTempIns = null;
            mOut = out;
            mGotResult = false;
        }

        private Allocation[] mTempIns;
        private Allocation mOut;
        private boolean mGotResult;
        private long mResult;
    }

    // To obtain the result, invoke get(), which blocks
    // until the asynchronously-launched operation has completed.
    public static class result_ulong2 {
        public Long2 get() {
            if (!mGotResult) {
                long[] outArray = new long[2];
                mOut.copyTo(outArray);
                for (int Idx = 0; Idx < 2; ++Idx) {
                    if (outArray[Idx] < 0)
                        throw new RSRuntimeException("Result is not representible in Java");
                }

                mResult = new Long2(outArray[0], outArray[1]);
                mOut.destroy();
                mOut = null;  // make Java object eligible for garbage collection
                if (mTempIns != null) {
                    for (Allocation tempIn : mTempIns) {
                        tempIn.destroy();
                    }

                    mTempIns = null;  // make Java objects eligible for garbage collection
                }

                mGotResult = true;
            }

            return mResult;
        }

        private  result_ulong2(Allocation out) {
            mTempIns = null;
            mOut = out;
            mGotResult = false;
        }

        private Allocation[] mTempIns;
        private Allocation mOut;
        private boolean mGotResult;
        private Long2 mResult;
    }

    // To obtain the result, invoke get(), which blocks
    // until the asynchronously-launched operation has completed.
    public static class result_ulong4 {
        public Long4 get() {
            if (!mGotResult) {
                long[] outArray = new long[4];
                mOut.copyTo(outArray);
                for (int Idx = 0; Idx < 4; ++Idx) {
                    if (outArray[Idx] < 0)
                        throw new RSRuntimeException("Result is not representible in Java");
                }

                mResult = new Long4(outArray[0], outArray[1], outArray[2], outArray[3]);
                mOut.destroy();
                mOut = null;  // make Java object eligible for garbage collection
                if (mTempIns != null) {
                    for (Allocation tempIn : mTempIns) {
                        tempIn.destroy();
                    }

                    mTempIns = null;  // make Java objects eligible for garbage collection
                }

                mGotResult = true;
            }

            return mResult;
        }

        private  result_ulong4(Allocation out) {
            mTempIns = null;
            mOut = out;
            mGotResult = false;
        }

        private Allocation[] mTempIns;
        private Allocation mOut;
        private boolean mGotResult;
        private Long4 mResult;
    }

    // To obtain the result, invoke get(), which blocks
    // until the asynchronously-launched operation has completed.
    public static class result_ushort {
        public int get() {
            if (!mGotResult) {
                short[] outArray = new short[1];
                mOut.copyTo(outArray);
                mResult = ((int) ((outArray[0]) & 0xffff));
                mOut.destroy();
                mOut = null;  // make Java object eligible for garbage collection
                if (mTempIns != null) {
                    for (Allocation tempIn : mTempIns) {
                        tempIn.destroy();
                    }

                    mTempIns = null;  // make Java objects eligible for garbage collection
                }

                mGotResult = true;
            }

            return mResult;
        }

        private  result_ushort(Allocation out) {
            mTempIns = null;
            mOut = out;
            mGotResult = false;
        }

        private Allocation[] mTempIns;
        private Allocation mOut;
        private boolean mGotResult;
        private int mResult;
    }

    // To obtain the result, invoke get(), which blocks
    // until the asynchronously-launched operation has completed.
    public static class result_ushort2 {
        public Int2 get() {
            if (!mGotResult) {
                short[] outArray = new short[2];
                mOut.copyTo(outArray);
                mResult = new Int2(((int) ((outArray[0]) & 0xffff)), ((int) ((outArray[1]) & 0xffff)));
                mOut.destroy();
                mOut = null;  // make Java object eligible for garbage collection
                if (mTempIns != null) {
                    for (Allocation tempIn : mTempIns) {
                        tempIn.destroy();
                    }

                    mTempIns = null;  // make Java objects eligible for garbage collection
                }

                mGotResult = true;
            }

            return mResult;
        }

        private  result_ushort2(Allocation out) {
            mTempIns = null;
            mOut = out;
            mGotResult = false;
        }

        private Allocation[] mTempIns;
        private Allocation mOut;
        private boolean mGotResult;
        private Int2 mResult;
    }

    // To obtain the result, invoke get(), which blocks
    // until the asynchronously-launched operation has completed.
    public static class result_ushort4 {
        public Int4 get() {
            if (!mGotResult) {
                short[] outArray = new short[4];
                mOut.copyTo(outArray);
                mResult = new Int4(((int) ((outArray[0]) & 0xffff)), ((int) ((outArray[1]) & 0xffff)), ((int) ((outArray[2]) & 0xffff)), ((int) ((outArray[3]) & 0xffff)));
                mOut.destroy();
                mOut = null;  // make Java object eligible for garbage collection
                if (mTempIns != null) {
                    for (Allocation tempIn : mTempIns) {
                        tempIn.destroy();
                    }

                    mTempIns = null;  // make Java objects eligible for garbage collection
                }

                mGotResult = true;
            }

            return mResult;
        }

        private  result_ushort4(Allocation out) {
            mTempIns = null;
            mOut = out;
            mGotResult = false;
        }

        private Allocation[] mTempIns;
        private Allocation mOut;
        private boolean mGotResult;
        private Int4 mResult;
    }

    private final static int mExportReduceIdx_my_half = 0;
    // in1 = "val"
    public result_half reduce_my_half(short[] in1) {
        // Verify that "in1" is non-null.
        if (in1 == null) {
            throw new RSIllegalArgumentException("Array \"in1\" is null!");
        }
        Allocation ain1 = Allocation.createSized(mRSLocal, __F16, in1.length);
        ain1.setAutoPadding(true);
        ain1.copyFrom(in1);

        result_half result = reduce_my_half(ain1, null);
        result.mTempIns = new Allocation[]{ain1};
        return result;
    }

    // ain1 = "half val"
    public result_half reduce_my_half(Allocation ain1) {
        return reduce_my_half(ain1, null);
    }

    // ain1 = "half val"
    public result_half reduce_my_half(Allocation ain1, Script.LaunchOptions sc) {
        // check ain1
        if (!ain1.getType().getElement().isCompatible(__F16)) {
            throw new RSRuntimeException("Type mismatch with F16!");
        }
        Allocation aout = Allocation.createSized(mRSLocal, __F16, 1);
        aout.setAutoPadding(true);
        reduce(mExportReduceIdx_my_half, new Allocation[]{ain1}, aout, sc);
        return new result_half(aout);
    }

    private final static int mExportReduceIdx_my_half2 = 1;
    // in1 = "val", flattened 2-vectors
    public result_half2 reduce_my_half2(short[] in1) {
        // Verify that "in1" is non-null.
        if (in1 == null) {
            throw new RSIllegalArgumentException("Array \"in1\" is null!");
        }
        // Verify that the array length is a multiple of the vector size.
        if (in1.length % 2 != 0) {
            throw new RSIllegalArgumentException("Array \"in1\" is not a multiple of 2 in length!");
        }
        Allocation ain1 = Allocation.createSized(mRSLocal, __F16_2, in1.length / 2);
        ain1.setAutoPadding(true);
        ain1.copyFrom(in1);

        result_half2 result = reduce_my_half2(ain1, null);
        result.mTempIns = new Allocation[]{ain1};
        return result;
    }

    // ain1 = "half2 val"
    public result_half2 reduce_my_half2(Allocation ain1) {
        return reduce_my_half2(ain1, null);
    }

    // ain1 = "half2 val"
    public result_half2 reduce_my_half2(Allocation ain1, Script.LaunchOptions sc) {
        // check ain1
        if (!ain1.getType().getElement().isCompatible(__F16_2)) {
            throw new RSRuntimeException("Type mismatch with F16_2!");
        }
        Allocation aout = Allocation.createSized(mRSLocal, __F16_2, 1);
        aout.setAutoPadding(true);
        reduce(mExportReduceIdx_my_half2, new Allocation[]{ain1}, aout, sc);
        return new result_half2(aout);
    }

    private final static int mExportReduceIdx_my_half4 = 2;
    // in1 = "val", flattened 4-vectors
    public result_half4 reduce_my_half4(short[] in1) {
        // Verify that "in1" is non-null.
        if (in1 == null) {
            throw new RSIllegalArgumentException("Array \"in1\" is null!");
        }
        // Verify that the array length is a multiple of the vector size.
        if (in1.length % 4 != 0) {
            throw new RSIllegalArgumentException("Array \"in1\" is not a multiple of 4 in length!");
        }
        Allocation ain1 = Allocation.createSized(mRSLocal, __F16_4, in1.length / 4);
        ain1.setAutoPadding(true);
        ain1.copyFrom(in1);

        result_half4 result = reduce_my_half4(ain1, null);
        result.mTempIns = new Allocation[]{ain1};
        return result;
    }

    // ain1 = "half4 val"
    public result_half4 reduce_my_half4(Allocation ain1) {
        return reduce_my_half4(ain1, null);
    }

    // ain1 = "half4 val"
    public result_half4 reduce_my_half4(Allocation ain1, Script.LaunchOptions sc) {
        // check ain1
        if (!ain1.getType().getElement().isCompatible(__F16_4)) {
            throw new RSRuntimeException("Type mismatch with F16_4!");
        }
        Allocation aout = Allocation.createSized(mRSLocal, __F16_4, 1);
        aout.setAutoPadding(true);
        reduce(mExportReduceIdx_my_half4, new Allocation[]{ain1}, aout, sc);
        return new result_half4(aout);
    }

    private final static int mExportReduceIdx_my_array_half = 3;
    // in1 = "val"
    public resultArray7_half reduce_my_array_half(short[] in1) {
        // Verify that "in1" is non-null.
        if (in1 == null) {
            throw new RSIllegalArgumentException("Array \"in1\" is null!");
        }
        Allocation ain1 = Allocation.createSized(mRSLocal, __F16, in1.length);
        ain1.setAutoPadding(true);
        ain1.copyFrom(in1);

        resultArray7_half result = reduce_my_array_half(ain1, null);
        result.mTempIns = new Allocation[]{ain1};
        return result;
    }

    // ain1 = "half val"
    public resultArray7_half reduce_my_array_half(Allocation ain1) {
        return reduce_my_array_half(ain1, null);
    }

    // ain1 = "half val"
    public resultArray7_half reduce_my_array_half(Allocation ain1, Script.LaunchOptions sc) {
        // check ain1
        if (!ain1.getType().getElement().isCompatible(__F16)) {
            throw new RSRuntimeException("Type mismatch with F16!");
        }
        Allocation aout = Allocation.createSized(mRSLocal, __F16, 7);
        aout.setAutoPadding(true);
        reduce(mExportReduceIdx_my_array_half, new Allocation[]{ain1}, aout, sc);
        return new resultArray7_half(aout);
    }

    private final static int mExportReduceIdx_my_array_half2 = 4;
    // in1 = "val", flattened 2-vectors
    public resultArray7_half2 reduce_my_array_half2(short[] in1) {
        // Verify that "in1" is non-null.
        if (in1 == null) {
            throw new RSIllegalArgumentException("Array \"in1\" is null!");
        }
        // Verify that the array length is a multiple of the vector size.
        if (in1.length % 2 != 0) {
            throw new RSIllegalArgumentException("Array \"in1\" is not a multiple of 2 in length!");
        }
        Allocation ain1 = Allocation.createSized(mRSLocal, __F16_2, in1.length / 2);
        ain1.setAutoPadding(true);
        ain1.copyFrom(in1);

        resultArray7_half2 result = reduce_my_array_half2(ain1, null);
        result.mTempIns = new Allocation[]{ain1};
        return result;
    }

    // ain1 = "half2 val"
    public resultArray7_half2 reduce_my_array_half2(Allocation ain1) {
        return reduce_my_array_half2(ain1, null);
    }

    // ain1 = "half2 val"
    public resultArray7_half2 reduce_my_array_half2(Allocation ain1, Script.LaunchOptions sc) {
        // check ain1
        if (!ain1.getType().getElement().isCompatible(__F16_2)) {
            throw new RSRuntimeException("Type mismatch with F16_2!");
        }
        Allocation aout = Allocation.createSized(mRSLocal, __F16_2, 7);
        aout.setAutoPadding(true);
        reduce(mExportReduceIdx_my_array_half2, new Allocation[]{ain1}, aout, sc);
        return new resultArray7_half2(aout);
    }

    private final static int mExportReduceIdx_my_array_half4 = 5;
    // in1 = "val", flattened 4-vectors
    public resultArray7_half4 reduce_my_array_half4(short[] in1) {
        // Verify that "in1" is non-null.
        if (in1 == null) {
            throw new RSIllegalArgumentException("Array \"in1\" is null!");
        }
        // Verify that the array length is a multiple of the vector size.
        if (in1.length % 4 != 0) {
            throw new RSIllegalArgumentException("Array \"in1\" is not a multiple of 4 in length!");
        }
        Allocation ain1 = Allocation.createSized(mRSLocal, __F16_4, in1.length / 4);
        ain1.setAutoPadding(true);
        ain1.copyFrom(in1);

        resultArray7_half4 result = reduce_my_array_half4(ain1, null);
        result.mTempIns = new Allocation[]{ain1};
        return result;
    }

    // ain1 = "half4 val"
    public resultArray7_half4 reduce_my_array_half4(Allocation ain1) {
        return reduce_my_array_half4(ain1, null);
    }

    // ain1 = "half4 val"
    public resultArray7_half4 reduce_my_array_half4(Allocation ain1, Script.LaunchOptions sc) {
        // check ain1
        if (!ain1.getType().getElement().isCompatible(__F16_4)) {
            throw new RSRuntimeException("Type mismatch with F16_4!");
        }
        Allocation aout = Allocation.createSized(mRSLocal, __F16_4, 7);
        aout.setAutoPadding(true);
        reduce(mExportReduceIdx_my_array_half4, new Allocation[]{ain1}, aout, sc);
        return new resultArray7_half4(aout);
    }

    private final static int mExportReduceIdx_my_float = 6;
    // in1 = "val"
    public result_float reduce_my_float(float[] in1) {
        // Verify that "in1" is non-null.
        if (in1 == null) {
            throw new RSIllegalArgumentException("Array \"in1\" is null!");
        }
        Allocation ain1 = Allocation.createSized(mRSLocal, __F32, in1.length);
        ain1.setAutoPadding(true);
        ain1.copyFrom(in1);

        result_float result = reduce_my_float(ain1, null);
        result.mTempIns = new Allocation[]{ain1};
        return result;
    }

    // ain1 = "float val"
    public result_float reduce_my_float(Allocation ain1) {
        return reduce_my_float(ain1, null);
    }

    // ain1 = "float val"
    public result_float reduce_my_float(Allocation ain1, Script.LaunchOptions sc) {
        // check ain1
        if (!ain1.getType().getElement().isCompatible(__F32)) {
            throw new RSRuntimeException("Type mismatch with F32!");
        }
        Allocation aout = Allocation.createSized(mRSLocal, __F32, 1);
        aout.setAutoPadding(true);
        reduce(mExportReduceIdx_my_float, new Allocation[]{ain1}, aout, sc);
        return new result_float(aout);
    }

    private final static int mExportReduceIdx_my_float2 = 7;
    // in1 = "val", flattened 2-vectors
    public result_float2 reduce_my_float2(float[] in1) {
        // Verify that "in1" is non-null.
        if (in1 == null) {
            throw new RSIllegalArgumentException("Array \"in1\" is null!");
        }
        // Verify that the array length is a multiple of the vector size.
        if (in1.length % 2 != 0) {
            throw new RSIllegalArgumentException("Array \"in1\" is not a multiple of 2 in length!");
        }
        Allocation ain1 = Allocation.createSized(mRSLocal, __F32_2, in1.length / 2);
        ain1.setAutoPadding(true);
        ain1.copyFrom(in1);

        result_float2 result = reduce_my_float2(ain1, null);
        result.mTempIns = new Allocation[]{ain1};
        return result;
    }

    // ain1 = "float2 val"
    public result_float2 reduce_my_float2(Allocation ain1) {
        return reduce_my_float2(ain1, null);
    }

    // ain1 = "float2 val"
    public result_float2 reduce_my_float2(Allocation ain1, Script.LaunchOptions sc) {
        // check ain1
        if (!ain1.getType().getElement().isCompatible(__F32_2)) {
            throw new RSRuntimeException("Type mismatch with F32_2!");
        }
        Allocation aout = Allocation.createSized(mRSLocal, __F32_2, 1);
        aout.setAutoPadding(true);
        reduce(mExportReduceIdx_my_float2, new Allocation[]{ain1}, aout, sc);
        return new result_float2(aout);
    }

    private final static int mExportReduceIdx_my_float4 = 8;
    // in1 = "val", flattened 4-vectors
    public result_float4 reduce_my_float4(float[] in1) {
        // Verify that "in1" is non-null.
        if (in1 == null) {
            throw new RSIllegalArgumentException("Array \"in1\" is null!");
        }
        // Verify that the array length is a multiple of the vector size.
        if (in1.length % 4 != 0) {
            throw new RSIllegalArgumentException("Array \"in1\" is not a multiple of 4 in length!");
        }
        Allocation ain1 = Allocation.createSized(mRSLocal, __F32_4, in1.length / 4);
        ain1.setAutoPadding(true);
        ain1.copyFrom(in1);

        result_float4 result = reduce_my_float4(ain1, null);
        result.mTempIns = new Allocation[]{ain1};
        return result;
    }

    // ain1 = "float4 val"
    public result_float4 reduce_my_float4(Allocation ain1) {
        return reduce_my_float4(ain1, null);
    }

    // ain1 = "float4 val"
    public result_float4 reduce_my_float4(Allocation ain1, Script.LaunchOptions sc) {
        // check ain1
        if (!ain1.getType().getElement().isCompatible(__F32_4)) {
            throw new RSRuntimeException("Type mismatch with F32_4!");
        }
        Allocation aout = Allocation.createSized(mRSLocal, __F32_4, 1);
        aout.setAutoPadding(true);
        reduce(mExportReduceIdx_my_float4, new Allocation[]{ain1}, aout, sc);
        return new result_float4(aout);
    }

    private final static int mExportReduceIdx_my_array_float = 9;
    // in1 = "val"
    public resultArray7_float reduce_my_array_float(float[] in1) {
        // Verify that "in1" is non-null.
        if (in1 == null) {
            throw new RSIllegalArgumentException("Array \"in1\" is null!");
        }
        Allocation ain1 = Allocation.createSized(mRSLocal, __F32, in1.length);
        ain1.setAutoPadding(true);
        ain1.copyFrom(in1);

        resultArray7_float result = reduce_my_array_float(ain1, null);
        result.mTempIns = new Allocation[]{ain1};
        return result;
    }

    // ain1 = "float val"
    public resultArray7_float reduce_my_array_float(Allocation ain1) {
        return reduce_my_array_float(ain1, null);
    }

    // ain1 = "float val"
    public resultArray7_float reduce_my_array_float(Allocation ain1, Script.LaunchOptions sc) {
        // check ain1
        if (!ain1.getType().getElement().isCompatible(__F32)) {
            throw new RSRuntimeException("Type mismatch with F32!");
        }
        Allocation aout = Allocation.createSized(mRSLocal, __F32, 7);
        aout.setAutoPadding(true);
        reduce(mExportReduceIdx_my_array_float, new Allocation[]{ain1}, aout, sc);
        return new resultArray7_float(aout);
    }

    private final static int mExportReduceIdx_my_array_float2 = 10;
    // in1 = "val", flattened 2-vectors
    public resultArray7_float2 reduce_my_array_float2(float[] in1) {
        // Verify that "in1" is non-null.
        if (in1 == null) {
            throw new RSIllegalArgumentException("Array \"in1\" is null!");
        }
        // Verify that the array length is a multiple of the vector size.
        if (in1.length % 2 != 0) {
            throw new RSIllegalArgumentException("Array \"in1\" is not a multiple of 2 in length!");
        }
        Allocation ain1 = Allocation.createSized(mRSLocal, __F32_2, in1.length / 2);
        ain1.setAutoPadding(true);
        ain1.copyFrom(in1);

        resultArray7_float2 result = reduce_my_array_float2(ain1, null);
        result.mTempIns = new Allocation[]{ain1};
        return result;
    }

    // ain1 = "float2 val"
    public resultArray7_float2 reduce_my_array_float2(Allocation ain1) {
        return reduce_my_array_float2(ain1, null);
    }

    // ain1 = "float2 val"
    public resultArray7_float2 reduce_my_array_float2(Allocation ain1, Script.LaunchOptions sc) {
        // check ain1
        if (!ain1.getType().getElement().isCompatible(__F32_2)) {
            throw new RSRuntimeException("Type mismatch with F32_2!");
        }
        Allocation aout = Allocation.createSized(mRSLocal, __F32_2, 7);
        aout.setAutoPadding(true);
        reduce(mExportReduceIdx_my_array_float2, new Allocation[]{ain1}, aout, sc);
        return new resultArray7_float2(aout);
    }

    private final static int mExportReduceIdx_my_array_float4 = 11;
    // in1 = "val", flattened 4-vectors
    public resultArray7_float4 reduce_my_array_float4(float[] in1) {
        // Verify that "in1" is non-null.
        if (in1 == null) {
            throw new RSIllegalArgumentException("Array \"in1\" is null!");
        }
        // Verify that the array length is a multiple of the vector size.
        if (in1.length % 4 != 0) {
            throw new RSIllegalArgumentException("Array \"in1\" is not a multiple of 4 in length!");
        }
        Allocation ain1 = Allocation.createSized(mRSLocal, __F32_4, in1.length / 4);
        ain1.setAutoPadding(true);
        ain1.copyFrom(in1);

        resultArray7_float4 result = reduce_my_array_float4(ain1, null);
        result.mTempIns = new Allocation[]{ain1};
        return result;
    }

    // ain1 = "float4 val"
    public resultArray7_float4 reduce_my_array_float4(Allocation ain1) {
        return reduce_my_array_float4(ain1, null);
    }

    // ain1 = "float4 val"
    public resultArray7_float4 reduce_my_array_float4(Allocation ain1, Script.LaunchOptions sc) {
        // check ain1
        if (!ain1.getType().getElement().isCompatible(__F32_4)) {
            throw new RSRuntimeException("Type mismatch with F32_4!");
        }
        Allocation aout = Allocation.createSized(mRSLocal, __F32_4, 7);
        aout.setAutoPadding(true);
        reduce(mExportReduceIdx_my_array_float4, new Allocation[]{ain1}, aout, sc);
        return new resultArray7_float4(aout);
    }

    private final static int mExportReduceIdx_my_double = 12;
    // in1 = "val"
    public result_double reduce_my_double(double[] in1) {
        // Verify that "in1" is non-null.
        if (in1 == null) {
            throw new RSIllegalArgumentException("Array \"in1\" is null!");
        }
        Allocation ain1 = Allocation.createSized(mRSLocal, __F64, in1.length);
        ain1.setAutoPadding(true);
        ain1.copyFrom(in1);

        result_double result = reduce_my_double(ain1, null);
        result.mTempIns = new Allocation[]{ain1};
        return result;
    }

    // ain1 = "double val"
    public result_double reduce_my_double(Allocation ain1) {
        return reduce_my_double(ain1, null);
    }

    // ain1 = "double val"
    public result_double reduce_my_double(Allocation ain1, Script.LaunchOptions sc) {
        // check ain1
        if (!ain1.getType().getElement().isCompatible(__F64)) {
            throw new RSRuntimeException("Type mismatch with F64!");
        }
        Allocation aout = Allocation.createSized(mRSLocal, __F64, 1);
        aout.setAutoPadding(true);
        reduce(mExportReduceIdx_my_double, new Allocation[]{ain1}, aout, sc);
        return new result_double(aout);
    }

    private final static int mExportReduceIdx_my_double2 = 13;
    // in1 = "val", flattened 2-vectors
    public result_double2 reduce_my_double2(double[] in1) {
        // Verify that "in1" is non-null.
        if (in1 == null) {
            throw new RSIllegalArgumentException("Array \"in1\" is null!");
        }
        // Verify that the array length is a multiple of the vector size.
        if (in1.length % 2 != 0) {
            throw new RSIllegalArgumentException("Array \"in1\" is not a multiple of 2 in length!");
        }
        Allocation ain1 = Allocation.createSized(mRSLocal, __F64_2, in1.length / 2);
        ain1.setAutoPadding(true);
        ain1.copyFrom(in1);

        result_double2 result = reduce_my_double2(ain1, null);
        result.mTempIns = new Allocation[]{ain1};
        return result;
    }

    // ain1 = "double2 val"
    public result_double2 reduce_my_double2(Allocation ain1) {
        return reduce_my_double2(ain1, null);
    }

    // ain1 = "double2 val"
    public result_double2 reduce_my_double2(Allocation ain1, Script.LaunchOptions sc) {
        // check ain1
        if (!ain1.getType().getElement().isCompatible(__F64_2)) {
            throw new RSRuntimeException("Type mismatch with F64_2!");
        }
        Allocation aout = Allocation.createSized(mRSLocal, __F64_2, 1);
        aout.setAutoPadding(true);
        reduce(mExportReduceIdx_my_double2, new Allocation[]{ain1}, aout, sc);
        return new result_double2(aout);
    }

    private final static int mExportReduceIdx_my_double4 = 14;
    // in1 = "val", flattened 4-vectors
    public result_double4 reduce_my_double4(double[] in1) {
        // Verify that "in1" is non-null.
        if (in1 == null) {
            throw new RSIllegalArgumentException("Array \"in1\" is null!");
        }
        // Verify that the array length is a multiple of the vector size.
        if (in1.length % 4 != 0) {
            throw new RSIllegalArgumentException("Array \"in1\" is not a multiple of 4 in length!");
        }
        Allocation ain1 = Allocation.createSized(mRSLocal, __F64_4, in1.length / 4);
        ain1.setAutoPadding(true);
        ain1.copyFrom(in1);

        result_double4 result = reduce_my_double4(ain1, null);
        result.mTempIns = new Allocation[]{ain1};
        return result;
    }

    // ain1 = "double4 val"
    public result_double4 reduce_my_double4(Allocation ain1) {
        return reduce_my_double4(ain1, null);
    }

    // ain1 = "double4 val"
    public result_double4 reduce_my_double4(Allocation ain1, Script.LaunchOptions sc) {
        // check ain1
        if (!ain1.getType().getElement().isCompatible(__F64_4)) {
            throw new RSRuntimeException("Type mismatch with F64_4!");
        }
        Allocation aout = Allocation.createSized(mRSLocal, __F64_4, 1);
        aout.setAutoPadding(true);
        reduce(mExportReduceIdx_my_double4, new Allocation[]{ain1}, aout, sc);
        return new result_double4(aout);
    }

    private final static int mExportReduceIdx_my_array_double = 15;
    // in1 = "val"
    public resultArray7_double reduce_my_array_double(double[] in1) {
        // Verify that "in1" is non-null.
        if (in1 == null) {
            throw new RSIllegalArgumentException("Array \"in1\" is null!");
        }
        Allocation ain1 = Allocation.createSized(mRSLocal, __F64, in1.length);
        ain1.setAutoPadding(true);
        ain1.copyFrom(in1);

        resultArray7_double result = reduce_my_array_double(ain1, null);
        result.mTempIns = new Allocation[]{ain1};
        return result;
    }

    // ain1 = "double val"
    public resultArray7_double reduce_my_array_double(Allocation ain1) {
        return reduce_my_array_double(ain1, null);
    }

    // ain1 = "double val"
    public resultArray7_double reduce_my_array_double(Allocation ain1, Script.LaunchOptions sc) {
        // check ain1
        if (!ain1.getType().getElement().isCompatible(__F64)) {
            throw new RSRuntimeException("Type mismatch with F64!");
        }
        Allocation aout = Allocation.createSized(mRSLocal, __F64, 7);
        aout.setAutoPadding(true);
        reduce(mExportReduceIdx_my_array_double, new Allocation[]{ain1}, aout, sc);
        return new resultArray7_double(aout);
    }

    private final static int mExportReduceIdx_my_array_double2 = 16;
    // in1 = "val", flattened 2-vectors
    public resultArray7_double2 reduce_my_array_double2(double[] in1) {
        // Verify that "in1" is non-null.
        if (in1 == null) {
            throw new RSIllegalArgumentException("Array \"in1\" is null!");
        }
        // Verify that the array length is a multiple of the vector size.
        if (in1.length % 2 != 0) {
            throw new RSIllegalArgumentException("Array \"in1\" is not a multiple of 2 in length!");
        }
        Allocation ain1 = Allocation.createSized(mRSLocal, __F64_2, in1.length / 2);
        ain1.setAutoPadding(true);
        ain1.copyFrom(in1);

        resultArray7_double2 result = reduce_my_array_double2(ain1, null);
        result.mTempIns = new Allocation[]{ain1};
        return result;
    }

    // ain1 = "double2 val"
    public resultArray7_double2 reduce_my_array_double2(Allocation ain1) {
        return reduce_my_array_double2(ain1, null);
    }

    // ain1 = "double2 val"
    public resultArray7_double2 reduce_my_array_double2(Allocation ain1, Script.LaunchOptions sc) {
        // check ain1
        if (!ain1.getType().getElement().isCompatible(__F64_2)) {
            throw new RSRuntimeException("Type mismatch with F64_2!");
        }
        Allocation aout = Allocation.createSized(mRSLocal, __F64_2, 7);
        aout.setAutoPadding(true);
        reduce(mExportReduceIdx_my_array_double2, new Allocation[]{ain1}, aout, sc);
        return new resultArray7_double2(aout);
    }

    private final static int mExportReduceIdx_my_array_double4 = 17;
    // in1 = "val", flattened 4-vectors
    public resultArray7_double4 reduce_my_array_double4(double[] in1) {
        // Verify that "in1" is non-null.
        if (in1 == null) {
            throw new RSIllegalArgumentException("Array \"in1\" is null!");
        }
        // Verify that the array length is a multiple of the vector size.
        if (in1.length % 4 != 0) {
            throw new RSIllegalArgumentException("Array \"in1\" is not a multiple of 4 in length!");
        }
        Allocation ain1 = Allocation.createSized(mRSLocal, __F64_4, in1.length / 4);
        ain1.setAutoPadding(true);
        ain1.copyFrom(in1);

        resultArray7_double4 result = reduce_my_array_double4(ain1, null);
        result.mTempIns = new Allocation[]{ain1};
        return result;
    }

    // ain1 = "double4 val"
    public resultArray7_double4 reduce_my_array_double4(Allocation ain1) {
        return reduce_my_array_double4(ain1, null);
    }

    // ain1 = "double4 val"
    public resultArray7_double4 reduce_my_array_double4(Allocation ain1, Script.LaunchOptions sc) {
        // check ain1
        if (!ain1.getType().getElement().isCompatible(__F64_4)) {
            throw new RSRuntimeException("Type mismatch with F64_4!");
        }
        Allocation aout = Allocation.createSized(mRSLocal, __F64_4, 7);
        aout.setAutoPadding(true);
        reduce(mExportReduceIdx_my_array_double4, new Allocation[]{ain1}, aout, sc);
        return new resultArray7_double4(aout);
    }

    private final static int mExportReduceIdx_my_char = 18;
    // in1 = "val"
    public result_char reduce_my_char(byte[] in1) {
        // Verify that "in1" is non-null.
        if (in1 == null) {
            throw new RSIllegalArgumentException("Array \"in1\" is null!");
        }
        Allocation ain1 = Allocation.createSized(mRSLocal, __I8, in1.length);
        ain1.setAutoPadding(true);
        ain1.copyFrom(in1);

        result_char result = reduce_my_char(ain1, null);
        result.mTempIns = new Allocation[]{ain1};
        return result;
    }

    // ain1 = "char val"
    public result_char reduce_my_char(Allocation ain1) {
        return reduce_my_char(ain1, null);
    }

    // ain1 = "char val"
    public result_char reduce_my_char(Allocation ain1, Script.LaunchOptions sc) {
        // check ain1
        if (!ain1.getType().getElement().isCompatible(__I8)) {
            throw new RSRuntimeException("Type mismatch with I8!");
        }
        Allocation aout = Allocation.createSized(mRSLocal, __I8, 1);
        aout.setAutoPadding(true);
        reduce(mExportReduceIdx_my_char, new Allocation[]{ain1}, aout, sc);
        return new result_char(aout);
    }

    private final static int mExportReduceIdx_my_char2 = 19;
    // in1 = "val", flattened 2-vectors
    public result_char2 reduce_my_char2(byte[] in1) {
        // Verify that "in1" is non-null.
        if (in1 == null) {
            throw new RSIllegalArgumentException("Array \"in1\" is null!");
        }
        // Verify that the array length is a multiple of the vector size.
        if (in1.length % 2 != 0) {
            throw new RSIllegalArgumentException("Array \"in1\" is not a multiple of 2 in length!");
        }
        Allocation ain1 = Allocation.createSized(mRSLocal, __I8_2, in1.length / 2);
        ain1.setAutoPadding(true);
        ain1.copyFrom(in1);

        result_char2 result = reduce_my_char2(ain1, null);
        result.mTempIns = new Allocation[]{ain1};
        return result;
    }

    // ain1 = "char2 val"
    public result_char2 reduce_my_char2(Allocation ain1) {
        return reduce_my_char2(ain1, null);
    }

    // ain1 = "char2 val"
    public result_char2 reduce_my_char2(Allocation ain1, Script.LaunchOptions sc) {
        // check ain1
        if (!ain1.getType().getElement().isCompatible(__I8_2)) {
            throw new RSRuntimeException("Type mismatch with I8_2!");
        }
        Allocation aout = Allocation.createSized(mRSLocal, __I8_2, 1);
        aout.setAutoPadding(true);
        reduce(mExportReduceIdx_my_char2, new Allocation[]{ain1}, aout, sc);
        return new result_char2(aout);
    }

    private final static int mExportReduceIdx_my_char4 = 20;
    // in1 = "val", flattened 4-vectors
    public result_char4 reduce_my_char4(byte[] in1) {
        // Verify that "in1" is non-null.
        if (in1 == null) {
            throw new RSIllegalArgumentException("Array \"in1\" is null!");
        }
        // Verify that the array length is a multiple of the vector size.
        if (in1.length % 4 != 0) {
            throw new RSIllegalArgumentException("Array \"in1\" is not a multiple of 4 in length!");
        }
        Allocation ain1 = Allocation.createSized(mRSLocal, __I8_4, in1.length / 4);
        ain1.setAutoPadding(true);
        ain1.copyFrom(in1);

        result_char4 result = reduce_my_char4(ain1, null);
        result.mTempIns = new Allocation[]{ain1};
        return result;
    }

    // ain1 = "char4 val"
    public result_char4 reduce_my_char4(Allocation ain1) {
        return reduce_my_char4(ain1, null);
    }

    // ain1 = "char4 val"
    public result_char4 reduce_my_char4(Allocation ain1, Script.LaunchOptions sc) {
        // check ain1
        if (!ain1.getType().getElement().isCompatible(__I8_4)) {
            throw new RSRuntimeException("Type mismatch with I8_4!");
        }
        Allocation aout = Allocation.createSized(mRSLocal, __I8_4, 1);
        aout.setAutoPadding(true);
        reduce(mExportReduceIdx_my_char4, new Allocation[]{ain1}, aout, sc);
        return new result_char4(aout);
    }

    private final static int mExportReduceIdx_my_array_char = 21;
    // in1 = "val"
    public resultArray7_char reduce_my_array_char(byte[] in1) {
        // Verify that "in1" is non-null.
        if (in1 == null) {
            throw new RSIllegalArgumentException("Array \"in1\" is null!");
        }
        Allocation ain1 = Allocation.createSized(mRSLocal, __I8, in1.length);
        ain1.setAutoPadding(true);
        ain1.copyFrom(in1);

        resultArray7_char result = reduce_my_array_char(ain1, null);
        result.mTempIns = new Allocation[]{ain1};
        return result;
    }

    // ain1 = "char val"
    public resultArray7_char reduce_my_array_char(Allocation ain1) {
        return reduce_my_array_char(ain1, null);
    }

    // ain1 = "char val"
    public resultArray7_char reduce_my_array_char(Allocation ain1, Script.LaunchOptions sc) {
        // check ain1
        if (!ain1.getType().getElement().isCompatible(__I8)) {
            throw new RSRuntimeException("Type mismatch with I8!");
        }
        Allocation aout = Allocation.createSized(mRSLocal, __I8, 7);
        aout.setAutoPadding(true);
        reduce(mExportReduceIdx_my_array_char, new Allocation[]{ain1}, aout, sc);
        return new resultArray7_char(aout);
    }

    private final static int mExportReduceIdx_my_array_char2 = 22;
    // in1 = "val", flattened 2-vectors
    public resultArray7_char2 reduce_my_array_char2(byte[] in1) {
        // Verify that "in1" is non-null.
        if (in1 == null) {
            throw new RSIllegalArgumentException("Array \"in1\" is null!");
        }
        // Verify that the array length is a multiple of the vector size.
        if (in1.length % 2 != 0) {
            throw new RSIllegalArgumentException("Array \"in1\" is not a multiple of 2 in length!");
        }
        Allocation ain1 = Allocation.createSized(mRSLocal, __I8_2, in1.length / 2);
        ain1.setAutoPadding(true);
        ain1.copyFrom(in1);

        resultArray7_char2 result = reduce_my_array_char2(ain1, null);
        result.mTempIns = new Allocation[]{ain1};
        return result;
    }

    // ain1 = "char2 val"
    public resultArray7_char2 reduce_my_array_char2(Allocation ain1) {
        return reduce_my_array_char2(ain1, null);
    }

    // ain1 = "char2 val"
    public resultArray7_char2 reduce_my_array_char2(Allocation ain1, Script.LaunchOptions sc) {
        // check ain1
        if (!ain1.getType().getElement().isCompatible(__I8_2)) {
            throw new RSRuntimeException("Type mismatch with I8_2!");
        }
        Allocation aout = Allocation.createSized(mRSLocal, __I8_2, 7);
        aout.setAutoPadding(true);
        reduce(mExportReduceIdx_my_array_char2, new Allocation[]{ain1}, aout, sc);
        return new resultArray7_char2(aout);
    }

    private final static int mExportReduceIdx_my_array_char4 = 23;
    // in1 = "val", flattened 4-vectors
    public resultArray7_char4 reduce_my_array_char4(byte[] in1) {
        // Verify that "in1" is non-null.
        if (in1 == null) {
            throw new RSIllegalArgumentException("Array \"in1\" is null!");
        }
        // Verify that the array length is a multiple of the vector size.
        if (in1.length % 4 != 0) {
            throw new RSIllegalArgumentException("Array \"in1\" is not a multiple of 4 in length!");
        }
        Allocation ain1 = Allocation.createSized(mRSLocal, __I8_4, in1.length / 4);
        ain1.setAutoPadding(true);
        ain1.copyFrom(in1);

        resultArray7_char4 result = reduce_my_array_char4(ain1, null);
        result.mTempIns = new Allocation[]{ain1};
        return result;
    }

    // ain1 = "char4 val"
    public resultArray7_char4 reduce_my_array_char4(Allocation ain1) {
        return reduce_my_array_char4(ain1, null);
    }

    // ain1 = "char4 val"
    public resultArray7_char4 reduce_my_array_char4(Allocation ain1, Script.LaunchOptions sc) {
        // check ain1
        if (!ain1.getType().getElement().isCompatible(__I8_4)) {
            throw new RSRuntimeException("Type mismatch with I8_4!");
        }
        Allocation aout = Allocation.createSized(mRSLocal, __I8_4, 7);
        aout.setAutoPadding(true);
        reduce(mExportReduceIdx_my_array_char4, new Allocation[]{ain1}, aout, sc);
        return new resultArray7_char4(aout);
    }

    private final static int mExportReduceIdx_my_short = 24;
    // in1 = "val"
    public result_short reduce_my_short(short[] in1) {
        // Verify that "in1" is non-null.
        if (in1 == null) {
            throw new RSIllegalArgumentException("Array \"in1\" is null!");
        }
        Allocation ain1 = Allocation.createSized(mRSLocal, __I16, in1.length);
        ain1.setAutoPadding(true);
        ain1.copyFrom(in1);

        result_short result = reduce_my_short(ain1, null);
        result.mTempIns = new Allocation[]{ain1};
        return result;
    }

    // ain1 = "short val"
    public result_short reduce_my_short(Allocation ain1) {
        return reduce_my_short(ain1, null);
    }

    // ain1 = "short val"
    public result_short reduce_my_short(Allocation ain1, Script.LaunchOptions sc) {
        // check ain1
        if (!ain1.getType().getElement().isCompatible(__I16)) {
            throw new RSRuntimeException("Type mismatch with I16!");
        }
        Allocation aout = Allocation.createSized(mRSLocal, __I16, 1);
        aout.setAutoPadding(true);
        reduce(mExportReduceIdx_my_short, new Allocation[]{ain1}, aout, sc);
        return new result_short(aout);
    }

    private final static int mExportReduceIdx_my_short2 = 25;
    // in1 = "val", flattened 2-vectors
    public result_short2 reduce_my_short2(short[] in1) {
        // Verify that "in1" is non-null.
        if (in1 == null) {
            throw new RSIllegalArgumentException("Array \"in1\" is null!");
        }
        // Verify that the array length is a multiple of the vector size.
        if (in1.length % 2 != 0) {
            throw new RSIllegalArgumentException("Array \"in1\" is not a multiple of 2 in length!");
        }
        Allocation ain1 = Allocation.createSized(mRSLocal, __I16_2, in1.length / 2);
        ain1.setAutoPadding(true);
        ain1.copyFrom(in1);

        result_short2 result = reduce_my_short2(ain1, null);
        result.mTempIns = new Allocation[]{ain1};
        return result;
    }

    // ain1 = "short2 val"
    public result_short2 reduce_my_short2(Allocation ain1) {
        return reduce_my_short2(ain1, null);
    }

    // ain1 = "short2 val"
    public result_short2 reduce_my_short2(Allocation ain1, Script.LaunchOptions sc) {
        // check ain1
        if (!ain1.getType().getElement().isCompatible(__I16_2)) {
            throw new RSRuntimeException("Type mismatch with I16_2!");
        }
        Allocation aout = Allocation.createSized(mRSLocal, __I16_2, 1);
        aout.setAutoPadding(true);
        reduce(mExportReduceIdx_my_short2, new Allocation[]{ain1}, aout, sc);
        return new result_short2(aout);
    }

    private final static int mExportReduceIdx_my_short4 = 26;
    // in1 = "val", flattened 4-vectors
    public result_short4 reduce_my_short4(short[] in1) {
        // Verify that "in1" is non-null.
        if (in1 == null) {
            throw new RSIllegalArgumentException("Array \"in1\" is null!");
        }
        // Verify that the array length is a multiple of the vector size.
        if (in1.length % 4 != 0) {
            throw new RSIllegalArgumentException("Array \"in1\" is not a multiple of 4 in length!");
        }
        Allocation ain1 = Allocation.createSized(mRSLocal, __I16_4, in1.length / 4);
        ain1.setAutoPadding(true);
        ain1.copyFrom(in1);

        result_short4 result = reduce_my_short4(ain1, null);
        result.mTempIns = new Allocation[]{ain1};
        return result;
    }

    // ain1 = "short4 val"
    public result_short4 reduce_my_short4(Allocation ain1) {
        return reduce_my_short4(ain1, null);
    }

    // ain1 = "short4 val"
    public result_short4 reduce_my_short4(Allocation ain1, Script.LaunchOptions sc) {
        // check ain1
        if (!ain1.getType().getElement().isCompatible(__I16_4)) {
            throw new RSRuntimeException("Type mismatch with I16_4!");
        }
        Allocation aout = Allocation.createSized(mRSLocal, __I16_4, 1);
        aout.setAutoPadding(true);
        reduce(mExportReduceIdx_my_short4, new Allocation[]{ain1}, aout, sc);
        return new result_short4(aout);
    }

    private final static int mExportReduceIdx_my_array_short = 27;
    // in1 = "val"
    public resultArray7_short reduce_my_array_short(short[] in1) {
        // Verify that "in1" is non-null.
        if (in1 == null) {
            throw new RSIllegalArgumentException("Array \"in1\" is null!");
        }
        Allocation ain1 = Allocation.createSized(mRSLocal, __I16, in1.length);
        ain1.setAutoPadding(true);
        ain1.copyFrom(in1);

        resultArray7_short result = reduce_my_array_short(ain1, null);
        result.mTempIns = new Allocation[]{ain1};
        return result;
    }

    // ain1 = "short val"
    public resultArray7_short reduce_my_array_short(Allocation ain1) {
        return reduce_my_array_short(ain1, null);
    }

    // ain1 = "short val"
    public resultArray7_short reduce_my_array_short(Allocation ain1, Script.LaunchOptions sc) {
        // check ain1
        if (!ain1.getType().getElement().isCompatible(__I16)) {
            throw new RSRuntimeException("Type mismatch with I16!");
        }
        Allocation aout = Allocation.createSized(mRSLocal, __I16, 7);
        aout.setAutoPadding(true);
        reduce(mExportReduceIdx_my_array_short, new Allocation[]{ain1}, aout, sc);
        return new resultArray7_short(aout);
    }

    private final static int mExportReduceIdx_my_array_short2 = 28;
    // in1 = "val", flattened 2-vectors
    public resultArray7_short2 reduce_my_array_short2(short[] in1) {
        // Verify that "in1" is non-null.
        if (in1 == null) {
            throw new RSIllegalArgumentException("Array \"in1\" is null!");
        }
        // Verify that the array length is a multiple of the vector size.
        if (in1.length % 2 != 0) {
            throw new RSIllegalArgumentException("Array \"in1\" is not a multiple of 2 in length!");
        }
        Allocation ain1 = Allocation.createSized(mRSLocal, __I16_2, in1.length / 2);
        ain1.setAutoPadding(true);
        ain1.copyFrom(in1);

        resultArray7_short2 result = reduce_my_array_short2(ain1, null);
        result.mTempIns = new Allocation[]{ain1};
        return result;
    }

    // ain1 = "short2 val"
    public resultArray7_short2 reduce_my_array_short2(Allocation ain1) {
        return reduce_my_array_short2(ain1, null);
    }

    // ain1 = "short2 val"
    public resultArray7_short2 reduce_my_array_short2(Allocation ain1, Script.LaunchOptions sc) {
        // check ain1
        if (!ain1.getType().getElement().isCompatible(__I16_2)) {
            throw new RSRuntimeException("Type mismatch with I16_2!");
        }
        Allocation aout = Allocation.createSized(mRSLocal, __I16_2, 7);
        aout.setAutoPadding(true);
        reduce(mExportReduceIdx_my_array_short2, new Allocation[]{ain1}, aout, sc);
        return new resultArray7_short2(aout);
    }

    private final static int mExportReduceIdx_my_array_short4 = 29;
    // in1 = "val", flattened 4-vectors
    public resultArray7_short4 reduce_my_array_short4(short[] in1) {
        // Verify that "in1" is non-null.
        if (in1 == null) {
            throw new RSIllegalArgumentException("Array \"in1\" is null!");
        }
        // Verify that the array length is a multiple of the vector size.
        if (in1.length % 4 != 0) {
            throw new RSIllegalArgumentException("Array \"in1\" is not a multiple of 4 in length!");
        }
        Allocation ain1 = Allocation.createSized(mRSLocal, __I16_4, in1.length / 4);
        ain1.setAutoPadding(true);
        ain1.copyFrom(in1);

        resultArray7_short4 result = reduce_my_array_short4(ain1, null);
        result.mTempIns = new Allocation[]{ain1};
        return result;
    }

    // ain1 = "short4 val"
    public resultArray7_short4 reduce_my_array_short4(Allocation ain1) {
        return reduce_my_array_short4(ain1, null);
    }

    // ain1 = "short4 val"
    public resultArray7_short4 reduce_my_array_short4(Allocation ain1, Script.LaunchOptions sc) {
        // check ain1
        if (!ain1.getType().getElement().isCompatible(__I16_4)) {
            throw new RSRuntimeException("Type mismatch with I16_4!");
        }
        Allocation aout = Allocation.createSized(mRSLocal, __I16_4, 7);
        aout.setAutoPadding(true);
        reduce(mExportReduceIdx_my_array_short4, new Allocation[]{ain1}, aout, sc);
        return new resultArray7_short4(aout);
    }

    private final static int mExportReduceIdx_my_int = 30;
    // in1 = "val"
    public result_int reduce_my_int(int[] in1) {
        // Verify that "in1" is non-null.
        if (in1 == null) {
            throw new RSIllegalArgumentException("Array \"in1\" is null!");
        }
        Allocation ain1 = Allocation.createSized(mRSLocal, __I32, in1.length);
        ain1.setAutoPadding(true);
        ain1.copyFrom(in1);

        result_int result = reduce_my_int(ain1, null);
        result.mTempIns = new Allocation[]{ain1};
        return result;
    }

    // ain1 = "int val"
    public result_int reduce_my_int(Allocation ain1) {
        return reduce_my_int(ain1, null);
    }

    // ain1 = "int val"
    public result_int reduce_my_int(Allocation ain1, Script.LaunchOptions sc) {
        // check ain1
        if (!ain1.getType().getElement().isCompatible(__I32)) {
            throw new RSRuntimeException("Type mismatch with I32!");
        }
        Allocation aout = Allocation.createSized(mRSLocal, __I32, 1);
        aout.setAutoPadding(true);
        reduce(mExportReduceIdx_my_int, new Allocation[]{ain1}, aout, sc);
        return new result_int(aout);
    }

    private final static int mExportReduceIdx_my_int2 = 31;
    // in1 = "val", flattened 2-vectors
    public result_int2 reduce_my_int2(int[] in1) {
        // Verify that "in1" is non-null.
        if (in1 == null) {
            throw new RSIllegalArgumentException("Array \"in1\" is null!");
        }
        // Verify that the array length is a multiple of the vector size.
        if (in1.length % 2 != 0) {
            throw new RSIllegalArgumentException("Array \"in1\" is not a multiple of 2 in length!");
        }
        Allocation ain1 = Allocation.createSized(mRSLocal, __I32_2, in1.length / 2);
        ain1.setAutoPadding(true);
        ain1.copyFrom(in1);

        result_int2 result = reduce_my_int2(ain1, null);
        result.mTempIns = new Allocation[]{ain1};
        return result;
    }

    // ain1 = "int2 val"
    public result_int2 reduce_my_int2(Allocation ain1) {
        return reduce_my_int2(ain1, null);
    }

    // ain1 = "int2 val"
    public result_int2 reduce_my_int2(Allocation ain1, Script.LaunchOptions sc) {
        // check ain1
        if (!ain1.getType().getElement().isCompatible(__I32_2)) {
            throw new RSRuntimeException("Type mismatch with I32_2!");
        }
        Allocation aout = Allocation.createSized(mRSLocal, __I32_2, 1);
        aout.setAutoPadding(true);
        reduce(mExportReduceIdx_my_int2, new Allocation[]{ain1}, aout, sc);
        return new result_int2(aout);
    }

    private final static int mExportReduceIdx_my_int4 = 32;
    // in1 = "val", flattened 4-vectors
    public result_int4 reduce_my_int4(int[] in1) {
        // Verify that "in1" is non-null.
        if (in1 == null) {
            throw new RSIllegalArgumentException("Array \"in1\" is null!");
        }
        // Verify that the array length is a multiple of the vector size.
        if (in1.length % 4 != 0) {
            throw new RSIllegalArgumentException("Array \"in1\" is not a multiple of 4 in length!");
        }
        Allocation ain1 = Allocation.createSized(mRSLocal, __I32_4, in1.length / 4);
        ain1.setAutoPadding(true);
        ain1.copyFrom(in1);

        result_int4 result = reduce_my_int4(ain1, null);
        result.mTempIns = new Allocation[]{ain1};
        return result;
    }

    // ain1 = "int4 val"
    public result_int4 reduce_my_int4(Allocation ain1) {
        return reduce_my_int4(ain1, null);
    }

    // ain1 = "int4 val"
    public result_int4 reduce_my_int4(Allocation ain1, Script.LaunchOptions sc) {
        // check ain1
        if (!ain1.getType().getElement().isCompatible(__I32_4)) {
            throw new RSRuntimeException("Type mismatch with I32_4!");
        }
        Allocation aout = Allocation.createSized(mRSLocal, __I32_4, 1);
        aout.setAutoPadding(true);
        reduce(mExportReduceIdx_my_int4, new Allocation[]{ain1}, aout, sc);
        return new result_int4(aout);
    }

    private final static int mExportReduceIdx_my_array_int = 33;
    // in1 = "val"
    public resultArray7_int reduce_my_array_int(int[] in1) {
        // Verify that "in1" is non-null.
        if (in1 == null) {
            throw new RSIllegalArgumentException("Array \"in1\" is null!");
        }
        Allocation ain1 = Allocation.createSized(mRSLocal, __I32, in1.length);
        ain1.setAutoPadding(true);
        ain1.copyFrom(in1);

        resultArray7_int result = reduce_my_array_int(ain1, null);
        result.mTempIns = new Allocation[]{ain1};
        return result;
    }

    // ain1 = "int val"
    public resultArray7_int reduce_my_array_int(Allocation ain1) {
        return reduce_my_array_int(ain1, null);
    }

    // ain1 = "int val"
    public resultArray7_int reduce_my_array_int(Allocation ain1, Script.LaunchOptions sc) {
        // check ain1
        if (!ain1.getType().getElement().isCompatible(__I32)) {
            throw new RSRuntimeException("Type mismatch with I32!");
        }
        Allocation aout = Allocation.createSized(mRSLocal, __I32, 7);
        aout.setAutoPadding(true);
        reduce(mExportReduceIdx_my_array_int, new Allocation[]{ain1}, aout, sc);
        return new resultArray7_int(aout);
    }

    private final static int mExportReduceIdx_my_array_int2 = 34;
    // in1 = "val", flattened 2-vectors
    public resultArray7_int2 reduce_my_array_int2(int[] in1) {
        // Verify that "in1" is non-null.
        if (in1 == null) {
            throw new RSIllegalArgumentException("Array \"in1\" is null!");
        }
        // Verify that the array length is a multiple of the vector size.
        if (in1.length % 2 != 0) {
            throw new RSIllegalArgumentException("Array \"in1\" is not a multiple of 2 in length!");
        }
        Allocation ain1 = Allocation.createSized(mRSLocal, __I32_2, in1.length / 2);
        ain1.setAutoPadding(true);
        ain1.copyFrom(in1);

        resultArray7_int2 result = reduce_my_array_int2(ain1, null);
        result.mTempIns = new Allocation[]{ain1};
        return result;
    }

    // ain1 = "int2 val"
    public resultArray7_int2 reduce_my_array_int2(Allocation ain1) {
        return reduce_my_array_int2(ain1, null);
    }

    // ain1 = "int2 val"
    public resultArray7_int2 reduce_my_array_int2(Allocation ain1, Script.LaunchOptions sc) {
        // check ain1
        if (!ain1.getType().getElement().isCompatible(__I32_2)) {
            throw new RSRuntimeException("Type mismatch with I32_2!");
        }
        Allocation aout = Allocation.createSized(mRSLocal, __I32_2, 7);
        aout.setAutoPadding(true);
        reduce(mExportReduceIdx_my_array_int2, new Allocation[]{ain1}, aout, sc);
        return new resultArray7_int2(aout);
    }

    private final static int mExportReduceIdx_my_array_int4 = 35;
    // in1 = "val", flattened 4-vectors
    public resultArray7_int4 reduce_my_array_int4(int[] in1) {
        // Verify that "in1" is non-null.
        if (in1 == null) {
            throw new RSIllegalArgumentException("Array \"in1\" is null!");
        }
        // Verify that the array length is a multiple of the vector size.
        if (in1.length % 4 != 0) {
            throw new RSIllegalArgumentException("Array \"in1\" is not a multiple of 4 in length!");
        }
        Allocation ain1 = Allocation.createSized(mRSLocal, __I32_4, in1.length / 4);
        ain1.setAutoPadding(true);
        ain1.copyFrom(in1);

        resultArray7_int4 result = reduce_my_array_int4(ain1, null);
        result.mTempIns = new Allocation[]{ain1};
        return result;
    }

    // ain1 = "int4 val"
    public resultArray7_int4 reduce_my_array_int4(Allocation ain1) {
        return reduce_my_array_int4(ain1, null);
    }

    // ain1 = "int4 val"
    public resultArray7_int4 reduce_my_array_int4(Allocation ain1, Script.LaunchOptions sc) {
        // check ain1
        if (!ain1.getType().getElement().isCompatible(__I32_4)) {
            throw new RSRuntimeException("Type mismatch with I32_4!");
        }
        Allocation aout = Allocation.createSized(mRSLocal, __I32_4, 7);
        aout.setAutoPadding(true);
        reduce(mExportReduceIdx_my_array_int4, new Allocation[]{ain1}, aout, sc);
        return new resultArray7_int4(aout);
    }

    private final static int mExportReduceIdx_my_long = 36;
    // in1 = "val"
    public result_long reduce_my_long(long[] in1) {
        // Verify that "in1" is non-null.
        if (in1 == null) {
            throw new RSIllegalArgumentException("Array \"in1\" is null!");
        }
        Allocation ain1 = Allocation.createSized(mRSLocal, __I64, in1.length);
        ain1.setAutoPadding(true);
        ain1.copyFrom(in1);

        result_long result = reduce_my_long(ain1, null);
        result.mTempIns = new Allocation[]{ain1};
        return result;
    }

    // ain1 = "long val"
    public result_long reduce_my_long(Allocation ain1) {
        return reduce_my_long(ain1, null);
    }

    // ain1 = "long val"
    public result_long reduce_my_long(Allocation ain1, Script.LaunchOptions sc) {
        // check ain1
        if (!ain1.getType().getElement().isCompatible(__I64)) {
            throw new RSRuntimeException("Type mismatch with I64!");
        }
        Allocation aout = Allocation.createSized(mRSLocal, __I64, 1);
        aout.setAutoPadding(true);
        reduce(mExportReduceIdx_my_long, new Allocation[]{ain1}, aout, sc);
        return new result_long(aout);
    }

    private final static int mExportReduceIdx_my_long2 = 37;
    // in1 = "val", flattened 2-vectors
    public result_long2 reduce_my_long2(long[] in1) {
        // Verify that "in1" is non-null.
        if (in1 == null) {
            throw new RSIllegalArgumentException("Array \"in1\" is null!");
        }
        // Verify that the array length is a multiple of the vector size.
        if (in1.length % 2 != 0) {
            throw new RSIllegalArgumentException("Array \"in1\" is not a multiple of 2 in length!");
        }
        Allocation ain1 = Allocation.createSized(mRSLocal, __I64_2, in1.length / 2);
        ain1.setAutoPadding(true);
        ain1.copyFrom(in1);

        result_long2 result = reduce_my_long2(ain1, null);
        result.mTempIns = new Allocation[]{ain1};
        return result;
    }

    // ain1 = "long2 val"
    public result_long2 reduce_my_long2(Allocation ain1) {
        return reduce_my_long2(ain1, null);
    }

    // ain1 = "long2 val"
    public result_long2 reduce_my_long2(Allocation ain1, Script.LaunchOptions sc) {
        // check ain1
        if (!ain1.getType().getElement().isCompatible(__I64_2)) {
            throw new RSRuntimeException("Type mismatch with I64_2!");
        }
        Allocation aout = Allocation.createSized(mRSLocal, __I64_2, 1);
        aout.setAutoPadding(true);
        reduce(mExportReduceIdx_my_long2, new Allocation[]{ain1}, aout, sc);
        return new result_long2(aout);
    }

    private final static int mExportReduceIdx_my_long4 = 38;
    // in1 = "val", flattened 4-vectors
    public result_long4 reduce_my_long4(long[] in1) {
        // Verify that "in1" is non-null.
        if (in1 == null) {
            throw new RSIllegalArgumentException("Array \"in1\" is null!");
        }
        // Verify that the array length is a multiple of the vector size.
        if (in1.length % 4 != 0) {
            throw new RSIllegalArgumentException("Array \"in1\" is not a multiple of 4 in length!");
        }
        Allocation ain1 = Allocation.createSized(mRSLocal, __I64_4, in1.length / 4);
        ain1.setAutoPadding(true);
        ain1.copyFrom(in1);

        result_long4 result = reduce_my_long4(ain1, null);
        result.mTempIns = new Allocation[]{ain1};
        return result;
    }

    // ain1 = "long4 val"
    public result_long4 reduce_my_long4(Allocation ain1) {
        return reduce_my_long4(ain1, null);
    }

    // ain1 = "long4 val"
    public result_long4 reduce_my_long4(Allocation ain1, Script.LaunchOptions sc) {
        // check ain1
        if (!ain1.getType().getElement().isCompatible(__I64_4)) {
            throw new RSRuntimeException("Type mismatch with I64_4!");
        }
        Allocation aout = Allocation.createSized(mRSLocal, __I64_4, 1);
        aout.setAutoPadding(true);
        reduce(mExportReduceIdx_my_long4, new Allocation[]{ain1}, aout, sc);
        return new result_long4(aout);
    }

    private final static int mExportReduceIdx_my_array_long = 39;
    // in1 = "val"
    public resultArray7_long reduce_my_array_long(long[] in1) {
        // Verify that "in1" is non-null.
        if (in1 == null) {
            throw new RSIllegalArgumentException("Array \"in1\" is null!");
        }
        Allocation ain1 = Allocation.createSized(mRSLocal, __I64, in1.length);
        ain1.setAutoPadding(true);
        ain1.copyFrom(in1);

        resultArray7_long result = reduce_my_array_long(ain1, null);
        result.mTempIns = new Allocation[]{ain1};
        return result;
    }

    // ain1 = "long val"
    public resultArray7_long reduce_my_array_long(Allocation ain1) {
        return reduce_my_array_long(ain1, null);
    }

    // ain1 = "long val"
    public resultArray7_long reduce_my_array_long(Allocation ain1, Script.LaunchOptions sc) {
        // check ain1
        if (!ain1.getType().getElement().isCompatible(__I64)) {
            throw new RSRuntimeException("Type mismatch with I64!");
        }
        Allocation aout = Allocation.createSized(mRSLocal, __I64, 7);
        aout.setAutoPadding(true);
        reduce(mExportReduceIdx_my_array_long, new Allocation[]{ain1}, aout, sc);
        return new resultArray7_long(aout);
    }

    private final static int mExportReduceIdx_my_array_long2 = 40;
    // in1 = "val", flattened 2-vectors
    public resultArray7_long2 reduce_my_array_long2(long[] in1) {
        // Verify that "in1" is non-null.
        if (in1 == null) {
            throw new RSIllegalArgumentException("Array \"in1\" is null!");
        }
        // Verify that the array length is a multiple of the vector size.
        if (in1.length % 2 != 0) {
            throw new RSIllegalArgumentException("Array \"in1\" is not a multiple of 2 in length!");
        }
        Allocation ain1 = Allocation.createSized(mRSLocal, __I64_2, in1.length / 2);
        ain1.setAutoPadding(true);
        ain1.copyFrom(in1);

        resultArray7_long2 result = reduce_my_array_long2(ain1, null);
        result.mTempIns = new Allocation[]{ain1};
        return result;
    }

    // ain1 = "long2 val"
    public resultArray7_long2 reduce_my_array_long2(Allocation ain1) {
        return reduce_my_array_long2(ain1, null);
    }

    // ain1 = "long2 val"
    public resultArray7_long2 reduce_my_array_long2(Allocation ain1, Script.LaunchOptions sc) {
        // check ain1
        if (!ain1.getType().getElement().isCompatible(__I64_2)) {
            throw new RSRuntimeException("Type mismatch with I64_2!");
        }
        Allocation aout = Allocation.createSized(mRSLocal, __I64_2, 7);
        aout.setAutoPadding(true);
        reduce(mExportReduceIdx_my_array_long2, new Allocation[]{ain1}, aout, sc);
        return new resultArray7_long2(aout);
    }

    private final static int mExportReduceIdx_my_array_long4 = 41;
    // in1 = "val", flattened 4-vectors
    public resultArray7_long4 reduce_my_array_long4(long[] in1) {
        // Verify that "in1" is non-null.
        if (in1 == null) {
            throw new RSIllegalArgumentException("Array \"in1\" is null!");
        }
        // Verify that the array length is a multiple of the vector size.
        if (in1.length % 4 != 0) {
            throw new RSIllegalArgumentException("Array \"in1\" is not a multiple of 4 in length!");
        }
        Allocation ain1 = Allocation.createSized(mRSLocal, __I64_4, in1.length / 4);
        ain1.setAutoPadding(true);
        ain1.copyFrom(in1);

        resultArray7_long4 result = reduce_my_array_long4(ain1, null);
        result.mTempIns = new Allocation[]{ain1};
        return result;
    }

    // ain1 = "long4 val"
    public resultArray7_long4 reduce_my_array_long4(Allocation ain1) {
        return reduce_my_array_long4(ain1, null);
    }

    // ain1 = "long4 val"
    public resultArray7_long4 reduce_my_array_long4(Allocation ain1, Script.LaunchOptions sc) {
        // check ain1
        if (!ain1.getType().getElement().isCompatible(__I64_4)) {
            throw new RSRuntimeException("Type mismatch with I64_4!");
        }
        Allocation aout = Allocation.createSized(mRSLocal, __I64_4, 7);
        aout.setAutoPadding(true);
        reduce(mExportReduceIdx_my_array_long4, new Allocation[]{ain1}, aout, sc);
        return new resultArray7_long4(aout);
    }

    private final static int mExportReduceIdx_my_uchar = 42;
    // in1 = "val"
    public result_uchar reduce_my_uchar(byte[] in1) {
        // Verify that "in1" is non-null.
        if (in1 == null) {
            throw new RSIllegalArgumentException("Array \"in1\" is null!");
        }
        Allocation ain1 = Allocation.createSized(mRSLocal, __U8, in1.length);
        ain1.setAutoPadding(true);
        ain1.copyFrom(in1);

        result_uchar result = reduce_my_uchar(ain1, null);
        result.mTempIns = new Allocation[]{ain1};
        return result;
    }

    // ain1 = "uchar val"
    public result_uchar reduce_my_uchar(Allocation ain1) {
        return reduce_my_uchar(ain1, null);
    }

    // ain1 = "uchar val"
    public result_uchar reduce_my_uchar(Allocation ain1, Script.LaunchOptions sc) {
        // check ain1
        if (!ain1.getType().getElement().isCompatible(__U8)) {
            throw new RSRuntimeException("Type mismatch with U8!");
        }
        Allocation aout = Allocation.createSized(mRSLocal, __U8, 1);
        aout.setAutoPadding(true);
        reduce(mExportReduceIdx_my_uchar, new Allocation[]{ain1}, aout, sc);
        return new result_uchar(aout);
    }

    private final static int mExportReduceIdx_my_uchar2 = 43;
    // in1 = "val", flattened 2-vectors
    public result_uchar2 reduce_my_uchar2(byte[] in1) {
        // Verify that "in1" is non-null.
        if (in1 == null) {
            throw new RSIllegalArgumentException("Array \"in1\" is null!");
        }
        // Verify that the array length is a multiple of the vector size.
        if (in1.length % 2 != 0) {
            throw new RSIllegalArgumentException("Array \"in1\" is not a multiple of 2 in length!");
        }
        Allocation ain1 = Allocation.createSized(mRSLocal, __U8_2, in1.length / 2);
        ain1.setAutoPadding(true);
        ain1.copyFrom(in1);

        result_uchar2 result = reduce_my_uchar2(ain1, null);
        result.mTempIns = new Allocation[]{ain1};
        return result;
    }

    // ain1 = "uchar2 val"
    public result_uchar2 reduce_my_uchar2(Allocation ain1) {
        return reduce_my_uchar2(ain1, null);
    }

    // ain1 = "uchar2 val"
    public result_uchar2 reduce_my_uchar2(Allocation ain1, Script.LaunchOptions sc) {
        // check ain1
        if (!ain1.getType().getElement().isCompatible(__U8_2)) {
            throw new RSRuntimeException("Type mismatch with U8_2!");
        }
        Allocation aout = Allocation.createSized(mRSLocal, __U8_2, 1);
        aout.setAutoPadding(true);
        reduce(mExportReduceIdx_my_uchar2, new Allocation[]{ain1}, aout, sc);
        return new result_uchar2(aout);
    }

    private final static int mExportReduceIdx_my_uchar4 = 44;
    // in1 = "val", flattened 4-vectors
    public result_uchar4 reduce_my_uchar4(byte[] in1) {
        // Verify that "in1" is non-null.
        if (in1 == null) {
            throw new RSIllegalArgumentException("Array \"in1\" is null!");
        }
        // Verify that the array length is a multiple of the vector size.
        if (in1.length % 4 != 0) {
            throw new RSIllegalArgumentException("Array \"in1\" is not a multiple of 4 in length!");
        }
        Allocation ain1 = Allocation.createSized(mRSLocal, __U8_4, in1.length / 4);
        ain1.setAutoPadding(true);
        ain1.copyFrom(in1);

        result_uchar4 result = reduce_my_uchar4(ain1, null);
        result.mTempIns = new Allocation[]{ain1};
        return result;
    }

    // ain1 = "uchar4 val"
    public result_uchar4 reduce_my_uchar4(Allocation ain1) {
        return reduce_my_uchar4(ain1, null);
    }

    // ain1 = "uchar4 val"
    public result_uchar4 reduce_my_uchar4(Allocation ain1, Script.LaunchOptions sc) {
        // check ain1
        if (!ain1.getType().getElement().isCompatible(__U8_4)) {
            throw new RSRuntimeException("Type mismatch with U8_4!");
        }
        Allocation aout = Allocation.createSized(mRSLocal, __U8_4, 1);
        aout.setAutoPadding(true);
        reduce(mExportReduceIdx_my_uchar4, new Allocation[]{ain1}, aout, sc);
        return new result_uchar4(aout);
    }

    private final static int mExportReduceIdx_my_array_uchar = 45;
    // in1 = "val"
    public resultArray7_uchar reduce_my_array_uchar(byte[] in1) {
        // Verify that "in1" is non-null.
        if (in1 == null) {
            throw new RSIllegalArgumentException("Array \"in1\" is null!");
        }
        Allocation ain1 = Allocation.createSized(mRSLocal, __U8, in1.length);
        ain1.setAutoPadding(true);
        ain1.copyFrom(in1);

        resultArray7_uchar result = reduce_my_array_uchar(ain1, null);
        result.mTempIns = new Allocation[]{ain1};
        return result;
    }

    // ain1 = "uchar val"
    public resultArray7_uchar reduce_my_array_uchar(Allocation ain1) {
        return reduce_my_array_uchar(ain1, null);
    }

    // ain1 = "uchar val"
    public resultArray7_uchar reduce_my_array_uchar(Allocation ain1, Script.LaunchOptions sc) {
        // check ain1
        if (!ain1.getType().getElement().isCompatible(__U8)) {
            throw new RSRuntimeException("Type mismatch with U8!");
        }
        Allocation aout = Allocation.createSized(mRSLocal, __U8, 7);
        aout.setAutoPadding(true);
        reduce(mExportReduceIdx_my_array_uchar, new Allocation[]{ain1}, aout, sc);
        return new resultArray7_uchar(aout);
    }

    private final static int mExportReduceIdx_my_array_uchar2 = 46;
    // in1 = "val", flattened 2-vectors
    public resultArray7_uchar2 reduce_my_array_uchar2(byte[] in1) {
        // Verify that "in1" is non-null.
        if (in1 == null) {
            throw new RSIllegalArgumentException("Array \"in1\" is null!");
        }
        // Verify that the array length is a multiple of the vector size.
        if (in1.length % 2 != 0) {
            throw new RSIllegalArgumentException("Array \"in1\" is not a multiple of 2 in length!");
        }
        Allocation ain1 = Allocation.createSized(mRSLocal, __U8_2, in1.length / 2);
        ain1.setAutoPadding(true);
        ain1.copyFrom(in1);

        resultArray7_uchar2 result = reduce_my_array_uchar2(ain1, null);
        result.mTempIns = new Allocation[]{ain1};
        return result;
    }

    // ain1 = "uchar2 val"
    public resultArray7_uchar2 reduce_my_array_uchar2(Allocation ain1) {
        return reduce_my_array_uchar2(ain1, null);
    }

    // ain1 = "uchar2 val"
    public resultArray7_uchar2 reduce_my_array_uchar2(Allocation ain1, Script.LaunchOptions sc) {
        // check ain1
        if (!ain1.getType().getElement().isCompatible(__U8_2)) {
            throw new RSRuntimeException("Type mismatch with U8_2!");
        }
        Allocation aout = Allocation.createSized(mRSLocal, __U8_2, 7);
        aout.setAutoPadding(true);
        reduce(mExportReduceIdx_my_array_uchar2, new Allocation[]{ain1}, aout, sc);
        return new resultArray7_uchar2(aout);
    }

    private final static int mExportReduceIdx_my_array_uchar4 = 47;
    // in1 = "val", flattened 4-vectors
    public resultArray7_uchar4 reduce_my_array_uchar4(byte[] in1) {
        // Verify that "in1" is non-null.
        if (in1 == null) {
            throw new RSIllegalArgumentException("Array \"in1\" is null!");
        }
        // Verify that the array length is a multiple of the vector size.
        if (in1.length % 4 != 0) {
            throw new RSIllegalArgumentException("Array \"in1\" is not a multiple of 4 in length!");
        }
        Allocation ain1 = Allocation.createSized(mRSLocal, __U8_4, in1.length / 4);
        ain1.setAutoPadding(true);
        ain1.copyFrom(in1);

        resultArray7_uchar4 result = reduce_my_array_uchar4(ain1, null);
        result.mTempIns = new Allocation[]{ain1};
        return result;
    }

    // ain1 = "uchar4 val"
    public resultArray7_uchar4 reduce_my_array_uchar4(Allocation ain1) {
        return reduce_my_array_uchar4(ain1, null);
    }

    // ain1 = "uchar4 val"
    public resultArray7_uchar4 reduce_my_array_uchar4(Allocation ain1, Script.LaunchOptions sc) {
        // check ain1
        if (!ain1.getType().getElement().isCompatible(__U8_4)) {
            throw new RSRuntimeException("Type mismatch with U8_4!");
        }
        Allocation aout = Allocation.createSized(mRSLocal, __U8_4, 7);
        aout.setAutoPadding(true);
        reduce(mExportReduceIdx_my_array_uchar4, new Allocation[]{ain1}, aout, sc);
        return new resultArray7_uchar4(aout);
    }

    private final static int mExportReduceIdx_my_ushort = 48;
    // in1 = "val"
    public result_ushort reduce_my_ushort(short[] in1) {
        // Verify that "in1" is non-null.
        if (in1 == null) {
            throw new RSIllegalArgumentException("Array \"in1\" is null!");
        }
        Allocation ain1 = Allocation.createSized(mRSLocal, __U16, in1.length);
        ain1.setAutoPadding(true);
        ain1.copyFrom(in1);

        result_ushort result = reduce_my_ushort(ain1, null);
        result.mTempIns = new Allocation[]{ain1};
        return result;
    }

    // ain1 = "ushort val"
    public result_ushort reduce_my_ushort(Allocation ain1) {
        return reduce_my_ushort(ain1, null);
    }

    // ain1 = "ushort val"
    public result_ushort reduce_my_ushort(Allocation ain1, Script.LaunchOptions sc) {
        // check ain1
        if (!ain1.getType().getElement().isCompatible(__U16)) {
            throw new RSRuntimeException("Type mismatch with U16!");
        }
        Allocation aout = Allocation.createSized(mRSLocal, __U16, 1);
        aout.setAutoPadding(true);
        reduce(mExportReduceIdx_my_ushort, new Allocation[]{ain1}, aout, sc);
        return new result_ushort(aout);
    }

    private final static int mExportReduceIdx_my_ushort2 = 49;
    // in1 = "val", flattened 2-vectors
    public result_ushort2 reduce_my_ushort2(short[] in1) {
        // Verify that "in1" is non-null.
        if (in1 == null) {
            throw new RSIllegalArgumentException("Array \"in1\" is null!");
        }
        // Verify that the array length is a multiple of the vector size.
        if (in1.length % 2 != 0) {
            throw new RSIllegalArgumentException("Array \"in1\" is not a multiple of 2 in length!");
        }
        Allocation ain1 = Allocation.createSized(mRSLocal, __U16_2, in1.length / 2);
        ain1.setAutoPadding(true);
        ain1.copyFrom(in1);

        result_ushort2 result = reduce_my_ushort2(ain1, null);
        result.mTempIns = new Allocation[]{ain1};
        return result;
    }

    // ain1 = "ushort2 val"
    public result_ushort2 reduce_my_ushort2(Allocation ain1) {
        return reduce_my_ushort2(ain1, null);
    }

    // ain1 = "ushort2 val"
    public result_ushort2 reduce_my_ushort2(Allocation ain1, Script.LaunchOptions sc) {
        // check ain1
        if (!ain1.getType().getElement().isCompatible(__U16_2)) {
            throw new RSRuntimeException("Type mismatch with U16_2!");
        }
        Allocation aout = Allocation.createSized(mRSLocal, __U16_2, 1);
        aout.setAutoPadding(true);
        reduce(mExportReduceIdx_my_ushort2, new Allocation[]{ain1}, aout, sc);
        return new result_ushort2(aout);
    }

    private final static int mExportReduceIdx_my_ushort4 = 50;
    // in1 = "val", flattened 4-vectors
    public result_ushort4 reduce_my_ushort4(short[] in1) {
        // Verify that "in1" is non-null.
        if (in1 == null) {
            throw new RSIllegalArgumentException("Array \"in1\" is null!");
        }
        // Verify that the array length is a multiple of the vector size.
        if (in1.length % 4 != 0) {
            throw new RSIllegalArgumentException("Array \"in1\" is not a multiple of 4 in length!");
        }
        Allocation ain1 = Allocation.createSized(mRSLocal, __U16_4, in1.length / 4);
        ain1.setAutoPadding(true);
        ain1.copyFrom(in1);

        result_ushort4 result = reduce_my_ushort4(ain1, null);
        result.mTempIns = new Allocation[]{ain1};
        return result;
    }

    // ain1 = "ushort4 val"
    public result_ushort4 reduce_my_ushort4(Allocation ain1) {
        return reduce_my_ushort4(ain1, null);
    }

    // ain1 = "ushort4 val"
    public result_ushort4 reduce_my_ushort4(Allocation ain1, Script.LaunchOptions sc) {
        // check ain1
        if (!ain1.getType().getElement().isCompatible(__U16_4)) {
            throw new RSRuntimeException("Type mismatch with U16_4!");
        }
        Allocation aout = Allocation.createSized(mRSLocal, __U16_4, 1);
        aout.setAutoPadding(true);
        reduce(mExportReduceIdx_my_ushort4, new Allocation[]{ain1}, aout, sc);
        return new result_ushort4(aout);
    }

    private final static int mExportReduceIdx_my_array_ushort = 51;
    // in1 = "val"
    public resultArray7_ushort reduce_my_array_ushort(short[] in1) {
        // Verify that "in1" is non-null.
        if (in1 == null) {
            throw new RSIllegalArgumentException("Array \"in1\" is null!");
        }
        Allocation ain1 = Allocation.createSized(mRSLocal, __U16, in1.length);
        ain1.setAutoPadding(true);
        ain1.copyFrom(in1);

        resultArray7_ushort result = reduce_my_array_ushort(ain1, null);
        result.mTempIns = new Allocation[]{ain1};
        return result;
    }

    // ain1 = "ushort val"
    public resultArray7_ushort reduce_my_array_ushort(Allocation ain1) {
        return reduce_my_array_ushort(ain1, null);
    }

    // ain1 = "ushort val"
    public resultArray7_ushort reduce_my_array_ushort(Allocation ain1, Script.LaunchOptions sc) {
        // check ain1
        if (!ain1.getType().getElement().isCompatible(__U16)) {
            throw new RSRuntimeException("Type mismatch with U16!");
        }
        Allocation aout = Allocation.createSized(mRSLocal, __U16, 7);
        aout.setAutoPadding(true);
        reduce(mExportReduceIdx_my_array_ushort, new Allocation[]{ain1}, aout, sc);
        return new resultArray7_ushort(aout);
    }

    private final static int mExportReduceIdx_my_array_ushort2 = 52;
    // in1 = "val", flattened 2-vectors
    public resultArray7_ushort2 reduce_my_array_ushort2(short[] in1) {
        // Verify that "in1" is non-null.
        if (in1 == null) {
            throw new RSIllegalArgumentException("Array \"in1\" is null!");
        }
        // Verify that the array length is a multiple of the vector size.
        if (in1.length % 2 != 0) {
            throw new RSIllegalArgumentException("Array \"in1\" is not a multiple of 2 in length!");
        }
        Allocation ain1 = Allocation.createSized(mRSLocal, __U16_2, in1.length / 2);
        ain1.setAutoPadding(true);
        ain1.copyFrom(in1);

        resultArray7_ushort2 result = reduce_my_array_ushort2(ain1, null);
        result.mTempIns = new Allocation[]{ain1};
        return result;
    }

    // ain1 = "ushort2 val"
    public resultArray7_ushort2 reduce_my_array_ushort2(Allocation ain1) {
        return reduce_my_array_ushort2(ain1, null);
    }

    // ain1 = "ushort2 val"
    public resultArray7_ushort2 reduce_my_array_ushort2(Allocation ain1, Script.LaunchOptions sc) {
        // check ain1
        if (!ain1.getType().getElement().isCompatible(__U16_2)) {
            throw new RSRuntimeException("Type mismatch with U16_2!");
        }
        Allocation aout = Allocation.createSized(mRSLocal, __U16_2, 7);
        aout.setAutoPadding(true);
        reduce(mExportReduceIdx_my_array_ushort2, new Allocation[]{ain1}, aout, sc);
        return new resultArray7_ushort2(aout);
    }

    private final static int mExportReduceIdx_my_array_ushort4 = 53;
    // in1 = "val", flattened 4-vectors
    public resultArray7_ushort4 reduce_my_array_ushort4(short[] in1) {
        // Verify that "in1" is non-null.
        if (in1 == null) {
            throw new RSIllegalArgumentException("Array \"in1\" is null!");
        }
        // Verify that the array length is a multiple of the vector size.
        if (in1.length % 4 != 0) {
            throw new RSIllegalArgumentException("Array \"in1\" is not a multiple of 4 in length!");
        }
        Allocation ain1 = Allocation.createSized(mRSLocal, __U16_4, in1.length / 4);
        ain1.setAutoPadding(true);
        ain1.copyFrom(in1);

        resultArray7_ushort4 result = reduce_my_array_ushort4(ain1, null);
        result.mTempIns = new Allocation[]{ain1};
        return result;
    }

    // ain1 = "ushort4 val"
    public resultArray7_ushort4 reduce_my_array_ushort4(Allocation ain1) {
        return reduce_my_array_ushort4(ain1, null);
    }

    // ain1 = "ushort4 val"
    public resultArray7_ushort4 reduce_my_array_ushort4(Allocation ain1, Script.LaunchOptions sc) {
        // check ain1
        if (!ain1.getType().getElement().isCompatible(__U16_4)) {
            throw new RSRuntimeException("Type mismatch with U16_4!");
        }
        Allocation aout = Allocation.createSized(mRSLocal, __U16_4, 7);
        aout.setAutoPadding(true);
        reduce(mExportReduceIdx_my_array_ushort4, new Allocation[]{ain1}, aout, sc);
        return new resultArray7_ushort4(aout);
    }

    private final static int mExportReduceIdx_my_uint = 54;
    // in1 = "val"
    public result_uint reduce_my_uint(int[] in1) {
        // Verify that "in1" is non-null.
        if (in1 == null) {
            throw new RSIllegalArgumentException("Array \"in1\" is null!");
        }
        Allocation ain1 = Allocation.createSized(mRSLocal, __U32, in1.length);
        ain1.setAutoPadding(true);
        ain1.copyFrom(in1);

        result_uint result = reduce_my_uint(ain1, null);
        result.mTempIns = new Allocation[]{ain1};
        return result;
    }

    // ain1 = "uint val"
    public result_uint reduce_my_uint(Allocation ain1) {
        return reduce_my_uint(ain1, null);
    }

    // ain1 = "uint val"
    public result_uint reduce_my_uint(Allocation ain1, Script.LaunchOptions sc) {
        // check ain1
        if (!ain1.getType().getElement().isCompatible(__U32)) {
            throw new RSRuntimeException("Type mismatch with U32!");
        }
        Allocation aout = Allocation.createSized(mRSLocal, __U32, 1);
        aout.setAutoPadding(true);
        reduce(mExportReduceIdx_my_uint, new Allocation[]{ain1}, aout, sc);
        return new result_uint(aout);
    }

    private final static int mExportReduceIdx_my_uint2 = 55;
    // in1 = "val", flattened 2-vectors
    public result_uint2 reduce_my_uint2(int[] in1) {
        // Verify that "in1" is non-null.
        if (in1 == null) {
            throw new RSIllegalArgumentException("Array \"in1\" is null!");
        }
        // Verify that the array length is a multiple of the vector size.
        if (in1.length % 2 != 0) {
            throw new RSIllegalArgumentException("Array \"in1\" is not a multiple of 2 in length!");
        }
        Allocation ain1 = Allocation.createSized(mRSLocal, __U32_2, in1.length / 2);
        ain1.setAutoPadding(true);
        ain1.copyFrom(in1);

        result_uint2 result = reduce_my_uint2(ain1, null);
        result.mTempIns = new Allocation[]{ain1};
        return result;
    }

    // ain1 = "uint2 val"
    public result_uint2 reduce_my_uint2(Allocation ain1) {
        return reduce_my_uint2(ain1, null);
    }

    // ain1 = "uint2 val"
    public result_uint2 reduce_my_uint2(Allocation ain1, Script.LaunchOptions sc) {
        // check ain1
        if (!ain1.getType().getElement().isCompatible(__U32_2)) {
            throw new RSRuntimeException("Type mismatch with U32_2!");
        }
        Allocation aout = Allocation.createSized(mRSLocal, __U32_2, 1);
        aout.setAutoPadding(true);
        reduce(mExportReduceIdx_my_uint2, new Allocation[]{ain1}, aout, sc);
        return new result_uint2(aout);
    }

    private final static int mExportReduceIdx_my_uint4 = 56;
    // in1 = "val", flattened 4-vectors
    public result_uint4 reduce_my_uint4(int[] in1) {
        // Verify that "in1" is non-null.
        if (in1 == null) {
            throw new RSIllegalArgumentException("Array \"in1\" is null!");
        }
        // Verify that the array length is a multiple of the vector size.
        if (in1.length % 4 != 0) {
            throw new RSIllegalArgumentException("Array \"in1\" is not a multiple of 4 in length!");
        }
        Allocation ain1 = Allocation.createSized(mRSLocal, __U32_4, in1.length / 4);
        ain1.setAutoPadding(true);
        ain1.copyFrom(in1);

        result_uint4 result = reduce_my_uint4(ain1, null);
        result.mTempIns = new Allocation[]{ain1};
        return result;
    }

    // ain1 = "uint4 val"
    public result_uint4 reduce_my_uint4(Allocation ain1) {
        return reduce_my_uint4(ain1, null);
    }

    // ain1 = "uint4 val"
    public result_uint4 reduce_my_uint4(Allocation ain1, Script.LaunchOptions sc) {
        // check ain1
        if (!ain1.getType().getElement().isCompatible(__U32_4)) {
            throw new RSRuntimeException("Type mismatch with U32_4!");
        }
        Allocation aout = Allocation.createSized(mRSLocal, __U32_4, 1);
        aout.setAutoPadding(true);
        reduce(mExportReduceIdx_my_uint4, new Allocation[]{ain1}, aout, sc);
        return new result_uint4(aout);
    }

    private final static int mExportReduceIdx_my_array_uint = 57;
    // in1 = "val"
    public resultArray7_uint reduce_my_array_uint(int[] in1) {
        // Verify that "in1" is non-null.
        if (in1 == null) {
            throw new RSIllegalArgumentException("Array \"in1\" is null!");
        }
        Allocation ain1 = Allocation.createSized(mRSLocal, __U32, in1.length);
        ain1.setAutoPadding(true);
        ain1.copyFrom(in1);

        resultArray7_uint result = reduce_my_array_uint(ain1, null);
        result.mTempIns = new Allocation[]{ain1};
        return result;
    }

    // ain1 = "uint val"
    public resultArray7_uint reduce_my_array_uint(Allocation ain1) {
        return reduce_my_array_uint(ain1, null);
    }

    // ain1 = "uint val"
    public resultArray7_uint reduce_my_array_uint(Allocation ain1, Script.LaunchOptions sc) {
        // check ain1
        if (!ain1.getType().getElement().isCompatible(__U32)) {
            throw new RSRuntimeException("Type mismatch with U32!");
        }
        Allocation aout = Allocation.createSized(mRSLocal, __U32, 7);
        aout.setAutoPadding(true);
        reduce(mExportReduceIdx_my_array_uint, new Allocation[]{ain1}, aout, sc);
        return new resultArray7_uint(aout);
    }

    private final static int mExportReduceIdx_my_array_uint2 = 58;
    // in1 = "val", flattened 2-vectors
    public resultArray7_uint2 reduce_my_array_uint2(int[] in1) {
        // Verify that "in1" is non-null.
        if (in1 == null) {
            throw new RSIllegalArgumentException("Array \"in1\" is null!");
        }
        // Verify that the array length is a multiple of the vector size.
        if (in1.length % 2 != 0) {
            throw new RSIllegalArgumentException("Array \"in1\" is not a multiple of 2 in length!");
        }
        Allocation ain1 = Allocation.createSized(mRSLocal, __U32_2, in1.length / 2);
        ain1.setAutoPadding(true);
        ain1.copyFrom(in1);

        resultArray7_uint2 result = reduce_my_array_uint2(ain1, null);
        result.mTempIns = new Allocation[]{ain1};
        return result;
    }

    // ain1 = "uint2 val"
    public resultArray7_uint2 reduce_my_array_uint2(Allocation ain1) {
        return reduce_my_array_uint2(ain1, null);
    }

    // ain1 = "uint2 val"
    public resultArray7_uint2 reduce_my_array_uint2(Allocation ain1, Script.LaunchOptions sc) {
        // check ain1
        if (!ain1.getType().getElement().isCompatible(__U32_2)) {
            throw new RSRuntimeException("Type mismatch with U32_2!");
        }
        Allocation aout = Allocation.createSized(mRSLocal, __U32_2, 7);
        aout.setAutoPadding(true);
        reduce(mExportReduceIdx_my_array_uint2, new Allocation[]{ain1}, aout, sc);
        return new resultArray7_uint2(aout);
    }

    private final static int mExportReduceIdx_my_array_uint4 = 59;
    // in1 = "val", flattened 4-vectors
    public resultArray7_uint4 reduce_my_array_uint4(int[] in1) {
        // Verify that "in1" is non-null.
        if (in1 == null) {
            throw new RSIllegalArgumentException("Array \"in1\" is null!");
        }
        // Verify that the array length is a multiple of the vector size.
        if (in1.length % 4 != 0) {
            throw new RSIllegalArgumentException("Array \"in1\" is not a multiple of 4 in length!");
        }
        Allocation ain1 = Allocation.createSized(mRSLocal, __U32_4, in1.length / 4);
        ain1.setAutoPadding(true);
        ain1.copyFrom(in1);

        resultArray7_uint4 result = reduce_my_array_uint4(ain1, null);
        result.mTempIns = new Allocation[]{ain1};
        return result;
    }

    // ain1 = "uint4 val"
    public resultArray7_uint4 reduce_my_array_uint4(Allocation ain1) {
        return reduce_my_array_uint4(ain1, null);
    }

    // ain1 = "uint4 val"
    public resultArray7_uint4 reduce_my_array_uint4(Allocation ain1, Script.LaunchOptions sc) {
        // check ain1
        if (!ain1.getType().getElement().isCompatible(__U32_4)) {
            throw new RSRuntimeException("Type mismatch with U32_4!");
        }
        Allocation aout = Allocation.createSized(mRSLocal, __U32_4, 7);
        aout.setAutoPadding(true);
        reduce(mExportReduceIdx_my_array_uint4, new Allocation[]{ain1}, aout, sc);
        return new resultArray7_uint4(aout);
    }

    private final static int mExportReduceIdx_my_ulong = 60;
    // in1 = "val"
    public result_ulong reduce_my_ulong(long[] in1) {
        // Verify that "in1" is non-null.
        if (in1 == null) {
            throw new RSIllegalArgumentException("Array \"in1\" is null!");
        }
        Allocation ain1 = Allocation.createSized(mRSLocal, __U64, in1.length);
        ain1.setAutoPadding(true);
        ain1.copyFrom(in1);

        result_ulong result = reduce_my_ulong(ain1, null);
        result.mTempIns = new Allocation[]{ain1};
        return result;
    }

    // ain1 = "ulong val"
    public result_ulong reduce_my_ulong(Allocation ain1) {
        return reduce_my_ulong(ain1, null);
    }

    // ain1 = "ulong val"
    public result_ulong reduce_my_ulong(Allocation ain1, Script.LaunchOptions sc) {
        // check ain1
        if (!ain1.getType().getElement().isCompatible(__U64)) {
            throw new RSRuntimeException("Type mismatch with U64!");
        }
        Allocation aout = Allocation.createSized(mRSLocal, __U64, 1);
        aout.setAutoPadding(true);
        reduce(mExportReduceIdx_my_ulong, new Allocation[]{ain1}, aout, sc);
        return new result_ulong(aout);
    }

    private final static int mExportReduceIdx_my_ulong2 = 61;
    // in1 = "val", flattened 2-vectors
    public result_ulong2 reduce_my_ulong2(long[] in1) {
        // Verify that "in1" is non-null.
        if (in1 == null) {
            throw new RSIllegalArgumentException("Array \"in1\" is null!");
        }
        // Verify that the array length is a multiple of the vector size.
        if (in1.length % 2 != 0) {
            throw new RSIllegalArgumentException("Array \"in1\" is not a multiple of 2 in length!");
        }
        Allocation ain1 = Allocation.createSized(mRSLocal, __U64_2, in1.length / 2);
        ain1.setAutoPadding(true);
        ain1.copyFrom(in1);

        result_ulong2 result = reduce_my_ulong2(ain1, null);
        result.mTempIns = new Allocation[]{ain1};
        return result;
    }

    // ain1 = "ulong2 val"
    public result_ulong2 reduce_my_ulong2(Allocation ain1) {
        return reduce_my_ulong2(ain1, null);
    }

    // ain1 = "ulong2 val"
    public result_ulong2 reduce_my_ulong2(Allocation ain1, Script.LaunchOptions sc) {
        // check ain1
        if (!ain1.getType().getElement().isCompatible(__U64_2)) {
            throw new RSRuntimeException("Type mismatch with U64_2!");
        }
        Allocation aout = Allocation.createSized(mRSLocal, __U64_2, 1);
        aout.setAutoPadding(true);
        reduce(mExportReduceIdx_my_ulong2, new Allocation[]{ain1}, aout, sc);
        return new result_ulong2(aout);
    }

    private final static int mExportReduceIdx_my_ulong4 = 62;
    // in1 = "val", flattened 4-vectors
    public result_ulong4 reduce_my_ulong4(long[] in1) {
        // Verify that "in1" is non-null.
        if (in1 == null) {
            throw new RSIllegalArgumentException("Array \"in1\" is null!");
        }
        // Verify that the array length is a multiple of the vector size.
        if (in1.length % 4 != 0) {
            throw new RSIllegalArgumentException("Array \"in1\" is not a multiple of 4 in length!");
        }
        Allocation ain1 = Allocation.createSized(mRSLocal, __U64_4, in1.length / 4);
        ain1.setAutoPadding(true);
        ain1.copyFrom(in1);

        result_ulong4 result = reduce_my_ulong4(ain1, null);
        result.mTempIns = new Allocation[]{ain1};
        return result;
    }

    // ain1 = "ulong4 val"
    public result_ulong4 reduce_my_ulong4(Allocation ain1) {
        return reduce_my_ulong4(ain1, null);
    }

    // ain1 = "ulong4 val"
    public result_ulong4 reduce_my_ulong4(Allocation ain1, Script.LaunchOptions sc) {
        // check ain1
        if (!ain1.getType().getElement().isCompatible(__U64_4)) {
            throw new RSRuntimeException("Type mismatch with U64_4!");
        }
        Allocation aout = Allocation.createSized(mRSLocal, __U64_4, 1);
        aout.setAutoPadding(true);
        reduce(mExportReduceIdx_my_ulong4, new Allocation[]{ain1}, aout, sc);
        return new result_ulong4(aout);
    }

    private final static int mExportReduceIdx_my_array_ulong = 63;
    // in1 = "val"
    public resultArray7_ulong reduce_my_array_ulong(long[] in1) {
        // Verify that "in1" is non-null.
        if (in1 == null) {
            throw new RSIllegalArgumentException("Array \"in1\" is null!");
        }
        Allocation ain1 = Allocation.createSized(mRSLocal, __U64, in1.length);
        ain1.setAutoPadding(true);
        ain1.copyFrom(in1);

        resultArray7_ulong result = reduce_my_array_ulong(ain1, null);
        result.mTempIns = new Allocation[]{ain1};
        return result;
    }

    // ain1 = "ulong val"
    public resultArray7_ulong reduce_my_array_ulong(Allocation ain1) {
        return reduce_my_array_ulong(ain1, null);
    }

    // ain1 = "ulong val"
    public resultArray7_ulong reduce_my_array_ulong(Allocation ain1, Script.LaunchOptions sc) {
        // check ain1
        if (!ain1.getType().getElement().isCompatible(__U64)) {
            throw new RSRuntimeException("Type mismatch with U64!");
        }
        Allocation aout = Allocation.createSized(mRSLocal, __U64, 7);
        aout.setAutoPadding(true);
        reduce(mExportReduceIdx_my_array_ulong, new Allocation[]{ain1}, aout, sc);
        return new resultArray7_ulong(aout);
    }

    private final static int mExportReduceIdx_my_array_ulong2 = 64;
    // in1 = "val", flattened 2-vectors
    public resultArray7_ulong2 reduce_my_array_ulong2(long[] in1) {
        // Verify that "in1" is non-null.
        if (in1 == null) {
            throw new RSIllegalArgumentException("Array \"in1\" is null!");
        }
        // Verify that the array length is a multiple of the vector size.
        if (in1.length % 2 != 0) {
            throw new RSIllegalArgumentException("Array \"in1\" is not a multiple of 2 in length!");
        }
        Allocation ain1 = Allocation.createSized(mRSLocal, __U64_2, in1.length / 2);
        ain1.setAutoPadding(true);
        ain1.copyFrom(in1);

        resultArray7_ulong2 result = reduce_my_array_ulong2(ain1, null);
        result.mTempIns = new Allocation[]{ain1};
        return result;
    }

    // ain1 = "ulong2 val"
    public resultArray7_ulong2 reduce_my_array_ulong2(Allocation ain1) {
        return reduce_my_array_ulong2(ain1, null);
    }

    // ain1 = "ulong2 val"
    public resultArray7_ulong2 reduce_my_array_ulong2(Allocation ain1, Script.LaunchOptions sc) {
        // check ain1
        if (!ain1.getType().getElement().isCompatible(__U64_2)) {
            throw new RSRuntimeException("Type mismatch with U64_2!");
        }
        Allocation aout = Allocation.createSized(mRSLocal, __U64_2, 7);
        aout.setAutoPadding(true);
        reduce(mExportReduceIdx_my_array_ulong2, new Allocation[]{ain1}, aout, sc);
        return new resultArray7_ulong2(aout);
    }

    private final static int mExportReduceIdx_my_array_ulong4 = 65;
    // in1 = "val", flattened 4-vectors
    public resultArray7_ulong4 reduce_my_array_ulong4(long[] in1) {
        // Verify that "in1" is non-null.
        if (in1 == null) {
            throw new RSIllegalArgumentException("Array \"in1\" is null!");
        }
        // Verify that the array length is a multiple of the vector size.
        if (in1.length % 4 != 0) {
            throw new RSIllegalArgumentException("Array \"in1\" is not a multiple of 4 in length!");
        }
        Allocation ain1 = Allocation.createSized(mRSLocal, __U64_4, in1.length / 4);
        ain1.setAutoPadding(true);
        ain1.copyFrom(in1);

        resultArray7_ulong4 result = reduce_my_array_ulong4(ain1, null);
        result.mTempIns = new Allocation[]{ain1};
        return result;
    }

    // ain1 = "ulong4 val"
    public resultArray7_ulong4 reduce_my_array_ulong4(Allocation ain1) {
        return reduce_my_array_ulong4(ain1, null);
    }

    // ain1 = "ulong4 val"
    public resultArray7_ulong4 reduce_my_array_ulong4(Allocation ain1, Script.LaunchOptions sc) {
        // check ain1
        if (!ain1.getType().getElement().isCompatible(__U64_4)) {
            throw new RSRuntimeException("Type mismatch with U64_4!");
        }
        Allocation aout = Allocation.createSized(mRSLocal, __U64_4, 7);
        aout.setAutoPadding(true);
        reduce(mExportReduceIdx_my_array_ulong4, new Allocation[]{ain1}, aout, sc);
        return new resultArray7_ulong4(aout);
    }

    private final static int mExportReduceIdx_my_bool = 66;
    // in1 = "val"
    public result_bool reduce_my_bool(byte[] in1) {
        // Verify that "in1" is non-null.
        if (in1 == null) {
            throw new RSIllegalArgumentException("Array \"in1\" is null!");
        }
        Allocation ain1 = Allocation.createSized(mRSLocal, __BOOLEAN, in1.length);
        ain1.setAutoPadding(true);
        ain1.copyFrom(in1);

        result_bool result = reduce_my_bool(ain1, null);
        result.mTempIns = new Allocation[]{ain1};
        return result;
    }

    // ain1 = "bool val"
    public result_bool reduce_my_bool(Allocation ain1) {
        return reduce_my_bool(ain1, null);
    }

    // ain1 = "bool val"
    public result_bool reduce_my_bool(Allocation ain1, Script.LaunchOptions sc) {
        // check ain1
        if (!ain1.getType().getElement().isCompatible(__BOOLEAN)) {
            throw new RSRuntimeException("Type mismatch with BOOLEAN!");
        }
        Allocation aout = Allocation.createSized(mRSLocal, __BOOLEAN, 1);
        aout.setAutoPadding(true);
        reduce(mExportReduceIdx_my_bool, new Allocation[]{ain1}, aout, sc);
        return new result_bool(aout);
    }

    private final static int mExportReduceIdx_my_array_bool = 67;
    // in1 = "val"
    public resultArray7_bool reduce_my_array_bool(byte[] in1) {
        // Verify that "in1" is non-null.
        if (in1 == null) {
            throw new RSIllegalArgumentException("Array \"in1\" is null!");
        }
        Allocation ain1 = Allocation.createSized(mRSLocal, __BOOLEAN, in1.length);
        ain1.setAutoPadding(true);
        ain1.copyFrom(in1);

        resultArray7_bool result = reduce_my_array_bool(ain1, null);
        result.mTempIns = new Allocation[]{ain1};
        return result;
    }

    // ain1 = "bool val"
    public resultArray7_bool reduce_my_array_bool(Allocation ain1) {
        return reduce_my_array_bool(ain1, null);
    }

    // ain1 = "bool val"
    public resultArray7_bool reduce_my_array_bool(Allocation ain1, Script.LaunchOptions sc) {
        // check ain1
        if (!ain1.getType().getElement().isCompatible(__BOOLEAN)) {
            throw new RSRuntimeException("Type mismatch with BOOLEAN!");
        }
        Allocation aout = Allocation.createSized(mRSLocal, __BOOLEAN, 7);
        aout.setAutoPadding(true);
        reduce(mExportReduceIdx_my_array_bool, new Allocation[]{ain1}, aout, sc);
        return new resultArray7_bool(aout);
    }

}

