/** * 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 org.eclipse.recommenders.internal.jayes.util; import java.util.HashMap; import java.util.Map; import org.eclipse.recommenders.jayes.factor.AbstractFactor; import org.eclipse.recommenders.jayes.util.MathUtils; public final class AddressCalc { private AddressCalc() { } public static void incrementMultiDimensionalCounter(final int[] counter, final int[] dimensions) { int dimension = counter.length - 1; counter[dimension]++; while (counter[dimension] == dimensions[dimension]) { // overflow, assume the counter was valid before and less than the // maximal counter counter[dimension] = 0; dimension--; counter[dimension]++; } } /** * computes a linear map that can be used to transform the factors' addresses to the corresponding index of the flat * value array of another factor consisting of the dimensions with the given dimensionIDs. dimensionIDs is expected * to be a superset of the dimension ids of the first factor */ public static int[] computeLinearMap(AbstractFactor factor, int... dimensionIDs) { return computeLinearMap(computeIdToDimensionIndexMap(factor), factor.getDimensions(), dimensionIDs); } private static int[] computeLinearMap(Map<Integer, Integer> foreignIdToIndex, int[] foreignDimensions, int[] dimensionIds) { int[] kernel = new int[dimensionIds.length]; for (int i = 0; i < kernel.length; i++) { int dimensionId = dimensionIds[i]; if (foreignIdToIndex.containsKey(dimensionId)) { kernel[i] = MathUtils.productOfRange(foreignDimensions, foreignIdToIndex.get(dimensionId) + 1, foreignDimensions.length); } } return kernel; } private static Map<Integer, Integer> computeIdToDimensionIndexMap(AbstractFactor factor) { Map<Integer, Integer> foreignIds = new HashMap<Integer, Integer>(); for (int i = 0; i < factor.getDimensionIDs().length; i++) { foreignIds.put(factor.getDimensionIDs()[i], i); } return foreignIds; } }