summaryrefslogtreecommitdiff
path: root/src/de/lmu/ifi/dbs/elki/result/ResultUtil.java
diff options
context:
space:
mode:
Diffstat (limited to 'src/de/lmu/ifi/dbs/elki/result/ResultUtil.java')
-rw-r--r--src/de/lmu/ifi/dbs/elki/result/ResultUtil.java82
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