/***************************************************************************** * Limpet - the Lightweight InforMation ProcEssing Toolkit * http://limpet.info * * (C) 2015-2016, Deep Blue C Technologies Ltd * * This library is free software; you can redistribute it and/or * modify it under the terms of the Eclipse Public License v1.0 * (http://www.eclipse.org/legal/epl-v10.html) * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. *****************************************************************************/ package info.limpet.analysis; import info.limpet.ICollection; import info.limpet.IObjectCollection; import info.limpet.IStoreItem; import info.limpet.data.operations.CollectionComplianceTests; import java.util.ArrayList; import java.util.Iterator; import java.util.List; import org.apache.commons.math3.stat.Frequency; public abstract class ObjectFrequencyBins extends CoreAnalysis { private static final int MAX_SIZE = 2000; private final CollectionComplianceTests aTests = new CollectionComplianceTests(); public ObjectFrequencyBins() { super("Quantity Frequency Bins"); } public static class BinnedData extends ArrayList<Bin> { /** * */ private static final long serialVersionUID = 1L; public BinnedData() { } } public static class Bin { private final Object indexVal; private final long freqVal; public Bin(Object index, long freq) { indexVal = index; freqVal = freq; } public long getFreqVal() { return freqVal; } public Object getIndexVal() { return indexVal; } } public static BinnedData doBins(IObjectCollection<?> collection) { // build up the histogram Frequency freq = new Frequency(); Iterator<?> iter2 = collection.getValues().iterator(); while (iter2.hasNext()) { Object object = (Object) iter2.next(); freq.addValue(object.toString()); } BinnedData res = new BinnedData(); Iterator<Comparable<?>> vIter = freq.valuesIterator(); while (vIter.hasNext()) { Comparable<?> value = vIter.next(); res.add(new Bin(value, freq.getCount(value))); } return res; } @Override public void analyse(List<IStoreItem> selection) { List<String> titles = new ArrayList<String>(); List<String> values = new ArrayList<String>(); // check compatibility if (appliesTo(selection) && selection.size() == 1) { // ok, let's go for it. for (Iterator<IStoreItem> iter = selection.iterator(); iter.hasNext();) { ICollection thisC = (ICollection) iter.next(); if (thisC.getValuesCount() <= MAX_SIZE) { IObjectCollection<?> o = (IObjectCollection<?>) thisC; BinnedData res = doBins(o); titles.add("Unique values"); values.add(res.size() + ""); StringBuffer freqBins = new StringBuffer(); Iterator<Bin> bIter = res.iterator(); while (bIter.hasNext()) { ObjectFrequencyBins.Bin bin = (ObjectFrequencyBins.Bin) bIter.next(); freqBins.append(bin.getIndexVal()); freqBins.append(':'); freqBins.append(bin.getFreqVal()); freqBins.append(", "); } titles.add("Frequency"); values.add(freqBins.toString()); } } } if (titles.size() > 0) { presentResults(titles, values); } } private boolean appliesTo(List<IStoreItem> selection) { return aTests.allCollections(selection) && aTests.allNonQuantity(selection) && aTests.allNonLocation(selection); } protected abstract void presentResults(List<String> titles, List<String> values); }