Java/core/src/main/java/com/amazon/randomcutforest/util/ArrayPacking.java [83:111]:
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
        int min = inputArray[0];
        int max = inputArray[0];
        for (int i = 1; i < length; i++) {
            min = min(min, inputArray[i]);
            max = Math.max(max, inputArray[i]);
        }
        long base = (long) max - min + 1;
        if (base == 1) {
            return new int[] { min, max, length };
        } else {
            int packNum = logMax(base);

            int[] output = new int[3 + (int) Math.ceil(1.0 * length / packNum)];
            output[0] = min;
            output[1] = max;
            output[2] = length;
            int len = 0;
            int used = 0;
            while (len < length) {
                long code = 0;
                int reach = min(len + packNum - 1, length - 1);
                for (int i = reach; i >= len; i--) {
                    code = base * code + (inputArray[i] - min);
                }
                output[3 + used++] = (int) code;
                len += packNum;
            }
            checkArgument(used + 3 == output.length, "incorrect state");
            return output;
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -



Java/core/src/main/java/com/amazon/randomcutforest/util/ArrayPacking.java [152:180]:
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
        int min = inputArray[0];
        int max = inputArray[0];
        for (int i = 1; i < length; i++) {
            min = min(min, inputArray[i]);
            max = Math.max(max, inputArray[i]);
        }
        long base = (long) max - min + 1;
        if (base == 1) {
            return new int[] { min, max, length };
        } else {
            int packNum = logMax(base);

            int[] output = new int[3 + (int) Math.ceil(1.0 * length / packNum)];
            output[0] = min;
            output[1] = max;
            output[2] = length;
            int len = 0;
            int used = 0;
            while (len < length) {
                long code = 0;
                int reach = min(len + packNum - 1, length - 1);
                for (int i = reach; i >= len; i--) {
                    code = base * code + (inputArray[i] - min);
                }
                output[3 + used++] = (int) code;
                len += packNum;
            }
            checkArgument(used + 3 == output.length, "incorrect state");
            return output;
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -



