package org.streaminer.stream.model; import org.streaminer.stream.frequency.FrequencyException; import java.io.Serializable; import java.util.LinkedHashMap; import java.util.Map; import java.util.Set; import org.streaminer.stream.frequency.IRichFrequency; /** * <p> * This class is a wrapper implementation and provides the adaption of different stream counting * algorithms to be used as approximations to distributions of nominal attributes. * </p> * * @author Christian Bockermann <chris@jwall.org> * */ public class StreamDistribution<T extends Serializable> implements Serializable, Distribution<T> { /** The unique class ID */ private static final long serialVersionUID = 2696199411688427094L; private IRichFrequency<T> counter; public StreamDistribution(){ } public StreamDistribution( IRichFrequency<T> countAlgo ){ this.counter = countAlgo; } public void setCounter( IRichFrequency<T> counter ){ this.counter = counter; } /** * @see stream.model.Distribution#getCount() */ @Override public Integer getCount() { return (int) counter.size(); } /** * @see stream.model.Distribution#getCount(java.io.Serializable) */ @Override public Integer getCount(T value) { return (int) counter.estimateCount(value); } /** * @see stream.model.Distribution#getHistogram() */ @Override public Map<T, Double> getHistogram() { Map<T,Double> hist = new LinkedHashMap<T,Double>(); for( T key : counter.keySet() ) hist.put( key, (double) counter.estimateCount(key) ); return hist; } /** * @see stream.model.Distribution#prob(java.io.Serializable) */ @Override public Double prob(T value) { Double val = (double) counter.estimateCount(value); Long total = counter.size(); return val / total.doubleValue(); } /** * @see stream.model.Distribution#update(java.io.Serializable) */ @Override public void update(T item) { try { counter.add( item ); } catch (FrequencyException ex) { ex.printStackTrace(); } } /** * @see stream.model.Distribution#getElements() */ @Override public Set<T> getElements() { return counter.keySet(); } }