/*
 * Copyright 2009-2012 by The Regents of the University of California
 * 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 from
 * 
 *     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.
 */

package edu.uci.ics.hyracks.storage.am.common.datagen;

import java.util.Arrays;

public class ProbabilityHelper {
    public static double[] getUniformProbDist(int numChoices) {
        double[] probDist = new double[numChoices];
        for (int i = 0; i < numChoices; i++) {
            probDist[i] = 1.0 / (double) numChoices;
        }
        return probDist;
    }

    public static double[] getZipfProbDist(int numChoices, int zipfSkew) {
        double[] probDist = new double[numChoices];
        double divisor = 0;
        for (int i = 1; i <= numChoices; i++) {
            divisor += 1.0 / (double) Math.pow((double) i, (double) zipfSkew);
        }
        for (int i = 1; i <= numChoices; i++) {
            probDist[i - 1] = (1.0 / (double) Math.pow((double) i, (double) zipfSkew)) / divisor;
        }
        return probDist;
    }

    public static int[] getCumulIntRanges(double[] probDist) {
        int[] opRanges = new int[probDist.length];
        if (opRanges.length > 1) {
            opRanges[0] = (int) Math.floor(Integer.MAX_VALUE * probDist[0]);
            for (int i = 1; i < opRanges.length - 1; i++) {
                opRanges[i] = opRanges[i - 1] + (int) Math.floor(Integer.MAX_VALUE * probDist[i]);
            }
            opRanges[opRanges.length - 1] = Integer.MAX_VALUE;
        } else {
            opRanges[0] = Integer.MAX_VALUE;
        }
        return opRanges;
    }

    public static int choose(int[] cumulIntRanges, int randomInt) {
        int rndVal = Math.abs(randomInt);
        int ix = Arrays.binarySearch(cumulIntRanges, rndVal);
        if (ix < 0) {
            ix = -ix - 1;
        }
        return ix;
    }

}
