/**
* Copyright (c) 2006-2009, NEPOMUK Consortium
*
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
*
* * Redistributions of source code must retain the above copyright notice,
* this list of conditions and the following disclaimer.
*
* * Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
*
* * Neither the name of the NEPOMUK Consortium nor the names of its
* contributors may be used to endorse or promote products derived from
* this software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
* LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*
**/
package processing.folkrank;
import java.util.Arrays;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;
/** This class holds the data the FolkRank computation is based on. In
* particular, it contains a list of all facts, a mapping of internal ids to
* strings and counts of the item occurences in the facts.
*
* @author rja
*/
public class FolkRankData {
private int[][] facts;
private int[][] counts;
private Date date;
private String[][] keyToValueMapping;
private Map<String, Integer>[] valueToKeyMapping;
/** Constructs a new fact array. The size of numberOfItemsPerDimensions
* defines how many dimensions will be used.
*
* @param noOfFacts - the number of facts.
* @param noOfItemsPerDimension - the number of items for each dimension.
*/
public FolkRankData (int noOfFacts, int[] noOfItemsPerDimension) {
facts = new int[noOfFacts][];
keyToValueMapping = new String[noOfItemsPerDimension.length][];
valueToKeyMapping = new HashMap[noOfItemsPerDimension.length];
counts = new int[noOfItemsPerDimension.length][];
this.date = new Date(); // TODO: it might be useful to set this from outside
for (int dim = 0; dim < counts.length; dim++) {
/*
* initialize counts with zero
*/
counts[dim] = new int[noOfItemsPerDimension[dim]];
Arrays.fill(counts[dim], 0);
/*
* initialize mappings to null
* (mappings are initialized in addMapping(), when needed.
*/
keyToValueMapping[dim] = null;
}
}
/** Adds for this dimension the mapping of key to value to the list of
* mappings.
*
* @param dimension - the dimension the mapping belongs to.
* @param key - the key of the mapping.
* @param value - the value of the mapping.
*/
public void addMapping (int dimension, int key, String value) {
/*
* initialize mapping for this dimension, if not initialized, yet.
*/
if (keyToValueMapping[dimension] == null) {
keyToValueMapping[dimension] = new String[counts[dimension].length];
}
keyToValueMapping[dimension][key] = value;
}
/** Stores the inverse mapping.
* @param dimension
* @param mapping
*/
public void addInverseMapping (final int dimension, final Map<String, Integer> mapping) {
valueToKeyMapping[dimension] = mapping;
}
/** Returns the mapping (integer) for value <code>key</code>.
* @param dimension
* @param key
* @return
*/
public int getInverseMapping (final int dimension, final String key) {
return valueToKeyMapping[dimension].get(key);
}
/** Checks, if there exists an inverse mapping for the given key.
*
* @param dimension
* @param key
* @return
*/
public boolean hasInverseMapping (final int dimension, final String key) {
return valueToKeyMapping[dimension].containsKey(key);
}
/** Returns the collected mappings.
*
* @return - an array of strings which contains in every array of
* its first dimension the mapping for the corresponding dimension.
*/
public String[][] getMapping() {
return keyToValueMapping;
}
/** Sets the fact with the specified id.
*
* @param factId - position in fact array.
* @param fact - value to be written into fact array.
*/
public void setFact (int factId, int[] fact) {
facts[factId] = fact;
/*
* Count occurences of items in this fact. Each item is counted twice,
* since one hyperedge is interpreted as 2*noOfDimensions directed
* edges.
*/
for (int dim = 0; dim < fact.length; dim++) {
counts[dim][fact[dim]] += 2;
}
}
/** Returns the fact array.
*
* @return An array of facts.
*/
public int[][] getFacts() {
return facts;
}
/** Returns the counts for each item in each dimension.
*
* @return An array of counts.
*/
public int[][] getCounts() {
return counts;
}
/** Returns the date of the current dataset.
* @return The date of the dataset.
*/
public Date getDate() {
return date;
}
}