diff options
Diffstat (limited to 'src/de/lmu/ifi/dbs/elki/result/ResultUtil.java')
-rw-r--r-- | src/de/lmu/ifi/dbs/elki/result/ResultUtil.java | 82 |
1 files changed, 63 insertions, 19 deletions
diff --git a/src/de/lmu/ifi/dbs/elki/result/ResultUtil.java b/src/de/lmu/ifi/dbs/elki/result/ResultUtil.java index 96cfe9f4..1666d6fc 100644 --- a/src/de/lmu/ifi/dbs/elki/result/ResultUtil.java +++ b/src/de/lmu/ifi/dbs/elki/result/ResultUtil.java @@ -4,7 +4,7 @@ package de.lmu.ifi.dbs.elki.result; This file is part of ELKI: Environment for Developing KDD-Applications Supported by Index-Structures - Copyright (C) 2011 + Copyright (C) 2012 Ludwig-Maximilians-Universität München Lehr- und Forschungseinheit für Datenbanksysteme ELKI Development Team @@ -33,6 +33,7 @@ import de.lmu.ifi.dbs.elki.algorithm.clustering.ClusteringAlgorithm; import de.lmu.ifi.dbs.elki.algorithm.clustering.trivial.ByLabelHierarchicalClustering; import de.lmu.ifi.dbs.elki.algorithm.clustering.trivial.TrivialAllInOne; import de.lmu.ifi.dbs.elki.data.Clustering; +import de.lmu.ifi.dbs.elki.data.NumberVector; import de.lmu.ifi.dbs.elki.data.model.Model; import de.lmu.ifi.dbs.elki.data.type.NoSupportedDataTypeException; import de.lmu.ifi.dbs.elki.database.Database; @@ -41,7 +42,6 @@ import de.lmu.ifi.dbs.elki.result.outlier.OutlierResult; import de.lmu.ifi.dbs.elki.utilities.ClassGenericsUtil; import de.lmu.ifi.dbs.elki.utilities.iterator.EmptyIterator; import de.lmu.ifi.dbs.elki.utilities.iterator.IterableIterator; -import de.lmu.ifi.dbs.elki.utilities.iterator.IterableUtil; import de.lmu.ifi.dbs.elki.utilities.iterator.MergedIterator; import de.lmu.ifi.dbs.elki.utilities.iterator.OneItemIterator; import de.lmu.ifi.dbs.elki.utilities.iterator.TypeFilterIterator; @@ -191,20 +191,14 @@ public class ResultUtil { @SuppressWarnings("unchecked") public static <C> ArrayList<C> filterResults(Result r, Class<?> restrictionClass) { ArrayList<C> res = new ArrayList<C>(); - try { + if(restrictionClass.isInstance(r)) { res.add((C) restrictionClass.cast(r)); } - catch(ClassCastException e) { - // ignore - } if(r instanceof HierarchicalResult) { for(Result result : ((HierarchicalResult) r).getHierarchy().iterDescendants(r)) { - try { + if(restrictionClass.isInstance(result)) { res.add((C) restrictionClass.cast(result)); } - catch(ClassCastException e) { - // ignore - } } } return res; @@ -215,21 +209,21 @@ public class ResultUtil { final Class<C> rc = (Class<C>) restrictionClass; // Include the current item IterableIterator<C> curIter; - try { + if(rc.isInstance(r)) { curIter = new OneItemIterator<C>(rc.cast(r)); } - catch(ClassCastException e) { + else { curIter = null; } if(r instanceof HierarchicalResult) { ResultHierarchy hier = ((HierarchicalResult) r).getHierarchy(); final Iterable<Result> iterDescendants = hier.iterDescendants(r); - final Iterator<C> others = new TypeFilterIterator<Result, C>(rc, iterDescendants); + final IterableIterator<C> others = new TypeFilterIterator<Result, C>(rc, iterDescendants); if(curIter != null) { - return IterableUtil.fromIterator(new MergedIterator<C>(curIter, others)); + return new MergedIterator<C>(curIter, others); } else { - return IterableUtil.fromIterator(others); + return others; } } else { @@ -268,13 +262,48 @@ public class ResultUtil { * Ensure that there also is a selection container object. * * @param db Database - * @param result Result + * @return selection result */ - public static void ensureSelectionResult(final Database db, final Result result) { - Collection<SelectionResult> selections = ResultUtil.filterResults(result, SelectionResult.class); + public static SelectionResult ensureSelectionResult(final Database db) { + Iterator<SelectionResult> selections = ResultUtil.filteredResults(db, SelectionResult.class); + if(selections.hasNext()) { + return selections.next(); + } + SelectionResult sel = new SelectionResult(); + addChildResult(db, sel); + return sel; + } + + /** + * Get the sampling result attached to a relation + * + * @param rel Relation + * @return Sampling result. + */ + public static SamplingResult getSamplingResult(final Relation<?> rel) { + Collection<SamplingResult> selections = ResultUtil.filterResults(rel, SamplingResult.class); if(selections.size() == 0) { - addChildResult(db, new SelectionResult()); + final SamplingResult newsam = new SamplingResult(rel); + addChildResult(rel, newsam); + return newsam; + } + return selections.iterator().next(); + } + + /** + * Get (or create) a scales result for a relation. + * + * @param rel Relation + * @return associated scales result + */ + public static ScalesResult getScalesResult(final Relation<? extends NumberVector<?, ?>> rel) { + Collection<ScalesResult> scas = ResultUtil.filterResults(rel, ScalesResult.class); + if(scas.size() == 0) { + final ScalesResult newsca = new ScalesResult(rel); + addChildResult(rel, newsca); + return newsca; } + return scas.iterator().next(); } /** @@ -302,4 +331,19 @@ public class ResultUtil { return null; } } + + /** + * Recursively remove a result and its children. + * + * @param hierarchy Result hierarchy + * @param child Result to remove + */ + public static void removeRecursive(ResultHierarchy hierarchy, Result child) { + for(Result parent : hierarchy.getParents(child)) { + hierarchy.remove(parent, child); + } + for(Result sub : hierarchy.getChildren(child)) { + removeRecursive(hierarchy, sub); + } + } }
\ No newline at end of file |