blob: 343dfbad082f6328c9b8269077444d3a0f37110a [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you 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.
*/
package org.apache.samoa.moa.core;
import java.io.PrintWriter;
import java.io.StringWriter;
import java.util.Random;
/**
* Class implementing some utility methods.
*
* @author Richard Kirkby (rkirkby@cs.waikato.ac.nz)
* @author Bernhard Pfahringer (bernhard@cs.waikato.ac.nz)
* @version $Revision: 7 $
*/
public class MiscUtils {
public static int chooseRandomIndexBasedOnWeights(double[] weights,
Random random) {
double probSum = Utils.sum(weights);
double val = random.nextDouble() * probSum;
int index = 0;
double sum = 0.0;
while ((sum <= val) && (index < weights.length)) {
sum += weights[index++];
}
return index - 1;
}
public static int poisson(double lambda, Random r) {
if (lambda < 100.0) {
double product = 1.0;
double sum = 1.0;
double threshold = r.nextDouble() * Math.exp(lambda);
int i = 1;
int max = Math.max(100, 10 * (int) Math.ceil(lambda));
while ((i < max) && (sum <= threshold)) {
product *= (lambda / i);
sum += product;
i++;
}
return i - 1;
}
double x = lambda + Math.sqrt(lambda) * r.nextGaussian();
if (x < 0.0) {
return 0;
}
return (int) Math.floor(x);
}
public static String getStackTraceString(Exception ex) {
StringWriter stackTraceWriter = new StringWriter();
ex.printStackTrace(new PrintWriter(stackTraceWriter));
return "*** STACK TRACE ***\n" + stackTraceWriter.toString();
}
/**
* Returns index of maximum element in a given array of doubles. First maximum is returned.
*
* @param doubles
* the array of doubles
* @return the index of the maximum element
*/
public static/* @pure@ */int maxIndex(double[] doubles) {
double maximum = 0;
int maxIndex = 0;
for (int i = 0; i < doubles.length; i++) {
if ((i == 0) || (doubles[i] > maximum)) {
maxIndex = i;
maximum = doubles[i];
}
}
return maxIndex;
}
}