All Downloads are FREE. Search and download functionalities are using the official Maven repository.

cc.kave.repackaged.jayes.util.MathUtils Maven / Gradle / Ivy

/**
 * Copyright (c) 2011 Michael Kutschke.
 * All rights reserved. This program and the accompanying materials
 * are made available under the terms of the Eclipse Public License v1.0
 * which accompanies this distribution, and is available at
 * http://www.eclipse.org/legal/epl-v10.html
 *
 * Contributors:
 *    Michael Kutschke - initial API and implementation.
 */
package cc.kave.repackaged.jayes.util;

import cc.kave.repackaged.jayes.factor.arraywrapper.IArrayWrapper;

public class MathUtils {

    public static void exp(double[] vector) {
        for (int i = 0; i < vector.length; i++) {
            vector[i] = Math.exp(vector[i]);
        }
    }
	
	public static void exp(IArrayWrapper array){
		for(int i = 0; i < array.length(); i++){
			array.set(i, Math.exp(array.getDouble(i)));
		}
	}

    public static void log(double[] vector) {
        for (int i = 0; i < vector.length; i++) {
            vector[i] = Math.log(vector[i]);
        }
    }
	
    public static void log(IArrayWrapper vector) {
        for (int i = 0; i < vector.length(); i++) {
            vector.set(i, Math.log(vector.getDouble(i)));
        }
    }

    public static double[] normalize(double[] vector) {
        double normFactor = MathUtils.sum(vector);
        if (normFactor == 0) {
            throw new IllegalArgumentException("Cannot normalize a zero-Vector!");
        }
        for (int i = 0; i < vector.length; i++) {
            vector[i] /= normFactor;
        }
        return vector;
    }

    public static double sum(double[] vector) {
        double result = 0;
        for (double d : vector) {
            result += d;
        }
        return result;
    }

    /**
     * computes c := a / b , but avoids division by zero. In the context of the
     * JTA, this is valid because it holds that b == 0 -> a == 0
     * 
     * @param a array of numerators
     * @param b array of denominators
     * @param c array of division results
     */
    public static void secureDivide(double[] a, double[] b, double[] c) {
        for (int i = 0; i < a.length; i++) {
            if (b[i] != 0) {
                c[i] = a[i] / b[i];
            }
        }
    }

    public static void secureSubtract(double[] a, double[] b, double[] c) {
        for (int i = 0; i < a.length; i++) {
            if (b[i] != Double.NEGATIVE_INFINITY) {
                c[i] = a[i] - b[i];
            }
        }
    }

    public static double[] normalizeLog(double[] vector) {
        double normFactor = MathUtils.logsumexp(vector);
        if (normFactor == Double.NEGATIVE_INFINITY) {
            throw new IllegalArgumentException("Cannot normalize a zero-Vector!");
        }
        for (int i = 0; i < vector.length; i++) {
            vector[i] -= normFactor;
        }
        return vector;
    }

    private static double logsumexp(double[] vector) {
        double max = absMax(vector);
        double sum = 0;
        for (double d : vector) {
            sum += Math.exp(d - max);
        }
        sum = max + Math.log(sum);
        return sum;
    }

    /**
     * 
     * @return the value that differs most from zero
     */
    private static double absMax(double[] vector) {
        double result = 0;
        for (double d : vector) {
            if (d != Double.NEGATIVE_INFINITY && Math.abs(d) > Math.abs(result)) {
                result = d;
            }
        }
        return result;
    }

    public static int product(int[] vector) {
        return productOfRange(vector,0,vector.length);
    }
    
    /**
     * product of the values in the array, from index start (inclusive) to end (exclusive)
     * @throws ArrayIndexOutOfBoundsException if end >= vector.length
     * 
     * @param vector input values
     * @param start start index (inclusive)
     * @param end end index (exclusive)
     * 
     * @return product of the provided values
     */
    public static int productOfRange(int[] vector, int start, int end){
        int result = 1;
        for(int i = start; i < end; i++){
            result *= vector[i];
        }
        return result;
    }
    
    public static int scalarProduct(int[] v1, int[] v2){
    	if(v1.length != v2.length){
    		throw new IllegalArgumentException("vectors differ in length");
    	}
    	int result = 0;
    	for(int i = 0; i < v1.length; i++){
    		result += v1[i] * v2[i];
    	}
    	return result;
    }

}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy