diff options
Diffstat (limited to 'src/de/lmu/ifi/dbs/elki/visualization')
164 files changed, 1009 insertions, 1018 deletions
diff --git a/src/de/lmu/ifi/dbs/elki/visualization/ExportVisualizations.java b/src/de/lmu/ifi/dbs/elki/visualization/ExportVisualizations.java index 9c19d15f..b7a361e0 100644 --- a/src/de/lmu/ifi/dbs/elki/visualization/ExportVisualizations.java +++ b/src/de/lmu/ifi/dbs/elki/visualization/ExportVisualizations.java @@ -4,7 +4,7 @@ package de.lmu.ifi.dbs.elki.visualization; This file is part of ELKI: Environment for Developing KDD-Applications Supported by Index-Structures - Copyright (C) 2013 + Copyright (C) 2014 Ludwig-Maximilians-Universität München Lehr- und Forschungseinheit für Datenbanksysteme ELKI Development Team diff --git a/src/de/lmu/ifi/dbs/elki/visualization/VisualizationTask.java b/src/de/lmu/ifi/dbs/elki/visualization/VisualizationTask.java index cb791905..83d743e1 100644 --- a/src/de/lmu/ifi/dbs/elki/visualization/VisualizationTask.java +++ b/src/de/lmu/ifi/dbs/elki/visualization/VisualizationTask.java @@ -4,7 +4,7 @@ package de.lmu.ifi.dbs.elki.visualization; This file is part of ELKI: Environment for Developing KDD-Applications Supported by Index-Structures - Copyright (C) 2013 + Copyright (C) 2014 Ludwig-Maximilians-Universität München Lehr- und Forschungseinheit für Datenbanksysteme ELKI Development Team diff --git a/src/de/lmu/ifi/dbs/elki/visualization/VisualizerContext.java b/src/de/lmu/ifi/dbs/elki/visualization/VisualizerContext.java index d6d65f79..5c2684f4 100644 --- a/src/de/lmu/ifi/dbs/elki/visualization/VisualizerContext.java +++ b/src/de/lmu/ifi/dbs/elki/visualization/VisualizerContext.java @@ -4,7 +4,7 @@ package de.lmu.ifi.dbs.elki.visualization; This file is part of ELKI: Environment for Developing KDD-Applications Supported by Index-Structures - Copyright (C) 2013 + Copyright (C) 2014 Ludwig-Maximilians-Universität München Lehr- und Forschungseinheit für Datenbanksysteme ELKI Development Team @@ -129,7 +129,7 @@ public class VisualizerContext implements DataStoreListener, Result { // FIXME: this is a really ugly workaround. :-( if (TypeUtil.NUMBER_VECTOR_FIELD.isAssignableFromType(rel.getDataTypeInformation())) { @SuppressWarnings("unchecked") - Relation<? extends NumberVector<?>> vrel = (Relation<? extends NumberVector<?>>) rel; + Relation<? extends NumberVector> vrel = (Relation<? extends NumberVector>) rel; ResultUtil.getScalesResult(vrel); } } diff --git a/src/de/lmu/ifi/dbs/elki/visualization/VisualizerParameterizer.java b/src/de/lmu/ifi/dbs/elki/visualization/VisualizerParameterizer.java index 69976532..ab1db370 100644 --- a/src/de/lmu/ifi/dbs/elki/visualization/VisualizerParameterizer.java +++ b/src/de/lmu/ifi/dbs/elki/visualization/VisualizerParameterizer.java @@ -4,7 +4,7 @@ package de.lmu.ifi.dbs.elki.visualization; This file is part of ELKI: Environment for Developing KDD-Applications Supported by Index-Structures - Copyright (C) 2013 + Copyright (C) 2014 Ludwig-Maximilians-Universität München Lehr- und Forschungseinheit für Datenbanksysteme ELKI Development Team @@ -35,6 +35,7 @@ import de.lmu.ifi.dbs.elki.database.ids.DBIDUtil; import de.lmu.ifi.dbs.elki.database.relation.Relation; import de.lmu.ifi.dbs.elki.datasource.FileBasedDatabaseConnection; import de.lmu.ifi.dbs.elki.logging.Logging; +import de.lmu.ifi.dbs.elki.math.random.RandomFactory; import de.lmu.ifi.dbs.elki.result.HierarchicalResult; import de.lmu.ifi.dbs.elki.result.Result; import de.lmu.ifi.dbs.elki.result.ResultUtil; @@ -42,20 +43,17 @@ import de.lmu.ifi.dbs.elki.result.SamplingResult; import de.lmu.ifi.dbs.elki.result.SettingsResult; import de.lmu.ifi.dbs.elki.utilities.ClassGenericsUtil; import de.lmu.ifi.dbs.elki.utilities.InspectionUtil; -import de.lmu.ifi.dbs.elki.utilities.RandomFactory; import de.lmu.ifi.dbs.elki.utilities.exceptions.AbortException; import de.lmu.ifi.dbs.elki.utilities.optionhandling.AbstractParameterizer; import de.lmu.ifi.dbs.elki.utilities.optionhandling.OptionID; -import de.lmu.ifi.dbs.elki.utilities.optionhandling.Parameterizable; import de.lmu.ifi.dbs.elki.utilities.optionhandling.WrongParameterValueException; import de.lmu.ifi.dbs.elki.utilities.optionhandling.constraints.CommonConstraints; import de.lmu.ifi.dbs.elki.utilities.optionhandling.parameterization.MergedParameterization; import de.lmu.ifi.dbs.elki.utilities.optionhandling.parameterization.Parameterization; +import de.lmu.ifi.dbs.elki.utilities.optionhandling.parameterization.TrackedParameter; import de.lmu.ifi.dbs.elki.utilities.optionhandling.parameters.IntParameter; -import de.lmu.ifi.dbs.elki.utilities.optionhandling.parameters.Parameter; import de.lmu.ifi.dbs.elki.utilities.optionhandling.parameters.PatternParameter; import de.lmu.ifi.dbs.elki.utilities.optionhandling.parameters.StringParameter; -import de.lmu.ifi.dbs.elki.utilities.pairs.Pair; import de.lmu.ifi.dbs.elki.visualization.projector.ProjectorFactory; import de.lmu.ifi.dbs.elki.visualization.style.PropertiesBasedStyleLibrary; import de.lmu.ifi.dbs.elki.visualization.style.StyleLibrary; @@ -72,7 +70,7 @@ import de.lmu.ifi.dbs.elki.workflow.AlgorithmStep; * @apiviz.has VisualizerContext oneway - - «create» * @apiviz.uses VisFactory oneway - n «configure» */ -public class VisualizerParameterizer implements Parameterizable { +public class VisualizerParameterizer { /** * Get a logger for this class. */ @@ -204,7 +202,7 @@ public class VisualizerParameterizer implements Parameterizable { * @return generated title */ public static String getTitle(Database db, Result result) { - List<Pair<Object, Parameter<?>>> settings = new ArrayList<>(); + List<TrackedParameter> settings = new ArrayList<>(); for(SettingsResult sr : ResultUtil.getSettingsResults(result)) { settings.addAll(sr.getSettings()); } @@ -212,15 +210,15 @@ public class VisualizerParameterizer implements Parameterizable { String distance = null; String dataset = null; - for(Pair<Object, Parameter<?>> setting : settings) { - if(setting.second.equals(AlgorithmStep.Parameterizer.ALGORITHM_ID)) { - algorithm = setting.second.getValue().toString(); + for(TrackedParameter setting : settings) { + if(setting.getParameter().equals(AlgorithmStep.Parameterizer.ALGORITHM_ID)) { + algorithm = setting.getParameter().getValue().toString(); } - if(setting.second.equals(DistanceBasedAlgorithm.DISTANCE_FUNCTION_ID)) { - distance = setting.second.getValue().toString(); + if(setting.getParameter().equals(DistanceBasedAlgorithm.DISTANCE_FUNCTION_ID)) { + distance = setting.getParameter().getValue().toString(); } - if(setting.second.equals(FileBasedDatabaseConnection.Parameterizer.INPUT_ID)) { - dataset = setting.second.getValue().toString(); + if(setting.getParameter().equals(FileBasedDatabaseConnection.Parameterizer.INPUT_ID)) { + dataset = setting.getParameter().getValue().toString(); } } StringBuilder buf = new StringBuilder(); diff --git a/src/de/lmu/ifi/dbs/elki/visualization/batikutil/AddCSSClass.java b/src/de/lmu/ifi/dbs/elki/visualization/batikutil/AddCSSClass.java index 1bc64b20..48c6648e 100644 --- a/src/de/lmu/ifi/dbs/elki/visualization/batikutil/AddCSSClass.java +++ b/src/de/lmu/ifi/dbs/elki/visualization/batikutil/AddCSSClass.java @@ -4,7 +4,7 @@ package de.lmu.ifi.dbs.elki.visualization.batikutil; This file is part of ELKI: Environment for Developing KDD-Applications Supported by Index-Structures - Copyright (C) 2013 + Copyright (C) 2014 Ludwig-Maximilians-Universität München Lehr- und Forschungseinheit für Datenbanksysteme ELKI Development Team diff --git a/src/de/lmu/ifi/dbs/elki/visualization/batikutil/AttributeModifier.java b/src/de/lmu/ifi/dbs/elki/visualization/batikutil/AttributeModifier.java index d6a48013..6e1030d2 100644 --- a/src/de/lmu/ifi/dbs/elki/visualization/batikutil/AttributeModifier.java +++ b/src/de/lmu/ifi/dbs/elki/visualization/batikutil/AttributeModifier.java @@ -4,7 +4,7 @@ package de.lmu.ifi.dbs.elki.visualization.batikutil; This file is part of ELKI: Environment for Developing KDD-Applications Supported by Index-Structures - Copyright (C) 2013 + Copyright (C) 2014 Ludwig-Maximilians-Universität München Lehr- und Forschungseinheit für Datenbanksysteme ELKI Development Team diff --git a/src/de/lmu/ifi/dbs/elki/visualization/batikutil/BatikUtil.java b/src/de/lmu/ifi/dbs/elki/visualization/batikutil/BatikUtil.java index 7774cde6..b0c7d14c 100644 --- a/src/de/lmu/ifi/dbs/elki/visualization/batikutil/BatikUtil.java +++ b/src/de/lmu/ifi/dbs/elki/visualization/batikutil/BatikUtil.java @@ -4,7 +4,7 @@ package de.lmu.ifi.dbs.elki.visualization.batikutil; This file is part of ELKI: Environment for Developing KDD-Applications Supported by Index-Structures - Copyright (C) 2013 + Copyright (C) 2014 Ludwig-Maximilians-Universität München Lehr- und Forschungseinheit für Datenbanksysteme ELKI Development Team diff --git a/src/de/lmu/ifi/dbs/elki/visualization/batikutil/CSSHoverClass.java b/src/de/lmu/ifi/dbs/elki/visualization/batikutil/CSSHoverClass.java index 021878b2..fbe79d44 100644 --- a/src/de/lmu/ifi/dbs/elki/visualization/batikutil/CSSHoverClass.java +++ b/src/de/lmu/ifi/dbs/elki/visualization/batikutil/CSSHoverClass.java @@ -4,7 +4,7 @@ package de.lmu.ifi.dbs.elki.visualization.batikutil; This file is part of ELKI: Environment for Developing KDD-Applications Supported by Index-Structures - Copyright (C) 2013 + Copyright (C) 2014 Ludwig-Maximilians-Universität München Lehr- und Forschungseinheit für Datenbanksysteme ELKI Development Team diff --git a/src/de/lmu/ifi/dbs/elki/visualization/batikutil/CloneInlineImages.java b/src/de/lmu/ifi/dbs/elki/visualization/batikutil/CloneInlineImages.java index 33cf6d8a..9a7942a7 100644 --- a/src/de/lmu/ifi/dbs/elki/visualization/batikutil/CloneInlineImages.java +++ b/src/de/lmu/ifi/dbs/elki/visualization/batikutil/CloneInlineImages.java @@ -4,7 +4,7 @@ package de.lmu.ifi.dbs.elki.visualization.batikutil; This file is part of ELKI: Environment for Developing KDD-Applications Supported by Index-Structures - Copyright (C) 2013 + Copyright (C) 2014 Ludwig-Maximilians-Universität München Lehr- und Forschungseinheit für Datenbanksysteme ELKI Development Team diff --git a/src/de/lmu/ifi/dbs/elki/visualization/batikutil/DragableArea.java b/src/de/lmu/ifi/dbs/elki/visualization/batikutil/DragableArea.java index 56a7b223..482662a6 100644 --- a/src/de/lmu/ifi/dbs/elki/visualization/batikutil/DragableArea.java +++ b/src/de/lmu/ifi/dbs/elki/visualization/batikutil/DragableArea.java @@ -4,7 +4,7 @@ package de.lmu.ifi.dbs.elki.visualization.batikutil; This file is part of ELKI: Environment for Developing KDD-Applications Supported by Index-Structures - Copyright (C) 2013 + Copyright (C) 2014 Ludwig-Maximilians-Universität München Lehr- und Forschungseinheit für Datenbanksysteme ELKI Development Team diff --git a/src/de/lmu/ifi/dbs/elki/visualization/batikutil/JSVGSynchronizedCanvas.java b/src/de/lmu/ifi/dbs/elki/visualization/batikutil/JSVGSynchronizedCanvas.java index 2e08a2dc..08f8f426 100644 --- a/src/de/lmu/ifi/dbs/elki/visualization/batikutil/JSVGSynchronizedCanvas.java +++ b/src/de/lmu/ifi/dbs/elki/visualization/batikutil/JSVGSynchronizedCanvas.java @@ -4,7 +4,7 @@ package de.lmu.ifi.dbs.elki.visualization.batikutil; This file is part of ELKI: Environment for Developing KDD-Applications Supported by Index-Structures - Copyright (C) 2013 + Copyright (C) 2014 Ludwig-Maximilians-Universität München Lehr- und Forschungseinheit für Datenbanksysteme ELKI Development Team @@ -26,7 +26,6 @@ package de.lmu.ifi.dbs.elki.visualization.batikutil; import org.apache.batik.bridge.UpdateManager; import org.apache.batik.swing.JSVGCanvas; import org.w3c.dom.Document; -import org.w3c.dom.svg.SVGDocument; import de.lmu.ifi.dbs.elki.logging.LoggingUtil; import de.lmu.ifi.dbs.elki.visualization.svg.SVGPlot; @@ -66,16 +65,12 @@ public class JSVGSynchronizedCanvas extends JSVGCanvas { } /** - * Use {@link #setPlot} instead if you need synchronization! + * Get the currently displayed SVG plot. * - * @deprecated Document cannot be synchronized - use {@link #setPlot} and a - * {@link SVGPlot} object! + * @return current SVG plot. May be {@code null}! */ - @Override - @Deprecated - public synchronized void setDocument(Document doc) { - // Note: this will call this.setSVGDocument! - super.setDocument(doc); + public SVGPlot getPlot() { + return this.plot; } /** @@ -86,9 +81,9 @@ public class JSVGSynchronizedCanvas extends JSVGCanvas { */ @Override @Deprecated - public synchronized void setSVGDocument(SVGDocument doc) { - setPlot(null); - super.setSVGDocument(doc); + public synchronized void setDocument(Document doc) { + // Note: this will call this.setSVGDocument! + super.setDocument(doc); } /** @@ -98,18 +93,19 @@ public class JSVGSynchronizedCanvas extends JSVGCanvas { */ public void setPlot(final SVGPlot newplot) { final SVGPlot oldplot = this.plot; - this.plot = newplot; - if(newplot != null) { - newplot.synchronizeWith(this.synchronizer); - super.setSVGDocument(newplot.getDocument()); - super.setDisableInteractions(newplot.getDisableInteractions()); - } - else { + if(newplot == null) { super.setSVGDocument(null); + if(oldplot != null) { + scheduleDetach(oldplot); + } + return; } + newplot.synchronizeWith(this.synchronizer); + super.setSVGDocument(newplot.getDocument()); + super.setDisableInteractions(newplot.getDisableInteractions()); // We only know we're detached when the synchronizer has run again. - if(oldplot != null) { + if(oldplot != null && oldplot != newplot) { scheduleDetach(oldplot); } } @@ -121,44 +117,35 @@ public class JSVGSynchronizedCanvas extends JSVGCanvas { */ private void scheduleDetach(final SVGPlot oldplot) { UpdateManager um = this.getUpdateManager(); - if(um != null) { - synchronized(um) { - if(um.isRunning()) { - //LoggingUtil.warning("Scheduling detach: " + this + " " + oldplot); - um.getUpdateRunnableQueue().preemptLater(new Runnable() { - @Override - public void run() { - detachPlot(oldplot); - } - }); - return; - } + if(um == null) { + return; + } + synchronized(um) { + if(um.isRunning()) { + // LoggingUtil.warning("Scheduling detach: " + this + " " + oldplot); + um.getUpdateRunnableQueue().preemptLater(new Runnable() { + @Override + public void run() { + detachPlot(oldplot); + } + }); + return; } } detachPlot(oldplot); } /** - * Get the currently displayed SVG plot. - * - * @return current SVG plot. May be {@code null}! - */ - public SVGPlot getPlot() { - return this.plot; - } - - /** * Execute the detaching event. * * @param oldplot Plot to detach from. */ protected void detachPlot(SVGPlot oldplot) { - //LoggingUtil.warning("Detaching: " + this + " " + oldplot); - if(oldplot != plot) { - oldplot.unsynchronizeWith(JSVGSynchronizedCanvas.this.synchronizer); - } - else { - LoggingUtil.warning("Detaching from a plot I'm already attached to again?!?"); + // LoggingUtil.warning("Detaching: " + this + " " + oldplot); + if(oldplot == plot) { + LoggingUtil.warning("Detaching from a plot I'm already attached to again?!?", new Throwable()); + return; } + oldplot.unsynchronizeWith(JSVGSynchronizedCanvas.this.synchronizer); } }
\ No newline at end of file diff --git a/src/de/lmu/ifi/dbs/elki/visualization/batikutil/JSVGUpdateSynchronizer.java b/src/de/lmu/ifi/dbs/elki/visualization/batikutil/JSVGUpdateSynchronizer.java index ab064e43..2201e1f8 100644 --- a/src/de/lmu/ifi/dbs/elki/visualization/batikutil/JSVGUpdateSynchronizer.java +++ b/src/de/lmu/ifi/dbs/elki/visualization/batikutil/JSVGUpdateSynchronizer.java @@ -4,7 +4,7 @@ package de.lmu.ifi.dbs.elki.visualization.batikutil; This file is part of ELKI: Environment for Developing KDD-Applications Supported by Index-Structures - Copyright (C) 2013 + Copyright (C) 2014 Ludwig-Maximilians-Universität München Lehr- und Forschungseinheit für Datenbanksysteme ELKI Development Team @@ -24,8 +24,8 @@ package de.lmu.ifi.dbs.elki.visualization.batikutil; */ import java.lang.ref.WeakReference; -import java.util.ArrayList; -import java.util.List; +import java.util.Set; +import java.util.concurrent.CopyOnWriteArraySet; import org.apache.batik.bridge.UpdateManager; import org.apache.batik.bridge.UpdateManagerAdapter; @@ -51,7 +51,7 @@ class JSVGUpdateSynchronizer implements UpdateSynchronizer { /** * The UpdateRunner we are put into */ - private List<WeakReference<UpdateRunner>> updaterunner = new ArrayList<>(); + private Set<WeakReference<UpdateRunner>> updaterunner = new CopyOnWriteArraySet<>(); /** * Adapter to track component changes @@ -87,7 +87,7 @@ class JSVGUpdateSynchronizer implements UpdateSynchronizer { */ protected void makeRunnerIfNeeded() { // Nothing to do if not connected to a plot - if(updaterunner.size() == 0) { + if(updaterunner.isEmpty()) { return; } // we don't need to make a SVG runner when there are no pending updates. @@ -130,6 +130,11 @@ class JSVGUpdateSynchronizer implements UpdateSynchronizer { @Override public void addUpdateRunner(UpdateRunner updateRunner) { + for(WeakReference<UpdateRunner> wur : updaterunner) { + if(wur.get() == null) { + updaterunner.remove(wur); + } + } updaterunner.add(new WeakReference<>(updateRunner)); } @@ -173,9 +178,10 @@ class JSVGUpdateSynchronizer implements UpdateSynchronizer { // Wake up all runners for(WeakReference<UpdateRunner> wur : updaterunner) { UpdateRunner ur = wur.get(); - if(ur != null && !ur.isEmpty()) { - ur.runQueue(); + if(ur == null || ur.isEmpty()) { + continue; } + ur.runQueue(); } } diff --git a/src/de/lmu/ifi/dbs/elki/visualization/batikutil/LazyCanvasResizer.java b/src/de/lmu/ifi/dbs/elki/visualization/batikutil/LazyCanvasResizer.java index a046b4d6..b8b9bec0 100644 --- a/src/de/lmu/ifi/dbs/elki/visualization/batikutil/LazyCanvasResizer.java +++ b/src/de/lmu/ifi/dbs/elki/visualization/batikutil/LazyCanvasResizer.java @@ -4,7 +4,7 @@ package de.lmu.ifi.dbs.elki.visualization.batikutil; This file is part of ELKI: Environment for Developing KDD-Applications Supported by Index-Structures - Copyright (C) 2013 + Copyright (C) 2014 Ludwig-Maximilians-Universität München Lehr- und Forschungseinheit für Datenbanksysteme ELKI Development Team diff --git a/src/de/lmu/ifi/dbs/elki/visualization/batikutil/NodeAppendChild.java b/src/de/lmu/ifi/dbs/elki/visualization/batikutil/NodeAppendChild.java index 3b640c8d..b94dd033 100644 --- a/src/de/lmu/ifi/dbs/elki/visualization/batikutil/NodeAppendChild.java +++ b/src/de/lmu/ifi/dbs/elki/visualization/batikutil/NodeAppendChild.java @@ -4,7 +4,7 @@ package de.lmu.ifi.dbs.elki.visualization.batikutil; This file is part of ELKI: Environment for Developing KDD-Applications Supported by Index-Structures - Copyright (C) 2013 + Copyright (C) 2014 Ludwig-Maximilians-Universität München Lehr- und Forschungseinheit für Datenbanksysteme ELKI Development Team diff --git a/src/de/lmu/ifi/dbs/elki/visualization/batikutil/NodeReplaceChild.java b/src/de/lmu/ifi/dbs/elki/visualization/batikutil/NodeReplaceChild.java index 524bf2c7..d6cef4d9 100644 --- a/src/de/lmu/ifi/dbs/elki/visualization/batikutil/NodeReplaceChild.java +++ b/src/de/lmu/ifi/dbs/elki/visualization/batikutil/NodeReplaceChild.java @@ -4,7 +4,7 @@ package de.lmu.ifi.dbs.elki.visualization.batikutil; This file is part of ELKI: Environment for Developing KDD-Applications Supported by Index-Structures - Copyright (C) 2013 + Copyright (C) 2014 Ludwig-Maximilians-Universität München Lehr- und Forschungseinheit für Datenbanksysteme ELKI Development Team diff --git a/src/de/lmu/ifi/dbs/elki/visualization/batikutil/NodeReplacer.java b/src/de/lmu/ifi/dbs/elki/visualization/batikutil/NodeReplacer.java index 72a42b2f..f529c1c0 100644 --- a/src/de/lmu/ifi/dbs/elki/visualization/batikutil/NodeReplacer.java +++ b/src/de/lmu/ifi/dbs/elki/visualization/batikutil/NodeReplacer.java @@ -4,7 +4,7 @@ package de.lmu.ifi.dbs.elki.visualization.batikutil; This file is part of ELKI: Environment for Developing KDD-Applications Supported by Index-Structures - Copyright (C) 2013 + Copyright (C) 2014 Ludwig-Maximilians-Universität München Lehr- und Forschungseinheit für Datenbanksysteme ELKI Development Team diff --git a/src/de/lmu/ifi/dbs/elki/visualization/batikutil/RemoveCSSClass.java b/src/de/lmu/ifi/dbs/elki/visualization/batikutil/RemoveCSSClass.java index 3f80117f..d972cb08 100644 --- a/src/de/lmu/ifi/dbs/elki/visualization/batikutil/RemoveCSSClass.java +++ b/src/de/lmu/ifi/dbs/elki/visualization/batikutil/RemoveCSSClass.java @@ -4,7 +4,7 @@ package de.lmu.ifi.dbs.elki.visualization.batikutil; This file is part of ELKI: Environment for Developing KDD-Applications Supported by Index-Structures - Copyright (C) 2013 + Copyright (C) 2014 Ludwig-Maximilians-Universität München Lehr- und Forschungseinheit für Datenbanksysteme ELKI Development Team diff --git a/src/de/lmu/ifi/dbs/elki/visualization/batikutil/ThumbnailRegistryEntry.java b/src/de/lmu/ifi/dbs/elki/visualization/batikutil/ThumbnailRegistryEntry.java index 9bab635c..46481206 100644 --- a/src/de/lmu/ifi/dbs/elki/visualization/batikutil/ThumbnailRegistryEntry.java +++ b/src/de/lmu/ifi/dbs/elki/visualization/batikutil/ThumbnailRegistryEntry.java @@ -3,7 +3,7 @@ package de.lmu.ifi.dbs.elki.visualization.batikutil; This file is part of ELKI: Environment for Developing KDD-Applications Supported by Index-Structures - Copyright (C) 2013 + Copyright (C) 2014 Ludwig-Maximilians-Universität München Lehr- und Forschungseinheit für Datenbanksysteme ELKI Development Team diff --git a/src/de/lmu/ifi/dbs/elki/visualization/batikutil/ThumbnailTranscoder.java b/src/de/lmu/ifi/dbs/elki/visualization/batikutil/ThumbnailTranscoder.java index a07b42f2..7470586a 100644 --- a/src/de/lmu/ifi/dbs/elki/visualization/batikutil/ThumbnailTranscoder.java +++ b/src/de/lmu/ifi/dbs/elki/visualization/batikutil/ThumbnailTranscoder.java @@ -4,7 +4,7 @@ package de.lmu.ifi.dbs.elki.visualization.batikutil; This file is part of ELKI: Environment for Developing KDD-Applications Supported by Index-Structures - Copyright (C) 2013 + Copyright (C) 2014 Ludwig-Maximilians-Universität München Lehr- und Forschungseinheit für Datenbanksysteme ELKI Development Team diff --git a/src/de/lmu/ifi/dbs/elki/visualization/colors/ColorLibrary.java b/src/de/lmu/ifi/dbs/elki/visualization/colors/ColorLibrary.java index 10041b1b..50a0bfd9 100644 --- a/src/de/lmu/ifi/dbs/elki/visualization/colors/ColorLibrary.java +++ b/src/de/lmu/ifi/dbs/elki/visualization/colors/ColorLibrary.java @@ -4,7 +4,7 @@ package de.lmu.ifi.dbs.elki.visualization.colors; This file is part of ELKI: Environment for Developing KDD-Applications Supported by Index-Structures - Copyright (C) 2013 + Copyright (C) 2014 Ludwig-Maximilians-Universität München Lehr- und Forschungseinheit für Datenbanksysteme ELKI Development Team diff --git a/src/de/lmu/ifi/dbs/elki/visualization/colors/ListBasedColorLibrary.java b/src/de/lmu/ifi/dbs/elki/visualization/colors/ListBasedColorLibrary.java index e3fadfd0..139531b2 100644 --- a/src/de/lmu/ifi/dbs/elki/visualization/colors/ListBasedColorLibrary.java +++ b/src/de/lmu/ifi/dbs/elki/visualization/colors/ListBasedColorLibrary.java @@ -4,7 +4,7 @@ package de.lmu.ifi.dbs.elki.visualization.colors; This file is part of ELKI: Environment for Developing KDD-Applications Supported by Index-Structures - Copyright (C) 2013 + Copyright (C) 2014 Ludwig-Maximilians-Universität München Lehr- und Forschungseinheit für Datenbanksysteme ELKI Development Team diff --git a/src/de/lmu/ifi/dbs/elki/visualization/css/CSSClass.java b/src/de/lmu/ifi/dbs/elki/visualization/css/CSSClass.java index 3f9bc095..040529e7 100644 --- a/src/de/lmu/ifi/dbs/elki/visualization/css/CSSClass.java +++ b/src/de/lmu/ifi/dbs/elki/visualization/css/CSSClass.java @@ -4,7 +4,7 @@ package de.lmu.ifi.dbs.elki.visualization.css; This file is part of ELKI: Environment for Developing KDD-Applications Supported by Index-Structures - Copyright (C) 2013 + Copyright (C) 2014 Ludwig-Maximilians-Universität München Lehr- und Forschungseinheit für Datenbanksysteme ELKI Development Team diff --git a/src/de/lmu/ifi/dbs/elki/visualization/css/CSSClassManager.java b/src/de/lmu/ifi/dbs/elki/visualization/css/CSSClassManager.java index 4d34d9cd..f363990d 100644 --- a/src/de/lmu/ifi/dbs/elki/visualization/css/CSSClassManager.java +++ b/src/de/lmu/ifi/dbs/elki/visualization/css/CSSClassManager.java @@ -4,7 +4,7 @@ package de.lmu.ifi.dbs.elki.visualization.css; This file is part of ELKI: Environment for Developing KDD-Applications Supported by Index-Structures - Copyright (C) 2013 + Copyright (C) 2014 Ludwig-Maximilians-Universität München Lehr- und Forschungseinheit für Datenbanksysteme ELKI Development Team diff --git a/src/de/lmu/ifi/dbs/elki/visualization/gui/ResultVisualizer.java b/src/de/lmu/ifi/dbs/elki/visualization/gui/ResultVisualizer.java index 92171f47..7cfa5f14 100644 --- a/src/de/lmu/ifi/dbs/elki/visualization/gui/ResultVisualizer.java +++ b/src/de/lmu/ifi/dbs/elki/visualization/gui/ResultVisualizer.java @@ -4,7 +4,7 @@ package de.lmu.ifi.dbs.elki.visualization.gui; This file is part of ELKI: Environment for Developing KDD-Applications Supported by Index-Structures - Copyright (C) 2013 + Copyright (C) 2014 Ludwig-Maximilians-Universität München Lehr- und Forschungseinheit für Datenbanksysteme ELKI Development Team @@ -131,7 +131,6 @@ public class ResultVisualizer implements ResultHandler { ResultWindow window = new ResultWindow(title, top, context, single); window.setVisible(true); window.setExtendedState(window.getExtendedState() | JFrame.MAXIMIZED_BOTH); - window.showOverview(); } catch (Throwable e) { LOG.exception("Error in starting visualizer window.", e); } diff --git a/src/de/lmu/ifi/dbs/elki/visualization/gui/ResultWindow.java b/src/de/lmu/ifi/dbs/elki/visualization/gui/ResultWindow.java index 0cfa5166..191a8658 100644 --- a/src/de/lmu/ifi/dbs/elki/visualization/gui/ResultWindow.java +++ b/src/de/lmu/ifi/dbs/elki/visualization/gui/ResultWindow.java @@ -4,7 +4,7 @@ package de.lmu.ifi.dbs.elki.visualization.gui; This file is part of ELKI: Environment for Developing KDD-Applications Supported by Index-Structures - Copyright (C) 2013 + Copyright (C) 2014 Ludwig-Maximilians-Universität München Lehr- und Forschungseinheit für Datenbanksysteme ELKI Development Team @@ -176,7 +176,7 @@ public class ResultWindow extends JFrame implements ResultListener { JMenuBar menubar = new JMenuBar(); JMenu filemenu = new JMenu("File"); filemenu.setMnemonic(KeyEvent.VK_F); - + // setup buttons if(!single) { overviewItem = new JMenuItem("Overview"); @@ -201,7 +201,7 @@ public class ResultWindow extends JFrame implements ResultListener { } }); filemenu.add(exportItem); - + editItem = new JMenuItem("Table View/Edit"); editItem.setMnemonic(KeyEvent.VK_T); editItem.addActionListener(new ActionListener() { @@ -244,6 +244,11 @@ public class ResultWindow extends JFrame implements ResultListener { if(e instanceof DetailViewSelectedEvent) { showSubplot((DetailViewSelectedEvent) e); } + if(OverviewPlot.OVERVIEW_REFRESHED.equals(e.getActionCommand())) { + if (currentSubplot == null) { + svgCanvas.setPlot(overview.getPlot()); + } + } } }); @@ -257,34 +262,27 @@ public class ResultWindow extends JFrame implements ResultListener { this.setExtendedState(JFrame.MAXIMIZED_BOTH); // resize listener - LazyCanvasResizer listener = new LazyCanvasResizer(this) { + LazyCanvasResizer listener = new LazyCanvasResizer(this, 0.1) { @Override public void executeResize(double newratio) { - setRatio(newratio); + ResultWindow.this.handleResize(newratio); } }; - setRatio(listener.getActiveRatio()); + this.overview.initialize(listener.getCurrentRatio()); + this.addComponentListener(listener); context.addResultListener(this); - update(); - } - - /** - * Change the plot ratio. Will only be applied to new plots for now. - * - * @param newratio New ratio - */ - protected void setRatio(double newratio) { - ResultWindow.this.overview.setRatio(newratio); + // update(); + updateVisualizerMenus(); } @Override public void dispose() { context.removeResultListener(this); svgCanvas.setPlot(null); - overview.dispose(); + overview.destroy(); if(currentSubplot != null) { currentSubplot.dispose(); currentSubplot = null; @@ -308,7 +306,7 @@ public class ResultWindow extends JFrame implements ResultListener { currentSubplot.destroy(); } currentSubplot = null; - showPlot(overview); + showPlot(overview.getPlot()); } /** @@ -333,8 +331,8 @@ public class ResultWindow extends JFrame implements ResultListener { ((DetailView) svgCanvas.getPlot()).destroy(); } svgCanvas.setPlot(plot); - if (overviewItem != null) { - overviewItem.setEnabled(plot != overview); + if(overviewItem != null) { + overviewItem.setEnabled(plot != overview.getPlot()); } exportItem.setEnabled(plot != null); } @@ -425,6 +423,17 @@ public class ResultWindow extends JFrame implements ResultListener { return true; } + /** + * Handle a resize event. + * + * @param newratio New window size ratio. + */ + protected void handleResize(double newratio) { + if(currentSubplot == null) { + ResultWindow.this.overview.setRatio(newratio); + } + } + public JMenuItem makeMenuItemForVisualizer(Result r) { if(VisualizationTask.class.isInstance(r)) { final VisualizationTask v = (VisualizationTask) r; diff --git a/src/de/lmu/ifi/dbs/elki/visualization/gui/SimpleSVGViewer.java b/src/de/lmu/ifi/dbs/elki/visualization/gui/SimpleSVGViewer.java index 8172de4e..2a82b1f4 100644 --- a/src/de/lmu/ifi/dbs/elki/visualization/gui/SimpleSVGViewer.java +++ b/src/de/lmu/ifi/dbs/elki/visualization/gui/SimpleSVGViewer.java @@ -4,7 +4,7 @@ package de.lmu.ifi.dbs.elki.visualization.gui; This file is part of ELKI: Environment for Developing KDD-Applications Supported by Index-Structures - Copyright (C) 2013 + Copyright (C) 2014 Ludwig-Maximilians-Universität München Lehr- und Forschungseinheit für Datenbanksysteme ELKI Development Team diff --git a/src/de/lmu/ifi/dbs/elki/visualization/gui/detail/DetailView.java b/src/de/lmu/ifi/dbs/elki/visualization/gui/detail/DetailView.java index 9bcd64b9..008dae35 100644 --- a/src/de/lmu/ifi/dbs/elki/visualization/gui/detail/DetailView.java +++ b/src/de/lmu/ifi/dbs/elki/visualization/gui/detail/DetailView.java @@ -4,7 +4,7 @@ package de.lmu.ifi.dbs.elki.visualization.gui.detail; This file is part of ELKI: Environment for Developing KDD-Applications Supported by Index-Structures - Copyright (C) 2013 + Copyright (C) 2014 Ludwig-Maximilians-Universität München Lehr- und Forschungseinheit für Datenbanksysteme ELKI Development Team diff --git a/src/de/lmu/ifi/dbs/elki/visualization/gui/overview/DetailViewSelectedEvent.java b/src/de/lmu/ifi/dbs/elki/visualization/gui/overview/DetailViewSelectedEvent.java index 6723c77f..a4f05531 100644 --- a/src/de/lmu/ifi/dbs/elki/visualization/gui/overview/DetailViewSelectedEvent.java +++ b/src/de/lmu/ifi/dbs/elki/visualization/gui/overview/DetailViewSelectedEvent.java @@ -4,7 +4,7 @@ package de.lmu.ifi.dbs.elki.visualization.gui.overview; This file is part of ELKI: Environment for Developing KDD-Applications Supported by Index-Structures - Copyright (C) 2013 + Copyright (C) 2014 Ludwig-Maximilians-Universität München Lehr- und Forschungseinheit für Datenbanksysteme ELKI Development Team diff --git a/src/de/lmu/ifi/dbs/elki/visualization/gui/overview/LayerMap.java b/src/de/lmu/ifi/dbs/elki/visualization/gui/overview/LayerMap.java index 5fb7019e..8e00cc63 100644 --- a/src/de/lmu/ifi/dbs/elki/visualization/gui/overview/LayerMap.java +++ b/src/de/lmu/ifi/dbs/elki/visualization/gui/overview/LayerMap.java @@ -3,7 +3,7 @@ package de.lmu.ifi.dbs.elki.visualization.gui.overview; This file is part of ELKI: Environment for Developing KDD-Applications Supported by Index-Structures - Copyright (C) 2013 + Copyright (C) 2014 Ludwig-Maximilians-Universität München Lehr- und Forschungseinheit für Datenbanksysteme ELKI Development Team diff --git a/src/de/lmu/ifi/dbs/elki/visualization/gui/overview/OverviewPlot.java b/src/de/lmu/ifi/dbs/elki/visualization/gui/overview/OverviewPlot.java index c4825b1e..34471bdd 100644 --- a/src/de/lmu/ifi/dbs/elki/visualization/gui/overview/OverviewPlot.java +++ b/src/de/lmu/ifi/dbs/elki/visualization/gui/overview/OverviewPlot.java @@ -4,7 +4,7 @@ package de.lmu.ifi.dbs.elki.visualization.gui.overview; This file is part of ELKI: Environment for Developing KDD-Applications Supported by Index-Structures - Copyright (C) 2013 + Copyright (C) 2014 Ludwig-Maximilians-Universität München Lehr- und Forschungseinheit für Datenbanksysteme ELKI Development Team @@ -29,6 +29,7 @@ import java.util.ArrayList; import java.util.Collection; import java.util.Iterator; import java.util.Map.Entry; +import java.util.concurrent.atomic.AtomicReference; import org.apache.batik.util.SVGConstants; import org.w3c.dom.Element; @@ -70,20 +71,28 @@ import de.lmu.ifi.dbs.elki.visualization.visualizers.Visualization; * @apiviz.has DetailViewSelectedEvent * @apiviz.uses DetailView */ -// FIXME: there still is a synchronization issue, that causes the initialization -// to be run twice in parallel. -public class OverviewPlot extends SVGPlot implements ResultListener { +public class OverviewPlot implements ResultListener { /** * Our logging class */ private static final Logging LOG = Logging.getLogger(OverviewPlot.class); /** + * Event when the overview plot was refreshed. + */ + public static final String OVERVIEW_REFRESHED = "Overview refreshed"; + + /** * Visualizer context */ private VisualizerContext context; /** + * The SVG plot object. + */ + private SVGPlot plot; + + /** * Map of coordinates to plots. */ protected RectangleArranger<PlotItem> plotmap; @@ -141,7 +150,7 @@ public class OverviewPlot extends SVGPlot implements ResultListener { /** * Pending refresh, for lazy refreshing */ - Runnable pendingRefresh = null; + AtomicReference<Runnable> pendingRefresh = new AtomicReference<>(null); /** * Reinitialize on refresh @@ -160,26 +169,6 @@ public class OverviewPlot extends SVGPlot implements ResultListener { this.context = context; this.single = single; - // Add a background element: - { - CSSClass cls = new CSSClass(this, "background"); - cls.setStatement(SVGConstants.CSS_FILL_PROPERTY, context.getStyleResult().getStyleLibrary().getBackgroundColor(StyleLibrary.PAGE)); - addCSSClassOrLogError(cls); - Element background = this.svgElement(SVGConstants.SVG_RECT_TAG); - background.setAttribute(SVGConstants.SVG_X_ATTRIBUTE, "0"); - background.setAttribute(SVGConstants.SVG_Y_ATTRIBUTE, "0"); - background.setAttribute(SVGConstants.SVG_WIDTH_ATTRIBUTE, "100%"); - background.setAttribute(SVGConstants.SVG_HEIGHT_ATTRIBUTE, "100%"); - SVGUtil.setCSSClass(background, cls.getName()); - getRoot().appendChild(background); - } - - if (single) { - setDisableInteractions(true); - } - SVGEffects.addShadowFilter(this); - SVGEffects.addLightGradient(this); - // register context listener context.addResultListener(this); } @@ -196,47 +185,57 @@ public class OverviewPlot extends SVGPlot implements ResultListener { ArrayList<Projector> projectors = ResultUtil.filterResults(context.getResult(), Projector.class); // Rectangle layout - for (Projector p : projectors) { + for(Projector p : projectors) { Collection<PlotItem> projs = p.arrange(); - for (PlotItem it : projs) { - if (it.w <= 0.0 || it.h <= 0.0) { + for(PlotItem it : projs) { + if(it.w <= 0.0 || it.h <= 0.0) { LOG.warning("Plot item with improper size information: " + it); - } else { - plotmap.put(it.w, it.h, it); + continue; } + plotmap.put(it.w, it.h, it); } } ResultHierarchy hier = context.getHierarchy(); ArrayList<VisualizationTask> tasks = ResultUtil.filterResults(context.getResult(), VisualizationTask.class); - nextTask: for (VisualizationTask task : tasks) { - if (!task.visible) { + nextTask: for(VisualizationTask task : tasks) { + if(!task.visible) { continue; } - for (Hierarchy.Iter<Result> iter = hier.iterParents(task); iter.valid(); iter.advance()) { - if (iter.get() instanceof Projector) { + for(Hierarchy.Iter<Result> iter = hier.iterParents(task); iter.valid(); iter.advance()) { + if(iter.get() instanceof Projector) { continue nextTask; } } - if (task.getWidth() <= 0.0 || task.getHeight() <= 0.0) { + if(task.getWidth() <= 0.0 || task.getHeight() <= 0.0) { LOG.warning("Task with improper size information: " + task); - } else { - PlotItem it = new PlotItem(task.getWidth(), task.getHeight(), null); - it.tasks.add(task); - plotmap.put(it.w, it.h, it); + continue; } + PlotItem it = new PlotItem(task.getWidth(), task.getHeight(), null); + it.tasks.add(task); + plotmap.put(it.w, it.h, it); } return plotmap; } /** + * Initialize the plot. + * + * @param ratio Initial ratio + */ + public void initialize(double ratio) { + this.ratio = ratio; + reinitialize(); + } + + /** * Refresh the overview plot. */ private void reinitialize() { - setupHoverer(); + initializePlot(); plotmap = arrangeVisualizations(ratio, 1.0); double s = plotmap.relativeFill(); - if (s < 0.9) { + if(s < 0.9) { // Retry, sometimes this yields better results plotmap = arrangeVisualizations(plotmap.getWidth() * s, plotmap.getHeight() * s); } @@ -246,7 +245,7 @@ public class OverviewPlot extends SVGPlot implements ResultListener { // TODO: cancel pending thumbnail requests! // Detach existing elements: - for (Pair<Element, Visualization> pair : vistoelem.values()) { + for(Pair<Element, Visualization> pair : vistoelem.values()) { SVGUtil.removeFromParent(pair.first); } // Replace the layer map @@ -254,44 +253,42 @@ public class OverviewPlot extends SVGPlot implements ResultListener { vistoelem = new LayerMap(); // Redo main layers - SVGUtil.removeFromParent(plotlayer); - SVGUtil.removeFromParent(hoverlayer); - plotlayer = this.svgElement(SVGConstants.SVG_G_TAG); - hoverlayer = this.svgElement(SVGConstants.SVG_G_TAG); + plotlayer = plot.svgElement(SVGConstants.SVG_G_TAG); + hoverlayer = plot.svgElement(SVGConstants.SVG_G_TAG); // Redo the layout - for (Entry<PlotItem, double[]> e : plotmap.entrySet()) { + for(Entry<PlotItem, double[]> e : plotmap.entrySet()) { final double basex = e.getValue()[0]; final double basey = e.getValue()[1]; - for (Iterator<PlotItem> iter = e.getKey().itemIterator(); iter.hasNext();) { + for(Iterator<PlotItem> iter = e.getKey().itemIterator(); iter.hasNext();) { PlotItem it = iter.next(); boolean hasDetails = false; // Container element for main plot item - Element g = this.svgElement(SVGConstants.SVG_G_TAG); + Element g = plot.svgElement(SVGConstants.SVG_G_TAG); SVGUtil.setAtt(g, SVGConstants.SVG_TRANSFORM_ATTRIBUTE, "translate(" + (basex + it.x) + " " + (basey + it.y) + ")"); plotlayer.appendChild(g); vistoelem.put(it, null, g, null); // Add the actual tasks: - for (VisualizationTask task : it.tasks) { - if (!visibleInOverview(task)) { + for(VisualizationTask task : it.tasks) { + if(!visibleInOverview(task)) { continue; } hasDetails |= !task.nodetail; Pair<Element, Visualization> pair = oldlayers.remove(it, task); - if (pair == null) { + if(pair == null) { pair = new Pair<>(null, null); - pair.first = svgElement(SVGConstants.SVG_G_TAG); + pair.first = plot.svgElement(SVGConstants.SVG_G_TAG); } - if (pair.second == null) { + if(pair.second == null) { pair.second = embedOrThumbnail(thumbsize, it, task, pair.first); } g.appendChild(pair.first); vistoelem.put(it, task, pair); } // When needed, add a hover effect - if (hasDetails && !single) { - Element hover = this.svgRect(basex + it.x, basey + it.y, it.w, it.h); + if(hasDetails && !single) { + Element hover = plot.svgRect(basex + it.x, basey + it.y, it.w, it.h); SVGUtil.addCSSClass(hover, selcss.getName()); // link hoverer. EventTarget targ = (EventTarget) hover; @@ -304,14 +301,66 @@ public class OverviewPlot extends SVGPlot implements ResultListener { } } } - for (Pair<Element, Visualization> pair : oldlayers.values()) { - if (pair.second != null) { + for(Pair<Element, Visualization> pair : oldlayers.values()) { + if(pair.second != null) { pair.second.destroy(); } } - getRoot().appendChild(plotlayer); - getRoot().appendChild(hoverlayer); - updateStyleElement(); + plot.getRoot().appendChild(plotlayer); + plot.getRoot().appendChild(hoverlayer); + plot.updateStyleElement(); + + // Notify listeners. + for(ActionListener actionListener : actionListeners) { + actionListener.actionPerformed(new ActionEvent(this, ActionEvent.ACTION_PERFORMED, OVERVIEW_REFRESHED)); + } + } + + /** + * Initialize the SVG plot. + */ + private void initializePlot() { + if(plot != null) { + plot.dispose(); + } + plot = new SVGPlot(); + { // Add a background element: + CSSClass cls = new CSSClass(this, "background"); + final String bgcol = context.getStyleResult().getStyleLibrary().getBackgroundColor(StyleLibrary.PAGE); + cls.setStatement(SVGConstants.CSS_FILL_PROPERTY, bgcol); + plot.addCSSClassOrLogError(cls); + Element background = plot.svgElement(SVGConstants.SVG_RECT_TAG); + background.setAttribute(SVGConstants.SVG_X_ATTRIBUTE, "0"); + background.setAttribute(SVGConstants.SVG_Y_ATTRIBUTE, "0"); + background.setAttribute(SVGConstants.SVG_WIDTH_ATTRIBUTE, "100%"); + background.setAttribute(SVGConstants.SVG_HEIGHT_ATTRIBUTE, "100%"); + SVGUtil.setCSSClass(background, cls.getName()); + // Don't export a white background: + if("white".equals(bgcol)) { + background.setAttribute(SVGPlot.NO_EXPORT_ATTRIBUTE, SVGPlot.NO_EXPORT_ATTRIBUTE); + } + plot.getRoot().appendChild(background); + } + { // setup the hover CSS classes. + selcss = new CSSClass(this, "s"); + selcss.setStatement(SVGConstants.CSS_FILL_PROPERTY, SVGConstants.CSS_RED_VALUE); + selcss.setStatement(SVGConstants.CSS_STROKE_PROPERTY, SVGConstants.CSS_NONE_VALUE); + selcss.setStatement(SVGConstants.CSS_FILL_OPACITY_PROPERTY, "0"); + selcss.setStatement(SVGConstants.CSS_CURSOR_PROPERTY, SVGConstants.CSS_POINTER_VALUE); + CSSClass hovcss = new CSSClass(this, "h"); + hovcss.setStatement(SVGConstants.CSS_FILL_OPACITY_PROPERTY, "0.25"); + plot.addCSSClassOrLogError(selcss); + plot.addCSSClassOrLogError(hovcss); + // Hover listener. + hoverer = new CSSHoverClass(hovcss.getName(), null, true); + } + + if(single) { + plot.setDisableInteractions(true); + } + SVGEffects.addShadowFilter(plot); + SVGEffects.addLightGradient(plot); + plot.updateStyleElement(); } /** @@ -323,71 +372,70 @@ public class OverviewPlot extends SVGPlot implements ResultListener { * @param parent Parent element to draw to */ private Visualization embedOrThumbnail(final int thumbsize, PlotItem it, VisualizationTask task, Element parent) { - if (single) { - VisualizationTask thumbtask = task.clone(this, context, it.proj, it.w, it.h); - final Visualization vis = thumbtask.getFactory().makeVisualization(thumbtask); - if (vis.getLayer() == null) { - LoggingUtil.warning("Visualization returned empty layer: " + vis); - } else { - if (task.noexport) { - vis.getLayer().setAttribute(NO_EXPORT_ATTRIBUTE, NO_EXPORT_ATTRIBUTE); - } - parent.appendChild(vis.getLayer()); - } - return vis; - } else { - VisualizationTask thumbtask = task.clone(this, context, it.proj, it.w, it.h); + VisualizationTask thumbtask = task.clone(plot, context, it.proj, it.w, it.h); + final Visualization vis; + if(!single) { thumbtask.thumbnail = true; thumbtask.thumbsize = thumbsize; - final Visualization vis = thumbtask.getFactory().makeVisualizationOrThumbnail(thumbtask); - if (vis.getLayer() == null) { - LoggingUtil.warning("Visualization returned empty layer: " + vis); - } else { - parent.appendChild(vis.getLayer()); - } + vis = thumbtask.getFactory().makeVisualizationOrThumbnail(thumbtask); + } + else { + vis = thumbtask.getFactory().makeVisualization(thumbtask); + } + if(vis.getLayer() == null) { + LoggingUtil.warning("Visualization returned empty layer: " + vis); return vis; } + if(task.noexport) { + vis.getLayer().setAttribute(SVGPlot.NO_EXPORT_ATTRIBUTE, SVGPlot.NO_EXPORT_ATTRIBUTE); + } + parent.appendChild(vis.getLayer()); + return vis; } /** * Do a refresh (when visibilities have changed). */ - synchronized void refresh() { - pendingRefresh = null; - if (reinitOnRefresh) { - LOG.debug("Reinitialize"); + void refresh() { + pendingRefresh.set(null); // Clear + if(reinitOnRefresh) { + LOG.debug("Reinitialize in thread " + Thread.currentThread().getName()); reinitialize(); reinitOnRefresh = false; - } else { + return; + } + synchronized(plot) { LOG.debug("Incremental refresh"); boolean refreshcss = false; final int thumbsize = (int) Math.max(screenwidth / plotmap.getWidth(), screenheight / plotmap.getHeight()); - for (PlotItem pi : plotmap.keySet()) { - for (Iterator<PlotItem> iter = pi.itemIterator(); iter.hasNext();) { + for(PlotItem pi : plotmap.keySet()) { + for(Iterator<PlotItem> iter = pi.itemIterator(); iter.hasNext();) { PlotItem it = iter.next(); - for (Iterator<VisualizationTask> tit = it.tasks.iterator(); tit.hasNext();) { + for(Iterator<VisualizationTask> tit = it.tasks.iterator(); tit.hasNext();) { VisualizationTask task = tit.next(); Pair<Element, Visualization> pair = vistoelem.get(it, task); // New task? - if (pair == null) { - if (visibleInOverview(task)) { + if(pair == null) { + if(visibleInOverview(task)) { pair = new Pair<>(null, null); - pair.first = svgElement(SVGConstants.SVG_G_TAG); + pair.first = plot.svgElement(SVGConstants.SVG_G_TAG); pair.second = embedOrThumbnail(thumbsize, it, task, pair.first); vistoelem.get(it, null).first.appendChild(pair.first); vistoelem.put(it, task, pair); refreshcss = true; } - } else { - if (visibleInOverview(task)) { + } + else { + if(visibleInOverview(task)) { // unhide if hidden. - if (pair.first.hasAttribute(SVGConstants.CSS_VISIBILITY_PROPERTY)) { + if(pair.first.hasAttribute(SVGConstants.CSS_VISIBILITY_PROPERTY)) { pair.first.removeAttribute(SVGConstants.CSS_VISIBILITY_PROPERTY); } - } else { + } + else { // hide if there is anything to hide. - if (pair.first != null && pair.first.hasChildNodes()) { + if(pair.first != null && pair.first.hasChildNodes()) { pair.first.setAttribute(SVGConstants.CSS_VISIBILITY_PROPERTY, SVGConstants.CSS_HIDDEN_VALUE); } } @@ -396,8 +444,8 @@ public class OverviewPlot extends SVGPlot implements ResultListener { } } } - if (refreshcss) { - updateStyleElement(); + if(refreshcss) { + plot.updateStyleElement(); } } } @@ -409,9 +457,10 @@ public class OverviewPlot extends SVGPlot implements ResultListener { * @return visibility */ protected boolean visibleInOverview(VisualizationTask task) { - if (single) { + if(single) { return task.visible && !task.noembed; - } else { + } + else { return task.visible && task.thumbnail; } } @@ -423,28 +472,9 @@ public class OverviewPlot extends SVGPlot implements ResultListener { // Recalculate bounding box. String vb = "0 0 " + plotmap.getWidth() + " " + plotmap.getHeight(); // Reset root bounding box. - SVGUtil.setAtt(getRoot(), SVGConstants.SVG_WIDTH_ATTRIBUTE, "20cm"); - SVGUtil.setAtt(getRoot(), SVGConstants.SVG_HEIGHT_ATTRIBUTE, (20 / plotmap.getWidth() * plotmap.getHeight()) + "cm"); - SVGUtil.setAtt(getRoot(), SVGConstants.SVG_VIEW_BOX_ATTRIBUTE, vb); - } - - /** - * Setup the CSS hover effect. - */ - private void setupHoverer() { - // setup the hover CSS classes. - selcss = new CSSClass(this, "s"); - selcss.setStatement(SVGConstants.CSS_FILL_PROPERTY, SVGConstants.CSS_RED_VALUE); - selcss.setStatement(SVGConstants.CSS_STROKE_PROPERTY, SVGConstants.CSS_NONE_VALUE); - selcss.setStatement(SVGConstants.CSS_FILL_OPACITY_PROPERTY, "0"); - selcss.setStatement(SVGConstants.CSS_CURSOR_PROPERTY, SVGConstants.CSS_POINTER_VALUE); - CSSClass hovcss = new CSSClass(this, "h"); - hovcss.setStatement(SVGConstants.CSS_FILL_OPACITY_PROPERTY, "0.25"); - addCSSClassOrLogError(selcss); - addCSSClassOrLogError(hovcss); - // Hover listener. - hoverer = new CSSHoverClass(hovcss.getName(), null, true); - updateStyleElement(); + SVGUtil.setAtt(plot.getRoot(), SVGConstants.SVG_WIDTH_ATTRIBUTE, "20cm"); + SVGUtil.setAtt(plot.getRoot(), SVGConstants.SVG_HEIGHT_ATTRIBUTE, (20 * plotmap.getHeight() / plotmap.getWidth()) + "cm"); + SVGUtil.setAtt(plot.getRoot(), SVGConstants.SVG_VIEW_BOX_ATTRIBUTE, vb); } /** @@ -473,7 +503,7 @@ public class OverviewPlot extends SVGPlot implements ResultListener { */ protected void triggerSubplotSelectEvent(PlotItem it) { // forward event to all listeners. - for (ActionListener actionListener : actionListeners) { + for(ActionListener actionListener : actionListeners) { actionListener.actionPerformed(new DetailViewSelectedEvent(this, ActionEvent.ACTION_PERFORMED, null, 0, it)); } } @@ -508,12 +538,20 @@ public class OverviewPlot extends SVGPlot implements ResultListener { } /** - * Cancel the overview, i.e. stop the thumbnailer + * Destroy this overview plot. */ - @Override - public void dispose() { + public void destroy() { context.removeResultListener(this); - super.dispose(); + plot.dispose(); + } + + /** + * Get the SVGPlot object. + * + * @return SVG plot + */ + public SVGPlot getPlot() { + return plot; } /** @@ -527,30 +565,37 @@ public class OverviewPlot extends SVGPlot implements ResultListener { * @param ratio the ratio to set */ public void setRatio(double ratio) { - this.ratio = ratio; + if(ratio != this.ratio) { + this.ratio = ratio; + reinitOnRefresh = true; + lazyRefresh(); + } } /** * Trigger a redraw, but avoid excessive redraws. */ public final void lazyRefresh() { + if(plot == null) { + LOG.warning("'lazyRefresh' called before initialized!"); + } LOG.debug("Scheduling refresh."); Runnable pr = new Runnable() { @Override public void run() { - if (OverviewPlot.this.pendingRefresh == this) { + if(OverviewPlot.this.pendingRefresh.compareAndSet(this, null)) { OverviewPlot.this.refresh(); } } }; - pendingRefresh = pr; - scheduleUpdate(pr); + OverviewPlot.this.pendingRefresh.set(pr); + plot.scheduleUpdate(pr); } @Override public void resultAdded(Result child, Result parent) { LOG.debug("result added: " + child); - if (child instanceof VisualizationTask) { + if(child instanceof VisualizationTask) { reinitOnRefresh = true; } lazyRefresh(); @@ -559,17 +604,13 @@ public class OverviewPlot extends SVGPlot implements ResultListener { @Override public void resultChanged(Result current) { LOG.debug("result changed: " + current); - if (current instanceof VisualizationTask) { - boolean relayout = true; - for (Hierarchy.Iter<Result> iter = context.getHierarchy().iterParents(current); iter.valid(); iter.advance()) { - if (iter.get() instanceof Projector) { - relayout = false; + if(current instanceof VisualizationTask) { + for(Hierarchy.Iter<Result> iter = context.getHierarchy().iterParents(current); iter.valid(); iter.advance()) { + if(iter.get() instanceof Projector) { + reinitOnRefresh = true; break; } } - if (relayout) { - reinitOnRefresh = true; - } } lazyRefresh(); } diff --git a/src/de/lmu/ifi/dbs/elki/visualization/gui/overview/PlotItem.java b/src/de/lmu/ifi/dbs/elki/visualization/gui/overview/PlotItem.java index 7919e07e..0c0d41ea 100644 --- a/src/de/lmu/ifi/dbs/elki/visualization/gui/overview/PlotItem.java +++ b/src/de/lmu/ifi/dbs/elki/visualization/gui/overview/PlotItem.java @@ -4,7 +4,7 @@ package de.lmu.ifi.dbs.elki.visualization.gui.overview; This file is part of ELKI: Environment for Developing KDD-Applications Supported by Index-Structures - Copyright (C) 2013 + Copyright (C) 2014 Ludwig-Maximilians-Universität München Lehr- und Forschungseinheit für Datenbanksysteme ELKI Development Team diff --git a/src/de/lmu/ifi/dbs/elki/visualization/gui/overview/RectangleArranger.java b/src/de/lmu/ifi/dbs/elki/visualization/gui/overview/RectangleArranger.java index 441f7ae2..fad6fc07 100644 --- a/src/de/lmu/ifi/dbs/elki/visualization/gui/overview/RectangleArranger.java +++ b/src/de/lmu/ifi/dbs/elki/visualization/gui/overview/RectangleArranger.java @@ -4,7 +4,7 @@ package de.lmu.ifi.dbs.elki.visualization.gui.overview; This file is part of ELKI: Environment for Developing KDD-Applications Supported by Index-Structures - Copyright (C) 2013 + Copyright (C) 2014 Ludwig-Maximilians-Universität München Lehr- und Forschungseinheit für Datenbanksysteme ELKI Development Team diff --git a/src/de/lmu/ifi/dbs/elki/visualization/opticsplot/OPTICSColorAdapter.java b/src/de/lmu/ifi/dbs/elki/visualization/opticsplot/OPTICSColorAdapter.java index 5a16c91c..671ccb01 100644 --- a/src/de/lmu/ifi/dbs/elki/visualization/opticsplot/OPTICSColorAdapter.java +++ b/src/de/lmu/ifi/dbs/elki/visualization/opticsplot/OPTICSColorAdapter.java @@ -4,7 +4,7 @@ package de.lmu.ifi.dbs.elki.visualization.opticsplot; This file is part of ELKI: Environment for Developing KDD-Applications Supported by Index-Structures - Copyright (C) 2013 + Copyright (C) 2014 Ludwig-Maximilians-Universität München Lehr- und Forschungseinheit für Datenbanksysteme ELKI Development Team @@ -23,7 +23,7 @@ package de.lmu.ifi.dbs.elki.visualization.opticsplot; along with this program. If not, see <http://www.gnu.org/licenses/>. */ -import de.lmu.ifi.dbs.elki.result.optics.ClusterOrderEntry; +import de.lmu.ifi.dbs.elki.algorithm.clustering.optics.ClusterOrderEntry; /** * Class to handle coloring of the OPTICS plot. diff --git a/src/de/lmu/ifi/dbs/elki/visualization/opticsplot/OPTICSColorFromStylingPolicy.java b/src/de/lmu/ifi/dbs/elki/visualization/opticsplot/OPTICSColorFromStylingPolicy.java index 1f9bccdc..1f24bd8f 100644 --- a/src/de/lmu/ifi/dbs/elki/visualization/opticsplot/OPTICSColorFromStylingPolicy.java +++ b/src/de/lmu/ifi/dbs/elki/visualization/opticsplot/OPTICSColorFromStylingPolicy.java @@ -4,7 +4,7 @@ package de.lmu.ifi.dbs.elki.visualization.opticsplot; This file is part of ELKI: Environment for Developing KDD-Applications Supported by Index-Structures - Copyright (C) 2013 + Copyright (C) 2014 Ludwig-Maximilians-Universität München Lehr- und Forschungseinheit für Datenbanksysteme ELKI Development Team @@ -23,7 +23,7 @@ package de.lmu.ifi.dbs.elki.visualization.opticsplot; along with this program. If not, see <http://www.gnu.org/licenses/>. */ -import de.lmu.ifi.dbs.elki.result.optics.ClusterOrderEntry; +import de.lmu.ifi.dbs.elki.algorithm.clustering.optics.ClusterOrderEntry; import de.lmu.ifi.dbs.elki.visualization.style.StylingPolicy; /** diff --git a/src/de/lmu/ifi/dbs/elki/visualization/opticsplot/OPTICSColorStatic.java b/src/de/lmu/ifi/dbs/elki/visualization/opticsplot/OPTICSColorStatic.java index b6933e63..ddc3a3cd 100644 --- a/src/de/lmu/ifi/dbs/elki/visualization/opticsplot/OPTICSColorStatic.java +++ b/src/de/lmu/ifi/dbs/elki/visualization/opticsplot/OPTICSColorStatic.java @@ -4,7 +4,7 @@ package de.lmu.ifi.dbs.elki.visualization.opticsplot; This file is part of ELKI: Environment for Developing KDD-Applications Supported by Index-Structures - Copyright (C) 2013 + Copyright (C) 2014 Ludwig-Maximilians-Universität München Lehr- und Forschungseinheit für Datenbanksysteme ELKI Development Team @@ -23,7 +23,7 @@ package de.lmu.ifi.dbs.elki.visualization.opticsplot; along with this program. If not, see <http://www.gnu.org/licenses/>. */ -import de.lmu.ifi.dbs.elki.result.optics.ClusterOrderEntry; +import de.lmu.ifi.dbs.elki.algorithm.clustering.optics.ClusterOrderEntry; /** * Pseudo-coloring for OPTICS plot that just uses a static color. diff --git a/src/de/lmu/ifi/dbs/elki/visualization/opticsplot/OPTICSCorrelationDimensionalityDistance.java b/src/de/lmu/ifi/dbs/elki/visualization/opticsplot/OPTICSCorrelationDimensionalityDistanceAdapter.java index 1261c668..1b12db86 100644 --- a/src/de/lmu/ifi/dbs/elki/visualization/opticsplot/OPTICSCorrelationDimensionalityDistance.java +++ b/src/de/lmu/ifi/dbs/elki/visualization/opticsplot/OPTICSCorrelationDimensionalityDistanceAdapter.java @@ -4,7 +4,7 @@ package de.lmu.ifi.dbs.elki.visualization.opticsplot; This file is part of ELKI: Environment for Developing KDD-Applications Supported by Index-Structures - Copyright (C) 2013 + Copyright (C) 2014 Ludwig-Maximilians-Universität München Lehr- und Forschungseinheit für Datenbanksysteme ELKI Development Team @@ -23,36 +23,31 @@ package de.lmu.ifi.dbs.elki.visualization.opticsplot; along with this program. If not, see <http://www.gnu.org/licenses/>. */ -import de.lmu.ifi.dbs.elki.distance.distancevalue.CorrelationDistance; -import de.lmu.ifi.dbs.elki.result.optics.ClusterOrderEntry; +import de.lmu.ifi.dbs.elki.algorithm.clustering.optics.CorrelationClusterOrderEntry; /** * Adapter that will map a correlation distance to its dimensionality. * * @author Erich Schubert */ -public class OPTICSCorrelationDimensionalityDistance<D extends CorrelationDistance<D>> implements OPTICSDistanceAdapter<D> { +public class OPTICSCorrelationDimensionalityDistanceAdapter implements OPTICSDistanceAdapter<CorrelationClusterOrderEntry<?>> { /** * Default constructor. */ - public OPTICSCorrelationDimensionalityDistance() { + public OPTICSCorrelationDimensionalityDistanceAdapter() { super(); } @Override - public double getDoubleForEntry(ClusterOrderEntry<D> coe) { - final D reachability = coe.getReachability(); - if (reachability == null) { + public double getDoubleForEntry(CorrelationClusterOrderEntry<?> coe) { + if(coe.getCorrelationValue() == Integer.MAX_VALUE) { return Double.POSITIVE_INFINITY; } - if (reachability.isInfiniteDistance() || reachability.isUndefinedDistance()) { - return Double.POSITIVE_INFINITY; - } - return reachability.getCorrelationValue(); + return coe.getCorrelationValue(); } @Override - public boolean isInfinite(ClusterOrderEntry<D> coe) { - return coe.getReachability().isInfiniteDistance(); + public boolean isInfinite(CorrelationClusterOrderEntry<?> coe) { + return coe.getCorrelationValue() == Integer.MAX_VALUE; } }
\ No newline at end of file diff --git a/src/de/lmu/ifi/dbs/elki/visualization/opticsplot/OPTICSCut.java b/src/de/lmu/ifi/dbs/elki/visualization/opticsplot/OPTICSCut.java index 452cf6af..434169d8 100644 --- a/src/de/lmu/ifi/dbs/elki/visualization/opticsplot/OPTICSCut.java +++ b/src/de/lmu/ifi/dbs/elki/visualization/opticsplot/OPTICSCut.java @@ -4,7 +4,7 @@ package de.lmu.ifi.dbs.elki.visualization.opticsplot; This file is part of ELKI: Environment for Developing KDD-Applications Supported by Index-Structures - Copyright (C) 2013 + Copyright (C) 2014 Ludwig-Maximilians-Universität München Lehr- und Forschungseinheit für Datenbanksysteme ELKI Development Team @@ -25,15 +25,14 @@ package de.lmu.ifi.dbs.elki.visualization.opticsplot; import java.util.List; +import de.lmu.ifi.dbs.elki.algorithm.clustering.optics.ClusterOrderEntry; +import de.lmu.ifi.dbs.elki.algorithm.clustering.optics.ClusterOrderResult; import de.lmu.ifi.dbs.elki.data.Cluster; import de.lmu.ifi.dbs.elki.data.Clustering; import de.lmu.ifi.dbs.elki.data.model.ClusterModel; import de.lmu.ifi.dbs.elki.data.model.Model; import de.lmu.ifi.dbs.elki.database.ids.DBIDUtil; import de.lmu.ifi.dbs.elki.database.ids.ModifiableDBIDs; -import de.lmu.ifi.dbs.elki.distance.distancevalue.Distance; -import de.lmu.ifi.dbs.elki.result.optics.ClusterOrderEntry; -import de.lmu.ifi.dbs.elki.result.optics.ClusterOrderResult; /** * Compute a partitioning from an OPTICS plot by doing a horizontal cut. @@ -49,14 +48,14 @@ public class OPTICSCut { /** * Compute an OPTICS cut clustering * - * @param <D> Distance type + * @param <E> Cluster order entry type * @param co Cluster order result * @param adapter Distance adapter * @param epsilon Epsilon value for cut * @return New partitioning clustering */ - public static <D extends Distance<D>> Clustering<Model> makeOPTICSCut(ClusterOrderResult<D> co, OPTICSDistanceAdapter<D> adapter, double epsilon) { - List<ClusterOrderEntry<D>> order = co.getClusterOrder(); + public static <E extends ClusterOrderEntry<?>> Clustering<Model> makeOPTICSCut(ClusterOrderResult<E> co, OPTICSDistanceAdapter<E> adapter, double epsilon) { + List<E> order = co.getClusterOrder(); // Clustering model we are building Clustering<Model> clustering = new Clustering<>("OPTICS Cut Clustering", "optics-cut"); // Collects noise elements diff --git a/src/de/lmu/ifi/dbs/elki/visualization/opticsplot/OPTICSDistanceAdapter.java b/src/de/lmu/ifi/dbs/elki/visualization/opticsplot/OPTICSDistanceAdapter.java index 8a6f13ba..728a490e 100644 --- a/src/de/lmu/ifi/dbs/elki/visualization/opticsplot/OPTICSDistanceAdapter.java +++ b/src/de/lmu/ifi/dbs/elki/visualization/opticsplot/OPTICSDistanceAdapter.java @@ -4,7 +4,7 @@ package de.lmu.ifi.dbs.elki.visualization.opticsplot; This file is part of ELKI: Environment for Developing KDD-Applications Supported by Index-Structures - Copyright (C) 2013 + Copyright (C) 2014 Ludwig-Maximilians-Universität München Lehr- und Forschungseinheit für Datenbanksysteme ELKI Development Team @@ -23,24 +23,24 @@ package de.lmu.ifi.dbs.elki.visualization.opticsplot; along with this program. If not, see <http://www.gnu.org/licenses/>. */ -import de.lmu.ifi.dbs.elki.distance.distancevalue.Distance; -import de.lmu.ifi.dbs.elki.result.optics.ClusterOrderEntry; +import de.lmu.ifi.dbs.elki.algorithm.clustering.optics.ClusterOrderEntry; /** - * Interface to map ClusterOrderEntries to double values to use in the OPTICS plot. + * Interface to map ClusterOrderEntries to double values to use in the OPTICS + * plot. * * @author Erich Schubert - * - * @param <D> Distance type + * + * @param <E> Cluster order entry type. */ -public interface OPTICSDistanceAdapter<D extends Distance<D>> { +public interface OPTICSDistanceAdapter<E extends ClusterOrderEntry<?>> { /** * Get the double value for plotting for a cluster order entry. * * @param coe Cluster Order Entry * @return Double value (height) */ - double getDoubleForEntry(ClusterOrderEntry<D> coe); + double getDoubleForEntry(E coe); /** * Test whether the reachability is infinite. @@ -48,5 +48,5 @@ public interface OPTICSDistanceAdapter<D extends Distance<D>> { * @param coe Cluster order entry * @return true, when infinite */ - boolean isInfinite(ClusterOrderEntry<D> coe); + boolean isInfinite(E coe); } diff --git a/src/de/lmu/ifi/dbs/elki/visualization/opticsplot/OPTICSNumberDistance.java b/src/de/lmu/ifi/dbs/elki/visualization/opticsplot/OPTICSNumberDistanceAdapter.java index ad7112f3..9f91966f 100644 --- a/src/de/lmu/ifi/dbs/elki/visualization/opticsplot/OPTICSNumberDistance.java +++ b/src/de/lmu/ifi/dbs/elki/visualization/opticsplot/OPTICSNumberDistanceAdapter.java @@ -4,7 +4,7 @@ package de.lmu.ifi.dbs.elki.visualization.opticsplot; This file is part of ELKI: Environment for Developing KDD-Applications Supported by Index-Structures - Copyright (C) 2013 + Copyright (C) 2014 Ludwig-Maximilians-Universität München Lehr- und Forschungseinheit für Datenbanksysteme ELKI Development Team @@ -23,32 +23,28 @@ package de.lmu.ifi.dbs.elki.visualization.opticsplot; along with this program. If not, see <http://www.gnu.org/licenses/>. */ -import de.lmu.ifi.dbs.elki.distance.distancevalue.NumberDistance; -import de.lmu.ifi.dbs.elki.result.optics.ClusterOrderEntry; +import de.lmu.ifi.dbs.elki.algorithm.clustering.optics.DoubleDistanceClusterOrderEntry; /** * Adapter that will map a regular number distance to its double value. * * @author Erich Schubert */ -public class OPTICSNumberDistance<D extends NumberDistance<D, ?>> implements OPTICSDistanceAdapter<D> { +public class OPTICSNumberDistanceAdapter implements OPTICSDistanceAdapter<DoubleDistanceClusterOrderEntry> { /** * Default constructor. */ - public OPTICSNumberDistance() { + public OPTICSNumberDistanceAdapter() { super(); } @Override - public double getDoubleForEntry(ClusterOrderEntry<D> coe) { - if (coe.getReachability() == null) { - return Double.POSITIVE_INFINITY; - } - return coe.getReachability().doubleValue(); + public double getDoubleForEntry(DoubleDistanceClusterOrderEntry coe) { + return coe.getReachability(); } @Override - public boolean isInfinite(ClusterOrderEntry<D> coe) { - return coe.getReachability().isInfiniteDistance(); + public boolean isInfinite(DoubleDistanceClusterOrderEntry coe) { + return coe.getReachability() >= Double.POSITIVE_INFINITY; } } diff --git a/src/de/lmu/ifi/dbs/elki/visualization/opticsplot/OPTICSPlot.java b/src/de/lmu/ifi/dbs/elki/visualization/opticsplot/OPTICSPlot.java index 4663ef1a..a7f87fd2 100644 --- a/src/de/lmu/ifi/dbs/elki/visualization/opticsplot/OPTICSPlot.java +++ b/src/de/lmu/ifi/dbs/elki/visualization/opticsplot/OPTICSPlot.java @@ -4,7 +4,7 @@ package de.lmu.ifi.dbs.elki.visualization.opticsplot; This file is part of ELKI: Environment for Developing KDD-Applications Supported by Index-Structures - Copyright (C) 2013 + Copyright (C) 2014 Ludwig-Maximilians-Universität München Lehr- und Forschungseinheit für Datenbanksysteme ELKI Development Team @@ -27,15 +27,14 @@ import java.awt.image.BufferedImage; import java.awt.image.RenderedImage; import java.util.List; -import de.lmu.ifi.dbs.elki.distance.distancevalue.CorrelationDistance; -import de.lmu.ifi.dbs.elki.distance.distancevalue.Distance; -import de.lmu.ifi.dbs.elki.distance.distancevalue.NumberDistance; +import de.lmu.ifi.dbs.elki.algorithm.clustering.optics.ClusterOrderEntry; +import de.lmu.ifi.dbs.elki.algorithm.clustering.optics.ClusterOrderResult; +import de.lmu.ifi.dbs.elki.algorithm.clustering.optics.CorrelationClusterOrderEntry; +import de.lmu.ifi.dbs.elki.algorithm.clustering.optics.DoubleDistanceClusterOrderEntry; import de.lmu.ifi.dbs.elki.logging.Logging; import de.lmu.ifi.dbs.elki.math.DoubleMinMax; import de.lmu.ifi.dbs.elki.math.scales.LinearScale; import de.lmu.ifi.dbs.elki.result.Result; -import de.lmu.ifi.dbs.elki.result.optics.ClusterOrderEntry; -import de.lmu.ifi.dbs.elki.result.optics.ClusterOrderResult; import de.lmu.ifi.dbs.elki.visualization.VisualizerContext; import de.lmu.ifi.dbs.elki.visualization.batikutil.ThumbnailRegistryEntry; import de.lmu.ifi.dbs.elki.visualization.style.StylingPolicy; @@ -50,9 +49,9 @@ import de.lmu.ifi.dbs.elki.visualization.style.StylingPolicy; * @apiviz.composedOf OPTICSDistanceAdapter * @apiviz.has ClusterOrderResult oneway - - renders * - * @param <D> Distance type + * @param <E> Cluster order entry type */ -public class OPTICSPlot<D extends Distance<D>> implements Result { +public class OPTICSPlot<E extends ClusterOrderEntry<?>> implements Result { /** * Logger */ @@ -76,7 +75,7 @@ public class OPTICSPlot<D extends Distance<D>> implements Result { /** * The result to plot */ - final ClusterOrderResult<D> co; + final ClusterOrderResult<E> co; /** * Color adapter to use @@ -86,7 +85,7 @@ public class OPTICSPlot<D extends Distance<D>> implements Result { /** * The mapping from cluster order entry to value */ - final OPTICSDistanceAdapter<D> distanceAdapter; + final OPTICSDistanceAdapter<E> distanceAdapter; /** * The Optics plot. @@ -105,7 +104,7 @@ public class OPTICSPlot<D extends Distance<D>> implements Result { * @param colors Coloring strategy * @param distanceAdapter Distance adapter */ - public OPTICSPlot(ClusterOrderResult<D> co, OPTICSColorAdapter colors, OPTICSDistanceAdapter<D> distanceAdapter) { + public OPTICSPlot(ClusterOrderResult<E> co, OPTICSColorAdapter colors, OPTICSDistanceAdapter<E> distanceAdapter) { super(); this.co = co; this.colors = colors; @@ -118,7 +117,7 @@ public class OPTICSPlot<D extends Distance<D>> implements Result { * @param co Cluster order to plot. * @param colors Coloring strategy */ - public OPTICSPlot(ClusterOrderResult<D> co, OPTICSColorAdapter colors) { + public OPTICSPlot(ClusterOrderResult<E> co, OPTICSColorAdapter colors) { super(); this.co = co; this.colors = colors; @@ -128,18 +127,18 @@ public class OPTICSPlot<D extends Distance<D>> implements Result { /** * Try to find a distance adapter. * - * @param <D> distance type + * @param <E> cluster order entry type * @param co ClusterOrderResult * @return distance adapter */ - @SuppressWarnings({ "unchecked", "rawtypes" }) - private static <D extends Distance<D>> OPTICSDistanceAdapter<D> getAdapterForDistance(ClusterOrderResult<D> co) { - Class<?> dcls = co.getDistanceClass(); - if(dcls != null && NumberDistance.class.isAssignableFrom(dcls)) { - return new OPTICSNumberDistance(); + @SuppressWarnings({ "unchecked" }) + private static <E extends ClusterOrderEntry<?>> OPTICSDistanceAdapter<E> getAdapterForDistance(ClusterOrderResult<E> co) { + Class<?> dcls = co.getEntryType(); + if(dcls != null && DoubleDistanceClusterOrderEntry.class.isAssignableFrom(dcls)) { + return (OPTICSDistanceAdapter<E>) new OPTICSNumberDistanceAdapter(); } - else if(dcls != null && CorrelationDistance.class.isAssignableFrom(dcls)) { - return new OPTICSCorrelationDimensionalityDistance(); + else if(dcls != null && CorrelationClusterOrderEntry.class.isAssignableFrom(dcls)) { + return (OPTICSDistanceAdapter<E>) new OPTICSCorrelationDimensionalityDistanceAdapter(); } else if(dcls == null) { throw new UnsupportedOperationException("No distance in cluster order?!?"); @@ -153,11 +152,11 @@ public class OPTICSPlot<D extends Distance<D>> implements Result { * Test whether this class can produce an OPTICS plot for the given cluster * order. * - * @param <D> Distance type + * @param <E> Cluster order entry type * @param co Cluster order result * @return test result */ - public static <D extends Distance<D>> boolean canPlot(ClusterOrderResult<D> co) { + public static <E extends ClusterOrderEntry<?>> boolean canPlot(ClusterOrderResult<E> co) { try { if(getAdapterForDistance(co) != null) { return true; @@ -173,7 +172,7 @@ public class OPTICSPlot<D extends Distance<D>> implements Result { * Trigger a redraw of the OPTICS plot */ public void replot() { - List<ClusterOrderEntry<D>> order = co.getClusterOrder(); + List<E> order = co.getClusterOrder(); width = order.size(); height = Math.min(200, (int) Math.ceil(width / 5)); @@ -184,7 +183,7 @@ public class OPTICSPlot<D extends Distance<D>> implements Result { BufferedImage img = new BufferedImage(width, height, BufferedImage.TYPE_INT_ARGB); int x = 0; - for(ClusterOrderEntry<D> coe : order) { + for(E coe : order) { double reach = distanceAdapter.getDoubleForEntry(coe); final int y; if(!Double.isInfinite(reach) && !Double.isNaN(reach)) { @@ -214,10 +213,10 @@ public class OPTICSPlot<D extends Distance<D>> implements Result { * @param order Cluster order to process * @return Scale for value range of cluster order */ - protected LinearScale computeScale(List<ClusterOrderEntry<D>> order) { + protected LinearScale computeScale(List<E> order) { DoubleMinMax range = new DoubleMinMax(); // calculate range - for(ClusterOrderEntry<D> coe : order) { + for(E coe : order) { double reach = distanceAdapter.getDoubleForEntry(coe); if(!distanceAdapter.isInfinite(coe) && !Double.isNaN(reach)) { range.put(reach); @@ -290,7 +289,7 @@ public class OPTICSPlot<D extends Distance<D>> implements Result { * * @return the distanceAdapter */ - public OPTICSDistanceAdapter<D> getDistanceAdapter() { + public OPTICSDistanceAdapter<E> getDistanceAdapter() { return distanceAdapter; } @@ -328,13 +327,13 @@ public class OPTICSPlot<D extends Distance<D>> implements Result { * Static method to find an optics plot for a result, or to create a new one * using the given context. * - * @param <D> Distance type + * @param <E> Cluster order entry type * @param co Cluster order * @param context Context (for colors and reference clustering) * * @return New or existing optics plot */ - public static <D extends Distance<D>> OPTICSPlot<D> plotForClusterOrder(ClusterOrderResult<D> co, VisualizerContext context) { + public static <E extends ClusterOrderEntry<?>> OPTICSPlot<E> plotForClusterOrder(ClusterOrderResult<E> co, VisualizerContext context) { // Check for an existing plot // ArrayList<OPTICSPlot<D>> plots = ResultUtil.filterResults(co, // OPTICSPlot.class); @@ -348,7 +347,7 @@ public class OPTICSPlot<D extends Distance<D>> implements Result { final StylingPolicy policy = context.getStyleResult().getStylingPolicy(); final OPTICSColorAdapter opcolor = new OPTICSColorFromStylingPolicy(policy); - OPTICSPlot<D> opticsplot = new OPTICSPlot<>(co, opcolor); + OPTICSPlot<E> opticsplot = new OPTICSPlot<>(co, opcolor); // co.addChildResult(opticsplot); return opticsplot; } @@ -358,7 +357,7 @@ public class OPTICSPlot<D extends Distance<D>> implements Result { * * @return Cluster order */ - public ClusterOrderResult<D> getClusterOrder() { + public ClusterOrderResult<E> getClusterOrder() { return co; } -}
\ No newline at end of file +} diff --git a/src/de/lmu/ifi/dbs/elki/visualization/projections/AbstractFullProjection.java b/src/de/lmu/ifi/dbs/elki/visualization/projections/AbstractFullProjection.java index 5f698192..4a0273ca 100644 --- a/src/de/lmu/ifi/dbs/elki/visualization/projections/AbstractFullProjection.java +++ b/src/de/lmu/ifi/dbs/elki/visualization/projections/AbstractFullProjection.java @@ -8,7 +8,7 @@ import de.lmu.ifi.dbs.elki.math.scales.LinearScale; This file is part of ELKI: Environment for Developing KDD-Applications Supported by Index-Structures - Copyright (C) 2013 + Copyright (C) 2014 Ludwig-Maximilians-Universität München Lehr- und Forschungseinheit für Datenbanksysteme ELKI Development Team @@ -52,7 +52,7 @@ public abstract class AbstractFullProjection extends AbstractProjection implemen * @return vector in scaled space */ @Override - public Vector projectDataToScaledSpace(NumberVector<?> data) { + public Vector projectDataToScaledSpace(NumberVector data) { final int dim = data.getDimensionality(); Vector vec = new Vector(dim); double[] ds = vec.getArrayRef(); @@ -86,7 +86,7 @@ public abstract class AbstractFullProjection extends AbstractProjection implemen * @return relative vector in scaled space */ @Override - public Vector projectRelativeDataToScaledSpace(NumberVector<?> data) { + public Vector projectRelativeDataToScaledSpace(NumberVector data) { final int dim = data.getDimensionality(); Vector vec = new Vector(dim); double[] ds = vec.getArrayRef(); @@ -120,7 +120,7 @@ public abstract class AbstractFullProjection extends AbstractProjection implemen * @return vector in rendering space */ @Override - public Vector projectDataToRenderSpace(NumberVector<?> data) { + public Vector projectDataToRenderSpace(NumberVector data) { return projectScaledToRender(projectDataToScaledSpace(data)); } @@ -142,7 +142,7 @@ public abstract class AbstractFullProjection extends AbstractProjection implemen * @return relative vector in rendering space */ @Override - public Vector projectRelativeDataToRenderSpace(NumberVector<?> data) { + public Vector projectRelativeDataToRenderSpace(NumberVector data) { return projectRelativeScaledToRender(projectRelativeDataToScaledSpace(data)); } @@ -166,7 +166,7 @@ public abstract class AbstractFullProjection extends AbstractProjection implemen * @return vector in data space */ @Override - public <NV extends NumberVector<?>> NV projectScaledToDataSpace(Vector v, NumberVector.Factory<NV, ?> factory) { + public <NV extends NumberVector> NV projectScaledToDataSpace(Vector v, NumberVector.Factory<NV> factory) { final int dim = v.getDimensionality(); Vector vec = v.copy(); double[] ds = vec.getArrayRef(); @@ -185,7 +185,7 @@ public abstract class AbstractFullProjection extends AbstractProjection implemen * @return vector in data space */ @Override - public <NV extends NumberVector<?>> NV projectRenderToDataSpace(Vector v, NumberVector.Factory<NV, ?> prototype) { + public <NV extends NumberVector> NV projectRenderToDataSpace(Vector v, NumberVector.Factory<NV> prototype) { final int dim = v.getDimensionality(); Vector vec = projectRenderToScaled(v); double[] ds = vec.getArrayRef(); @@ -206,7 +206,7 @@ public abstract class AbstractFullProjection extends AbstractProjection implemen * @return relative vector in data space */ @Override - public <NV extends NumberVector<?>> NV projectRelativeScaledToDataSpace(Vector v, NumberVector.Factory<NV, ?> prototype) { + public <NV extends NumberVector> NV projectRelativeScaledToDataSpace(Vector v, NumberVector.Factory<NV> prototype) { final int dim = v.getDimensionality(); Vector vec = v.copy(); double[] ds = vec.getArrayRef(); @@ -225,7 +225,7 @@ public abstract class AbstractFullProjection extends AbstractProjection implemen * @return relative vector in data space */ @Override - public <NV extends NumberVector<?>> NV projectRelativeRenderToDataSpace(Vector v, NumberVector.Factory<NV, ?> prototype) { + public <NV extends NumberVector> NV projectRelativeRenderToDataSpace(Vector v, NumberVector.Factory<NV> prototype) { final int dim = v.getDimensionality(); Vector vec = projectRelativeRenderToScaled(v); double[] ds = vec.getArrayRef(); diff --git a/src/de/lmu/ifi/dbs/elki/visualization/projections/AbstractProjection.java b/src/de/lmu/ifi/dbs/elki/visualization/projections/AbstractProjection.java index a1629d77..21fb6d56 100644 --- a/src/de/lmu/ifi/dbs/elki/visualization/projections/AbstractProjection.java +++ b/src/de/lmu/ifi/dbs/elki/visualization/projections/AbstractProjection.java @@ -4,7 +4,7 @@ package de.lmu.ifi.dbs.elki.visualization.projections; This file is part of ELKI: Environment for Developing KDD-Applications Supported by Index-Structures - Copyright (C) 2013 + Copyright (C) 2014 Ludwig-Maximilians-Universität München Lehr- und Forschungseinheit für Datenbanksysteme ELKI Development Team diff --git a/src/de/lmu/ifi/dbs/elki/visualization/projections/AbstractSimpleProjection.java b/src/de/lmu/ifi/dbs/elki/visualization/projections/AbstractSimpleProjection.java index ea93dbda..d188eb85 100644 --- a/src/de/lmu/ifi/dbs/elki/visualization/projections/AbstractSimpleProjection.java +++ b/src/de/lmu/ifi/dbs/elki/visualization/projections/AbstractSimpleProjection.java @@ -4,7 +4,7 @@ package de.lmu.ifi.dbs.elki.visualization.projections; This file is part of ELKI: Environment for Developing KDD-Applications Supported by Index-Structures - Copyright (C) 2013 + Copyright (C) 2014 Ludwig-Maximilians-Universität München Lehr- und Forschungseinheit für Datenbanksysteme ELKI Development Team diff --git a/src/de/lmu/ifi/dbs/elki/visualization/projections/AffineProjection.java b/src/de/lmu/ifi/dbs/elki/visualization/projections/AffineProjection.java index f29c1d50..3e9bfcbb 100644 --- a/src/de/lmu/ifi/dbs/elki/visualization/projections/AffineProjection.java +++ b/src/de/lmu/ifi/dbs/elki/visualization/projections/AffineProjection.java @@ -4,7 +4,7 @@ package de.lmu.ifi.dbs.elki.visualization.projections; This file is part of ELKI: Environment for Developing KDD-Applications Supported by Index-Structures - Copyright (C) 2013 + Copyright (C) 2014 Ludwig-Maximilians-Universität München Lehr- und Forschungseinheit für Datenbanksysteme ELKI Development Team @@ -173,7 +173,7 @@ public class AffineProjection extends AbstractFullProjection implements Projecti } @Override - public double[] fastProjectDataToRenderSpace(NumberVector<?> data) { + public double[] fastProjectDataToRenderSpace(NumberVector data) { return fastProjectScaledToRenderSpace(fastProjectDataToScaledSpace(data)); } @@ -184,7 +184,7 @@ public class AffineProjection extends AbstractFullProjection implements Projecti } @Override - public double[] fastProjectDataToScaledSpace(NumberVector<?> data) { + public double[] fastProjectDataToScaledSpace(NumberVector data) { // FIXME: implement with less objects? return projectDataToScaledSpace(data).getArrayRef(); } @@ -222,7 +222,7 @@ public class AffineProjection extends AbstractFullProjection implements Projecti } @Override - public double[] fastProjectRelativeDataToRenderSpace(NumberVector<?> data) { + public double[] fastProjectRelativeDataToRenderSpace(NumberVector data) { // FIXME: implement with less objects? return fastProjectRelativeScaledToRenderSpace(projectRelativeDataToScaledSpace(data).getArrayRef()); } diff --git a/src/de/lmu/ifi/dbs/elki/visualization/projections/CanvasSize.java b/src/de/lmu/ifi/dbs/elki/visualization/projections/CanvasSize.java index c53e62dd..21e0cb39 100644 --- a/src/de/lmu/ifi/dbs/elki/visualization/projections/CanvasSize.java +++ b/src/de/lmu/ifi/dbs/elki/visualization/projections/CanvasSize.java @@ -4,7 +4,7 @@ package de.lmu.ifi.dbs.elki.visualization.projections; This file is part of ELKI: Environment for Developing KDD-Applications Supported by Index-Structures - Copyright (C) 2013 + Copyright (C) 2014 Ludwig-Maximilians-Universität München Lehr- und Forschungseinheit für Datenbanksysteme ELKI Development Team diff --git a/src/de/lmu/ifi/dbs/elki/visualization/projections/FullProjection.java b/src/de/lmu/ifi/dbs/elki/visualization/projections/FullProjection.java index e715e859..c5f3e492 100644 --- a/src/de/lmu/ifi/dbs/elki/visualization/projections/FullProjection.java +++ b/src/de/lmu/ifi/dbs/elki/visualization/projections/FullProjection.java @@ -4,7 +4,7 @@ package de.lmu.ifi.dbs.elki.visualization.projections; This file is part of ELKI: Environment for Developing KDD-Applications Supported by Index-Structures - Copyright (C) 2013 + Copyright (C) 2014 Ludwig-Maximilians-Universität München Lehr- und Forschungseinheit für Datenbanksysteme ELKI Development Team @@ -75,7 +75,7 @@ public interface FullProjection extends Projection { * @param data vector in data space * @return vector in scaled space */ - Vector projectDataToScaledSpace(NumberVector<?> data); + Vector projectDataToScaledSpace(NumberVector data); /** * Project a data vector from data space to scaled space. @@ -91,7 +91,7 @@ public interface FullProjection extends Projection { * @param data relative vector in data space * @return relative vector in scaled space */ - Vector projectRelativeDataToScaledSpace(NumberVector<?> data); + Vector projectRelativeDataToScaledSpace(NumberVector data); /** * Project a relative data vector from data space to scaled space. @@ -107,7 +107,7 @@ public interface FullProjection extends Projection { * @param data vector in data space * @return vector in rendering space */ - Vector projectDataToRenderSpace(NumberVector<?> data); + Vector projectDataToRenderSpace(NumberVector data); /** * Project a data vector from data space to rendering space. @@ -125,7 +125,7 @@ public interface FullProjection extends Projection { * @param factory Object factory * @return vector in data space */ - <NV extends NumberVector<?>> NV projectScaledToDataSpace(Vector v, NumberVector.Factory<NV, ?> factory); + <NV extends NumberVector> NV projectScaledToDataSpace(Vector v, NumberVector.Factory<NV> factory); /** * Project a vector from rendering space to data space. @@ -135,7 +135,7 @@ public interface FullProjection extends Projection { * @param prototype Object factory * @return vector in data space */ - <NV extends NumberVector<?>> NV projectRenderToDataSpace(Vector v, NumberVector.Factory<NV, ?> prototype); + <NV extends NumberVector> NV projectRenderToDataSpace(Vector v, NumberVector.Factory<NV> prototype); /** * Project a relative data vector from data space to rendering space. @@ -143,7 +143,7 @@ public interface FullProjection extends Projection { * @param data relative vector in data space * @return relative vector in rendering space */ - Vector projectRelativeDataToRenderSpace(NumberVector<?> data); + Vector projectRelativeDataToRenderSpace(NumberVector data); /** * Project a relative data vector from data space to rendering space. @@ -161,7 +161,7 @@ public interface FullProjection extends Projection { * @param prototype Object factory * @return relative vector in data space */ - <NV extends NumberVector<?>> NV projectRelativeScaledToDataSpace(Vector v, NumberVector.Factory<NV, ?> prototype); + <NV extends NumberVector> NV projectRelativeScaledToDataSpace(Vector v, NumberVector.Factory<NV> prototype); /** * Project a relative vector from rendering space to data space. @@ -171,5 +171,5 @@ public interface FullProjection extends Projection { * @param prototype Object factory * @return relative vector in data space */ - <NV extends NumberVector<?>> NV projectRelativeRenderToDataSpace(Vector v, NumberVector.Factory<NV, ?> prototype); + <NV extends NumberVector> NV projectRelativeRenderToDataSpace(Vector v, NumberVector.Factory<NV> prototype); } diff --git a/src/de/lmu/ifi/dbs/elki/visualization/projections/OPTICSProjection.java b/src/de/lmu/ifi/dbs/elki/visualization/projections/OPTICSProjection.java index 13409ee0..e0032144 100644 --- a/src/de/lmu/ifi/dbs/elki/visualization/projections/OPTICSProjection.java +++ b/src/de/lmu/ifi/dbs/elki/visualization/projections/OPTICSProjection.java @@ -4,7 +4,7 @@ package de.lmu.ifi.dbs.elki.visualization.projections; This file is part of ELKI: Environment for Developing KDD-Applications Supported by Index-Structures - Copyright (C) 2013 + Copyright (C) 2014 Ludwig-Maximilians-Universität München Lehr- und Forschungseinheit für Datenbanksysteme ELKI Development Team @@ -23,10 +23,10 @@ package de.lmu.ifi.dbs.elki.visualization.projections; along with this program. If not, see <http://www.gnu.org/licenses/>. */ -import de.lmu.ifi.dbs.elki.distance.distancevalue.Distance; +import de.lmu.ifi.dbs.elki.algorithm.clustering.optics.ClusterOrderEntry; +import de.lmu.ifi.dbs.elki.algorithm.clustering.optics.ClusterOrderResult; import de.lmu.ifi.dbs.elki.math.scales.LinearScale; import de.lmu.ifi.dbs.elki.result.AbstractHierarchicalResult; -import de.lmu.ifi.dbs.elki.result.optics.ClusterOrderResult; import de.lmu.ifi.dbs.elki.visualization.VisualizerContext; import de.lmu.ifi.dbs.elki.visualization.opticsplot.OPTICSPlot; import de.lmu.ifi.dbs.elki.visualization.projector.OPTICSProjector; @@ -36,19 +36,21 @@ import de.lmu.ifi.dbs.elki.visualization.projector.OPTICSProjector; * consistency in the visualizer API. * * @author Erich Schubert + * + * @param <E> Cluster order entry type */ -public class OPTICSProjection<D extends Distance<D>> extends AbstractHierarchicalResult implements Projection { +public class OPTICSProjection<E extends ClusterOrderEntry<?>> extends AbstractHierarchicalResult implements Projection { /** * The projector we were generated from. */ - OPTICSProjector<D> projector; + OPTICSProjector<E> projector; /** * Constructor. - * + * * @param opticsProjector OPTICS projector */ - public OPTICSProjection(OPTICSProjector<D> opticsProjector) { + public OPTICSProjection(OPTICSProjector<E> opticsProjector) { super(); this.projector = opticsProjector; } @@ -79,7 +81,7 @@ public class OPTICSProjection<D extends Distance<D>> extends AbstractHierarchica * @param context Context to use * @return Plot */ - public OPTICSPlot<D> getOPTICSPlot(VisualizerContext context) { + public OPTICSPlot<E> getOPTICSPlot(VisualizerContext context) { return projector.getOPTICSPlot(context); } @@ -88,7 +90,7 @@ public class OPTICSProjection<D extends Distance<D>> extends AbstractHierarchica * * @return Cluster oder result. */ - public ClusterOrderResult<D> getResult() { + public ClusterOrderResult<E> getResult() { return projector.getResult(); } } diff --git a/src/de/lmu/ifi/dbs/elki/visualization/projections/Projection.java b/src/de/lmu/ifi/dbs/elki/visualization/projections/Projection.java index d141838e..991c5605 100644 --- a/src/de/lmu/ifi/dbs/elki/visualization/projections/Projection.java +++ b/src/de/lmu/ifi/dbs/elki/visualization/projections/Projection.java @@ -4,7 +4,7 @@ package de.lmu.ifi.dbs.elki.visualization.projections; This file is part of ELKI: Environment for Developing KDD-Applications Supported by Index-Structures - Copyright (C) 2013 + Copyright (C) 2014 Ludwig-Maximilians-Universität München Lehr- und Forschungseinheit für Datenbanksysteme ELKI Development Team diff --git a/src/de/lmu/ifi/dbs/elki/visualization/projections/Projection1D.java b/src/de/lmu/ifi/dbs/elki/visualization/projections/Projection1D.java index a5f5e7e9..47487efc 100644 --- a/src/de/lmu/ifi/dbs/elki/visualization/projections/Projection1D.java +++ b/src/de/lmu/ifi/dbs/elki/visualization/projections/Projection1D.java @@ -4,7 +4,7 @@ package de.lmu.ifi.dbs.elki.visualization.projections; This file is part of ELKI: Environment for Developing KDD-Applications Supported by Index-Structures - Copyright (C) 2013 + Copyright (C) 2014 Ludwig-Maximilians-Universität München Lehr- und Forschungseinheit für Datenbanksysteme ELKI Development Team @@ -48,7 +48,7 @@ public interface Projection1D extends Projection { * @param data vector in data space * @return vector in rendering space */ - public double fastProjectDataToRenderSpace(NumberVector<?> data); + public double fastProjectDataToRenderSpace(NumberVector data); /** * Project a vector from scaled space to rendering space. @@ -72,7 +72,7 @@ public interface Projection1D extends Projection { * @param data vector in data space * @return vector in rendering space */ - public double fastProjectRelativeDataToRenderSpace(NumberVector<?> data); + public double fastProjectRelativeDataToRenderSpace(NumberVector data); /** * Project a vector from scaled space to rendering space. diff --git a/src/de/lmu/ifi/dbs/elki/visualization/projections/Projection2D.java b/src/de/lmu/ifi/dbs/elki/visualization/projections/Projection2D.java index 1a8b1952..d9c9ff0e 100644 --- a/src/de/lmu/ifi/dbs/elki/visualization/projections/Projection2D.java +++ b/src/de/lmu/ifi/dbs/elki/visualization/projections/Projection2D.java @@ -4,7 +4,7 @@ package de.lmu.ifi.dbs.elki.visualization.projections; This file is part of ELKI: Environment for Developing KDD-Applications Supported by Index-Structures - Copyright (C) 2013 + Copyright (C) 2014 Ludwig-Maximilians-Universität München Lehr- und Forschungseinheit für Datenbanksysteme ELKI Development Team @@ -52,7 +52,7 @@ public interface Projection2D extends Projection { * @param data vector in data space * @return vector in rendering space */ - public double[] fastProjectDataToRenderSpace(NumberVector<?> data); + public double[] fastProjectDataToRenderSpace(NumberVector data); /** * Project a data vector from data space to scaled space. @@ -68,7 +68,7 @@ public interface Projection2D extends Projection { * @param data vector in data space * @return vector in scaled space */ - public double[] fastProjectDataToScaledSpace(NumberVector<?> data); + public double[] fastProjectDataToScaledSpace(NumberVector data); /** * Project a vector from scaled space to rendering space. @@ -93,7 +93,7 @@ public interface Projection2D extends Projection { * @param prototype Prototype to create vector from * @return vector in data space */ - // public <V extends NumberVector<?>> V fastProjectRenderToDataSpace(double[] data, V prototype); + // public <V extends NumberVector> V fastProjectRenderToDataSpace(double[] data, V prototype); /** * Project a vector from rendering space to scaled space. @@ -117,7 +117,7 @@ public interface Projection2D extends Projection { * @param data vector in data space * @return vector in rendering space */ - public double[] fastProjectRelativeDataToRenderSpace(NumberVector<?> data); + public double[] fastProjectRelativeDataToRenderSpace(NumberVector data); /** * Project a vector from scaled space to rendering space. diff --git a/src/de/lmu/ifi/dbs/elki/visualization/projections/ProjectionParallel.java b/src/de/lmu/ifi/dbs/elki/visualization/projections/ProjectionParallel.java index 576c3290..c3344726 100644 --- a/src/de/lmu/ifi/dbs/elki/visualization/projections/ProjectionParallel.java +++ b/src/de/lmu/ifi/dbs/elki/visualization/projections/ProjectionParallel.java @@ -166,7 +166,7 @@ public interface ProjectionParallel extends Projection { * @param v Input vector
* @return Vector with reordering, inversions and scales applied.
*/
- public double[] fastProjectDataToRenderSpace(NumberVector<?> v);
+ public double[] fastProjectDataToRenderSpace(NumberVector v);
/**
* Project the value of a single axis to its display value
diff --git a/src/de/lmu/ifi/dbs/elki/visualization/projections/Simple1D.java b/src/de/lmu/ifi/dbs/elki/visualization/projections/Simple1D.java index 97ac38cc..6a812bf9 100644 --- a/src/de/lmu/ifi/dbs/elki/visualization/projections/Simple1D.java +++ b/src/de/lmu/ifi/dbs/elki/visualization/projections/Simple1D.java @@ -4,7 +4,7 @@ package de.lmu.ifi.dbs.elki.visualization.projections; This file is part of ELKI: Environment for Developing KDD-Applications Supported by Index-Structures - Copyright (C) 2013 + Copyright (C) 2014 Ludwig-Maximilians-Universität München Lehr- und Forschungseinheit für Datenbanksysteme ELKI Development Team @@ -55,7 +55,7 @@ public class Simple1D extends AbstractSimpleProjection implements Projection1D { } @Override - public double fastProjectDataToRenderSpace(NumberVector<?> data) { + public double fastProjectDataToRenderSpace(NumberVector data) { return (scales[dnum].getScaled(data.doubleValue(dnum)) - 0.5) * SCALE; } @@ -70,7 +70,7 @@ public class Simple1D extends AbstractSimpleProjection implements Projection1D { } @Override - public double fastProjectRelativeDataToRenderSpace(NumberVector<?> data) { + public double fastProjectRelativeDataToRenderSpace(NumberVector data) { return (data.doubleValue(dnum) - 0.5) * SCALE; } diff --git a/src/de/lmu/ifi/dbs/elki/visualization/projections/Simple2D.java b/src/de/lmu/ifi/dbs/elki/visualization/projections/Simple2D.java index 9b27af5a..2d7033d2 100644 --- a/src/de/lmu/ifi/dbs/elki/visualization/projections/Simple2D.java +++ b/src/de/lmu/ifi/dbs/elki/visualization/projections/Simple2D.java @@ -4,7 +4,7 @@ package de.lmu.ifi.dbs.elki.visualization.projections; This file is part of ELKI: Environment for Developing KDD-Applications Supported by Index-Structures - Copyright (C) 2013 + Copyright (C) 2014 Ludwig-Maximilians-Universität München Lehr- und Forschungseinheit für Datenbanksysteme ELKI Development Team @@ -66,7 +66,7 @@ public class Simple2D extends AbstractSimpleProjection implements Projection2D { } @Override - public double[] fastProjectDataToRenderSpace(NumberVector<?> data) { + public double[] fastProjectDataToRenderSpace(NumberVector data) { double x = (scales[dim1].getScaled(data.doubleValue(dim1)) - 0.5) * SCALE; double y = (scales[dim2].getScaled(data.doubleValue(dim2)) - 0.5) * -SCALE; return new double[] { x, y }; @@ -83,7 +83,7 @@ public class Simple2D extends AbstractSimpleProjection implements Projection2D { } @Override - public double[] fastProjectDataToScaledSpace(NumberVector<?> data) { + public double[] fastProjectDataToScaledSpace(NumberVector data) { final int dim = data.getDimensionality(); double[] ds = new double[dim]; for(int d = 0; d < dim; d++) { @@ -141,7 +141,7 @@ public class Simple2D extends AbstractSimpleProjection implements Projection2D { } @Override - public double[] fastProjectRelativeDataToRenderSpace(NumberVector<?> data) { + public double[] fastProjectRelativeDataToRenderSpace(NumberVector data) { double x = scales[dim1].getRelativeScaled(data.doubleValue(dim1)) * SCALE; double y = scales[dim2].getRelativeScaled(data.doubleValue(dim2)) * -SCALE; return new double[] { x, y }; diff --git a/src/de/lmu/ifi/dbs/elki/visualization/projections/SimpleParallel.java b/src/de/lmu/ifi/dbs/elki/visualization/projections/SimpleParallel.java index 6b07895d..55c86d26 100644 --- a/src/de/lmu/ifi/dbs/elki/visualization/projections/SimpleParallel.java +++ b/src/de/lmu/ifi/dbs/elki/visualization/projections/SimpleParallel.java @@ -215,7 +215,7 @@ public class SimpleParallel extends BasicResult implements ProjectionParallel { }
@Override
- public double[] fastProjectDataToRenderSpace(NumberVector<?> data) {
+ public double[] fastProjectDataToRenderSpace(NumberVector data) {
double[] v = new double[visDims];
for(int j = 0, o = 0; j < scales.length; j++) {
if(isDimHidden(j)) {
diff --git a/src/de/lmu/ifi/dbs/elki/visualization/projector/HistogramFactory.java b/src/de/lmu/ifi/dbs/elki/visualization/projector/HistogramFactory.java index 894bd264..fa4be47c 100644 --- a/src/de/lmu/ifi/dbs/elki/visualization/projector/HistogramFactory.java +++ b/src/de/lmu/ifi/dbs/elki/visualization/projector/HistogramFactory.java @@ -4,7 +4,7 @@ package de.lmu.ifi.dbs.elki.visualization.projector; This file is part of ELKI: Environment for Developing KDD-Applications Supported by Index-Structures - Copyright (C) 2013 + Copyright (C) 2014 Ludwig-Maximilians-Universität München Lehr- und Forschungseinheit für Datenbanksysteme ELKI Development Team @@ -66,9 +66,9 @@ public class HistogramFactory implements ProjectorFactory { for(Relation<?> rel : rels) { if(TypeUtil.NUMBER_VECTOR_FIELD.isAssignableFromType(rel.getDataTypeInformation())) { @SuppressWarnings("unchecked") - Relation<NumberVector<?>> vrel = (Relation<NumberVector<?>>) rel; + Relation<NumberVector> vrel = (Relation<NumberVector>) rel; final int dim = RelationUtil.dimensionality(vrel); - HistogramProjector<NumberVector<?>> proj = new HistogramProjector<>(vrel, Math.min(dim, maxdim)); + HistogramProjector<NumberVector> proj = new HistogramProjector<>(vrel, Math.min(dim, maxdim)); baseResult.getHierarchy().add(vrel, proj); } } diff --git a/src/de/lmu/ifi/dbs/elki/visualization/projector/HistogramProjector.java b/src/de/lmu/ifi/dbs/elki/visualization/projector/HistogramProjector.java index 3503692c..49025ec5 100644 --- a/src/de/lmu/ifi/dbs/elki/visualization/projector/HistogramProjector.java +++ b/src/de/lmu/ifi/dbs/elki/visualization/projector/HistogramProjector.java @@ -4,7 +4,7 @@ package de.lmu.ifi.dbs.elki.visualization.projector; This file is part of ELKI: Environment for Developing KDD-Applications Supported by Index-Structures - Copyright (C) 2013 + Copyright (C) 2014 Ludwig-Maximilians-Universität München Lehr- und Forschungseinheit für Datenbanksysteme ELKI Development Team @@ -50,7 +50,7 @@ import de.lmu.ifi.dbs.elki.visualization.visualizers.visunproj.LabelVisualizatio * * @param <V> Vector type */ -public class HistogramProjector<V extends NumberVector<?>> extends AbstractHierarchicalResult implements Projector { +public class HistogramProjector<V extends NumberVector> extends AbstractHierarchicalResult implements Projector { /** * Relation we project. */ diff --git a/src/de/lmu/ifi/dbs/elki/visualization/projector/OPTICSProjector.java b/src/de/lmu/ifi/dbs/elki/visualization/projector/OPTICSProjector.java index 832184f0..a3b4f4b5 100644 --- a/src/de/lmu/ifi/dbs/elki/visualization/projector/OPTICSProjector.java +++ b/src/de/lmu/ifi/dbs/elki/visualization/projector/OPTICSProjector.java @@ -4,7 +4,7 @@ package de.lmu.ifi.dbs.elki.visualization.projector; This file is part of ELKI: Environment for Developing KDD-Applications Supported by Index-Structures - Copyright (C) 2013 + Copyright (C) 2014 Ludwig-Maximilians-Universität München Lehr- und Forschungseinheit für Datenbanksysteme ELKI Development Team @@ -27,10 +27,10 @@ import java.util.ArrayList; import java.util.Collection; import java.util.List; -import de.lmu.ifi.dbs.elki.distance.distancevalue.Distance; +import de.lmu.ifi.dbs.elki.algorithm.clustering.optics.ClusterOrderEntry; +import de.lmu.ifi.dbs.elki.algorithm.clustering.optics.ClusterOrderResult; import de.lmu.ifi.dbs.elki.result.AbstractHierarchicalResult; import de.lmu.ifi.dbs.elki.result.ResultUtil; -import de.lmu.ifi.dbs.elki.result.optics.ClusterOrderResult; import de.lmu.ifi.dbs.elki.visualization.VisualizationTask; import de.lmu.ifi.dbs.elki.visualization.VisualizerContext; import de.lmu.ifi.dbs.elki.visualization.gui.overview.PlotItem; @@ -41,24 +41,26 @@ import de.lmu.ifi.dbs.elki.visualization.projections.OPTICSProjection; * Projection for OPTICS plots. * * @author Erich Schubert + * + * @param <E> Cluster order entry type */ -public class OPTICSProjector<D extends Distance<D>> extends AbstractHierarchicalResult implements Projector { +public class OPTICSProjector<E extends ClusterOrderEntry<?>> extends AbstractHierarchicalResult implements Projector { /** * Cluster order result */ - private ClusterOrderResult<D> clusterOrder; + private ClusterOrderResult<E> clusterOrder; /** * OPTICS plot image */ - private OPTICSPlot<D> plot = null; + private OPTICSPlot<E> plot = null; /** * Constructor. * * @param co Cluster order */ - public OPTICSProjector(ClusterOrderResult<D> co) { + public OPTICSProjector(ClusterOrderResult<E> co) { super(); this.clusterOrder = co; } @@ -77,7 +79,7 @@ public class OPTICSProjector<D extends Distance<D>> extends AbstractHierarchical public Collection<PlotItem> arrange() { List<PlotItem> col = new ArrayList<>(1); List<VisualizationTask> tasks = ResultUtil.filterResults(this, VisualizationTask.class); - if (tasks.size() > 0) { + if(tasks.size() > 0) { final PlotItem it = new PlotItem(4., 1., new OPTICSProjection<>(this)); it.tasks = tasks; col.add(it); @@ -90,7 +92,7 @@ public class OPTICSProjector<D extends Distance<D>> extends AbstractHierarchical * * @return the cluster order */ - public ClusterOrderResult<D> getResult() { + public ClusterOrderResult<E> getResult() { return clusterOrder; } @@ -100,7 +102,7 @@ public class OPTICSProjector<D extends Distance<D>> extends AbstractHierarchical * @param context Context to use * @return Plot */ - public OPTICSPlot<D> getOPTICSPlot(VisualizerContext context) { + public OPTICSPlot<E> getOPTICSPlot(VisualizerContext context) { if(plot == null) { plot = OPTICSPlot.plotForClusterOrder(clusterOrder, context); } diff --git a/src/de/lmu/ifi/dbs/elki/visualization/projector/OPTICSProjectorFactory.java b/src/de/lmu/ifi/dbs/elki/visualization/projector/OPTICSProjectorFactory.java index 797c4031..155f0d07 100644 --- a/src/de/lmu/ifi/dbs/elki/visualization/projector/OPTICSProjectorFactory.java +++ b/src/de/lmu/ifi/dbs/elki/visualization/projector/OPTICSProjectorFactory.java @@ -4,7 +4,7 @@ package de.lmu.ifi.dbs.elki.visualization.projector; This file is part of ELKI: Environment for Developing KDD-Applications Supported by Index-Structures - Copyright (C) 2013 + Copyright (C) 2014 Ludwig-Maximilians-Universität München Lehr- und Forschungseinheit für Datenbanksysteme ELKI Development Team @@ -25,11 +25,12 @@ package de.lmu.ifi.dbs.elki.visualization.projector; import java.util.Collection; -import de.lmu.ifi.dbs.elki.distance.distancevalue.DoubleDistance; +import de.lmu.ifi.dbs.elki.algorithm.clustering.optics.ClusterOrderEntry; +import de.lmu.ifi.dbs.elki.algorithm.clustering.optics.ClusterOrderResult; +import de.lmu.ifi.dbs.elki.algorithm.clustering.optics.DoubleDistanceClusterOrderEntry; import de.lmu.ifi.dbs.elki.result.HierarchicalResult; import de.lmu.ifi.dbs.elki.result.Result; import de.lmu.ifi.dbs.elki.result.ResultUtil; -import de.lmu.ifi.dbs.elki.result.optics.ClusterOrderResult; import de.lmu.ifi.dbs.elki.visualization.opticsplot.OPTICSPlot; /** @@ -49,11 +50,11 @@ public class OPTICSProjectorFactory implements ProjectorFactory { @Override public void processNewResult(HierarchicalResult baseResult, Result newResult) { - Collection<ClusterOrderResult<?>> cos = ResultUtil.filterResults(newResult, ClusterOrderResult.class); - for(ClusterOrderResult<?> co : cos) { + Collection<ClusterOrderResult<? extends ClusterOrderEntry<?>>> cos = ResultUtil.filterResults(newResult, ClusterOrderResult.class); + for(ClusterOrderResult<? extends ClusterOrderEntry<?>> co : cos) { if(OPTICSPlot.canPlot(co)) { @SuppressWarnings("unchecked") - OPTICSProjector<?> proj = new OPTICSProjector<>((ClusterOrderResult<DoubleDistance>) co); + OPTICSProjector<?> proj = new OPTICSProjector<>((ClusterOrderResult<DoubleDistanceClusterOrderEntry>) co); baseResult.getHierarchy().add(co, proj); } } diff --git a/src/de/lmu/ifi/dbs/elki/visualization/projector/ParallelPlotFactory.java b/src/de/lmu/ifi/dbs/elki/visualization/projector/ParallelPlotFactory.java index e744ae5b..07a05ff0 100644 --- a/src/de/lmu/ifi/dbs/elki/visualization/projector/ParallelPlotFactory.java +++ b/src/de/lmu/ifi/dbs/elki/visualization/projector/ParallelPlotFactory.java @@ -54,8 +54,8 @@ public class ParallelPlotFactory implements ProjectorFactory { // TODO: multi-relational parallel plots
if(TypeUtil.NUMBER_VECTOR_FIELD.isAssignableFromType(rel.getDataTypeInformation())) {
@SuppressWarnings("unchecked")
- Relation<NumberVector<?>> vrel = (Relation<NumberVector<?>>) rel;
- ParallelPlotProjector<NumberVector<?>> proj = new ParallelPlotProjector<>(vrel);
+ Relation<NumberVector> vrel = (Relation<NumberVector>) rel;
+ ParallelPlotProjector<NumberVector> proj = new ParallelPlotProjector<>(vrel);
baseResult.getHierarchy().add(vrel, proj);
}
}
diff --git a/src/de/lmu/ifi/dbs/elki/visualization/projector/ParallelPlotProjector.java b/src/de/lmu/ifi/dbs/elki/visualization/projector/ParallelPlotProjector.java index bc981924..31a86534 100644 --- a/src/de/lmu/ifi/dbs/elki/visualization/projector/ParallelPlotProjector.java +++ b/src/de/lmu/ifi/dbs/elki/visualization/projector/ParallelPlotProjector.java @@ -47,7 +47,7 @@ import de.lmu.ifi.dbs.elki.visualization.projections.SimpleParallel; * @param <V> Vector type
*/
// TODO: support categorical features, and multiple relations too
-public class ParallelPlotProjector<V extends NumberVector<?>> extends AbstractHierarchicalResult implements Projector {
+public class ParallelPlotProjector<V extends NumberVector> extends AbstractHierarchicalResult implements Projector {
/**
* Relation we project.
*/
@@ -71,7 +71,7 @@ public class ParallelPlotProjector<V extends NumberVector<?>> extends AbstractHi ScalesResult scales = ResultUtil.getScalesResult(rel);
ProjectionParallel proj = new SimpleParallel(scales.getScales());
- final double width = Math.ceil(Math.log(scales.getScales().length) / MathUtil.LOG2);
+ final double width = Math.ceil(MathUtil.log2(scales.getScales().length));
final PlotItem it = new PlotItem(width, 1., proj);
it.tasks = tasks;
col.add(it);
diff --git a/src/de/lmu/ifi/dbs/elki/visualization/projector/Projector.java b/src/de/lmu/ifi/dbs/elki/visualization/projector/Projector.java index 8febb94b..a323b914 100644 --- a/src/de/lmu/ifi/dbs/elki/visualization/projector/Projector.java +++ b/src/de/lmu/ifi/dbs/elki/visualization/projector/Projector.java @@ -4,7 +4,7 @@ package de.lmu.ifi.dbs.elki.visualization.projector; This file is part of ELKI: Environment for Developing KDD-Applications Supported by Index-Structures - Copyright (C) 2013 + Copyright (C) 2014 Ludwig-Maximilians-Universität München Lehr- und Forschungseinheit für Datenbanksysteme ELKI Development Team diff --git a/src/de/lmu/ifi/dbs/elki/visualization/projector/ProjectorFactory.java b/src/de/lmu/ifi/dbs/elki/visualization/projector/ProjectorFactory.java index 25a9ddc1..b5424442 100644 --- a/src/de/lmu/ifi/dbs/elki/visualization/projector/ProjectorFactory.java +++ b/src/de/lmu/ifi/dbs/elki/visualization/projector/ProjectorFactory.java @@ -4,7 +4,7 @@ package de.lmu.ifi.dbs.elki.visualization.projector; This file is part of ELKI: Environment for Developing KDD-Applications Supported by Index-Structures - Copyright (C) 2013 + Copyright (C) 2014 Ludwig-Maximilians-Universität München Lehr- und Forschungseinheit für Datenbanksysteme ELKI Development Team @@ -26,7 +26,6 @@ package de.lmu.ifi.dbs.elki.visualization.projector; import de.lmu.ifi.dbs.elki.result.HierarchicalResult; import de.lmu.ifi.dbs.elki.result.Result; import de.lmu.ifi.dbs.elki.result.ResultProcessor; -import de.lmu.ifi.dbs.elki.utilities.optionhandling.Parameterizable; /** * A projector is responsible for adding projections to the visualization by @@ -36,7 +35,7 @@ import de.lmu.ifi.dbs.elki.utilities.optionhandling.Parameterizable; * * @apiviz.has Projector */ -public interface ProjectorFactory extends ResultProcessor, Parameterizable { +public interface ProjectorFactory extends ResultProcessor { /** * Add projections for the given result (tree) to the result tree. * diff --git a/src/de/lmu/ifi/dbs/elki/visualization/projector/ScatterPlotFactory.java b/src/de/lmu/ifi/dbs/elki/visualization/projector/ScatterPlotFactory.java index f1d61698..de41b85a 100644 --- a/src/de/lmu/ifi/dbs/elki/visualization/projector/ScatterPlotFactory.java +++ b/src/de/lmu/ifi/dbs/elki/visualization/projector/ScatterPlotFactory.java @@ -4,7 +4,7 @@ package de.lmu.ifi.dbs.elki.visualization.projector; This file is part of ELKI: Environment for Developing KDD-Applications Supported by Index-Structures - Copyright (C) 2013 + Copyright (C) 2014 Ludwig-Maximilians-Universität München Lehr- und Forschungseinheit für Datenbanksysteme ELKI Development Team @@ -74,9 +74,9 @@ public class ScatterPlotFactory implements ProjectorFactory { for(Relation<?> rel : rels) { if(TypeUtil.NUMBER_VECTOR_FIELD.isAssignableFromType(rel.getDataTypeInformation())) { @SuppressWarnings("unchecked") - Relation<NumberVector<?>> vrel = (Relation<NumberVector<?>>) rel; + Relation<NumberVector> vrel = (Relation<NumberVector>) rel; final int dim = RelationUtil.dimensionality(vrel); - ScatterPlotProjector<NumberVector<?>> proj = new ScatterPlotProjector<>(vrel, Math.min(maxdim, dim)); + ScatterPlotProjector<NumberVector> proj = new ScatterPlotProjector<>(vrel, Math.min(maxdim, dim)); baseResult.getHierarchy().add(vrel, proj); } } diff --git a/src/de/lmu/ifi/dbs/elki/visualization/projector/ScatterPlotProjector.java b/src/de/lmu/ifi/dbs/elki/visualization/projector/ScatterPlotProjector.java index 84035058..9c6c2bbe 100644 --- a/src/de/lmu/ifi/dbs/elki/visualization/projector/ScatterPlotProjector.java +++ b/src/de/lmu/ifi/dbs/elki/visualization/projector/ScatterPlotProjector.java @@ -4,7 +4,7 @@ package de.lmu.ifi.dbs.elki.visualization.projector; This file is part of ELKI: Environment for Developing KDD-Applications Supported by Index-Structures - Copyright (C) 2013 + Copyright (C) 2014 Ludwig-Maximilians-Universität München Lehr- und Forschungseinheit für Datenbanksysteme ELKI Development Team @@ -52,7 +52,7 @@ import de.lmu.ifi.dbs.elki.visualization.visualizers.visunproj.LabelVisualizatio * * @param <V> Vector type */ -public class ScatterPlotProjector<V extends NumberVector<?>> extends AbstractHierarchicalResult implements Projector { +public class ScatterPlotProjector<V extends NumberVector> extends AbstractHierarchicalResult implements Projector { /** * Relation we project. */ diff --git a/src/de/lmu/ifi/dbs/elki/visualization/savedialog/SVGSaveDialog.java b/src/de/lmu/ifi/dbs/elki/visualization/savedialog/SVGSaveDialog.java index a12f4820..34501e78 100644 --- a/src/de/lmu/ifi/dbs/elki/visualization/savedialog/SVGSaveDialog.java +++ b/src/de/lmu/ifi/dbs/elki/visualization/savedialog/SVGSaveDialog.java @@ -4,7 +4,7 @@ package de.lmu.ifi.dbs.elki.visualization.savedialog; This file is part of ELKI: Environment for Developing KDD-Applications Supported by Index-Structures - Copyright (C) 2013 + Copyright (C) 2014 Ludwig-Maximilians-Universität München Lehr- und Forschungseinheit für Datenbanksysteme ELKI Development Team diff --git a/src/de/lmu/ifi/dbs/elki/visualization/savedialog/SaveOptionsPanel.java b/src/de/lmu/ifi/dbs/elki/visualization/savedialog/SaveOptionsPanel.java index 913fdee2..ce65c449 100644 --- a/src/de/lmu/ifi/dbs/elki/visualization/savedialog/SaveOptionsPanel.java +++ b/src/de/lmu/ifi/dbs/elki/visualization/savedialog/SaveOptionsPanel.java @@ -4,7 +4,7 @@ package de.lmu.ifi.dbs.elki.visualization.savedialog; This file is part of ELKI: Environment for Developing KDD-Applications Supported by Index-Structures - Copyright (C) 2013 + Copyright (C) 2014 Ludwig-Maximilians-Universität München Lehr- und Forschungseinheit für Datenbanksysteme ELKI Development Team diff --git a/src/de/lmu/ifi/dbs/elki/visualization/style/ClassStylingPolicy.java b/src/de/lmu/ifi/dbs/elki/visualization/style/ClassStylingPolicy.java index 0e60b051..6dd78b35 100644 --- a/src/de/lmu/ifi/dbs/elki/visualization/style/ClassStylingPolicy.java +++ b/src/de/lmu/ifi/dbs/elki/visualization/style/ClassStylingPolicy.java @@ -4,7 +4,7 @@ package de.lmu.ifi.dbs.elki.visualization.style; This file is part of ELKI: Environment for Developing KDD-Applications Supported by Index-Structures - Copyright (C) 2013 + Copyright (C) 2014 Ludwig-Maximilians-Universität München Lehr- und Forschungseinheit für Datenbanksysteme ELKI Development Team diff --git a/src/de/lmu/ifi/dbs/elki/visualization/style/ClusterStylingPolicy.java b/src/de/lmu/ifi/dbs/elki/visualization/style/ClusterStylingPolicy.java index cd2fd17b..dd3302d2 100644 --- a/src/de/lmu/ifi/dbs/elki/visualization/style/ClusterStylingPolicy.java +++ b/src/de/lmu/ifi/dbs/elki/visualization/style/ClusterStylingPolicy.java @@ -4,7 +4,7 @@ package de.lmu.ifi.dbs.elki.visualization.style; This file is part of ELKI: Environment for Developing KDD-Applications Supported by Index-Structures - Copyright (C) 2013 + Copyright (C) 2014 Ludwig-Maximilians-Universität München Lehr- und Forschungseinheit für Datenbanksysteme ELKI Development Team diff --git a/src/de/lmu/ifi/dbs/elki/visualization/style/PropertiesBasedStyleLibrary.java b/src/de/lmu/ifi/dbs/elki/visualization/style/PropertiesBasedStyleLibrary.java index d936a9d5..53071462 100644 --- a/src/de/lmu/ifi/dbs/elki/visualization/style/PropertiesBasedStyleLibrary.java +++ b/src/de/lmu/ifi/dbs/elki/visualization/style/PropertiesBasedStyleLibrary.java @@ -4,7 +4,7 @@ package de.lmu.ifi.dbs.elki.visualization.style; This file is part of ELKI: Environment for Developing KDD-Applications Supported by Index-Structures - Copyright (C) 2013 + Copyright (C) 2014 Ludwig-Maximilians-Universität München Lehr- und Forschungseinheit für Datenbanksysteme ELKI Development Team diff --git a/src/de/lmu/ifi/dbs/elki/visualization/style/SingleObjectsStylingPolicy.java b/src/de/lmu/ifi/dbs/elki/visualization/style/SingleObjectsStylingPolicy.java index c367eb24..286893e1 100644 --- a/src/de/lmu/ifi/dbs/elki/visualization/style/SingleObjectsStylingPolicy.java +++ b/src/de/lmu/ifi/dbs/elki/visualization/style/SingleObjectsStylingPolicy.java @@ -4,7 +4,7 @@ package de.lmu.ifi.dbs.elki.visualization.style; This file is part of ELKI: Environment for Developing KDD-Applications Supported by Index-Structures - Copyright (C) 2013 + Copyright (C) 2014 Ludwig-Maximilians-Universität München Lehr- und Forschungseinheit für Datenbanksysteme ELKI Development Team diff --git a/src/de/lmu/ifi/dbs/elki/visualization/style/StyleLibrary.java b/src/de/lmu/ifi/dbs/elki/visualization/style/StyleLibrary.java index 6c7b841f..d31b216b 100644 --- a/src/de/lmu/ifi/dbs/elki/visualization/style/StyleLibrary.java +++ b/src/de/lmu/ifi/dbs/elki/visualization/style/StyleLibrary.java @@ -4,7 +4,7 @@ package de.lmu.ifi.dbs.elki.visualization.style; This file is part of ELKI: Environment for Developing KDD-Applications Supported by Index-Structures - Copyright (C) 2013 + Copyright (C) 2014 Ludwig-Maximilians-Universität München Lehr- und Forschungseinheit für Datenbanksysteme ELKI Development Team diff --git a/src/de/lmu/ifi/dbs/elki/visualization/style/StyleResult.java b/src/de/lmu/ifi/dbs/elki/visualization/style/StyleResult.java index 231a1cd8..93704d0a 100644 --- a/src/de/lmu/ifi/dbs/elki/visualization/style/StyleResult.java +++ b/src/de/lmu/ifi/dbs/elki/visualization/style/StyleResult.java @@ -4,7 +4,7 @@ package de.lmu.ifi.dbs.elki.visualization.style; This file is part of ELKI: Environment for Developing KDD-Applications Supported by Index-Structures - Copyright (C) 2013 + Copyright (C) 2014 Ludwig-Maximilians-Universität München Lehr- und Forschungseinheit für Datenbanksysteme ELKI Development Team diff --git a/src/de/lmu/ifi/dbs/elki/visualization/style/StylingPolicy.java b/src/de/lmu/ifi/dbs/elki/visualization/style/StylingPolicy.java index 98ed25e1..8834adae 100644 --- a/src/de/lmu/ifi/dbs/elki/visualization/style/StylingPolicy.java +++ b/src/de/lmu/ifi/dbs/elki/visualization/style/StylingPolicy.java @@ -4,7 +4,7 @@ package de.lmu.ifi.dbs.elki.visualization.style; This file is part of ELKI: Environment for Developing KDD-Applications Supported by Index-Structures - Copyright (C) 2013 + Copyright (C) 2014 Ludwig-Maximilians-Universität München Lehr- und Forschungseinheit für Datenbanksysteme ELKI Development Team diff --git a/src/de/lmu/ifi/dbs/elki/visualization/style/lines/DashedLineStyleLibrary.java b/src/de/lmu/ifi/dbs/elki/visualization/style/lines/DashedLineStyleLibrary.java index 35c47eb7..04d7f6d7 100644 --- a/src/de/lmu/ifi/dbs/elki/visualization/style/lines/DashedLineStyleLibrary.java +++ b/src/de/lmu/ifi/dbs/elki/visualization/style/lines/DashedLineStyleLibrary.java @@ -4,7 +4,7 @@ package de.lmu.ifi.dbs.elki.visualization.style.lines; This file is part of ELKI: Environment for Developing KDD-Applications Supported by Index-Structures - Copyright (C) 2013 + Copyright (C) 2014 Ludwig-Maximilians-Universität München Lehr- und Forschungseinheit für Datenbanksysteme ELKI Development Team diff --git a/src/de/lmu/ifi/dbs/elki/visualization/style/lines/LineStyleLibrary.java b/src/de/lmu/ifi/dbs/elki/visualization/style/lines/LineStyleLibrary.java index 6c817778..7177e01a 100644 --- a/src/de/lmu/ifi/dbs/elki/visualization/style/lines/LineStyleLibrary.java +++ b/src/de/lmu/ifi/dbs/elki/visualization/style/lines/LineStyleLibrary.java @@ -4,7 +4,7 @@ package de.lmu.ifi.dbs.elki.visualization.style.lines; This file is part of ELKI: Environment for Developing KDD-Applications Supported by Index-Structures - Copyright (C) 2013 + Copyright (C) 2014 Ludwig-Maximilians-Universität München Lehr- und Forschungseinheit für Datenbanksysteme ELKI Development Team diff --git a/src/de/lmu/ifi/dbs/elki/visualization/style/lines/SolidLineStyleLibrary.java b/src/de/lmu/ifi/dbs/elki/visualization/style/lines/SolidLineStyleLibrary.java index 340381a1..25964999 100644 --- a/src/de/lmu/ifi/dbs/elki/visualization/style/lines/SolidLineStyleLibrary.java +++ b/src/de/lmu/ifi/dbs/elki/visualization/style/lines/SolidLineStyleLibrary.java @@ -4,7 +4,7 @@ package de.lmu.ifi.dbs.elki.visualization.style.lines; This file is part of ELKI: Environment for Developing KDD-Applications Supported by Index-Structures - Copyright (C) 2013 + Copyright (C) 2014 Ludwig-Maximilians-Universität München Lehr- und Forschungseinheit für Datenbanksysteme ELKI Development Team diff --git a/src/de/lmu/ifi/dbs/elki/visualization/style/lines/package-info.java b/src/de/lmu/ifi/dbs/elki/visualization/style/lines/package-info.java index ef9d9af7..b96f025c 100644 --- a/src/de/lmu/ifi/dbs/elki/visualization/style/lines/package-info.java +++ b/src/de/lmu/ifi/dbs/elki/visualization/style/lines/package-info.java @@ -6,7 +6,7 @@ This file is part of ELKI: Environment for Developing KDD-Applications Supported by Index-Structures - Copyright (C) 2013 + Copyright (C) 2014 Ludwig-Maximilians-Universität München Lehr- und Forschungseinheit für Datenbanksysteme ELKI Development Team diff --git a/src/de/lmu/ifi/dbs/elki/visualization/style/marker/CircleMarkers.java b/src/de/lmu/ifi/dbs/elki/visualization/style/marker/CircleMarkers.java index f78c72de..05df3834 100644 --- a/src/de/lmu/ifi/dbs/elki/visualization/style/marker/CircleMarkers.java +++ b/src/de/lmu/ifi/dbs/elki/visualization/style/marker/CircleMarkers.java @@ -4,7 +4,7 @@ package de.lmu.ifi.dbs.elki.visualization.style.marker; This file is part of ELKI: Environment for Developing KDD-Applications Supported by Index-Structures - Copyright (C) 2013 + Copyright (C) 2014 Ludwig-Maximilians-Universität München Lehr- und Forschungseinheit für Datenbanksysteme ELKI Development Team diff --git a/src/de/lmu/ifi/dbs/elki/visualization/style/marker/MarkerLibrary.java b/src/de/lmu/ifi/dbs/elki/visualization/style/marker/MarkerLibrary.java index 75591c93..2d665af8 100644 --- a/src/de/lmu/ifi/dbs/elki/visualization/style/marker/MarkerLibrary.java +++ b/src/de/lmu/ifi/dbs/elki/visualization/style/marker/MarkerLibrary.java @@ -4,7 +4,7 @@ package de.lmu.ifi.dbs.elki.visualization.style.marker; This file is part of ELKI: Environment for Developing KDD-Applications Supported by Index-Structures - Copyright (C) 2013 + Copyright (C) 2014 Ludwig-Maximilians-Universität München Lehr- und Forschungseinheit für Datenbanksysteme ELKI Development Team diff --git a/src/de/lmu/ifi/dbs/elki/visualization/style/marker/MinimalMarkers.java b/src/de/lmu/ifi/dbs/elki/visualization/style/marker/MinimalMarkers.java index 4111dbbc..5e455e5e 100644 --- a/src/de/lmu/ifi/dbs/elki/visualization/style/marker/MinimalMarkers.java +++ b/src/de/lmu/ifi/dbs/elki/visualization/style/marker/MinimalMarkers.java @@ -4,7 +4,7 @@ package de.lmu.ifi.dbs.elki.visualization.style.marker; This file is part of ELKI: Environment for Developing KDD-Applications Supported by Index-Structures - Copyright (C) 2013 + Copyright (C) 2014 Ludwig-Maximilians-Universität München Lehr- und Forschungseinheit für Datenbanksysteme ELKI Development Team diff --git a/src/de/lmu/ifi/dbs/elki/visualization/style/marker/PrettyMarkers.java b/src/de/lmu/ifi/dbs/elki/visualization/style/marker/PrettyMarkers.java index d99d92a7..881a22a7 100644 --- a/src/de/lmu/ifi/dbs/elki/visualization/style/marker/PrettyMarkers.java +++ b/src/de/lmu/ifi/dbs/elki/visualization/style/marker/PrettyMarkers.java @@ -4,7 +4,7 @@ package de.lmu.ifi.dbs.elki.visualization.style.marker; This file is part of ELKI: Environment for Developing KDD-Applications Supported by Index-Structures - Copyright (C) 2013 + Copyright (C) 2014 Ludwig-Maximilians-Universität München Lehr- und Forschungseinheit für Datenbanksysteme ELKI Development Team diff --git a/src/de/lmu/ifi/dbs/elki/visualization/svg/SVGArrow.java b/src/de/lmu/ifi/dbs/elki/visualization/svg/SVGArrow.java index cbae03e2..86ba3cfa 100644 --- a/src/de/lmu/ifi/dbs/elki/visualization/svg/SVGArrow.java +++ b/src/de/lmu/ifi/dbs/elki/visualization/svg/SVGArrow.java @@ -4,7 +4,7 @@ package de.lmu.ifi.dbs.elki.visualization.svg; This file is part of ELKI: Environment for Developing KDD-Applications Supported by Index-Structures - Copyright (C) 2013 + Copyright (C) 2014 Ludwig-Maximilians-Universität München Lehr- und Forschungseinheit für Datenbanksysteme ELKI Development Team diff --git a/src/de/lmu/ifi/dbs/elki/visualization/svg/SVGButton.java b/src/de/lmu/ifi/dbs/elki/visualization/svg/SVGButton.java index 9b69ab14..dbcb33fc 100644 --- a/src/de/lmu/ifi/dbs/elki/visualization/svg/SVGButton.java +++ b/src/de/lmu/ifi/dbs/elki/visualization/svg/SVGButton.java @@ -4,7 +4,7 @@ package de.lmu.ifi.dbs.elki.visualization.svg; This file is part of ELKI: Environment for Developing KDD-Applications Supported by Index-Structures - Copyright (C) 2013 + Copyright (C) 2014 Ludwig-Maximilians-Universität München Lehr- und Forschungseinheit für Datenbanksysteme ELKI Development Team diff --git a/src/de/lmu/ifi/dbs/elki/visualization/svg/SVGCheckbox.java b/src/de/lmu/ifi/dbs/elki/visualization/svg/SVGCheckbox.java index dc27b989..2e837ce5 100644 --- a/src/de/lmu/ifi/dbs/elki/visualization/svg/SVGCheckbox.java +++ b/src/de/lmu/ifi/dbs/elki/visualization/svg/SVGCheckbox.java @@ -4,7 +4,7 @@ package de.lmu.ifi.dbs.elki.visualization.svg; This file is part of ELKI: Environment for Developing KDD-Applications Supported by Index-Structures - Copyright (C) 2013 + Copyright (C) 2014 Ludwig-Maximilians-Universität München Lehr- und Forschungseinheit für Datenbanksysteme ELKI Development Team diff --git a/src/de/lmu/ifi/dbs/elki/visualization/svg/SVGCloneVisible.java b/src/de/lmu/ifi/dbs/elki/visualization/svg/SVGCloneVisible.java index 6397348c..0172b77b 100644 --- a/src/de/lmu/ifi/dbs/elki/visualization/svg/SVGCloneVisible.java +++ b/src/de/lmu/ifi/dbs/elki/visualization/svg/SVGCloneVisible.java @@ -4,7 +4,7 @@ package de.lmu.ifi.dbs.elki.visualization.svg; This file is part of ELKI: Environment for Developing KDD-Applications Supported by Index-Structures - Copyright (C) 2013 + Copyright (C) 2014 Ludwig-Maximilians-Universität München Lehr- und Forschungseinheit für Datenbanksysteme ELKI Development Team diff --git a/src/de/lmu/ifi/dbs/elki/visualization/svg/SVGEffects.java b/src/de/lmu/ifi/dbs/elki/visualization/svg/SVGEffects.java index 9382e0b6..d3e17abb 100644 --- a/src/de/lmu/ifi/dbs/elki/visualization/svg/SVGEffects.java +++ b/src/de/lmu/ifi/dbs/elki/visualization/svg/SVGEffects.java @@ -4,7 +4,7 @@ package de.lmu.ifi.dbs.elki.visualization.svg; This file is part of ELKI: Environment for Developing KDD-Applications Supported by Index-Structures - Copyright (C) 2013 + Copyright (C) 2014 Ludwig-Maximilians-Universität München Lehr- und Forschungseinheit für Datenbanksysteme ELKI Development Team diff --git a/src/de/lmu/ifi/dbs/elki/visualization/svg/SVGHyperCube.java b/src/de/lmu/ifi/dbs/elki/visualization/svg/SVGHyperCube.java index 64f5e9be..5ed7ca5a 100644 --- a/src/de/lmu/ifi/dbs/elki/visualization/svg/SVGHyperCube.java +++ b/src/de/lmu/ifi/dbs/elki/visualization/svg/SVGHyperCube.java @@ -4,7 +4,7 @@ package de.lmu.ifi.dbs.elki.visualization.svg; This file is part of ELKI: Environment for Developing KDD-Applications Supported by Index-Structures - Copyright (C) 2013 + Copyright (C) 2014 Ludwig-Maximilians-Universität München Lehr- und Forschungseinheit für Datenbanksysteme ELKI Development Team @@ -70,7 +70,7 @@ public class SVGHyperCube { * @param max Opposite corner * @return path element */ - public static <V extends NumberVector<?>> Element drawFrame(SVGPlot svgp, Projection2D proj, V min, V max) { + public static <V extends NumberVector> Element drawFrame(SVGPlot svgp, Projection2D proj, V min, V max) { SVGPath path = new SVGPath(); ArrayList<double[]> edges = getVisibleEdges(proj, min.getColumnVector().getArrayRef(), max.getColumnVector().getArrayRef()); double[] rv_min = proj.fastProjectDataToRenderSpace(min); @@ -107,7 +107,7 @@ public class SVGHyperCube { * @param max Opposite corner * @return group element */ - public static <V extends NumberVector<?>> Element drawFilled(SVGPlot svgp, String cls, Projection2D proj, V min, V max) { + public static <V extends NumberVector> Element drawFilled(SVGPlot svgp, String cls, Projection2D proj, V min, V max) { Element group = svgp.svgElement(SVGConstants.SVG_G_TAG); ArrayList<double[]> edges = getVisibleEdges(proj, min.getColumnVector().getArrayRef(), max.getColumnVector().getArrayRef()); double[] rv_min = proj.fastProjectDataToRenderSpace(min); diff --git a/src/de/lmu/ifi/dbs/elki/visualization/svg/SVGHyperSphere.java b/src/de/lmu/ifi/dbs/elki/visualization/svg/SVGHyperSphere.java index 14acc5c3..2a4afa83 100644 --- a/src/de/lmu/ifi/dbs/elki/visualization/svg/SVGHyperSphere.java +++ b/src/de/lmu/ifi/dbs/elki/visualization/svg/SVGHyperSphere.java @@ -4,7 +4,7 @@ package de.lmu.ifi.dbs.elki.visualization.svg; This file is part of ELKI: Environment for Developing KDD-Applications Supported by Index-Structures - Copyright (C) 2013 + Copyright (C) 2014 Ludwig-Maximilians-Universität München Lehr- und Forschungseinheit für Datenbanksysteme ELKI Development Team @@ -28,7 +28,6 @@ import java.util.BitSet; import org.w3c.dom.Element; import de.lmu.ifi.dbs.elki.data.NumberVector; -import de.lmu.ifi.dbs.elki.distance.distancevalue.NumberDistance; import de.lmu.ifi.dbs.elki.visualization.projections.Projection2D; /** @@ -56,7 +55,7 @@ public class SVGHyperSphere { * @param radius radius * @return path element */ - public static Element drawManhattan(SVGPlot svgp, Projection2D proj, NumberVector<?> mid, double radius) { + public static Element drawManhattan(SVGPlot svgp, Projection2D proj, NumberVector mid, double radius) { final double[] v_mid = mid.getColumnVector().getArrayRef(); // a copy final BitSet dims = proj.getVisibleDimensions2D(); @@ -101,7 +100,7 @@ public class SVGHyperSphere { * @param radius radius * @return path element */ - public static Element drawEuclidean(SVGPlot svgp, Projection2D proj, NumberVector<?> mid, double radius) { + public static Element drawEuclidean(SVGPlot svgp, Projection2D proj, NumberVector mid, double radius) { double[] v_mid = mid.getColumnVector().getArrayRef(); // a copy BitSet dims = proj.getVisibleDimensions2D(); @@ -152,7 +151,7 @@ public class SVGHyperSphere { * @param p L_p value * @return path element */ - public static Element drawLp(SVGPlot svgp, Projection2D proj, NumberVector<?> mid, double radius, double p) { + public static Element drawLp(SVGPlot svgp, Projection2D proj, NumberVector mid, double radius, double p) { final double[] v_mid = mid.getColumnVector().getArrayRef(); final BitSet dims = proj.getVisibleDimensions2D(); @@ -260,15 +259,13 @@ public class SVGHyperSphere { /** * Wireframe "cross" hypersphere * - * @param <D> radius * @param svgp SVG Plot * @param proj Visualization projection * @param mid mean vector - * @param rad radius + * @param radius radius * @return path element */ - public static <D extends NumberDistance<?, ?>> Element drawCross(SVGPlot svgp, Projection2D proj, NumberVector<?> mid, D rad) { - final double radius = rad.doubleValue(); + public static Element drawCross(SVGPlot svgp, Projection2D proj, NumberVector mid, double radius) { final double[] v_mid = mid.getColumnVector().getArrayRef(); final BitSet dims = proj.getVisibleDimensions2D(); diff --git a/src/de/lmu/ifi/dbs/elki/visualization/svg/SVGPath.java b/src/de/lmu/ifi/dbs/elki/visualization/svg/SVGPath.java index 6937ab3e..4af270b5 100644 --- a/src/de/lmu/ifi/dbs/elki/visualization/svg/SVGPath.java +++ b/src/de/lmu/ifi/dbs/elki/visualization/svg/SVGPath.java @@ -4,7 +4,7 @@ package de.lmu.ifi.dbs.elki.visualization.svg; This file is part of ELKI: Environment for Developing KDD-Applications Supported by Index-Structures - Copyright (C) 2013 + Copyright (C) 2014 Ludwig-Maximilians-Universität München Lehr- und Forschungseinheit für Datenbanksysteme ELKI Development Team diff --git a/src/de/lmu/ifi/dbs/elki/visualization/svg/SVGPlot.java b/src/de/lmu/ifi/dbs/elki/visualization/svg/SVGPlot.java index 44ec906b..f87f2443 100644 --- a/src/de/lmu/ifi/dbs/elki/visualization/svg/SVGPlot.java +++ b/src/de/lmu/ifi/dbs/elki/visualization/svg/SVGPlot.java @@ -4,7 +4,7 @@ package de.lmu.ifi.dbs.elki.visualization.svg; This file is part of ELKI: Environment for Developing KDD-Applications Supported by Index-Structures - Copyright (C) 2013 + Copyright (C) 2014 Ludwig-Maximilians-Universität München Lehr- und Forschungseinheit für Datenbanksysteme ELKI Development Team diff --git a/src/de/lmu/ifi/dbs/elki/visualization/svg/SVGScoreBar.java b/src/de/lmu/ifi/dbs/elki/visualization/svg/SVGScoreBar.java index e421cafa..a481bf05 100644 --- a/src/de/lmu/ifi/dbs/elki/visualization/svg/SVGScoreBar.java +++ b/src/de/lmu/ifi/dbs/elki/visualization/svg/SVGScoreBar.java @@ -4,7 +4,7 @@ package de.lmu.ifi.dbs.elki.visualization.svg; This file is part of ELKI: Environment for Developing KDD-Applications Supported by Index-Structures - Copyright (C) 2013 + Copyright (C) 2014 Ludwig-Maximilians-Universität München Lehr- und Forschungseinheit für Datenbanksysteme ELKI Development Team @@ -28,8 +28,6 @@ import java.text.NumberFormat; import org.apache.batik.util.SVGConstants; import org.w3c.dom.Element; -import de.lmu.ifi.dbs.elki.utilities.FormatUtil; - /** * Draw a score bar. Essentially like a progress bar, left-to-right, displaying * a relative score. @@ -39,14 +37,9 @@ import de.lmu.ifi.dbs.elki.utilities.FormatUtil; // TODO: refactor to get a progress bar? public class SVGScoreBar { /** - * Fill value - */ - protected double fill = 0.0; - - /** - * Total size + * Value, minimum and maximum values */ - protected double size = 1.0; + protected double val, min = 0., max = 1.; /** * Label (on the right) @@ -68,12 +61,14 @@ public class SVGScoreBar { /** * Set the fill of the score bar. * - * @param fill Fill value - * @param size Total size + * @param val Value + * @param min Minimum value + * @param max Maximum value */ - public void setFill(double fill, double size) { - this.fill = fill; - this.size = size; + public void setFill(double val, double min, double max) { + this.val = val; + this.min = min; + this.max = max; } /** @@ -114,8 +109,8 @@ public class SVGScoreBar { bar.setAttribute(SVGConstants.SVG_STROKE_WIDTH_ATTRIBUTE, String.valueOf(height * 0.01)); barchart.appendChild(bar); - if(fill >= 0 && fill <= size + 1) { - double fpos = (fill / size) * (width - (0.04 * height)); + if(val >= min && val <= max && min < max) { + double fpos = (val - min) / (max - min) * (width - (0.04 * height)); Element chart = svgp.svgRect(x + 0.02 * height, y + 0.02 * height, fpos, height - 0.04 * height); chart.setAttribute(SVGConstants.SVG_FILL_ATTRIBUTE, "#d4e4f1"); chart.setAttribute(SVGConstants.SVG_STROKE_ATTRIBUTE, "#a0a0a0"); @@ -125,7 +120,7 @@ public class SVGScoreBar { // Draw the values: if(format != null) { - String num = Double.isNaN(fill) ? "NaN" : FormatUtil.format(fill, format); + String num = Double.isNaN(val) ? "NaN" : format.format(val); Element lbl = svgp.svgText(x + 0.05 * width, y + 0.75 * height, num); lbl.setAttribute(SVGConstants.SVG_STYLE_ATTRIBUTE, "font-size: " + 0.75 * height + "; font-weight: bold"); barchart.appendChild(lbl); diff --git a/src/de/lmu/ifi/dbs/elki/visualization/svg/SVGSimpleLinearAxis.java b/src/de/lmu/ifi/dbs/elki/visualization/svg/SVGSimpleLinearAxis.java index 3fd28d3d..a50ce8c5 100644 --- a/src/de/lmu/ifi/dbs/elki/visualization/svg/SVGSimpleLinearAxis.java +++ b/src/de/lmu/ifi/dbs/elki/visualization/svg/SVGSimpleLinearAxis.java @@ -4,7 +4,7 @@ package de.lmu.ifi.dbs.elki.visualization.svg; This file is part of ELKI: Environment for Developing KDD-Applications Supported by Index-Structures - Copyright (C) 2013 + Copyright (C) 2014 Ludwig-Maximilians-Universität München Lehr- und Forschungseinheit für Datenbanksysteme ELKI Development Team diff --git a/src/de/lmu/ifi/dbs/elki/visualization/svg/SVGUtil.java b/src/de/lmu/ifi/dbs/elki/visualization/svg/SVGUtil.java index 0e680e12..7749cd09 100644 --- a/src/de/lmu/ifi/dbs/elki/visualization/svg/SVGUtil.java +++ b/src/de/lmu/ifi/dbs/elki/visualization/svg/SVGUtil.java @@ -4,7 +4,7 @@ package de.lmu.ifi.dbs.elki.visualization.svg; This file is part of ELKI: Environment for Developing KDD-Applications Supported by Index-Structures - Copyright (C) 2013 + Copyright (C) 2014 Ludwig-Maximilians-Universität München Lehr- und Forschungseinheit für Datenbanksysteme ELKI Development Team diff --git a/src/de/lmu/ifi/dbs/elki/visualization/svg/UpdateRunner.java b/src/de/lmu/ifi/dbs/elki/visualization/svg/UpdateRunner.java index edf40621..74d943ae 100644 --- a/src/de/lmu/ifi/dbs/elki/visualization/svg/UpdateRunner.java +++ b/src/de/lmu/ifi/dbs/elki/visualization/svg/UpdateRunner.java @@ -4,7 +4,7 @@ package de.lmu.ifi.dbs.elki.visualization.svg; This file is part of ELKI: Environment for Developing KDD-Applications Supported by Index-Structures - Copyright (C) 2013 + Copyright (C) 2014 Ludwig-Maximilians-Universität München Lehr- und Forschungseinheit für Datenbanksysteme ELKI Development Team @@ -125,9 +125,10 @@ public class UpdateRunner { * @param newsync Update synchronizer */ public synchronized void synchronizeWith(UpdateSynchronizer newsync) { - // LoggingUtil.warning("Synchronizing: " + sync + " " + newsync); + // LoggingUtil.warning("Synchronizing: " + sync + " " + newsync, new + // Throwable()); if(synchronizer == newsync) { - LoggingUtil.warning("Double-synced to the same plot!"); + LoggingUtil.warning("Double-synced to the same plot!", new Throwable()); return; } if(synchronizer != null) { @@ -136,7 +137,6 @@ public class UpdateRunner { } synchronizer = newsync; newsync.addUpdateRunner(this); - } /** @@ -147,12 +147,11 @@ public class UpdateRunner { public synchronized void unsynchronizeWith(UpdateSynchronizer oldsync) { if(synchronizer == null) { LoggingUtil.warning("Warning: was not synchronized."); + return; } - else { - if(synchronizer != oldsync) { - LoggingUtil.warning("Warning: was synchronized differently!"); - return; - } + if(synchronizer != oldsync) { + LoggingUtil.warning("Warning: was synchronized differently!"); + return; } // LoggingUtil.warning("Unsynchronizing: " + sync + " " + oldsync); synchronizer = null; diff --git a/src/de/lmu/ifi/dbs/elki/visualization/svg/UpdateSynchronizer.java b/src/de/lmu/ifi/dbs/elki/visualization/svg/UpdateSynchronizer.java index a91fb142..b0b45f2f 100644 --- a/src/de/lmu/ifi/dbs/elki/visualization/svg/UpdateSynchronizer.java +++ b/src/de/lmu/ifi/dbs/elki/visualization/svg/UpdateSynchronizer.java @@ -4,7 +4,7 @@ package de.lmu.ifi.dbs.elki.visualization.svg; This file is part of ELKI: Environment for Developing KDD-Applications Supported by Index-Structures - Copyright (C) 2013 + Copyright (C) 2014 Ludwig-Maximilians-Universität München Lehr- und Forschungseinheit für Datenbanksysteme ELKI Development Team diff --git a/src/de/lmu/ifi/dbs/elki/visualization/svg/VoronoiDraw.java b/src/de/lmu/ifi/dbs/elki/visualization/svg/VoronoiDraw.java index e5824fba..9eb554bd 100644 --- a/src/de/lmu/ifi/dbs/elki/visualization/svg/VoronoiDraw.java +++ b/src/de/lmu/ifi/dbs/elki/visualization/svg/VoronoiDraw.java @@ -3,7 +3,7 @@ package de.lmu.ifi.dbs.elki.visualization.svg; This file is part of ELKI: Environment for Developing KDD-Applications Supported by Index-Structures - Copyright (C) 2013 + Copyright (C) 2014 Ludwig-Maximilians-Universität München Lehr- und Forschungseinheit für Datenbanksysteme ELKI Development Team diff --git a/src/de/lmu/ifi/dbs/elki/visualization/visualizers/AbstractVisFactory.java b/src/de/lmu/ifi/dbs/elki/visualization/visualizers/AbstractVisFactory.java index 320ecd4c..6e03a68e 100644 --- a/src/de/lmu/ifi/dbs/elki/visualization/visualizers/AbstractVisFactory.java +++ b/src/de/lmu/ifi/dbs/elki/visualization/visualizers/AbstractVisFactory.java @@ -4,7 +4,7 @@ package de.lmu.ifi.dbs.elki.visualization.visualizers; This file is part of ELKI: Environment for Developing KDD-Applications Supported by Index-Structures - Copyright (C) 2013 + Copyright (C) 2014 Ludwig-Maximilians-Universität München Lehr- und Forschungseinheit für Datenbanksysteme ELKI Development Team diff --git a/src/de/lmu/ifi/dbs/elki/visualization/visualizers/AbstractVisualization.java b/src/de/lmu/ifi/dbs/elki/visualization/visualizers/AbstractVisualization.java index cad9283e..921523b9 100644 --- a/src/de/lmu/ifi/dbs/elki/visualization/visualizers/AbstractVisualization.java +++ b/src/de/lmu/ifi/dbs/elki/visualization/visualizers/AbstractVisualization.java @@ -4,7 +4,7 @@ package de.lmu.ifi.dbs.elki.visualization.visualizers; This file is part of ELKI: Environment for Developing KDD-Applications Supported by Index-Structures - Copyright (C) 2013 + Copyright (C) 2014 Ludwig-Maximilians-Universität München Lehr- und Forschungseinheit für Datenbanksysteme ELKI Development Team diff --git a/src/de/lmu/ifi/dbs/elki/visualization/visualizers/StaticVisualizationInstance.java b/src/de/lmu/ifi/dbs/elki/visualization/visualizers/StaticVisualizationInstance.java index 8c7ad9a7..f5449582 100644 --- a/src/de/lmu/ifi/dbs/elki/visualization/visualizers/StaticVisualizationInstance.java +++ b/src/de/lmu/ifi/dbs/elki/visualization/visualizers/StaticVisualizationInstance.java @@ -4,7 +4,7 @@ package de.lmu.ifi.dbs.elki.visualization.visualizers; This file is part of ELKI: Environment for Developing KDD-Applications Supported by Index-Structures - Copyright (C) 2013 + Copyright (C) 2014 Ludwig-Maximilians-Universität München Lehr- und Forschungseinheit für Datenbanksysteme ELKI Development Team diff --git a/src/de/lmu/ifi/dbs/elki/visualization/visualizers/VisFactory.java b/src/de/lmu/ifi/dbs/elki/visualization/visualizers/VisFactory.java index c65a1c63..c166a8e9 100644 --- a/src/de/lmu/ifi/dbs/elki/visualization/visualizers/VisFactory.java +++ b/src/de/lmu/ifi/dbs/elki/visualization/visualizers/VisFactory.java @@ -4,7 +4,7 @@ package de.lmu.ifi.dbs.elki.visualization.visualizers; This file is part of ELKI: Environment for Developing KDD-Applications Supported by Index-Structures - Copyright (C) 2013 + Copyright (C) 2014 Ludwig-Maximilians-Universität München Lehr- und Forschungseinheit für Datenbanksysteme ELKI Development Team @@ -26,7 +26,6 @@ package de.lmu.ifi.dbs.elki.visualization.visualizers; import de.lmu.ifi.dbs.elki.result.HierarchicalResult; import de.lmu.ifi.dbs.elki.result.Result; import de.lmu.ifi.dbs.elki.result.ResultProcessor; -import de.lmu.ifi.dbs.elki.utilities.optionhandling.Parameterizable; import de.lmu.ifi.dbs.elki.visualization.VisualizationTask; /** @@ -41,7 +40,7 @@ import de.lmu.ifi.dbs.elki.visualization.VisualizationTask; * @apiviz.uses Visualization - - «create» * @apiviz.uses VisualizationTask - - «create» */ -public interface VisFactory extends ResultProcessor, Parameterizable { +public interface VisFactory extends ResultProcessor { /** * Add visualizers for the given result (tree) to the context. * diff --git a/src/de/lmu/ifi/dbs/elki/visualization/visualizers/Visualization.java b/src/de/lmu/ifi/dbs/elki/visualization/visualizers/Visualization.java index 5c1be0ab..5e211830 100644 --- a/src/de/lmu/ifi/dbs/elki/visualization/visualizers/Visualization.java +++ b/src/de/lmu/ifi/dbs/elki/visualization/visualizers/Visualization.java @@ -4,7 +4,7 @@ package de.lmu.ifi.dbs.elki.visualization.visualizers; This file is part of ELKI: Environment for Developing KDD-Applications Supported by Index-Structures - Copyright (C) 2013 + Copyright (C) 2014 Ludwig-Maximilians-Universität München Lehr- und Forschungseinheit für Datenbanksysteme ELKI Development Team diff --git a/src/de/lmu/ifi/dbs/elki/visualization/visualizers/VisualizerUtil.java b/src/de/lmu/ifi/dbs/elki/visualization/visualizers/VisualizerUtil.java index 947f5841..0416f87d 100644 --- a/src/de/lmu/ifi/dbs/elki/visualization/visualizers/VisualizerUtil.java +++ b/src/de/lmu/ifi/dbs/elki/visualization/visualizers/VisualizerUtil.java @@ -4,7 +4,7 @@ package de.lmu.ifi.dbs.elki.visualization.visualizers; This file is part of ELKI: Environment for Developing KDD-Applications Supported by Index-Structures - Copyright (C) 2013 + Copyright (C) 2014 Ludwig-Maximilians-Universität München Lehr- und Forschungseinheit für Datenbanksysteme ELKI Development Team diff --git a/src/de/lmu/ifi/dbs/elki/visualization/visualizers/histogram/AbstractHistogramVisualization.java b/src/de/lmu/ifi/dbs/elki/visualization/visualizers/histogram/AbstractHistogramVisualization.java index 8d3616ac..deb451bd 100644 --- a/src/de/lmu/ifi/dbs/elki/visualization/visualizers/histogram/AbstractHistogramVisualization.java +++ b/src/de/lmu/ifi/dbs/elki/visualization/visualizers/histogram/AbstractHistogramVisualization.java @@ -4,7 +4,7 @@ package de.lmu.ifi.dbs.elki.visualization.visualizers.histogram; This file is part of ELKI: Environment for Developing KDD-Applications Supported by Index-Structures - Copyright (C) 2013 + Copyright (C) 2014 Ludwig-Maximilians-Universität München Lehr- und Forschungseinheit für Datenbanksysteme ELKI Development Team diff --git a/src/de/lmu/ifi/dbs/elki/visualization/visualizers/histogram/ColoredHistogramVisualizer.java b/src/de/lmu/ifi/dbs/elki/visualization/visualizers/histogram/ColoredHistogramVisualizer.java index eb737a6d..b940da67 100644 --- a/src/de/lmu/ifi/dbs/elki/visualization/visualizers/histogram/ColoredHistogramVisualizer.java +++ b/src/de/lmu/ifi/dbs/elki/visualization/visualizers/histogram/ColoredHistogramVisualizer.java @@ -4,7 +4,7 @@ package de.lmu.ifi.dbs.elki.visualization.visualizers.histogram; This file is part of ELKI: Environment for Developing KDD-Applications Supported by Index-Structures - Copyright (C) 2013 + Copyright (C) 2014 Ludwig-Maximilians-Universität München Lehr- und Forschungseinheit für Datenbanksysteme ELKI Development Team @@ -142,7 +142,7 @@ public class ColoredHistogramVisualizer extends AbstractVisFactory { */ // FIXME: make non-static, react to database changes! // FIXME: cache histogram instead of recomputing it. - public class Instance<NV extends NumberVector<?>> extends AbstractHistogramVisualization { + public class Instance<NV extends NumberVector> extends AbstractHistogramVisualization { /** * Generic tag to indicate the type of element. Used in IDs, CSS-Classes * etc. diff --git a/src/de/lmu/ifi/dbs/elki/visualization/visualizers/optics/AbstractOPTICSVisualization.java b/src/de/lmu/ifi/dbs/elki/visualization/visualizers/optics/AbstractOPTICSVisualization.java index d734fc9e..3cb40170 100644 --- a/src/de/lmu/ifi/dbs/elki/visualization/visualizers/optics/AbstractOPTICSVisualization.java +++ b/src/de/lmu/ifi/dbs/elki/visualization/visualizers/optics/AbstractOPTICSVisualization.java @@ -4,7 +4,7 @@ package de.lmu.ifi.dbs.elki.visualization.visualizers.optics; This file is part of ELKI: Environment for Developing KDD-Applications Supported by Index-Structures - Copyright (C) 2013 + Copyright (C) 2014 Ludwig-Maximilians-Universität München Lehr- und Forschungseinheit für Datenbanksysteme ELKI Development Team @@ -27,8 +27,7 @@ import java.util.List; import org.apache.batik.util.SVGConstants; -import de.lmu.ifi.dbs.elki.distance.distancevalue.Distance; -import de.lmu.ifi.dbs.elki.result.optics.ClusterOrderEntry; +import de.lmu.ifi.dbs.elki.algorithm.clustering.optics.ClusterOrderEntry; import de.lmu.ifi.dbs.elki.visualization.VisualizationTask; import de.lmu.ifi.dbs.elki.visualization.projections.OPTICSProjection; import de.lmu.ifi.dbs.elki.visualization.style.StyleLibrary; @@ -42,13 +41,13 @@ import de.lmu.ifi.dbs.elki.visualization.visualizers.AbstractVisualization; * * @apiviz.uses OPTICSProjection * - * @param <D> + * @param <E> Cluster order entry type */ -public abstract class AbstractOPTICSVisualization<D extends Distance<D>> extends AbstractVisualization { +public abstract class AbstractOPTICSVisualization<E extends ClusterOrderEntry<?>> extends AbstractVisualization { /** * The plot */ - final protected OPTICSProjection<D> optics; + final protected OPTICSProjection<E> optics; /** * Width of plot (in display units) @@ -87,7 +86,7 @@ public abstract class AbstractOPTICSVisualization<D extends Distance<D>> extends * * @return Cluster order */ - protected List<ClusterOrderEntry<D>> getClusterOrder() { + protected List<E> getClusterOrder() { return optics.getResult().getClusterOrder(); } }
\ No newline at end of file diff --git a/src/de/lmu/ifi/dbs/elki/visualization/visualizers/optics/OPTICSClusterVisualization.java b/src/de/lmu/ifi/dbs/elki/visualization/visualizers/optics/OPTICSClusterVisualization.java index dd4462c9..bd0adfda 100644 --- a/src/de/lmu/ifi/dbs/elki/visualization/visualizers/optics/OPTICSClusterVisualization.java +++ b/src/de/lmu/ifi/dbs/elki/visualization/visualizers/optics/OPTICSClusterVisualization.java @@ -4,7 +4,7 @@ package de.lmu.ifi.dbs.elki.visualization.visualizers.optics; This file is part of ELKI: Environment for Developing KDD-Applications Supported by Index-Structures - Copyright (C) 2013 + Copyright (C) 2014 Ludwig-Maximilians-Universität München Lehr- und Forschungseinheit für Datenbanksysteme ELKI Development Team @@ -30,11 +30,10 @@ import java.util.Map; import org.apache.batik.util.SVGConstants; import org.w3c.dom.Element; +import de.lmu.ifi.dbs.elki.algorithm.clustering.optics.ClusterOrderEntry; import de.lmu.ifi.dbs.elki.data.Cluster; import de.lmu.ifi.dbs.elki.data.Clustering; import de.lmu.ifi.dbs.elki.data.model.OPTICSModel; -import de.lmu.ifi.dbs.elki.distance.distancevalue.Distance; -import de.lmu.ifi.dbs.elki.distance.distancevalue.DoubleDistance; import de.lmu.ifi.dbs.elki.logging.Logging; import de.lmu.ifi.dbs.elki.result.HierarchicalResult; import de.lmu.ifi.dbs.elki.result.Result; @@ -70,8 +69,7 @@ public class OPTICSClusterVisualization extends AbstractVisFactory { private static final String NAME = "OPTICS Cluster Ranges"; /** - * Constructor, adhering to - * {@link de.lmu.ifi.dbs.elki.utilities.optionhandling.Parameterizable} + * Constructor. */ public OPTICSClusterVisualization() { super(); @@ -80,9 +78,9 @@ public class OPTICSClusterVisualization extends AbstractVisFactory { @Override public void processNewResult(HierarchicalResult baseResult, Result result) { Collection<OPTICSProjector<?>> ops = ResultUtil.filterResults(result, OPTICSProjector.class); - for (OPTICSProjector<?> p : ops) { + for(OPTICSProjector<?> p : ops) { final Clustering<OPTICSModel> ocl = findOPTICSClustering(baseResult); - if (ocl != null) { + if(ocl != null) { final VisualizationTask task = new VisualizationTask(NAME, ocl, null, this); task.level = VisualizationTask.LEVEL_DATA; baseResult.getHierarchy().add(p, task); @@ -94,7 +92,7 @@ public class OPTICSClusterVisualization extends AbstractVisFactory { @Override public Visualization makeVisualization(VisualizationTask task) { - return new Instance<DoubleDistance>(task); + return new Instance(task); } @Override @@ -112,16 +110,17 @@ public class OPTICSClusterVisualization extends AbstractVisFactory { @SuppressWarnings("unchecked") protected static Clustering<OPTICSModel> findOPTICSClustering(Result result) { Collection<Clustering<?>> cs = ResultUtil.filterResults(result, Clustering.class); - for (Clustering<?> clus : cs) { - if (clus.getToplevelClusters().size() == 0) { + for(Clustering<?> clus : cs) { + if(clus.getToplevelClusters().size() == 0) { continue; } try { Cluster<?> firstcluster = clus.getToplevelClusters().iterator().next(); - if (firstcluster.getModel() instanceof OPTICSModel) { + if(firstcluster.getModel() instanceof OPTICSModel) { return (Clustering<OPTICSModel>) clus; } - } catch (Exception e) { + } + catch(Exception e) { // Empty clustering? Shouldn't happen. LOG.warning("Clustering with no cluster detected.", e); } @@ -135,10 +134,8 @@ public class OPTICSClusterVisualization extends AbstractVisFactory { * @author Erich Schubert * * @apiviz.uses Clustering oneway - - «visualizes» - * - * @param <D> Distance type (actually unused) */ - public class Instance<D extends Distance<D>> extends AbstractOPTICSVisualization<D> { + public class Instance extends AbstractOPTICSVisualization<ClusterOrderEntry<?>> { /** * CSS class for markers */ @@ -169,7 +166,7 @@ public class OPTICSClusterVisualization extends AbstractVisFactory { ColorLibrary colors = context.getStyleResult().getStyleLibrary().getColorSet(StyleLibrary.PLOT); HashMap<Cluster<?>, String> colormap = new HashMap<>(); int cnum = 0; - for (Cluster<?> c : clus.getAllClusters()) { + for(Cluster<?> c : clus.getAllClusters()) { colormap.put(c, colors.getColor(cnum)); cnum++; } @@ -186,7 +183,7 @@ public class OPTICSClusterVisualization extends AbstractVisFactory { private void drawClusters(Clustering<OPTICSModel> clustering, Hierarchy.Iter<Cluster<OPTICSModel>> clusters, int depth, Map<Cluster<?>, String> colormap) { final double scale = StyleLibrary.SCALE; - for (; clusters.valid(); clusters.advance()) { + for(; clusters.valid(); clusters.advance()) { Cluster<OPTICSModel> cluster = clusters.get(); try { OPTICSModel model = cluster.getModel(); @@ -196,16 +193,17 @@ public class OPTICSClusterVisualization extends AbstractVisFactory { Element e = svgp.svgLine(x1, y, x2, y); SVGUtil.addCSSClass(e, CSS_BRACKET); String color = colormap.get(cluster); - if (color != null) { + if(color != null) { SVGUtil.setAtt(e, SVGConstants.SVG_STYLE_ATTRIBUTE, SVGConstants.CSS_STROKE_PROPERTY + ":" + color); } layer.appendChild(e); - } catch (ClassCastException e) { + } + catch(ClassCastException e) { LOG.warning("Expected OPTICSModel, got: " + cluster.getModel().getClass().getSimpleName()); } // Descend final Hierarchy.Iter<Cluster<OPTICSModel>> children = clustering.getClusterHierarchy().iterChildren(cluster); - if (children != null) { + if(children != null) { drawClusters(clustering, children, depth + 1, colormap); } } @@ -216,7 +214,7 @@ public class OPTICSClusterVisualization extends AbstractVisFactory { */ private void addCSSClasses() { // Class for the markers - if (!svgp.getCSSClassManager().contains(CSS_BRACKET)) { + if(!svgp.getCSSClassManager().contains(CSS_BRACKET)) { final CSSClass cls = new CSSClass(this, CSS_BRACKET); final StyleLibrary style = context.getStyleResult().getStyleLibrary(); cls.setStatement(SVGConstants.CSS_STROKE_PROPERTY, style.getColor(StyleLibrary.PLOT)); diff --git a/src/de/lmu/ifi/dbs/elki/visualization/visualizers/optics/OPTICSPlotCutVisualization.java b/src/de/lmu/ifi/dbs/elki/visualization/visualizers/optics/OPTICSPlotCutVisualization.java index e53c4c9d..a56c83d2 100644 --- a/src/de/lmu/ifi/dbs/elki/visualization/visualizers/optics/OPTICSPlotCutVisualization.java +++ b/src/de/lmu/ifi/dbs/elki/visualization/visualizers/optics/OPTICSPlotCutVisualization.java @@ -31,14 +31,14 @@ import org.w3c.dom.Element; import org.w3c.dom.events.Event;
import org.w3c.dom.svg.SVGPoint;
+import de.lmu.ifi.dbs.elki.algorithm.clustering.optics.ClusterOrderEntry;
+import de.lmu.ifi.dbs.elki.algorithm.clustering.optics.ClusterOrderResult;
+import de.lmu.ifi.dbs.elki.algorithm.clustering.optics.DoubleDistanceClusterOrderEntry;
import de.lmu.ifi.dbs.elki.data.Clustering;
import de.lmu.ifi.dbs.elki.data.model.Model;
-import de.lmu.ifi.dbs.elki.distance.distancevalue.Distance;
-import de.lmu.ifi.dbs.elki.distance.distancevalue.DoubleDistance;
import de.lmu.ifi.dbs.elki.result.HierarchicalResult;
import de.lmu.ifi.dbs.elki.result.Result;
import de.lmu.ifi.dbs.elki.result.ResultUtil;
-import de.lmu.ifi.dbs.elki.result.optics.ClusterOrderResult;
import de.lmu.ifi.dbs.elki.utilities.FormatUtil;
import de.lmu.ifi.dbs.elki.visualization.VisualizationTask;
import de.lmu.ifi.dbs.elki.visualization.batikutil.DragableArea;
@@ -76,7 +76,7 @@ public class OPTICSPlotCutVisualization extends AbstractVisFactory { @Override
public void processNewResult(HierarchicalResult baseResult, Result result) {
Collection<OPTICSProjector<?>> ops = ResultUtil.filterResults(result, OPTICSProjector.class);
- for (OPTICSProjector<?> p : ops) {
+ for(OPTICSProjector<?> p : ops) {
final VisualizationTask task = new VisualizationTask(NAME, p, null, this);
task.level = VisualizationTask.LEVEL_INTERACTIVE;
baseResult.getHierarchy().add(p, task);
@@ -85,7 +85,7 @@ public class OPTICSPlotCutVisualization extends AbstractVisFactory { @Override
public Visualization makeVisualization(VisualizationTask task) {
- return new Instance<DoubleDistance>(task);
+ return new Instance<DoubleDistanceClusterOrderEntry>(task);
}
@Override
@@ -100,9 +100,9 @@ public class OPTICSPlotCutVisualization extends AbstractVisFactory { * @author Heidi Kolb
* @author Erich Schubert
*
- * @param <D> distance type
+ * @param <E> cluster order entry type
*/
- public class Instance<D extends Distance<D>> extends AbstractOPTICSVisualization<D> implements DragableArea.DragListener {
+ public class Instance<E extends ClusterOrderEntry<?>> extends AbstractOPTICSVisualization<E> implements DragableArea.DragListener {
/**
* CSS-Styles
*/
@@ -154,43 +154,46 @@ public class OPTICSPlotCutVisualization extends AbstractVisFactory { @Override
protected void incrementalRedraw() {
- if (layer == null) {
+ if(layer == null) {
makeLayerElement();
addCSSClasses();
}
// TODO make the number of digits configurable
- final String label = (epsilon > 0.0) ? FormatUtil.format(epsilon, 4) : "";
+ final String label = (epsilon > 0.0) ? FormatUtil.NF4.format(epsilon) : "";
// compute absolute y-value of bar
final double yAct = plotheight - getYFromEpsilon(epsilon);
- if (elemText == null) {
+ if(elemText == null) {
elemText = svgp.svgText(StyleLibrary.SCALE * 1.05, yAct, label);
SVGUtil.setAtt(elemText, SVGConstants.SVG_CLASS_ATTRIBUTE, CSS_EPSILON);
layer.appendChild(elemText);
- } else {
+ }
+ else {
elemText.setTextContent(label);
SVGUtil.setAtt(elemText, SVGConstants.SVG_Y_ATTRIBUTE, yAct);
}
// line and handle
- if (elementLine == null) {
+ if(elementLine == null) {
elementLine = svgp.svgLine(0, yAct, StyleLibrary.SCALE * 1.04, yAct);
SVGUtil.addCSSClass(elementLine, CSS_LINE);
layer.appendChild(elementLine);
- } else {
+ }
+ else {
SVGUtil.setAtt(elementLine, SVG12Constants.SVG_Y1_ATTRIBUTE, yAct);
SVGUtil.setAtt(elementLine, SVG12Constants.SVG_Y2_ATTRIBUTE, yAct);
}
- if (elementPoint == null) {
+ if(elementPoint == null) {
elementPoint = svgp.svgCircle(StyleLibrary.SCALE * 1.04, yAct, StyleLibrary.SCALE * 0.004);
SVGUtil.addCSSClass(elementPoint, CSS_LINE);
layer.appendChild(elementPoint);
- } else {
+ }
+ else {
SVGUtil.setAtt(elementPoint, SVG12Constants.SVG_CY_ATTRIBUTE, yAct);
}
- if (eventarea == null) {
+ if(eventarea == null) {
eventarea = new DragableArea(svgp, StyleLibrary.SCALE, 0, StyleLibrary.SCALE * 0.1, plotheight, this);
layer.appendChild(eventarea.getElement());
}
@@ -209,10 +212,10 @@ public class OPTICSPlotCutVisualization extends AbstractVisFactory { * @return epsilon
*/
protected double getEpsilonFromY(double y) {
- if (y < 0) {
+ if(y < 0) {
y = 0;
}
- if (y > plotheight) {
+ if(y > plotheight) {
y = plotheight;
}
return optics.getOPTICSPlot(context).getScale().getUnscaled(y / plotheight);
@@ -226,10 +229,10 @@ public class OPTICSPlotCutVisualization extends AbstractVisFactory { */
protected double getYFromEpsilon(double epsilon) {
double y = optics.getOPTICSPlot(context).getScale().getScaled(epsilon) * plotheight;
- if (y < 0) {
+ if(y < 0) {
y = 0;
}
- if (y > plotheight) {
+ if(y > plotheight) {
y = plotheight;
}
return y;
@@ -245,7 +248,7 @@ public class OPTICSPlotCutVisualization extends AbstractVisFactory { @Override
public boolean duringDrag(SVGPoint start, SVGPoint end, Event evt, boolean inside) {
- if (inside) {
+ if(inside) {
epsilon = getEpsilonFromY(plotheight - end.getY());
}
// opvis.unsetEpsilonExcept(this);
@@ -255,12 +258,12 @@ public class OPTICSPlotCutVisualization extends AbstractVisFactory { @Override
public boolean endDrag(SVGPoint start, SVGPoint end, Event evt, boolean inside) {
- if (inside) {
+ if(inside) {
epsilon = getEpsilonFromY(plotheight - end.getY());
// opvis.unsetEpsilonExcept(this);
// FIXME: replace an existing optics cut result!
- final ClusterOrderResult<D> order = optics.getResult();
+ final ClusterOrderResult<E> order = optics.getResult();
Clustering<Model> cl = OPTICSCut.makeOPTICSCut(order, optics.getOPTICSPlot(context).getDistanceAdapter(), epsilon);
order.addChildResult(cl);
}
@@ -281,7 +284,7 @@ public class OPTICSPlotCutVisualization extends AbstractVisFactory { private void addCSSClasses() {
// Class for the epsilon-value
final StyleLibrary style = context.getStyleResult().getStyleLibrary();
- if (!svgp.getCSSClassManager().contains(CSS_EPSILON)) {
+ if(!svgp.getCSSClassManager().contains(CSS_EPSILON)) {
final CSSClass label = new CSSClass(svgp, CSS_EPSILON);
label.setStatement(SVGConstants.CSS_FILL_PROPERTY, style.getTextColor(StyleLibrary.AXIS_LABEL));
label.setStatement(SVGConstants.CSS_FONT_FAMILY_PROPERTY, style.getFontFamily(StyleLibrary.AXIS_LABEL));
@@ -289,7 +292,7 @@ public class OPTICSPlotCutVisualization extends AbstractVisFactory { svgp.addCSSClassOrLogError(label);
}
// Class for the epsilon cut line
- if (!svgp.getCSSClassManager().contains(CSS_LINE)) {
+ if(!svgp.getCSSClassManager().contains(CSS_LINE)) {
final CSSClass lcls = new CSSClass(svgp, CSS_LINE);
lcls.setStatement(SVGConstants.CSS_STROKE_PROPERTY, style.getColor(StyleLibrary.PLOT));
lcls.setStatement(SVGConstants.CSS_STROKE_WIDTH_PROPERTY, 0.5 * style.getLineWidth(StyleLibrary.PLOT));
diff --git a/src/de/lmu/ifi/dbs/elki/visualization/visualizers/optics/OPTICSPlotSelectionVisualization.java b/src/de/lmu/ifi/dbs/elki/visualization/visualizers/optics/OPTICSPlotSelectionVisualization.java index bd2d0946..9149a590 100644 --- a/src/de/lmu/ifi/dbs/elki/visualization/visualizers/optics/OPTICSPlotSelectionVisualization.java +++ b/src/de/lmu/ifi/dbs/elki/visualization/visualizers/optics/OPTICSPlotSelectionVisualization.java @@ -32,19 +32,17 @@ import org.w3c.dom.Element; import org.w3c.dom.events.Event;
import org.w3c.dom.svg.SVGPoint;
+import de.lmu.ifi.dbs.elki.algorithm.clustering.optics.ClusterOrderEntry;
import de.lmu.ifi.dbs.elki.database.ids.DBID;
import de.lmu.ifi.dbs.elki.database.ids.DBIDUtil;
import de.lmu.ifi.dbs.elki.database.ids.DBIDs;
import de.lmu.ifi.dbs.elki.database.ids.HashSetModifiableDBIDs;
-import de.lmu.ifi.dbs.elki.distance.distancevalue.Distance;
-import de.lmu.ifi.dbs.elki.distance.distancevalue.DoubleDistance;
import de.lmu.ifi.dbs.elki.logging.Logging;
import de.lmu.ifi.dbs.elki.result.DBIDSelection;
import de.lmu.ifi.dbs.elki.result.HierarchicalResult;
import de.lmu.ifi.dbs.elki.result.Result;
import de.lmu.ifi.dbs.elki.result.ResultUtil;
import de.lmu.ifi.dbs.elki.result.SelectionResult;
-import de.lmu.ifi.dbs.elki.result.optics.ClusterOrderEntry;
import de.lmu.ifi.dbs.elki.visualization.VisualizationTask;
import de.lmu.ifi.dbs.elki.visualization.batikutil.DragableArea;
import de.lmu.ifi.dbs.elki.visualization.css.CSSClass;
@@ -83,8 +81,7 @@ public class OPTICSPlotSelectionVisualization extends AbstractVisFactory { }
/**
- * Constructor, adhering to
- * {@link de.lmu.ifi.dbs.elki.utilities.optionhandling.Parameterizable}
+ * Constructor.
*/
public OPTICSPlotSelectionVisualization() {
super();
@@ -102,7 +99,7 @@ public class OPTICSPlotSelectionVisualization extends AbstractVisFactory { @Override
public Visualization makeVisualization(VisualizationTask task) {
- return new Instance<DoubleDistance>(task);
+ return new Instance(task);
}
@Override
@@ -118,10 +115,8 @@ public class OPTICSPlotSelectionVisualization extends AbstractVisFactory { * @author Erich Schubert
*
* @apiviz.uses DBIDSelection oneway - 1 visualizes
- *
- * @param <D> distance type
*/
- public class Instance<D extends Distance<D>> extends AbstractOPTICSVisualization<D> implements DragableArea.DragListener {
+ public class Instance extends AbstractOPTICSVisualization<ClusterOrderEntry<?>> implements DragableArea.DragListener {
/**
* CSS class for markers
*/
@@ -172,7 +167,7 @@ public class OPTICSPlotSelectionVisualization extends AbstractVisFactory { * Add marker for the selected IDs to mtag
*/
public void addMarker() {
- List<ClusterOrderEntry<D>> order = getClusterOrder();
+ List<? extends ClusterOrderEntry<?>> order = getClusterOrder();
// TODO: replace mtag!
DBIDSelection selContext = context.getSelection();
if(selContext != null) {
@@ -218,7 +213,7 @@ public class OPTICSPlotSelectionVisualization extends AbstractVisFactory { @Override
public boolean startDrag(SVGPoint startPoint, Event evt) {
- List<ClusterOrderEntry<D>> order = getClusterOrder();
+ List<? extends ClusterOrderEntry<?>> order = getClusterOrder();
int mouseActIndex = getSelectedIndex(order, startPoint);
if(mouseActIndex >= 0 && mouseActIndex < order.size()) {
double width = plotwidth / order.size();
@@ -233,7 +228,7 @@ public class OPTICSPlotSelectionVisualization extends AbstractVisFactory { @Override
public boolean duringDrag(SVGPoint startPoint, SVGPoint dragPoint, Event evt, boolean inside) {
- List<ClusterOrderEntry<D>> order = getClusterOrder();
+ List<? extends ClusterOrderEntry<?>> order = getClusterOrder();
int mouseDownIndex = getSelectedIndex(order, startPoint);
int mouseActIndex = getSelectedIndex(order, dragPoint);
final int begin = Math.max(Math.min(mouseDownIndex, mouseActIndex), 0);
@@ -250,7 +245,7 @@ public class OPTICSPlotSelectionVisualization extends AbstractVisFactory { @Override
public boolean endDrag(SVGPoint startPoint, SVGPoint dragPoint, Event evt, boolean inside) {
- List<ClusterOrderEntry<D>> order = getClusterOrder();
+ List<? extends ClusterOrderEntry<?>> order = getClusterOrder();
int mouseDownIndex = getSelectedIndex(order, startPoint);
int mouseActIndex = getSelectedIndex(order, dragPoint);
Mode mode = getInputMode(evt);
@@ -291,7 +286,7 @@ public class OPTICSPlotSelectionVisualization extends AbstractVisFactory { * @param cPt clicked point
* @return Index of the object
*/
- private int getSelectedIndex(List<ClusterOrderEntry<D>> order, SVGPoint cPt) {
+ private int getSelectedIndex(List<? extends ClusterOrderEntry<?>> order, SVGPoint cPt) {
int mouseActIndex = (int) ((cPt.getX() / plotwidth) * order.size());
return mouseActIndex;
}
@@ -304,7 +299,7 @@ public class OPTICSPlotSelectionVisualization extends AbstractVisFactory { * @param end last index to select
*/
protected void updateSelection(Mode mode, int begin, int end) {
- List<ClusterOrderEntry<D>> order = getClusterOrder();
+ List<? extends ClusterOrderEntry<?>> order = getClusterOrder();
if(begin < 0 || begin > end || end >= order.size()) {
LOG.warning("Invalid range in updateSelection: " + begin + " .. " + end);
return;
diff --git a/src/de/lmu/ifi/dbs/elki/visualization/visualizers/optics/OPTICSPlotVisualizer.java b/src/de/lmu/ifi/dbs/elki/visualization/visualizers/optics/OPTICSPlotVisualizer.java index 6a834cb8..430f918a 100644 --- a/src/de/lmu/ifi/dbs/elki/visualization/visualizers/optics/OPTICSPlotVisualizer.java +++ b/src/de/lmu/ifi/dbs/elki/visualization/visualizers/optics/OPTICSPlotVisualizer.java @@ -4,7 +4,7 @@ package de.lmu.ifi.dbs.elki.visualization.visualizers.optics; This file is part of ELKI: Environment for Developing KDD-Applications Supported by Index-Structures - Copyright (C) 2013 + Copyright (C) 2014 Ludwig-Maximilians-Universität München Lehr- und Forschungseinheit für Datenbanksysteme ELKI Development Team @@ -28,8 +28,7 @@ import java.util.Collection; import org.apache.batik.util.SVGConstants; import org.w3c.dom.Element; -import de.lmu.ifi.dbs.elki.distance.distancevalue.Distance; -import de.lmu.ifi.dbs.elki.distance.distancevalue.DoubleDistance; +import de.lmu.ifi.dbs.elki.algorithm.clustering.optics.ClusterOrderEntry; import de.lmu.ifi.dbs.elki.logging.LoggingUtil; import de.lmu.ifi.dbs.elki.result.HierarchicalResult; import de.lmu.ifi.dbs.elki.result.Result; @@ -59,8 +58,7 @@ public class OPTICSPlotVisualizer extends AbstractVisFactory { private static final String NAME = "OPTICS Plot"; /** - * Constructor, adhering to - * {@link de.lmu.ifi.dbs.elki.utilities.optionhandling.Parameterizable} + * Constructor. */ public OPTICSPlotVisualizer() { super(); @@ -79,7 +77,7 @@ public class OPTICSPlotVisualizer extends AbstractVisFactory { @Override public Visualization makeVisualization(VisualizationTask task) { - return new Instance<DoubleDistance>(task); + return new Instance(task); } @Override @@ -92,10 +90,8 @@ public class OPTICSPlotVisualizer extends AbstractVisFactory { * Instance. * * @author Erich Schubert - * - * @param <D> Distance type */ - public class Instance<D extends Distance<D>> extends AbstractOPTICSVisualization<D> { + public class Instance extends AbstractOPTICSVisualization<ClusterOrderEntry<?>> { /** * Constructor. * @@ -110,7 +106,7 @@ public class OPTICSPlotVisualizer extends AbstractVisFactory { makeLayerElement(); // addCSSClasses(); - OPTICSPlot<D> opticsplot = optics.getOPTICSPlot(context); + OPTICSPlot<?> opticsplot = optics.getOPTICSPlot(context); String ploturi = opticsplot.getSVGPlotURI(); Element itag = svgp.svgElement(SVGConstants.SVG_IMAGE_TAG); diff --git a/src/de/lmu/ifi/dbs/elki/visualization/visualizers/optics/OPTICSSteepAreaVisualization.java b/src/de/lmu/ifi/dbs/elki/visualization/visualizers/optics/OPTICSSteepAreaVisualization.java index d587b554..b557f493 100644 --- a/src/de/lmu/ifi/dbs/elki/visualization/visualizers/optics/OPTICSSteepAreaVisualization.java +++ b/src/de/lmu/ifi/dbs/elki/visualization/visualizers/optics/OPTICSSteepAreaVisualization.java @@ -4,7 +4,7 @@ package de.lmu.ifi.dbs.elki.visualization.visualizers.optics; This file is part of ELKI: Environment for Developing KDD-Applications Supported by Index-Structures - Copyright (C) 2013 + Copyright (C) 2014 Ludwig-Maximilians-Universität München Lehr- und Forschungseinheit für Datenbanksysteme ELKI Development Team @@ -30,17 +30,16 @@ import java.util.List; import org.apache.batik.util.SVGConstants; import org.w3c.dom.Element; -import de.lmu.ifi.dbs.elki.algorithm.clustering.OPTICSXi; -import de.lmu.ifi.dbs.elki.algorithm.clustering.OPTICSXi.SteepAreaResult; -import de.lmu.ifi.dbs.elki.distance.distancevalue.Distance; -import de.lmu.ifi.dbs.elki.distance.distancevalue.DoubleDistance; +import de.lmu.ifi.dbs.elki.algorithm.clustering.optics.ClusterOrderEntry; +import de.lmu.ifi.dbs.elki.algorithm.clustering.optics.ClusterOrderResult; +import de.lmu.ifi.dbs.elki.algorithm.clustering.optics.DoubleDistanceClusterOrderEntry; +import de.lmu.ifi.dbs.elki.algorithm.clustering.optics.OPTICSXi; +import de.lmu.ifi.dbs.elki.algorithm.clustering.optics.OPTICSXi.SteepAreaResult; import de.lmu.ifi.dbs.elki.math.scales.LinearScale; import de.lmu.ifi.dbs.elki.result.HierarchicalResult; import de.lmu.ifi.dbs.elki.result.Result; import de.lmu.ifi.dbs.elki.result.ResultUtil; import de.lmu.ifi.dbs.elki.result.SelectionResult; -import de.lmu.ifi.dbs.elki.result.optics.ClusterOrderEntry; -import de.lmu.ifi.dbs.elki.result.optics.ClusterOrderResult; import de.lmu.ifi.dbs.elki.utilities.datastructures.hierarchy.Hierarchy; import de.lmu.ifi.dbs.elki.visualization.VisualizationTask; import de.lmu.ifi.dbs.elki.visualization.css.CSSClass; @@ -67,8 +66,7 @@ public class OPTICSSteepAreaVisualization extends AbstractVisFactory { private static final String NAME = "OPTICS Steep Areas"; /** - * Constructor, adhering to - * {@link de.lmu.ifi.dbs.elki.utilities.optionhandling.Parameterizable} + * Constructor. */ public OPTICSSteepAreaVisualization() { super(); @@ -77,9 +75,9 @@ public class OPTICSSteepAreaVisualization extends AbstractVisFactory { @Override public void processNewResult(HierarchicalResult baseResult, Result result) { Collection<OPTICSProjector<?>> ops = ResultUtil.filterResults(result, OPTICSProjector.class); - for (OPTICSProjector<?> p : ops) { + for(OPTICSProjector<?> p : ops) { final SteepAreaResult steep = findSteepAreaResult(p.getResult()); - if (steep != null) { + if(steep != null) { final VisualizationTask task = new VisualizationTask(NAME, p, null, this); task.level = VisualizationTask.LEVEL_DATA + 1; task.initDefaultVisibility(false); @@ -91,7 +89,7 @@ public class OPTICSSteepAreaVisualization extends AbstractVisFactory { @Override public Visualization makeVisualization(VisualizationTask task) { - return new Instance<DoubleDistance>(task); + return new Instance<DoubleDistanceClusterOrderEntry>(task); } @Override @@ -107,8 +105,8 @@ public class OPTICSSteepAreaVisualization extends AbstractVisFactory { * @return OPTICS clustering */ protected static OPTICSXi.SteepAreaResult findSteepAreaResult(ClusterOrderResult<?> co) { - for (Hierarchy.Iter<Result> r = co.getHierarchy().iterChildren(co); r.valid(); r.advance()) { - if (OPTICSXi.SteepAreaResult.class.isInstance(r.get())) { + for(Hierarchy.Iter<Result> r = co.getHierarchy().iterChildren(co); r.valid(); r.advance()) { + if(OPTICSXi.SteepAreaResult.class.isInstance(r.get())) { return (OPTICSXi.SteepAreaResult) r.get(); } } @@ -121,9 +119,9 @@ public class OPTICSSteepAreaVisualization extends AbstractVisFactory { * @author Erich Schubert * * @apiviz.uses - * de.lmu.ifi.dbs.elki.algorithm.clustering.OPTICSXi.SteepAreaResult + * de.lmu.ifi.dbs.elki.algorithm.clustering.optics.OPTICSXi.SteepAreaResult */ - public class Instance<D extends Distance<D>> extends AbstractOPTICSVisualization<D> { + public class Instance<E extends ClusterOrderEntry<?>> extends AbstractOPTICSVisualization<E> { /** * CSS class for markers */ @@ -156,12 +154,12 @@ public class OPTICSSteepAreaVisualization extends AbstractVisFactory { makeLayerElement(); addCSSClasses(); - final OPTICSPlot<D> opticsplot = optics.getOPTICSPlot(context); - final List<ClusterOrderEntry<D>> co = getClusterOrder(); - final OPTICSDistanceAdapter<D> adapter = opticsplot.getDistanceAdapter(); + final OPTICSPlot<E> opticsplot = optics.getOPTICSPlot(context); + final List<E> co = getClusterOrder(); + final OPTICSDistanceAdapter<E> adapter = opticsplot.getDistanceAdapter(); final LinearScale scale = opticsplot.getScale(); - for (OPTICSXi.SteepArea area : areas) { + for(OPTICSXi.SteepArea area : areas) { final int st = area.getStartIndex(); final int en = area.getEndIndex(); // Note: make sure we are using doubles! @@ -172,9 +170,10 @@ public class OPTICSSteepAreaVisualization extends AbstractVisFactory { final double y1 = (!Double.isInfinite(d1) && !Double.isNaN(d1)) ? (1. - scale.getScaled(d1)) : 0.; final double y2 = (!Double.isInfinite(d2) && !Double.isNaN(d2)) ? (1. - scale.getScaled(d2)) : 0.; Element e = svgp.svgLine(plotwidth * x1, plotheight * y1, plotwidth * x2, plotheight * y2); - if (area instanceof OPTICSXi.SteepDownArea) { + if(area instanceof OPTICSXi.SteepDownArea) { SVGUtil.addCSSClass(e, CSS_STEEP_DOWN); - } else { + } + else { SVGUtil.addCSSClass(e, CSS_STEEP_UP); } layer.appendChild(e); @@ -187,10 +186,10 @@ public class OPTICSSteepAreaVisualization extends AbstractVisFactory { private void addCSSClasses() { // Class for the markers final StyleLibrary style = context.getStyleResult().getStyleLibrary(); - if (!svgp.getCSSClassManager().contains(CSS_STEEP_DOWN)) { + if(!svgp.getCSSClassManager().contains(CSS_STEEP_DOWN)) { final CSSClass cls = new CSSClass(this, CSS_STEEP_DOWN); Color color = SVGUtil.stringToColor(style.getColor(StyleLibrary.PLOT)); - if (color == null) { + if(color == null) { color = Color.BLACK; } color = new Color((int) (color.getRed() * 0.8), (int) (color.getGreen() * 0.8 + 0.2 * 256.), (int) (color.getBlue() * 0.8)); @@ -198,10 +197,10 @@ public class OPTICSSteepAreaVisualization extends AbstractVisFactory { cls.setStatement(SVGConstants.CSS_STROKE_WIDTH_PROPERTY, style.getLineWidth(StyleLibrary.PLOT)); svgp.addCSSClassOrLogError(cls); } - if (!svgp.getCSSClassManager().contains(CSS_STEEP_UP)) { + if(!svgp.getCSSClassManager().contains(CSS_STEEP_UP)) { final CSSClass cls = new CSSClass(this, CSS_STEEP_UP); Color color = SVGUtil.stringToColor(style.getColor(StyleLibrary.PLOT)); - if (color == null) { + if(color == null) { color = Color.BLACK; } color = new Color((int) (color.getRed() * 0.8 + 0.2 * 256.), (int) (color.getGreen() * 0.8), (int) (color.getBlue() * 0.8)); @@ -213,7 +212,7 @@ public class OPTICSSteepAreaVisualization extends AbstractVisFactory { @Override public void resultChanged(Result current) { - if (current instanceof SelectionResult) { + if(current instanceof SelectionResult) { synchronizedRedraw(); return; } diff --git a/src/de/lmu/ifi/dbs/elki/visualization/visualizers/pairsegments/CircleSegmentsVisualizer.java b/src/de/lmu/ifi/dbs/elki/visualization/visualizers/pairsegments/CircleSegmentsVisualizer.java index ff281a35..3db1b6ac 100644 --- a/src/de/lmu/ifi/dbs/elki/visualization/visualizers/pairsegments/CircleSegmentsVisualizer.java +++ b/src/de/lmu/ifi/dbs/elki/visualization/visualizers/pairsegments/CircleSegmentsVisualizer.java @@ -4,7 +4,7 @@ package de.lmu.ifi.dbs.elki.visualization.visualizers.pairsegments; This file is part of ELKI: Environment for Developing KDD-Applications Supported by Index-Structures - Copyright (C) 2013 + Copyright (C) 2014 Ludwig-Maximilians-Universität München Lehr- und Forschungseinheit für Datenbanksysteme ELKI Development Team diff --git a/src/de/lmu/ifi/dbs/elki/visualization/visualizers/pairsegments/SegmentsStylingPolicy.java b/src/de/lmu/ifi/dbs/elki/visualization/visualizers/pairsegments/SegmentsStylingPolicy.java index 4dc35180..1b0a3eda 100644 --- a/src/de/lmu/ifi/dbs/elki/visualization/visualizers/pairsegments/SegmentsStylingPolicy.java +++ b/src/de/lmu/ifi/dbs/elki/visualization/visualizers/pairsegments/SegmentsStylingPolicy.java @@ -4,7 +4,7 @@ package de.lmu.ifi.dbs.elki.visualization.visualizers.pairsegments; This file is part of ELKI: Environment for Developing KDD-Applications Supported by Index-Structures - Copyright (C) 2013 + Copyright (C) 2014 Ludwig-Maximilians-Universität München Lehr- und Forschungseinheit für Datenbanksysteme ELKI Development Team diff --git a/src/de/lmu/ifi/dbs/elki/visualization/visualizers/pairsegments/package-info.java b/src/de/lmu/ifi/dbs/elki/visualization/visualizers/pairsegments/package-info.java index 967ed347..adbf42bb 100644 --- a/src/de/lmu/ifi/dbs/elki/visualization/visualizers/pairsegments/package-info.java +++ b/src/de/lmu/ifi/dbs/elki/visualization/visualizers/pairsegments/package-info.java @@ -5,7 +5,7 @@ This file is part of ELKI: Environment for Developing KDD-Applications Supported by Index-Structures - Copyright (C) 2013 + Copyright (C) 2014 Ludwig-Maximilians-Universität München Lehr- und Forschungseinheit für Datenbanksysteme ELKI Development Team diff --git a/src/de/lmu/ifi/dbs/elki/visualization/visualizers/parallel/AbstractParallelVisualization.java b/src/de/lmu/ifi/dbs/elki/visualization/visualizers/parallel/AbstractParallelVisualization.java index a2039126..0847dcdb 100644 --- a/src/de/lmu/ifi/dbs/elki/visualization/visualizers/parallel/AbstractParallelVisualization.java +++ b/src/de/lmu/ifi/dbs/elki/visualization/visualizers/parallel/AbstractParallelVisualization.java @@ -44,7 +44,7 @@ import de.lmu.ifi.dbs.elki.visualization.visualizers.AbstractVisualization; *
* @param <NV> Vector type in relation
*/
-public abstract class AbstractParallelVisualization<NV extends NumberVector<?>> extends AbstractVisualization {
+public abstract class AbstractParallelVisualization<NV extends NumberVector> extends AbstractVisualization {
/**
* The current projection
*/
diff --git a/src/de/lmu/ifi/dbs/elki/visualization/visualizers/parallel/AxisReorderVisualization.java b/src/de/lmu/ifi/dbs/elki/visualization/visualizers/parallel/AxisReorderVisualization.java index 6d77f592..011914ee 100644 --- a/src/de/lmu/ifi/dbs/elki/visualization/visualizers/parallel/AxisReorderVisualization.java +++ b/src/de/lmu/ifi/dbs/elki/visualization/visualizers/parallel/AxisReorderVisualization.java @@ -90,7 +90,7 @@ public class AxisReorderVisualization extends AbstractVisFactory { * @author Robert Rödler
* @author Erich Schubert
*/
- public class Instance extends AbstractParallelVisualization<NumberVector<?>> {
+ public class Instance extends AbstractParallelVisualization<NumberVector> {
/**
* Generic tags to indicate the type of element. Used in IDs, CSS-Classes
* etc.
diff --git a/src/de/lmu/ifi/dbs/elki/visualization/visualizers/parallel/AxisVisibilityVisualization.java b/src/de/lmu/ifi/dbs/elki/visualization/visualizers/parallel/AxisVisibilityVisualization.java index 3c78120a..659a5e72 100644 --- a/src/de/lmu/ifi/dbs/elki/visualization/visualizers/parallel/AxisVisibilityVisualization.java +++ b/src/de/lmu/ifi/dbs/elki/visualization/visualizers/parallel/AxisVisibilityVisualization.java @@ -3,7 +3,7 @@ package de.lmu.ifi.dbs.elki.visualization.visualizers.parallel; This file is part of ELKI: Environment for Developing KDD-Applications Supported by Index-Structures - Copyright (C) 2013 + Copyright (C) 2014 Ludwig-Maximilians-Universität München Lehr- und Forschungseinheit für Datenbanksysteme ELKI Development Team @@ -89,7 +89,7 @@ public class AxisVisibilityVisualization extends AbstractVisFactory { * @author Robert Rödler
* @author Erich Schubert
*/
- public class Instance extends AbstractParallelVisualization<NumberVector<?>> {
+ public class Instance extends AbstractParallelVisualization<NumberVector> {
/**
* Generic tags to indicate the type of element. Used in IDs, CSS-Classes
* etc.
diff --git a/src/de/lmu/ifi/dbs/elki/visualization/visualizers/parallel/LineVisualization.java b/src/de/lmu/ifi/dbs/elki/visualization/visualizers/parallel/LineVisualization.java index 1290372f..77d8a80b 100644 --- a/src/de/lmu/ifi/dbs/elki/visualization/visualizers/parallel/LineVisualization.java +++ b/src/de/lmu/ifi/dbs/elki/visualization/visualizers/parallel/LineVisualization.java @@ -94,7 +94,7 @@ public class LineVisualization extends AbstractVisFactory { *
* @author Robert Rödler
*/
- public class Instance extends AbstractParallelVisualization<NumberVector<?>> implements DataStoreListener {
+ public class Instance extends AbstractParallelVisualization<NumberVector> implements DataStoreListener {
/**
* Generic tags to indicate the type of element. Used in IDs, CSS-Classes
* etc.
@@ -184,26 +184,22 @@ public class LineVisualization extends AbstractVisFactory { private Element drawLine(DBIDRef iter) {
SVGPath path = new SVGPath();
double[] yPos = proj.fastProjectDataToRenderSpace(relation.get(iter));
- boolean draw = false, drawprev = false, drawn = false;
+ boolean drawn = false;
+ int valid = 0; /* run length of valid values */
for(int i = 0; i < yPos.length; i++) {
// NaN handling:
if(yPos[i] != yPos[i]) {
- draw = false;
- drawprev = false;
+ valid = 0;
continue;
}
- if(draw) {
- if(drawprev) {
+ ++valid;
+ if(valid > 1) {
+ if(valid == 2) {
path.moveTo(getVisibleAxisX(i - 1), yPos[i - 1]);
- drawprev = false;
}
path.lineTo(getVisibleAxisX(i), yPos[i]);
drawn = true;
}
- else {
- drawprev = true;
- }
- draw = true;
}
if(!drawn) {
return null; // Not enough data.
diff --git a/src/de/lmu/ifi/dbs/elki/visualization/visualizers/parallel/ParallelAxisVisualization.java b/src/de/lmu/ifi/dbs/elki/visualization/visualizers/parallel/ParallelAxisVisualization.java index 00ef60ed..f3a0b9b1 100644 --- a/src/de/lmu/ifi/dbs/elki/visualization/visualizers/parallel/ParallelAxisVisualization.java +++ b/src/de/lmu/ifi/dbs/elki/visualization/visualizers/parallel/ParallelAxisVisualization.java @@ -97,7 +97,7 @@ public class ParallelAxisVisualization extends AbstractVisFactory { * @apiviz.uses SVGSimpleLinearAxis
*/
// TODO: split into interactive / non-interactive parts?
- public class Instance extends AbstractParallelVisualization<NumberVector<?>> {
+ public class Instance extends AbstractParallelVisualization<NumberVector> {
/**
* Axis label class.
*/
diff --git a/src/de/lmu/ifi/dbs/elki/visualization/visualizers/parallel/cluster/ClusterOutlineVisualization.java b/src/de/lmu/ifi/dbs/elki/visualization/visualizers/parallel/cluster/ClusterOutlineVisualization.java index 10aa6309..b155005e 100644 --- a/src/de/lmu/ifi/dbs/elki/visualization/visualizers/parallel/cluster/ClusterOutlineVisualization.java +++ b/src/de/lmu/ifi/dbs/elki/visualization/visualizers/parallel/cluster/ClusterOutlineVisualization.java @@ -40,18 +40,26 @@ import de.lmu.ifi.dbs.elki.math.DoubleMinMax; import de.lmu.ifi.dbs.elki.result.HierarchicalResult;
import de.lmu.ifi.dbs.elki.result.Result;
import de.lmu.ifi.dbs.elki.result.ResultUtil;
+import de.lmu.ifi.dbs.elki.utilities.optionhandling.AbstractParameterizer;
import de.lmu.ifi.dbs.elki.utilities.optionhandling.OptionID;
+import de.lmu.ifi.dbs.elki.utilities.optionhandling.parameterization.Parameterization;
+import de.lmu.ifi.dbs.elki.utilities.optionhandling.parameters.DoubleParameter;
+import de.lmu.ifi.dbs.elki.utilities.optionhandling.parameters.Flag;
import de.lmu.ifi.dbs.elki.visualization.VisualizationTask;
import de.lmu.ifi.dbs.elki.visualization.colors.ColorLibrary;
import de.lmu.ifi.dbs.elki.visualization.css.CSSClass;
import de.lmu.ifi.dbs.elki.visualization.projector.ParallelPlotProjector;
+import de.lmu.ifi.dbs.elki.visualization.style.ClusterStylingPolicy;
import de.lmu.ifi.dbs.elki.visualization.style.StyleLibrary;
+import de.lmu.ifi.dbs.elki.visualization.style.StyleResult;
+import de.lmu.ifi.dbs.elki.visualization.style.StylingPolicy;
import de.lmu.ifi.dbs.elki.visualization.svg.SVGPath;
import de.lmu.ifi.dbs.elki.visualization.svg.SVGPlot;
import de.lmu.ifi.dbs.elki.visualization.svg.SVGUtil;
import de.lmu.ifi.dbs.elki.visualization.visualizers.AbstractVisFactory;
import de.lmu.ifi.dbs.elki.visualization.visualizers.Visualization;
import de.lmu.ifi.dbs.elki.visualization.visualizers.parallel.AbstractParallelVisualization;
+import de.lmu.ifi.dbs.elki.visualization.visualizers.scatterplot.cluster.ClusterHullVisualization;
/**
* Generates a SVG-Element that visualizes the area covered by a cluster.
@@ -66,45 +74,41 @@ public class ClusterOutlineVisualization extends AbstractVisFactory { /**
* A short name characterizing this Visualizer.
*/
- public static final String NAME = "Parallel Cluster Outline";
+ private static final String NAME = "Cluster Hull (Parallel Coordinates)";
/**
- * Currently unused option to enable/disable rounding
+ * Settings
*/
- public static final OptionID ROUNDED_ID = new OptionID("parallel.clusteroutline.rounded", "Draw lines rounded");
+ Parameterizer settings;
/**
- * Currently, always enabled.
- */
- private boolean rounded = true;
-
- /**
- * Constructor, adhering to
- * {@link de.lmu.ifi.dbs.elki.utilities.optionhandling.Parameterizable}
+ * Constructor.
+ *
+ * @param settings Settings
*/
- public ClusterOutlineVisualization() {
+ public ClusterOutlineVisualization(Parameterizer settings) {
super();
+ this.settings = settings;
}
@Override
public Visualization makeVisualization(VisualizationTask task) {
- return new Instance(task, rounded);
+ return new Instance(task);
}
@Override
public void processNewResult(HierarchicalResult baseResult, Result result) {
- // Find clusterings we can visualize:
- Collection<Clustering<?>> clusterings = ResultUtil.filterResults(result, Clustering.class);
- for(Clustering<?> c : clusterings) {
- if(c.getAllClusters().size() > 0) {
- Collection<ParallelPlotProjector<?>> ps = ResultUtil.filterResults(baseResult, ParallelPlotProjector.class);
- for(ParallelPlotProjector<?> p : ps) {
- final VisualizationTask task = new VisualizationTask(NAME, c, p.getRelation(), this);
- task.level = VisualizationTask.LEVEL_DATA - 1;
- task.initDefaultVisibility(false);
- baseResult.getHierarchy().add(c, task);
- baseResult.getHierarchy().add(p, task);
- }
+ // We attach ourselves to the style library, not the clustering, so there is
+ // only one hull.
+ Collection<StyleResult> styleres = ResultUtil.filterResults(result, StyleResult.class);
+ for(StyleResult s : styleres) {
+ Collection<ParallelPlotProjector<?>> ps = ResultUtil.filterResults(baseResult, ParallelPlotProjector.class);
+ for(ParallelPlotProjector<?> p : ps) {
+ final VisualizationTask task = new VisualizationTask(NAME, s, p.getRelation(), this);
+ task.level = VisualizationTask.LEVEL_DATA - 1;
+ task.initDefaultVisibility(false);
+ baseResult.getHierarchy().add(s, task);
+ baseResult.getHierarchy().add(p, task);
}
}
}
@@ -121,7 +125,7 @@ public class ClusterOutlineVisualization extends AbstractVisFactory { * @author Robert Rödler
* @author Erich Schubert
*/
- public class Instance extends AbstractParallelVisualization<NumberVector<?>> implements DataStoreListener {
+ public class Instance extends AbstractParallelVisualization<NumberVector> implements DataStoreListener {
/**
* Generic tags to indicate the type of element. Used in IDs, CSS-Classes
* etc.
@@ -131,22 +135,16 @@ public class ClusterOutlineVisualization extends AbstractVisFactory { /**
* The result we visualize
*/
- private Clustering<Model> clustering;
-
- /**
- * Flag for using rounded shapes
- */
- boolean rounded = true;
+ private StyleResult style;
/**
* Constructor.
*
* @param task VisualizationTask
*/
- public Instance(VisualizationTask task, boolean rounded) {
+ public Instance(VisualizationTask task) {
super(task);
- this.clustering = task.getResult();
- this.rounded = rounded;
+ this.style = task.getResult();
context.addDataStoreListener(this);
context.addResultListener(this);
incrementalRedraw();
@@ -161,17 +159,27 @@ public class ClusterOutlineVisualization extends AbstractVisFactory { @Override
protected void redraw() {
- addCSSClasses(svgp);
+ final StylingPolicy spol = style.getStylingPolicy();
+ if(!(spol instanceof ClusterStylingPolicy)) {
+ return;
+ }
+ final ClusterStylingPolicy cpol = (ClusterStylingPolicy) spol;
+ @SuppressWarnings("unchecked")
+ Clustering<Model> clustering = (Clustering<Model>) cpol.getClustering();
+
int dim = proj.getVisibleDimensions();
DoubleMinMax[] mms = DoubleMinMax.newArray(dim);
DoubleMinMax[] midmm = DoubleMinMax.newArray(dim - 1);
+ // Heuristic value for transparency:
+ double baseopacity = .5;
+
Iterator<Cluster<Model>> ci = clustering.getAllClusters().iterator();
for(int cnum = 0; cnum < clustering.getAllClusters().size(); cnum++) {
Cluster<?> clus = ci.next();
final DBIDs ids = clus.getIDs();
- if (ids.size() < 1) {
+ if(ids.size() < 1) {
continue;
}
for(int i = 0; i < dim; i++) {
@@ -194,7 +202,7 @@ public class ClusterOutlineVisualization extends AbstractVisFactory { }
SVGPath path = new SVGPath();
- if(!rounded) {
+ if(!settings.bend) {
// Straight lines
for(int i = 0; i < dim; i++) {
path.drawTo(getVisibleAxisX(i), mms[i].getMax());
@@ -208,7 +216,6 @@ public class ClusterOutlineVisualization extends AbstractVisFactory { }
path.drawTo(getVisibleAxisX(i), mms[i].getMin());
}
- path.close();
}
else {
// Maxima
@@ -221,10 +228,19 @@ public class ClusterOutlineVisualization extends AbstractVisFactory { for(int i = dim - 1; i > 0; i--) {
path.quadTo(getVisibleAxisX(i - .5), midmm[i - 1].getMin(), getVisibleAxisX(i - 1), mms[i - 1].getMin());
}
- path.close();
}
+ path.close();
+
+ // TODO: improve the visualization by adjusting the opacity by the
+ // cluster extends on each axis (maybe use a horizontal gradient?)
+ double weight = 0.;
+ for(int i = 0; i < dim; i++) {
+ weight += mms[i].getDiff();
+ }
+ weight = (weight > 0.) ? (dim * StyleLibrary.SCALE) / weight : 1.;
Element intervals = path.makeElement(svgp);
+ addCSSClasses(svgp, cpol.getStyleForCluster(clus), baseopacity * weight * ids.size() / relation.size());
SVGUtil.addCSSClass(intervals, CLUSTERAREA + cnum);
layer.appendChild(intervals);
}
@@ -234,33 +250,66 @@ public class ClusterOutlineVisualization extends AbstractVisFactory { * Adds the required CSS-Classes
*
* @param svgp SVG-Plot
+ * @param clusterID Cluster ID to style
+ * @param opac Opacity
*/
- private void addCSSClasses(SVGPlot svgp) {
- if(!svgp.getCSSClassManager().contains(CLUSTERAREA)) {
- final StyleLibrary style = context.getStyleResult().getStyleLibrary();
- ColorLibrary colors = style.getColorSet(StyleLibrary.PLOT);
- int clusterID = 0;
-
- for(@SuppressWarnings("unused")
- Cluster<?> cluster : clustering.getAllClusters()) {
- CSSClass cls = new CSSClass(this, CLUSTERAREA + clusterID);
- // cls.setStatement(SVGConstants.CSS_STROKE_WIDTH_PROPERTY,
- // context.getStyleLibrary().getLineWidth(StyleLibrary.PLOT) / 2.0);
- cls.setStatement(SVGConstants.CSS_OPACITY_PROPERTY, 0.5);
- final String color;
- if(clustering.getAllClusters().size() == 1) {
- color = SVGConstants.CSS_BLACK_VALUE;
- }
- else {
- color = colors.getColor(clusterID);
- }
- // cls.setStatement(SVGConstants.CSS_STROKE_PROPERTY, color);
- cls.setStatement(SVGConstants.CSS_FILL_PROPERTY, color);
+ private void addCSSClasses(SVGPlot svgp, int clusterID, double opac) {
+ final StyleLibrary style = context.getStyleResult().getStyleLibrary();
+ ColorLibrary colors = style.getColorSet(StyleLibrary.PLOT);
- svgp.addCSSClassOrLogError(cls);
- clusterID++;
- }
+ CSSClass cls = new CSSClass(this, CLUSTERAREA + clusterID);
+ final String color = colors.getColor(clusterID);
+
+ // cls.setStatement(SVGConstants.CSS_STROKE_WIDTH_PROPERTY,
+ // context.getStyleLibrary().getLineWidth(StyleLibrary.PLOT) / 2.0);
+ // cls.setStatement(SVGConstants.CSS_STROKE_PROPERTY, color);
+ cls.setStatement(SVGConstants.CSS_FILL_PROPERTY, color);
+ cls.setStatement(SVGConstants.CSS_FILL_OPACITY_PROPERTY, opac);
+
+ svgp.addCSSClassOrLogError(cls);
+ }
+ }
+
+ /**
+ * Parameterization class.
+ *
+ * @author Erich Schubert
+ *
+ * @apiviz.exclude
+ */
+ public static class Parameterizer extends AbstractParameterizer {
+ /**
+ * Option string to draw straight lines for hull.
+ */
+ public static final OptionID STRAIGHT_ID = new OptionID("parallel.clusteroutline.straight", "Draw straight lines");
+
+ /**
+ * Alpha value
+ */
+ double alpha = Double.POSITIVE_INFINITY;
+
+ /**
+ * Use bend curves
+ */
+ private boolean bend = true;
+
+ @Override
+ protected void makeOptions(Parameterization config) {
+ super.makeOptions(config);
+ DoubleParameter alphaP = new DoubleParameter(ClusterHullVisualization.Parameterizer.ALPHA_ID, Double.POSITIVE_INFINITY);
+ if(config.grab(alphaP)) {
+ alpha = alphaP.doubleValue();
}
+
+ Flag bendP = new Flag(STRAIGHT_ID);
+ if(config.grab(bendP)) {
+ bend = bendP.isFalse();
+ }
+ }
+
+ @Override
+ protected ClusterOutlineVisualization makeInstance() {
+ return new ClusterOutlineVisualization(this);
}
}
}
\ No newline at end of file diff --git a/src/de/lmu/ifi/dbs/elki/visualization/visualizers/parallel/cluster/ClusterParallelMeanVisualization.java b/src/de/lmu/ifi/dbs/elki/visualization/visualizers/parallel/cluster/ClusterParallelMeanVisualization.java index ad3ed503..e98093d7 100644 --- a/src/de/lmu/ifi/dbs/elki/visualization/visualizers/parallel/cluster/ClusterParallelMeanVisualization.java +++ b/src/de/lmu/ifi/dbs/elki/visualization/visualizers/parallel/cluster/ClusterParallelMeanVisualization.java @@ -64,8 +64,7 @@ public class ClusterParallelMeanVisualization extends AbstractVisFactory { private static final String NAME = "Cluster Means";
/**
- * Constructor, adhering to
- * {@link de.lmu.ifi.dbs.elki.utilities.optionhandling.Parameterizable}.
+ * Constructor.
*/
public ClusterParallelMeanVisualization() {
super();
@@ -83,7 +82,7 @@ public class ClusterParallelMeanVisualization extends AbstractVisFactory { for (Clustering<?> c : clusterings) {
if (c.getAllClusters().size() > 0) {
// Does the cluster have a model with cluster means?
- Clustering<MeanModel<? extends NumberVector<?>>> mcls = findMeanModel(c);
+ Clustering<MeanModel> mcls = findMeanModel(c);
if (mcls != null) {
Collection<ParallelPlotProjector<?>> ps = ResultUtil.filterResults(baseResult, ParallelPlotProjector.class);
for (ParallelPlotProjector<?> p : ps) {
@@ -104,9 +103,9 @@ public class ClusterParallelMeanVisualization extends AbstractVisFactory { * @return the clustering cast to return a mean model, null otherwise.
*/
@SuppressWarnings("unchecked")
- private static Clustering<MeanModel<? extends NumberVector<?>>> findMeanModel(Clustering<?> c) {
- if (c.getAllClusters().get(0).getModel() instanceof MeanModel<?>) {
- return (Clustering<MeanModel<? extends NumberVector<?>>>) c;
+ private static Clustering<MeanModel> findMeanModel(Clustering<?> c) {
+ if (c.getAllClusters().get(0).getModel() instanceof MeanModel) {
+ return (Clustering<MeanModel>) c;
}
return null;
}
@@ -123,7 +122,7 @@ public class ClusterParallelMeanVisualization extends AbstractVisFactory { * @author Robert Rödler
*
*/
- public class Instance extends AbstractParallelVisualization<NumberVector<?>> implements DataStoreListener {
+ public class Instance extends AbstractParallelVisualization<NumberVector> implements DataStoreListener {
/**
* Generic tags to indicate the type of element. Used in IDs, CSS-Classes
* etc.
@@ -133,7 +132,7 @@ public class ClusterParallelMeanVisualization extends AbstractVisFactory { /**
* The result we visualize.
*/
- private Clustering<MeanModel<? extends NumberVector<?>>> clustering;
+ private Clustering<MeanModel> clustering;
/**
* Constructor.
@@ -159,13 +158,13 @@ public class ClusterParallelMeanVisualization extends AbstractVisFactory { protected void redraw() {
addCSSClasses(svgp);
- Iterator<Cluster<MeanModel<? extends NumberVector<?>>>> ci = clustering.getAllClusters().iterator();
+ Iterator<Cluster<MeanModel>> ci = clustering.getAllClusters().iterator();
for (int cnum = 0; cnum < clustering.getAllClusters().size(); cnum++) {
- Cluster<MeanModel<? extends NumberVector<?>>> clus = ci.next();
+ Cluster<MeanModel> clus = ci.next();
if (clus.getModel() == null) {
continue;
}
- NumberVector<?> mean = clus.getModel().getMean();
+ NumberVector mean = clus.getModel().getMean();
if (mean == null) {
continue;
}
diff --git a/src/de/lmu/ifi/dbs/elki/visualization/visualizers/parallel/cluster/package-info.java b/src/de/lmu/ifi/dbs/elki/visualization/visualizers/parallel/cluster/package-info.java index 0ae97b92..c2ffa94e 100644 --- a/src/de/lmu/ifi/dbs/elki/visualization/visualizers/parallel/cluster/package-info.java +++ b/src/de/lmu/ifi/dbs/elki/visualization/visualizers/parallel/cluster/package-info.java @@ -5,7 +5,7 @@ This file is part of ELKI: Environment for Developing KDD-Applications Supported by Index-Structures - Copyright (C) 2013 + Copyright (C) 2014 Ludwig-Maximilians-Universität München Lehr- und Forschungseinheit für Datenbanksysteme ELKI Development Team diff --git a/src/de/lmu/ifi/dbs/elki/visualization/visualizers/parallel/index/RTreeParallelVisualization.java b/src/de/lmu/ifi/dbs/elki/visualization/visualizers/parallel/index/RTreeParallelVisualization.java index 04676905..f952f391 100644 --- a/src/de/lmu/ifi/dbs/elki/visualization/visualizers/parallel/index/RTreeParallelVisualization.java +++ b/src/de/lmu/ifi/dbs/elki/visualization/visualizers/parallel/index/RTreeParallelVisualization.java @@ -103,6 +103,7 @@ public class RTreeParallelVisualization extends AbstractVisFactory { for(ParallelPlotProjector<?> p : ps) {
final VisualizationTask task = new VisualizationTask(NAME, (Result) tree, p.getRelation(), this);
task.level = VisualizationTask.LEVEL_BACKGROUND + 2;
+ task.default_visibility = false;
baseResult.getHierarchy().add((Result) tree, task);
baseResult.getHierarchy().add(p, task);
}
@@ -121,7 +122,7 @@ public class RTreeParallelVisualization extends AbstractVisFactory { * @param <E> Tree entry type
*/
// TODO: listen for tree changes instead of data changes?
- public class Instance<N extends AbstractRStarTreeNode<N, E>, E extends SpatialEntry> extends AbstractParallelVisualization<NumberVector<?>> implements DataStoreListener {
+ public class Instance<N extends AbstractRStarTreeNode<N, E>, E extends SpatialEntry> extends AbstractParallelVisualization<NumberVector> implements DataStoreListener {
/**
* The tree we visualize
*/
diff --git a/src/de/lmu/ifi/dbs/elki/visualization/visualizers/parallel/index/package-info.java b/src/de/lmu/ifi/dbs/elki/visualization/visualizers/parallel/index/package-info.java index 93c1e75b..a1266943 100644 --- a/src/de/lmu/ifi/dbs/elki/visualization/visualizers/parallel/index/package-info.java +++ b/src/de/lmu/ifi/dbs/elki/visualization/visualizers/parallel/index/package-info.java @@ -5,7 +5,7 @@ This file is part of ELKI: Environment for Developing KDD-Applications Supported by Index-Structures - Copyright (C) 2013 + Copyright (C) 2014 Ludwig-Maximilians-Universität München Lehr- und Forschungseinheit für Datenbanksysteme ELKI Development Team diff --git a/src/de/lmu/ifi/dbs/elki/visualization/visualizers/parallel/selection/SelectionAxisRangeVisualization.java b/src/de/lmu/ifi/dbs/elki/visualization/visualizers/parallel/selection/SelectionAxisRangeVisualization.java index 6e2a9329..266c702b 100644 --- a/src/de/lmu/ifi/dbs/elki/visualization/visualizers/parallel/selection/SelectionAxisRangeVisualization.java +++ b/src/de/lmu/ifi/dbs/elki/visualization/visualizers/parallel/selection/SelectionAxisRangeVisualization.java @@ -96,7 +96,7 @@ public class SelectionAxisRangeVisualization extends AbstractVisFactory { * @apiviz.has SelectionResult oneway - - visualizes
* @apiviz.has RangeSelection oneway - - visualizes
*/
- public class Instance extends AbstractParallelVisualization<NumberVector<?>> {
+ public class Instance extends AbstractParallelVisualization<NumberVector> {
/**
* CSS Class for the range marker
*/
diff --git a/src/de/lmu/ifi/dbs/elki/visualization/visualizers/parallel/selection/SelectionLineVisualization.java b/src/de/lmu/ifi/dbs/elki/visualization/visualizers/parallel/selection/SelectionLineVisualization.java index 92e5f64c..a0efe2c3 100644 --- a/src/de/lmu/ifi/dbs/elki/visualization/visualizers/parallel/selection/SelectionLineVisualization.java +++ b/src/de/lmu/ifi/dbs/elki/visualization/visualizers/parallel/selection/SelectionLineVisualization.java @@ -98,7 +98,7 @@ public class SelectionLineVisualization extends AbstractVisFactory { *
* @apiviz.has SelectionResult oneway - - visualizes
*/
- public class Instance extends AbstractParallelVisualization<NumberVector<?>> implements DataStoreListener {
+ public class Instance extends AbstractParallelVisualization<NumberVector> implements DataStoreListener {
/**
* CSS Class for the range marker
*/
diff --git a/src/de/lmu/ifi/dbs/elki/visualization/visualizers/parallel/selection/SelectionToolAxisRangeVisualization.java b/src/de/lmu/ifi/dbs/elki/visualization/visualizers/parallel/selection/SelectionToolAxisRangeVisualization.java index 4fd00023..c2ea272e 100644 --- a/src/de/lmu/ifi/dbs/elki/visualization/visualizers/parallel/selection/SelectionToolAxisRangeVisualization.java +++ b/src/de/lmu/ifi/dbs/elki/visualization/visualizers/parallel/selection/SelectionToolAxisRangeVisualization.java @@ -74,8 +74,7 @@ public class SelectionToolAxisRangeVisualization extends AbstractVisFactory { private static final String NAME = "Axis Range Selection";
/**
- * Constructor, adhering to
- * {@link de.lmu.ifi.dbs.elki.utilities.optionhandling.Parameterizable}
+ * Constructor.
*/
public SelectionToolAxisRangeVisualization() {
super();
@@ -112,7 +111,7 @@ public class SelectionToolAxisRangeVisualization extends AbstractVisFactory { * @apiviz.has SelectionResult oneway - - updates
* @apiviz.has RangeSelection oneway - - updates
*/
- public class Instance extends AbstractParallelVisualization<NumberVector<?>> implements DragableArea.DragListener {
+ public class Instance extends AbstractParallelVisualization<NumberVector> implements DragableArea.DragListener {
/**
* Generic tag to indicate the type of element. Used in IDs, CSS-Classes
* etc.
@@ -273,7 +272,7 @@ public class SelectionToolAxisRangeVisualization extends AbstractVisFactory { selection.clear();
candidates: for(DBIDIter iditer = relation.iterDBIDs(); iditer.valid(); iditer.advance()) {
- NumberVector<?> dbTupel = relation.get(iditer);
+ NumberVector dbTupel = relation.get(iditer);
for(int i = 0; i < dim; i++) {
if(ranges != null && ranges[i] != null) {
if(dbTupel.doubleValue(i) < ranges[i].first || dbTupel.doubleValue(i) > ranges[i].second) {
diff --git a/src/de/lmu/ifi/dbs/elki/visualization/visualizers/parallel/selection/SelectionToolLineVisualization.java b/src/de/lmu/ifi/dbs/elki/visualization/visualizers/parallel/selection/SelectionToolLineVisualization.java index b7296492..907c8fc6 100644 --- a/src/de/lmu/ifi/dbs/elki/visualization/visualizers/parallel/selection/SelectionToolLineVisualization.java +++ b/src/de/lmu/ifi/dbs/elki/visualization/visualizers/parallel/selection/SelectionToolLineVisualization.java @@ -77,8 +77,7 @@ public class SelectionToolLineVisualization extends AbstractVisFactory { }
/**
- * Constructor, adhering to
- * {@link de.lmu.ifi.dbs.elki.utilities.optionhandling.Parameterizable}
+ * Constructor. */
public SelectionToolLineVisualization() {
super();
@@ -115,7 +114,7 @@ public class SelectionToolLineVisualization extends AbstractVisFactory { * @apiviz.has SelectionResult oneway - - updates
* @apiviz.has DBIDSelection oneway - - updates
*/
- public class Instance extends AbstractParallelVisualization<NumberVector<?>> implements DragableArea.DragListener {
+ public class Instance extends AbstractParallelVisualization<NumberVector> implements DragableArea.DragListener {
/**
* CSS class of the selection rectangle while selecting.
*/
diff --git a/src/de/lmu/ifi/dbs/elki/visualization/visualizers/parallel/selection/package-info.java b/src/de/lmu/ifi/dbs/elki/visualization/visualizers/parallel/selection/package-info.java index 52acab59..4f763940 100644 --- a/src/de/lmu/ifi/dbs/elki/visualization/visualizers/parallel/selection/package-info.java +++ b/src/de/lmu/ifi/dbs/elki/visualization/visualizers/parallel/selection/package-info.java @@ -5,7 +5,7 @@ This file is part of ELKI: Environment for Developing KDD-Applications Supported by Index-Structures - Copyright (C) 2013 + Copyright (C) 2014 Ludwig-Maximilians-Universität München Lehr- und Forschungseinheit für Datenbanksysteme ELKI Development Team diff --git a/src/de/lmu/ifi/dbs/elki/visualization/visualizers/scatterplot/AbstractScatterplotVisualization.java b/src/de/lmu/ifi/dbs/elki/visualization/visualizers/scatterplot/AbstractScatterplotVisualization.java index 1f2d89d7..13c6c669 100644 --- a/src/de/lmu/ifi/dbs/elki/visualization/visualizers/scatterplot/AbstractScatterplotVisualization.java +++ b/src/de/lmu/ifi/dbs/elki/visualization/visualizers/scatterplot/AbstractScatterplotVisualization.java @@ -4,7 +4,7 @@ package de.lmu.ifi.dbs.elki.visualization.visualizers.scatterplot; This file is part of ELKI: Environment for Developing KDD-Applications Supported by Index-Structures - Copyright (C) 2013 + Copyright (C) 2014 Ludwig-Maximilians-Universität München Lehr- und Forschungseinheit für Datenbanksysteme ELKI Development Team @@ -56,7 +56,7 @@ public abstract class AbstractScatterplotVisualization extends AbstractVisualiza /** * The representation we visualize */ - final protected Relation<? extends NumberVector<?>> rel; + final protected Relation<? extends NumberVector> rel; /** * The DBID sample diff --git a/src/de/lmu/ifi/dbs/elki/visualization/visualizers/scatterplot/AbstractTooltipVisualization.java b/src/de/lmu/ifi/dbs/elki/visualization/visualizers/scatterplot/AbstractTooltipVisualization.java index 61bff7d4..4bfe80d2 100644 --- a/src/de/lmu/ifi/dbs/elki/visualization/visualizers/scatterplot/AbstractTooltipVisualization.java +++ b/src/de/lmu/ifi/dbs/elki/visualization/visualizers/scatterplot/AbstractTooltipVisualization.java @@ -4,7 +4,7 @@ package de.lmu.ifi.dbs.elki.visualization.visualizers.scatterplot; This file is part of ELKI: Environment for Developing KDD-Applications Supported by Index-Structures - Copyright (C) 2013 + Copyright (C) 2014 Ludwig-Maximilians-Universität München Lehr- und Forschungseinheit für Datenbanksysteme ELKI Development Team diff --git a/src/de/lmu/ifi/dbs/elki/visualization/visualizers/scatterplot/AxisVisualization.java b/src/de/lmu/ifi/dbs/elki/visualization/visualizers/scatterplot/AxisVisualization.java index dd3f2218..e88ba006 100644 --- a/src/de/lmu/ifi/dbs/elki/visualization/visualizers/scatterplot/AxisVisualization.java +++ b/src/de/lmu/ifi/dbs/elki/visualization/visualizers/scatterplot/AxisVisualization.java @@ -4,7 +4,7 @@ package de.lmu.ifi.dbs.elki.visualization.visualizers.scatterplot; This file is part of ELKI: Environment for Developing KDD-Applications Supported by Index-Structures - Copyright (C) 2013 + Copyright (C) 2014 Ludwig-Maximilians-Universität München Lehr- und Forschungseinheit für Datenbanksysteme ELKI Development Team diff --git a/src/de/lmu/ifi/dbs/elki/visualization/visualizers/scatterplot/MarkerVisualization.java b/src/de/lmu/ifi/dbs/elki/visualization/visualizers/scatterplot/MarkerVisualization.java index 8a3d0849..9c899238 100644 --- a/src/de/lmu/ifi/dbs/elki/visualization/visualizers/scatterplot/MarkerVisualization.java +++ b/src/de/lmu/ifi/dbs/elki/visualization/visualizers/scatterplot/MarkerVisualization.java @@ -4,7 +4,7 @@ package de.lmu.ifi.dbs.elki.visualization.visualizers.scatterplot; This file is part of ELKI: Environment for Developing KDD-Applications Supported by Index-Structures - Copyright (C) 2013 + Copyright (C) 2014 Ludwig-Maximilians-Universität München Lehr- und Forschungseinheit für Datenbanksysteme ELKI Development Team @@ -64,8 +64,7 @@ public class MarkerVisualization extends AbstractVisFactory { private static final String NAME = "Markers"; /** - * Constructor, adhering to - * {@link de.lmu.ifi.dbs.elki.utilities.optionhandling.Parameterizable} + * Constructor. */ public MarkerVisualization() { super(); @@ -145,7 +144,7 @@ public class MarkerVisualization extends AbstractVisFactory { continue; // TODO: can we test more efficiently than this? } try { - final NumberVector<?> vec = rel.get(iter); + final NumberVector vec = rel.get(iter); double[] v = proj.fastProjectDataToRenderSpace(vec); if(v[0] != v[0] || v[1] != v[1]) { continue; // NaN! diff --git a/src/de/lmu/ifi/dbs/elki/visualization/visualizers/scatterplot/PolygonVisualization.java b/src/de/lmu/ifi/dbs/elki/visualization/visualizers/scatterplot/PolygonVisualization.java index 8037eae6..2c7c90b4 100644 --- a/src/de/lmu/ifi/dbs/elki/visualization/visualizers/scatterplot/PolygonVisualization.java +++ b/src/de/lmu/ifi/dbs/elki/visualization/visualizers/scatterplot/PolygonVisualization.java @@ -4,7 +4,7 @@ package de.lmu.ifi.dbs.elki.visualization.visualizers.scatterplot; This file is part of ELKI: Environment for Developing KDD-Applications Supported by Index-Structures - Copyright (C) 2013 + Copyright (C) 2014 Ludwig-Maximilians-Universität München Lehr- und Forschungseinheit für Datenbanksysteme ELKI Development Team diff --git a/src/de/lmu/ifi/dbs/elki/visualization/visualizers/scatterplot/ReferencePointsVisualization.java b/src/de/lmu/ifi/dbs/elki/visualization/visualizers/scatterplot/ReferencePointsVisualization.java index b3a66582..8ea851de 100644 --- a/src/de/lmu/ifi/dbs/elki/visualization/visualizers/scatterplot/ReferencePointsVisualization.java +++ b/src/de/lmu/ifi/dbs/elki/visualization/visualizers/scatterplot/ReferencePointsVisualization.java @@ -4,7 +4,7 @@ package de.lmu.ifi.dbs.elki.visualization.visualizers.scatterplot; This file is part of ELKI: Environment for Developing KDD-Applications Supported by Index-Structures - Copyright (C) 2013 + Copyright (C) 2014 Ludwig-Maximilians-Universität München Lehr- und Forschungseinheit für Datenbanksysteme ELKI Development Team @@ -59,8 +59,7 @@ public class ReferencePointsVisualization extends AbstractVisFactory { private static final String NAME = "Reference Points"; /** - * Constructor, adhering to - * {@link de.lmu.ifi.dbs.elki.utilities.optionhandling.Parameterizable} + * Constructor. */ public ReferencePointsVisualization() { super(); @@ -104,7 +103,7 @@ public class ReferencePointsVisualization extends AbstractVisFactory { /** * Serves reference points. */ - protected ReferencePointsResult<? extends NumberVector<?>> result; + protected ReferencePointsResult<? extends NumberVector> result; /** * Constructor. @@ -121,11 +120,11 @@ public class ReferencePointsVisualization extends AbstractVisFactory { public void redraw() { final StyleLibrary style = context.getStyleResult().getStyleLibrary(); setupCSS(svgp); - Iterator<? extends NumberVector<?>> iter = result.iterator(); + Iterator<? extends NumberVector> iter = result.iterator(); final double dotsize = style.getSize(StyleLibrary.REFERENCE_POINTS); while(iter.hasNext()) { - NumberVector<?> v = iter.next(); + NumberVector v = iter.next(); double[] projected = proj.fastProjectDataToRenderSpace(v); Element dot = svgp.svgCircle(projected[0], projected[1], dotsize); SVGUtil.addCSSClass(dot, REFPOINT); diff --git a/src/de/lmu/ifi/dbs/elki/visualization/visualizers/scatterplot/TooltipScoreVisualization.java b/src/de/lmu/ifi/dbs/elki/visualization/visualizers/scatterplot/TooltipScoreVisualization.java index 45351aec..eb011a26 100644 --- a/src/de/lmu/ifi/dbs/elki/visualization/visualizers/scatterplot/TooltipScoreVisualization.java +++ b/src/de/lmu/ifi/dbs/elki/visualization/visualizers/scatterplot/TooltipScoreVisualization.java @@ -4,7 +4,7 @@ package de.lmu.ifi.dbs.elki.visualization.visualizers.scatterplot; This file is part of ELKI: Environment for Developing KDD-Applications Supported by Index-Structures - Copyright (C) 2013 + Copyright (C) 2014 Ludwig-Maximilians-Universität München Lehr- und Forschungseinheit für Datenbanksysteme ELKI Development Team diff --git a/src/de/lmu/ifi/dbs/elki/visualization/visualizers/scatterplot/TooltipStringVisualization.java b/src/de/lmu/ifi/dbs/elki/visualization/visualizers/scatterplot/TooltipStringVisualization.java index 42da21d9..b3745504 100644 --- a/src/de/lmu/ifi/dbs/elki/visualization/visualizers/scatterplot/TooltipStringVisualization.java +++ b/src/de/lmu/ifi/dbs/elki/visualization/visualizers/scatterplot/TooltipStringVisualization.java @@ -4,7 +4,7 @@ package de.lmu.ifi.dbs.elki.visualization.visualizers.scatterplot; This file is part of ELKI: Environment for Developing KDD-Applications Supported by Index-Structures - Copyright (C) 2013 + Copyright (C) 2014 Ludwig-Maximilians-Universität München Lehr- und Forschungseinheit für Datenbanksysteme ELKI Development Team @@ -78,8 +78,7 @@ public class TooltipStringVisualization extends AbstractVisFactory { public static final String NAME_EID = "External ID Tooltips"; /** - * Constructor, adhering to - * {@link de.lmu.ifi.dbs.elki.utilities.optionhandling.Parameterizable} + * Constructor. */ public TooltipStringVisualization() { super(); diff --git a/src/de/lmu/ifi/dbs/elki/visualization/visualizers/scatterplot/cluster/ClusterHullVisualization.java b/src/de/lmu/ifi/dbs/elki/visualization/visualizers/scatterplot/cluster/ClusterHullVisualization.java index 9436b25c..54e715d6 100644 --- a/src/de/lmu/ifi/dbs/elki/visualization/visualizers/scatterplot/cluster/ClusterHullVisualization.java +++ b/src/de/lmu/ifi/dbs/elki/visualization/visualizers/scatterplot/cluster/ClusterHullVisualization.java @@ -86,7 +86,7 @@ public class ClusterHullVisualization extends AbstractVisFactory { /**
* A short name characterizing this Visualizer.
*/
- private static final String NAME = "Cluster Hull Visualization";
+ private static final String NAME = "Cluster Hull (Scatterplot)";
/**
* Settings
@@ -114,13 +114,13 @@ public class ClusterHullVisualization extends AbstractVisFactory { // We attach ourselves to the style library, not the clustering, so there is
// only one hull.
Collection<StyleResult> styleres = ResultUtil.filterResults(result, StyleResult.class);
- for (StyleResult c : styleres) {
+ for(StyleResult s : styleres) {
Collection<ScatterPlotProjector<?>> ps = ResultUtil.filterResults(baseResult, ScatterPlotProjector.class);
- for (ScatterPlotProjector<?> p : ps) {
- final VisualizationTask task = new VisualizationTask(NAME, c, p.getRelation(), this);
+ for(ScatterPlotProjector<?> p : ps) {
+ final VisualizationTask task = new VisualizationTask(NAME, s, p.getRelation(), this);
task.level = VisualizationTask.LEVEL_DATA - 1;
task.initDefaultVisibility(false);
- baseResult.getHierarchy().add(c, task);
+ baseResult.getHierarchy().add(s, task);
baseResult.getHierarchy().add(p, task);
}
}
@@ -162,7 +162,7 @@ public class ClusterHullVisualization extends AbstractVisFactory { @Override
protected void redraw() {
final StylingPolicy spol = style.getStylingPolicy();
- if (!(spol instanceof ClusterStylingPolicy)) {
+ if(!(spol instanceof ClusterStylingPolicy)) {
return;
}
final ClusterStylingPolicy cpol = (ClusterStylingPolicy) spol;
@@ -181,20 +181,19 @@ public class ClusterHullVisualization extends AbstractVisFactory { double baseopacity = flat ? 0.5 : 0.5;
// Convex hull mode:
- if (settings.alpha >= Double.POSITIVE_INFINITY) {
+ if(settings.alpha >= Double.POSITIVE_INFINITY) {
// Build the convex hulls (reusing the hulls of nested clusters!)
Map<Object, DoubleObjPair<Polygon>> hullmap = new HashMap<>(clusters.size());
- for (Cluster<Model> clu : topc) {
+ for(Cluster<Model> clu : topc) {
buildHullsRecursively(clu, hier, hullmap);
}
// This way, we draw each cluster only once.
// Unfortunately, not depth ordered (TODO!)
- for (Cluster<Model> clu : clusters) {
+ for(Cluster<Model> clu : clusters) {
DoubleObjPair<Polygon> pair = hullmap.get(clu), mpair = hullmap.get(clu.getModel());
- ;
// Plot the convex hull:
- if (pair != null && pair.second != null && pair.second.size() > 1) {
+ if(pair != null && pair.second != null && pair.second.size() > 1) {
SVGPath path = new SVGPath(pair.second);
// Approximate area (using bounding box)
double hullarea = SpatialUtil.volume(pair.second);
@@ -209,7 +208,7 @@ public class ClusterHullVisualization extends AbstractVisFactory { layer.appendChild(hulls);
}
// For core density models, over-plot the core:
- if (mpair != null && mpair.second != null && mpair.second.size() > 1) {
+ if(mpair != null && mpair.second != null && mpair.second.size() > 1) {
SVGPath path = new SVGPath(mpair.second);
// Approximate area (using bounding box)
double hullarea = SpatialUtil.volume(mpair.second);
@@ -223,25 +222,27 @@ public class ClusterHullVisualization extends AbstractVisFactory { layer.appendChild(hulls);
}
}
- } else {
+ }
+ else {
// Alpha shape mode.
// For alpha shapes we can't use the shortcut of convex hulls,
// but have to revisit all child clusters.
- for (Cluster<Model> clu : clusters) {
+ for(Cluster<Model> clu : clusters) {
ArrayList<Vector> ps = new ArrayList<>();
double weight = addRecursively(ps, hier, clu);
List<Polygon> polys;
- if (ps.size() < 1) {
+ if(ps.size() < 1) {
continue;
}
- if (ps.size() > 2) {
+ if(ps.size() > 2) {
polys = (new AlphaShape(ps, settings.alpha * Projection.SCALE)).compute();
- } else {
+ }
+ else {
// Trivial polygon. Might still degenerate to a single point though.
polys = new ArrayList<>(1);
polys.add(new Polygon(ps));
}
- for (Polygon p : polys) {
+ for(Polygon p : polys) {
SVGPath path = new SVGPath(p);
Element hulls = path.makeElement(svgp);
addCSSClasses(svgp, cpol.getStyleForCluster(clu), baseopacity * weight / rel.size());
@@ -264,43 +265,43 @@ public class ClusterHullVisualization extends AbstractVisFactory { final DBIDs ids = clu.getIDs();
boolean coremodel = false;
DBIDs cids = null;
- if (model instanceof CoreObjectsModel) {
+ if(model instanceof CoreObjectsModel) {
cids = ((CoreObjectsModel) model).getCoreObjects();
coremodel = cids.size() > 0;
}
GrahamScanConvexHull2D hull = new GrahamScanConvexHull2D();
GrahamScanConvexHull2D hull2 = coremodel ? new GrahamScanConvexHull2D() : null;
- for (DBIDIter iter = ids.iter(); iter.valid(); iter.advance()) {
+ for(DBIDIter iter = ids.iter(); iter.valid(); iter.advance()) {
final double[] projv = proj.fastProjectDataToRenderSpace(rel.get(iter));
if(projv[0] != projv[0] || projv[1] != projv[1]) {
continue; // NaN!
}
Vector projP = new Vector(projv);
hull.add(projP);
- if (coremodel && cids.contains(iter)) {
+ if(coremodel && cids.contains(iter)) {
hull2.add(projP);
}
}
double weight = ids.size(), cweight = coremodel ? cids.size() : 0.0;
- if (hier != null && hulls != null) {
+ if(hier != null && hulls != null) {
final int numc = hier.numChildren(clu);
- if (numc > 0) {
- for (Iter<Cluster<Model>> iter = hier.iterChildren(clu); iter.valid(); iter.advance()) {
+ if(numc > 0) {
+ for(Iter<Cluster<Model>> iter = hier.iterChildren(clu); iter.valid(); iter.advance()) {
final Cluster<Model> iclu = iter.get();
DoubleObjPair<Polygon> poly = hulls.get(iclu);
- if (poly == null) {
+ if(poly == null) {
poly = buildHullsRecursively(iclu, hier, hulls);
}
// Add inner convex hull to outer convex hull.
- for (ArrayListIter<Vector> vi = poly.second.iter(); vi.valid(); vi.advance()) {
+ for(ArrayListIter<Vector> vi = poly.second.iter(); vi.valid(); vi.advance()) {
hull.add(vi.get());
}
// For a core model, include the inner core, too.
- if (coremodel) {
+ if(coremodel) {
DoubleObjPair<Polygon> ipoly = hulls.get(iclu.getModel());
- if (ipoly != null) {
- for (ArrayListIter<Vector> vi = ipoly.second.iter(); vi.valid(); vi.advance()) {
+ if(ipoly != null) {
+ for(ArrayListIter<Vector> vi = ipoly.second.iter(); vi.valid(); vi.advance()) {
hull2.add(vi.get());
}
cweight += ipoly.first / numc;
@@ -312,7 +313,7 @@ public class ClusterHullVisualization extends AbstractVisFactory { }
DoubleObjPair<Polygon> pair = new DoubleObjPair<>(weight, hull.getHull());
hulls.put(clu, pair);
- if (coremodel) {
+ if(coremodel) {
hulls.put(model, new DoubleObjPair<>(cweight, hull2.getHull()));
}
return pair;
@@ -329,14 +330,14 @@ public class ClusterHullVisualization extends AbstractVisFactory { private double addRecursively(ArrayList<Vector> hull, Hierarchy<Cluster<Model>> hier, Cluster<Model> clus) {
final DBIDs ids = clus.getIDs();
double weight = ids.size();
- for (DBIDIter iter = ids.iter(); iter.valid(); iter.advance()) {
+ for(DBIDIter iter = ids.iter(); iter.valid(); iter.advance()) {
double[] projP = proj.fastProjectDataToRenderSpace(rel.get(iter));
if(projP[0] != projP[0] || projP[1] != projP[1]) {
continue; // NaN!
}
hull.add(new Vector(projP));
}
- for (Iter<Cluster<Model>> iter = hier.iterChildren(clus); iter.valid(); iter.advance()) {
+ for(Iter<Cluster<Model>> iter = hier.iterChildren(clus); iter.valid(); iter.advance()) {
weight += .5 * addRecursively(hull, hier, iter.get());
}
return weight;
@@ -352,7 +353,7 @@ public class ClusterHullVisualization extends AbstractVisFactory { ColorLibrary colors = style.getColorSet(StyleLibrary.PLOT);
CSSClass cls = new CSSClass(this, CLUSTERHULL + clusterID);
- cls.setStatement(SVGConstants.CSS_STROKE_WIDTH_PROPERTY, style.getLineWidth(StyleLibrary.PLOT));
+ cls.setStatement(SVGConstants.CSS_STROKE_WIDTH_PROPERTY, .5 * style.getLineWidth(StyleLibrary.PLOT));
final String color = colors.getColor(clusterID);
cls.setStatement(SVGConstants.CSS_STROKE_PROPERTY, color);
@@ -389,7 +390,7 @@ public class ClusterHullVisualization extends AbstractVisFactory { protected void makeOptions(Parameterization config) {
super.makeOptions(config);
DoubleParameter alphaP = new DoubleParameter(ALPHA_ID, Double.POSITIVE_INFINITY);
- if (config.grab(alphaP)) {
+ if(config.grab(alphaP)) {
alpha = alphaP.doubleValue();
}
}
diff --git a/src/de/lmu/ifi/dbs/elki/visualization/visualizers/scatterplot/cluster/ClusterMeanVisualization.java b/src/de/lmu/ifi/dbs/elki/visualization/visualizers/scatterplot/cluster/ClusterMeanVisualization.java index c07e5dca..5a7d8702 100644 --- a/src/de/lmu/ifi/dbs/elki/visualization/visualizers/scatterplot/cluster/ClusterMeanVisualization.java +++ b/src/de/lmu/ifi/dbs/elki/visualization/visualizers/scatterplot/cluster/ClusterMeanVisualization.java @@ -31,7 +31,6 @@ import org.w3c.dom.Element; import de.lmu.ifi.dbs.elki.data.Cluster;
import de.lmu.ifi.dbs.elki.data.Clustering;
-import de.lmu.ifi.dbs.elki.data.NumberVector;
import de.lmu.ifi.dbs.elki.data.model.MeanModel;
import de.lmu.ifi.dbs.elki.data.model.MedoidModel;
import de.lmu.ifi.dbs.elki.data.model.Model;
@@ -164,8 +163,7 @@ public class ClusterMeanVisualization extends AbstractVisFactory { Model model = clus.getModel();
double[] mean;
if(model instanceof MeanModel) {
- @SuppressWarnings("unchecked")
- MeanModel<? extends NumberVector<?>> mmodel = (MeanModel<? extends NumberVector<?>>) model;
+ MeanModel mmodel = (MeanModel) model;
mean = proj.fastProjectDataToRenderSpace(mmodel.getMean());
}
else if(model instanceof MedoidModel) {
@@ -247,7 +245,7 @@ public class ClusterMeanVisualization extends AbstractVisFactory { */
private static boolean testMeanModel(Clustering<?> c) {
Model firstmodel = c.getAllClusters().get(0).getModel();
- if(firstmodel instanceof MeanModel<?>) {
+ if(firstmodel instanceof MeanModel) {
return true;
}
if(firstmodel instanceof MedoidModel) {
diff --git a/src/de/lmu/ifi/dbs/elki/visualization/visualizers/scatterplot/cluster/ClusterOrderVisualization.java b/src/de/lmu/ifi/dbs/elki/visualization/visualizers/scatterplot/cluster/ClusterOrderVisualization.java index 339b7c41..b277824e 100644 --- a/src/de/lmu/ifi/dbs/elki/visualization/visualizers/scatterplot/cluster/ClusterOrderVisualization.java +++ b/src/de/lmu/ifi/dbs/elki/visualization/visualizers/scatterplot/cluster/ClusterOrderVisualization.java @@ -4,7 +4,7 @@ package de.lmu.ifi.dbs.elki.visualization.visualizers.scatterplot.cluster; This file is part of ELKI: Environment for Developing KDD-Applications Supported by Index-Structures - Copyright (C) 2013 + Copyright (C) 2014 Ludwig-Maximilians-Universität München Lehr- und Forschungseinheit für Datenbanksysteme ELKI Development Team @@ -27,14 +27,13 @@ import java.util.Collection; import org.w3c.dom.Element; +import de.lmu.ifi.dbs.elki.algorithm.clustering.optics.ClusterOrderEntry; +import de.lmu.ifi.dbs.elki.algorithm.clustering.optics.ClusterOrderResult; import de.lmu.ifi.dbs.elki.database.datastore.DataStoreListener; import de.lmu.ifi.dbs.elki.database.ids.DBID; -import de.lmu.ifi.dbs.elki.distance.distancevalue.DoubleDistance; import de.lmu.ifi.dbs.elki.result.HierarchicalResult; import de.lmu.ifi.dbs.elki.result.Result; import de.lmu.ifi.dbs.elki.result.ResultUtil; -import de.lmu.ifi.dbs.elki.result.optics.ClusterOrderEntry; -import de.lmu.ifi.dbs.elki.result.optics.ClusterOrderResult; import de.lmu.ifi.dbs.elki.visualization.VisualizationTask; import de.lmu.ifi.dbs.elki.visualization.css.CSSClass; import de.lmu.ifi.dbs.elki.visualization.projector.ScatterPlotProjector; @@ -60,8 +59,7 @@ public class ClusterOrderVisualization extends AbstractVisFactory { private static final String NAME = "Predecessor Graph"; /** - * Constructor, adhering to - * {@link de.lmu.ifi.dbs.elki.utilities.optionhandling.Parameterizable} + * Constructor. */ public ClusterOrderVisualization() { super(); @@ -74,8 +72,8 @@ public class ClusterOrderVisualization extends AbstractVisFactory { @Override public void processNewResult(HierarchicalResult baseResult, Result result) { - Collection<ClusterOrderResult<DoubleDistance>> cos = ResultUtil.filterResults(result, ClusterOrderResult.class); - for(ClusterOrderResult<DoubleDistance> co : cos) { + Collection<ClusterOrderResult<?>> cos = ResultUtil.filterResults(result, ClusterOrderResult.class); + for(ClusterOrderResult<?> co : cos) { Collection<ScatterPlotProjector<?>> ps = ResultUtil.filterResults(baseResult, ScatterPlotProjector.class); for(ScatterPlotProjector<?> p : ps) { final VisualizationTask task = new VisualizationTask(NAME, co, p.getRelation(), this); @@ -104,7 +102,7 @@ public class ClusterOrderVisualization extends AbstractVisFactory { /** * The result we visualize */ - protected ClusterOrderResult<?> result; + protected ClusterOrderResult<? extends ClusterOrderEntry<?>> result; public Instance(VisualizationTask task) { super(task); diff --git a/src/de/lmu/ifi/dbs/elki/visualization/visualizers/scatterplot/cluster/EMClusterVisualization.java b/src/de/lmu/ifi/dbs/elki/visualization/visualizers/scatterplot/cluster/EMClusterVisualization.java index 9a5df4e4..98dc004f 100644 --- a/src/de/lmu/ifi/dbs/elki/visualization/visualizers/scatterplot/cluster/EMClusterVisualization.java +++ b/src/de/lmu/ifi/dbs/elki/visualization/visualizers/scatterplot/cluster/EMClusterVisualization.java @@ -4,7 +4,7 @@ package de.lmu.ifi.dbs.elki.visualization.visualizers.scatterplot.cluster; This file is part of ELKI: Environment for Developing KDD-Applications Supported by Index-Structures - Copyright (C) 2013 + Copyright (C) 2014 Ludwig-Maximilians-Universität München Lehr- und Forschungseinheit für Datenbanksysteme ELKI Development Team @@ -32,8 +32,6 @@ import org.w3c.dom.Element; import de.lmu.ifi.dbs.elki.data.Cluster; import de.lmu.ifi.dbs.elki.data.Clustering; -import de.lmu.ifi.dbs.elki.data.DoubleVector; -import de.lmu.ifi.dbs.elki.data.NumberVector; import de.lmu.ifi.dbs.elki.data.model.EMModel; import de.lmu.ifi.dbs.elki.data.model.MeanModel; import de.lmu.ifi.dbs.elki.data.model.Model; @@ -71,7 +69,7 @@ import de.lmu.ifi.dbs.elki.visualization.visualizers.scatterplot.AbstractScatter * @author Robert Rödler * * @apiviz.stereotype factory - * @apiviz.uses EMClusterVisualization oneway - - «create» + * @apiviz.uses Instance oneway - - «create» */ public class EMClusterVisualization extends AbstractVisFactory { /** @@ -92,8 +90,8 @@ public class EMClusterVisualization extends AbstractVisFactory { } @Override - public Instance<DoubleVector> makeVisualization(VisualizationTask task) { - return new Instance<>(task); + public Instance makeVisualization(VisualizationTask task) { + return new Instance(task); } @Override @@ -103,7 +101,7 @@ public class EMClusterVisualization extends AbstractVisFactory { for(Clustering<?> c : clusterings) { if(c.getAllClusters().size() > 0) { // Does the cluster have a model with cluster means? - Clustering<MeanModel<DoubleVector>> mcls = findMeanModel(c); + Clustering<MeanModel> mcls = findMeanModel(c); if(mcls != null) { Collection<ScatterPlotProjector<?>> ps = ResultUtil.filterResults(baseResult, ScatterPlotProjector.class); for(ScatterPlotProjector<?> p : ps) { @@ -120,15 +118,14 @@ public class EMClusterVisualization extends AbstractVisFactory { /** * Test if the given clustering has a mean model. * - * @param <NV> Vector type * @param c Clustering to inspect * @return the clustering cast to return a mean model, null otherwise. */ @SuppressWarnings("unchecked") - private static <NV extends NumberVector<?>> Clustering<MeanModel<NV>> findMeanModel(Clustering<?> c) { + private static Clustering<MeanModel> findMeanModel(Clustering<?> c) { final Model firstModel = c.getAllClusters().get(0).getModel(); - if(c.getAllClusters().get(0).getModel() instanceof MeanModel<?> && firstModel instanceof EMModel<?>) { - return (Clustering<MeanModel<NV>>) c; + if(c.getAllClusters().get(0).getModel() instanceof MeanModel && firstModel instanceof EMModel) { + return (Clustering<MeanModel>) c; } return null; } @@ -140,12 +137,10 @@ public class EMClusterVisualization extends AbstractVisFactory { * * @apiviz.has EMModel oneway - - visualizes * @apiviz.uses GrahamScanConvexHull2D - * - * @param <NV> Type of the NumberVector being visualized. */ // TODO: nicer stacking of n-fold hulls // TODO: can we find a proper sphere for 3+ dimensions? - public class Instance<NV extends NumberVector<?>> extends AbstractScatterplotVisualization { + public class Instance extends AbstractScatterplotVisualization { /** * Generic tags to indicate the type of element. Used in IDs, CSS-Classes * etc. @@ -155,7 +150,7 @@ public class EMClusterVisualization extends AbstractVisFactory { /** * The result we work on */ - Clustering<EMModel<NV>> clustering; + Clustering<EMModel> clustering; private static final double KAPPA = SVGHyperSphere.EUCLIDEAN_KAPPA; @@ -187,16 +182,16 @@ public class EMClusterVisualization extends AbstractVisFactory { addCSSClasses(svgp); // PCARunner - PCARunner<NV> pcarun = ClassGenericsUtil.parameterizeOrAbort(PCARunner.class, new EmptyParameterization()); + PCARunner pcarun = ClassGenericsUtil.parameterizeOrAbort(PCARunner.class, new EmptyParameterization()); - Iterator<Cluster<EMModel<NV>>> ci = clustering.getAllClusters().iterator(); + Iterator<Cluster<EMModel>> ci = clustering.getAllClusters().iterator(); for(int cnum = 0; cnum < clustering.getAllClusters().size(); cnum++) { - Cluster<EMModel<NV>> clus = ci.next(); + Cluster<EMModel> clus = ci.next(); DBIDs ids = clus.getIDs(); if(ids.size() > 0) { Matrix covmat = clus.getModel().getCovarianceMatrix(); - NV centroid = clus.getModel().getMean(); + Vector centroid = clus.getModel().getMean(); Vector cent = new Vector(proj.fastProjectDataToRenderSpace(centroid)); // Compute the eigenvectors diff --git a/src/de/lmu/ifi/dbs/elki/visualization/visualizers/scatterplot/cluster/VoronoiVisualization.java b/src/de/lmu/ifi/dbs/elki/visualization/visualizers/scatterplot/cluster/VoronoiVisualization.java index 7c4b57f2..4c41759d 100644 --- a/src/de/lmu/ifi/dbs/elki/visualization/visualizers/scatterplot/cluster/VoronoiVisualization.java +++ b/src/de/lmu/ifi/dbs/elki/visualization/visualizers/scatterplot/cluster/VoronoiVisualization.java @@ -32,8 +32,6 @@ import org.w3c.dom.Element; import de.lmu.ifi.dbs.elki.data.Cluster;
import de.lmu.ifi.dbs.elki.data.Clustering;
-import de.lmu.ifi.dbs.elki.data.NumberVector;
-import de.lmu.ifi.dbs.elki.data.model.KMeansModel;
import de.lmu.ifi.dbs.elki.data.model.MeanModel;
import de.lmu.ifi.dbs.elki.data.model.MedoidModel;
import de.lmu.ifi.dbs.elki.data.model.Model;
@@ -152,7 +150,7 @@ public class VoronoiVisualization extends AbstractVisFactory { */
private static boolean testMeanModel(Clustering<?> c) {
Model firstmodel = c.getAllClusters().get(0).getModel();
- if (firstmodel instanceof KMeansModel<?>) {
+ if (firstmodel instanceof MeanModel) {
return true;
}
if (firstmodel instanceof MedoidModel) {
@@ -209,12 +207,11 @@ public class VoronoiVisualization extends AbstractVisFactory { Model model = clus.getModel();
double[] mean;
if (model instanceof MeanModel) {
- @SuppressWarnings("unchecked")
- MeanModel<? extends NumberVector<?>> mmodel = (MeanModel<? extends NumberVector<?>>) model;
- mean = proj.fastProjectDataToRenderSpace(mmodel.getMean());
+ MeanModel mmodel = (MeanModel) model;
+ mean = mmodel.getMean().getArrayRef();
} else if (model instanceof MedoidModel) {
MedoidModel mmodel = (MedoidModel) model;
- mean = proj.fastProjectDataToRenderSpace(rel.get(mmodel.getMedoid()));
+ mean = rel.get(mmodel.getMedoid()).getColumnVector().getArrayRef();
} else {
continue;
}
@@ -227,7 +224,8 @@ public class VoronoiVisualization extends AbstractVisFactory { layer.appendChild(path);
}
if (settings.mode == Mode.DELAUNAY || settings.mode == Mode.V_AND_D) {
- Element path = new SVGPath(means.get(0)).drawTo(means.get(1)).makeElement(svgp);
+ Element path = new SVGPath(proj.fastProjectDataToRenderSpace(means.get(0)))//
+ .drawTo(proj.fastProjectDataToRenderSpace(means.get(1))).makeElement(svgp);
SVGUtil.addCSSClass(path, KMEANSBORDER);
layer.appendChild(path);
}
@@ -239,8 +237,7 @@ public class VoronoiVisualization extends AbstractVisFactory { Model model = clus.getModel();
Vector mean;
if (model instanceof MeanModel) {
- @SuppressWarnings("unchecked")
- MeanModel<? extends NumberVector<?>> mmodel = (MeanModel<? extends NumberVector<?>>) model;
+ MeanModel mmodel = (MeanModel) model;
mean = mmodel.getMean().getColumnVector();
} else if (model instanceof MedoidModel) {
MedoidModel mmodel = (MedoidModel) model;
diff --git a/src/de/lmu/ifi/dbs/elki/visualization/visualizers/scatterplot/cluster/package-info.java b/src/de/lmu/ifi/dbs/elki/visualization/visualizers/scatterplot/cluster/package-info.java index 076b6563..3b0049dd 100644 --- a/src/de/lmu/ifi/dbs/elki/visualization/visualizers/scatterplot/cluster/package-info.java +++ b/src/de/lmu/ifi/dbs/elki/visualization/visualizers/scatterplot/cluster/package-info.java @@ -5,7 +5,7 @@ This file is part of ELKI: Environment for Developing KDD-Applications Supported by Index-Structures - Copyright (C) 2013 + Copyright (C) 2014 Ludwig-Maximilians-Universität München Lehr- und Forschungseinheit für Datenbanksysteme ELKI Development Team diff --git a/src/de/lmu/ifi/dbs/elki/visualization/visualizers/scatterplot/density/DensityEstimationOverlay.java b/src/de/lmu/ifi/dbs/elki/visualization/visualizers/scatterplot/density/DensityEstimationOverlay.java index a2b34e0e..e1e1872c 100644 --- a/src/de/lmu/ifi/dbs/elki/visualization/visualizers/scatterplot/density/DensityEstimationOverlay.java +++ b/src/de/lmu/ifi/dbs/elki/visualization/visualizers/scatterplot/density/DensityEstimationOverlay.java @@ -4,7 +4,7 @@ package de.lmu.ifi.dbs.elki.visualization.visualizers.scatterplot.density; This file is part of ELKI: Environment for Developing KDD-Applications Supported by Index-Structures - Copyright (C) 2013 + Copyright (C) 2014 Ludwig-Maximilians-Universität München Lehr- und Forschungseinheit für Datenbanksysteme ELKI Development Team @@ -63,8 +63,7 @@ public class DensityEstimationOverlay extends AbstractVisFactory { private static final String NAME = "Density estimation overlay"; /** - * Constructor, adhering to - * {@link de.lmu.ifi.dbs.elki.utilities.optionhandling.Parameterizable} + * Constructor. */ public DensityEstimationOverlay() { super(); @@ -134,7 +133,9 @@ public class DensityEstimationOverlay extends AbstractVisFactory { layer.appendChild(itag); } - @Reference(authors = "D. W. Scott", title = "Multivariate density estimation", booktitle = "Multivariate Density Estimation: Theory, Practice, and Visualization", url = "http://dx.doi.org/10.1002/9780470316849.fmatter") + @Reference(authors = "D. W. Scott", title = "Multivariate density estimation: Theory, Practice, and Visualization", // + booktitle = "Multivariate Density Estimation: Theory, Practice, and Visualization", // + url = "http://dx.doi.org/10.1002/9780470316849") private double[] initializeBandwidth(double[][] data) { MeanVariance mv0 = new MeanVariance(); MeanVariance mv1 = new MeanVariance(); diff --git a/src/de/lmu/ifi/dbs/elki/visualization/visualizers/scatterplot/index/TreeMBRVisualization.java b/src/de/lmu/ifi/dbs/elki/visualization/visualizers/scatterplot/index/TreeMBRVisualization.java index 438eddb8..6b926525 100644 --- a/src/de/lmu/ifi/dbs/elki/visualization/visualizers/scatterplot/index/TreeMBRVisualization.java +++ b/src/de/lmu/ifi/dbs/elki/visualization/visualizers/scatterplot/index/TreeMBRVisualization.java @@ -4,7 +4,7 @@ package de.lmu.ifi.dbs.elki.visualization.visualizers.scatterplot.index; This file is part of ELKI: Environment for Developing KDD-Applications Supported by Index-Structures - Copyright (C) 2013 + Copyright (C) 2014 Ludwig-Maximilians-Universität München Lehr- und Forschungseinheit für Datenbanksysteme ELKI Development Team @@ -103,6 +103,7 @@ public class TreeMBRVisualization extends AbstractVisFactory { for(ScatterPlotProjector<?> p : ps) { final VisualizationTask task = new VisualizationTask(NAME, (Result) tree, p.getRelation(), this); task.level = VisualizationTask.LEVEL_BACKGROUND + 1; + task.initDefaultVisibility(false); baseResult.getHierarchy().add((Result) tree, task); baseResult.getHierarchy().add(p, task); } diff --git a/src/de/lmu/ifi/dbs/elki/visualization/visualizers/scatterplot/index/TreeSphereVisualization.java b/src/de/lmu/ifi/dbs/elki/visualization/visualizers/scatterplot/index/TreeSphereVisualization.java index 4ced6de1..4b4e77a0 100644 --- a/src/de/lmu/ifi/dbs/elki/visualization/visualizers/scatterplot/index/TreeSphereVisualization.java +++ b/src/de/lmu/ifi/dbs/elki/visualization/visualizers/scatterplot/index/TreeSphereVisualization.java @@ -4,7 +4,7 @@ package de.lmu.ifi.dbs.elki.visualization.visualizers.scatterplot.index; This file is part of ELKI: Environment for Developing KDD-Applications Supported by Index-Structures - Copyright (C) 2013 + Copyright (C) 2014 Ludwig-Maximilians-Universität München Lehr- und Forschungseinheit für Datenbanksysteme ELKI Development Team @@ -35,8 +35,6 @@ import de.lmu.ifi.dbs.elki.distance.distancefunction.DistanceFunction; import de.lmu.ifi.dbs.elki.distance.distancefunction.minkowski.EuclideanDistanceFunction; import de.lmu.ifi.dbs.elki.distance.distancefunction.minkowski.LPNormDistanceFunction; import de.lmu.ifi.dbs.elki.distance.distancefunction.minkowski.ManhattanDistanceFunction; -import de.lmu.ifi.dbs.elki.distance.distancevalue.DoubleDistance; -import de.lmu.ifi.dbs.elki.distance.distancevalue.NumberDistance; import de.lmu.ifi.dbs.elki.index.tree.metrical.mtreevariants.AbstractMTree; import de.lmu.ifi.dbs.elki.index.tree.metrical.mtreevariants.AbstractMTreeNode; import de.lmu.ifi.dbs.elki.index.tree.metrical.mtreevariants.MTreeEntry; @@ -66,7 +64,7 @@ import de.lmu.ifi.dbs.elki.visualization.visualizers.scatterplot.AbstractScatter * @author Erich Schubert * * @apiviz.stereotype factory - * @apiviz.uses TreeSphereVisualization oneway - - «create» + * @apiviz.uses Instance oneway - - «create» */ public class TreeSphereVisualization extends AbstractVisFactory { /** @@ -106,12 +104,13 @@ public class TreeSphereVisualization extends AbstractVisFactory { @Override public void processNewResult(HierarchicalResult baseResult, Result result) { Collection<ScatterPlotProjector<?>> ps = ResultUtil.filterResults(baseResult, ScatterPlotProjector.class); - for (ScatterPlotProjector<?> p : ps) { - Collection<AbstractMTree<?, DoubleDistance, ?, ?, ?>> trees = ResultUtil.filterResults(result, AbstractMTree.class); - for (AbstractMTree<?, DoubleDistance, ?, ?, ?> tree : trees) { - if (canVisualize(tree) && tree instanceof Result) { + for(ScatterPlotProjector<?> p : ps) { + Collection<AbstractMTree<?, ?, ?, ?>> trees = ResultUtil.filterResults(result, AbstractMTree.class); + for(AbstractMTree<?, ?, ?, ?> tree : trees) { + if(canVisualize(tree) && tree instanceof Result) { final VisualizationTask task = new VisualizationTask(NAME, (Result) tree, p.getRelation(), this); task.level = VisualizationTask.LEVEL_BACKGROUND + 1; + task.initDefaultVisibility(false); baseResult.getHierarchy().add((Result) tree, task); baseResult.getHierarchy().add(p, task); } @@ -121,7 +120,7 @@ public class TreeSphereVisualization extends AbstractVisFactory { @Override public Visualization makeVisualization(VisualizationTask task) { - return new Instance<DoubleDistance, MTreeNode<Object, DoubleDistance>, MTreeEntry>(task); + return new Instance<MTreeNode<Object>, MTreeEntry>(task); } /** @@ -130,11 +129,11 @@ public class TreeSphereVisualization extends AbstractVisFactory { * @param tree Tree to visualize * @return p value */ - public static double getLPNormP(AbstractMTree<?, ?, ?, ?, ?> tree) { + public static double getLPNormP(AbstractMTree<?, ?, ?, ?> tree) { // Note: we deliberately lose generics here, so the compilers complain // less on the next typecheck and cast! - DistanceFunction<?, ?> distanceFunction = tree.getDistanceFunction(); - if (LPNormDistanceFunction.class.isInstance(distanceFunction)) { + DistanceFunction<?> distanceFunction = tree.getDistanceFunction(); + if(LPNormDistanceFunction.class.isInstance(distanceFunction)) { return ((LPNormDistanceFunction) distanceFunction).getP(); } return 0; @@ -146,7 +145,7 @@ public class TreeSphereVisualization extends AbstractVisFactory { * @param tree Tree to visualize * @return whether the tree is visualizable */ - public static boolean canVisualize(AbstractMTree<?, ?, ?, ?, ?> tree) { + public static boolean canVisualize(AbstractMTree<?, ?, ?, ?> tree) { return getLPNormP(tree) > 0; } @@ -162,7 +161,7 @@ public class TreeSphereVisualization extends AbstractVisFactory { * @param <E> Tree entry type */ // TODO: listen for tree changes! - public class Instance<D extends NumberDistance<D, ?>, N extends AbstractMTreeNode<?, D, N, E>, E extends MTreeEntry> extends AbstractScatterplotVisualization implements DataStoreListener { + public class Instance<N extends AbstractMTreeNode<?, N, E>, E extends MTreeEntry> extends AbstractScatterplotVisualization implements DataStoreListener { protected double p; /** @@ -173,7 +172,7 @@ public class TreeSphereVisualization extends AbstractVisFactory { /** * The tree we visualize */ - protected AbstractMTree<?, D, N, E, ?> tree; + protected AbstractMTree<?, N, E, ?> tree; /** * Constructor @@ -196,28 +195,31 @@ public class TreeSphereVisualization extends AbstractVisFactory { ColorLibrary colors = style.getColorSet(StyleLibrary.PLOT); p = getLPNormP(tree); - if (tree != null) { - if (ManhattanDistanceFunction.class.isInstance(tree.getDistanceFunction())) { + if(tree != null) { + if(ManhattanDistanceFunction.class.isInstance(tree.getDistanceFunction())) { dist = Modus.MANHATTAN; - } else if (EuclideanDistanceFunction.class.isInstance(tree.getDistanceFunction())) { + } + else if(EuclideanDistanceFunction.class.isInstance(tree.getDistanceFunction())) { dist = Modus.EUCLIDEAN; - } else { + } + else { dist = Modus.LPCROSS; } E root = tree.getRootEntry(); final int mtheight = tree.getHeight(); - for (int i = 0; i < mtheight; i++) { + for(int i = 0; i < mtheight; i++) { CSSClass cls = new CSSClass(this, INDEX + i); // Relative depth of this level. 1.0 = toplevel final double relDepth = 1. - (((double) i) / mtheight); - if (settings.fill) { + if(settings.fill) { cls.setStatement(SVGConstants.CSS_STROKE_PROPERTY, colors.getColor(i)); cls.setStatement(SVGConstants.CSS_STROKE_WIDTH_PROPERTY, relDepth * style.getLineWidth(StyleLibrary.PLOT)); cls.setStatement(SVGConstants.CSS_FILL_PROPERTY, colors.getColor(i)); cls.setStatement(SVGConstants.CSS_FILL_OPACITY_PROPERTY, 0.1 / (projdim - 1)); cls.setStatement(SVGConstants.CSS_STROKE_LINECAP_PROPERTY, SVGConstants.CSS_ROUND_VALUE); cls.setStatement(SVGConstants.CSS_STROKE_LINEJOIN_PROPERTY, SVGConstants.CSS_ROUND_VALUE); - } else { + } + else { cls.setStatement(SVGConstants.CSS_STROKE_PROPERTY, colors.getColor(i)); cls.setStatement(SVGConstants.CSS_STROKE_WIDTH_PROPERTY, relDepth * style.getLineWidth(StyleLibrary.PLOT)); cls.setStatement(SVGConstants.CSS_FILL_PROPERTY, SVGConstants.CSS_NONE_VALUE); @@ -240,16 +242,17 @@ public class TreeSphereVisualization extends AbstractVisFactory { * @param entry Current entry * @param depth Current depth */ - private void visualizeMTreeEntry(SVGPlot svgp, Element layer, Projection2D proj, AbstractMTree<?, D, N, E, ?> mtree, E entry, int depth) { + private void visualizeMTreeEntry(SVGPlot svgp, Element layer, Projection2D proj, AbstractMTree<?, N, E, ?> mtree, E entry, int depth) { DBID roid = entry.getRoutingObjectID(); - if (roid != null) { - NumberVector<?> ro = rel.get(roid); + if(roid != null) { + NumberVector ro = rel.get(roid); double rad = entry.getCoveringRadius(); final Element r; - if (dist == Modus.MANHATTAN) { + if(dist == Modus.MANHATTAN) { r = SVGHyperSphere.drawManhattan(svgp, proj, ro, rad); - } else if (dist == Modus.EUCLIDEAN) { + } + else if(dist == Modus.EUCLIDEAN) { r = SVGHyperSphere.drawEuclidean(svgp, proj, ro, rad); } // TODO: add visualizer for infinity norm? @@ -261,11 +264,11 @@ public class TreeSphereVisualization extends AbstractVisFactory { layer.appendChild(r); } - if (!entry.isLeafEntry()) { + if(!entry.isLeafEntry()) { N node = mtree.getNode(entry); - for (int i = 0; i < node.getNumEntries(); i++) { + for(int i = 0; i < node.getNumEntries(); i++) { E child = node.getEntry(i); - if (!child.isLeafEntry()) { + if(!child.isLeafEntry()) { visualizeMTreeEntry(svgp, layer, proj, mtree, child, depth + 1); } } @@ -293,7 +296,7 @@ public class TreeSphereVisualization extends AbstractVisFactory { protected void makeOptions(Parameterization config) { super.makeOptions(config); Flag fillF = new Flag(TreeMBRVisualization.Parameterizer.FILL_ID); - if (config.grab(fillF)) { + if(config.grab(fillF)) { fill = fillF.isTrue(); } } diff --git a/src/de/lmu/ifi/dbs/elki/visualization/visualizers/scatterplot/index/package-info.java b/src/de/lmu/ifi/dbs/elki/visualization/visualizers/scatterplot/index/package-info.java index b82e9359..c47c6fbd 100644 --- a/src/de/lmu/ifi/dbs/elki/visualization/visualizers/scatterplot/index/package-info.java +++ b/src/de/lmu/ifi/dbs/elki/visualization/visualizers/scatterplot/index/package-info.java @@ -5,7 +5,7 @@ This file is part of ELKI: Environment for Developing KDD-Applications Supported by Index-Structures - Copyright (C) 2013 + Copyright (C) 2014 Ludwig-Maximilians-Universität München Lehr- und Forschungseinheit für Datenbanksysteme ELKI Development Team diff --git a/src/de/lmu/ifi/dbs/elki/visualization/visualizers/scatterplot/outlier/BubbleVisualization.java b/src/de/lmu/ifi/dbs/elki/visualization/visualizers/scatterplot/outlier/BubbleVisualization.java index 752cf333..bca3f634 100644 --- a/src/de/lmu/ifi/dbs/elki/visualization/visualizers/scatterplot/outlier/BubbleVisualization.java +++ b/src/de/lmu/ifi/dbs/elki/visualization/visualizers/scatterplot/outlier/BubbleVisualization.java @@ -4,7 +4,7 @@ package de.lmu.ifi.dbs.elki.visualization.visualizers.scatterplot.outlier; This file is part of ELKI: Environment for Developing KDD-Applications Supported by Index-Structures - Copyright (C) 2013 + Copyright (C) 2014 Ludwig-Maximilians-Universität München Lehr- und Forschungseinheit für Datenbanksysteme ELKI Development Team @@ -180,7 +180,7 @@ public class BubbleVisualization extends AbstractVisFactory { for(DBIDIter objId = sample.getSample().iter(); objId.valid(); objId.advance()) { final double radius = getScaledForId(objId); if(radius > 0.01 && !Double.isInfinite(radius)) { - final NumberVector<?> vec = rel.get(objId); + final NumberVector vec = rel.get(objId); if(vec != null) { double[] v = proj.fastProjectDataToRenderSpace(vec); if(v[0] != v[0] || v[1] != v[1]) { @@ -198,7 +198,7 @@ public class BubbleVisualization extends AbstractVisFactory { for(DBIDIter objId = sample.getSample().iter(); objId.valid(); objId.advance()) { final double radius = getScaledForId(objId); if(radius > 0.01 && !Double.isInfinite(radius)) { - final NumberVector<?> vec = rel.get(objId); + final NumberVector vec = rel.get(objId); if(vec != null) { double[] v = proj.fastProjectDataToRenderSpace(vec); if(v[0] != v[0] || v[1] != v[1]) { @@ -270,7 +270,7 @@ public class BubbleVisualization extends AbstractVisFactory { * by the given scales. */ protected double getScaledForId(DBIDRef id) { - double d = result.getScores().get(id).doubleValue(); + double d = result.getScores().doubleValue(id); if(Double.isNaN(d) || Double.isInfinite(d)) { return 0.0; } diff --git a/src/de/lmu/ifi/dbs/elki/visualization/visualizers/scatterplot/outlier/COPVectorVisualization.java b/src/de/lmu/ifi/dbs/elki/visualization/visualizers/scatterplot/outlier/COPVectorVisualization.java index e62f0c3d..f169b0a8 100644 --- a/src/de/lmu/ifi/dbs/elki/visualization/visualizers/scatterplot/outlier/COPVectorVisualization.java +++ b/src/de/lmu/ifi/dbs/elki/visualization/visualizers/scatterplot/outlier/COPVectorVisualization.java @@ -4,7 +4,7 @@ package de.lmu.ifi.dbs.elki.visualization.visualizers.scatterplot.outlier; This file is part of ELKI: Environment for Developing KDD-Applications Supported by Index-Structures - Copyright (C) 2013 + Copyright (C) 2014 Ludwig-Maximilians-Universität München Lehr- und Forschungseinheit für Datenbanksysteme ELKI Development Team @@ -152,7 +152,7 @@ public class COPVectorVisualization extends AbstractVisFactory { if (VMath.euclideanLength(ev) < 0.01) { continue; } - final NumberVector<?> vec = rel.get(objId); + final NumberVector vec = rel.get(objId); if (vec == null) { continue; } diff --git a/src/de/lmu/ifi/dbs/elki/visualization/visualizers/scatterplot/outlier/package-info.java b/src/de/lmu/ifi/dbs/elki/visualization/visualizers/scatterplot/outlier/package-info.java index f8da2afd..d0f5fa0f 100644 --- a/src/de/lmu/ifi/dbs/elki/visualization/visualizers/scatterplot/outlier/package-info.java +++ b/src/de/lmu/ifi/dbs/elki/visualization/visualizers/scatterplot/outlier/package-info.java @@ -5,7 +5,7 @@ This file is part of ELKI: Environment for Developing KDD-Applications Supported by Index-Structures - Copyright (C) 2013 + Copyright (C) 2014 Ludwig-Maximilians-Universität München Lehr- und Forschungseinheit für Datenbanksysteme ELKI Development Team diff --git a/src/de/lmu/ifi/dbs/elki/visualization/visualizers/scatterplot/selection/DistanceFunctionVisualization.java b/src/de/lmu/ifi/dbs/elki/visualization/visualizers/scatterplot/selection/DistanceFunctionVisualization.java index 38dc973f..40fd96f9 100644 --- a/src/de/lmu/ifi/dbs/elki/visualization/visualizers/scatterplot/selection/DistanceFunctionVisualization.java +++ b/src/de/lmu/ifi/dbs/elki/visualization/visualizers/scatterplot/selection/DistanceFunctionVisualization.java @@ -1,26 +1,27 @@ package de.lmu.ifi.dbs.elki.visualization.visualizers.scatterplot.selection;
-/* - This file is part of ELKI: +
+/*
+ This file is part of ELKI:
Environment for Developing KDD-Applications Supported by Index-Structures - - Copyright (C) 2013 - Ludwig-Maximilians-Universität München - Lehr- und Forschungseinheit für Datenbanksysteme +
+ Copyright (C) 2013
+ Ludwig-Maximilians-Universität München
+ Lehr- und Forschungseinheit für Datenbanksysteme
ELKI Development Team - - This program is free software: you can redistribute it and/or modify - it under the terms of the GNU Affero General Public License as published by - the Free Software Foundation, either version 3 of the License, or +
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU Affero General Public License as published by
+ the Free Software Foundation, either version 3 of the License, or
(at your option) any later version. - - This program 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. See the +
+ This program 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. See the
GNU Affero General Public License for more details. - - You should have received a copy of the GNU Affero General Public License - along with this program. If not, see <http://www.gnu.org/licenses/>. - */ +
+ You should have received a copy of the GNU Affero General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
import java.util.Collection;
@@ -32,15 +33,13 @@ import de.lmu.ifi.dbs.elki.data.VectorUtil; import de.lmu.ifi.dbs.elki.database.datastore.DataStoreListener;
import de.lmu.ifi.dbs.elki.database.ids.DBIDIter;
import de.lmu.ifi.dbs.elki.database.ids.DBIDs;
-import de.lmu.ifi.dbs.elki.database.ids.distance.DistanceDBIDPair;
-import de.lmu.ifi.dbs.elki.database.ids.distance.DistanceDBIDListIter;
-import de.lmu.ifi.dbs.elki.database.ids.distance.KNNList;
+import de.lmu.ifi.dbs.elki.database.ids.DoubleDBIDListIter;
+import de.lmu.ifi.dbs.elki.database.ids.DoubleDBIDPair;
+import de.lmu.ifi.dbs.elki.database.ids.KNNList;
import de.lmu.ifi.dbs.elki.distance.distancefunction.ArcCosineDistanceFunction;
import de.lmu.ifi.dbs.elki.distance.distancefunction.CosineDistanceFunction;
import de.lmu.ifi.dbs.elki.distance.distancefunction.DistanceFunction;
import de.lmu.ifi.dbs.elki.distance.distancefunction.minkowski.LPNormDistanceFunction;
-import de.lmu.ifi.dbs.elki.distance.distancevalue.DoubleDistance;
-import de.lmu.ifi.dbs.elki.distance.distancevalue.NumberDistance;
import de.lmu.ifi.dbs.elki.index.preprocessed.knn.AbstractMaterializeKNNPreprocessor;
import de.lmu.ifi.dbs.elki.logging.LoggingUtil;
import de.lmu.ifi.dbs.elki.math.MathUtil;
@@ -95,13 +94,13 @@ public class DistanceFunctionVisualization extends AbstractVisFactory { @Override
public Visualization makeVisualization(VisualizationTask task) {
- return new Instance<DoubleDistance>(task);
+ return new Instance(task);
}
@Override
public void processNewResult(HierarchicalResult baseResult, Result result) {
- Collection<AbstractMaterializeKNNPreprocessor<?, ?, ?>> kNNIndex = ResultUtil.filterResults(result, AbstractMaterializeKNNPreprocessor.class);
- for(AbstractMaterializeKNNPreprocessor<?, ?, ?> kNN : kNNIndex) {
+ Collection<AbstractMaterializeKNNPreprocessor<?>> kNNIndex = ResultUtil.filterResults(result, AbstractMaterializeKNNPreprocessor.class);
+ for(AbstractMaterializeKNNPreprocessor<?> kNN : kNNIndex) {
Collection<ScatterPlotProjector<?>> ps = ResultUtil.filterResults(baseResult, ScatterPlotProjector.class);
for(ScatterPlotProjector<?> p : ps) {
final VisualizationTask task = new VisualizationTask(NAME, kNN, p.getRelation(), this);
@@ -118,8 +117,8 @@ public class DistanceFunctionVisualization extends AbstractVisFactory { * @param kNN kNN preprocessor
* @return p of LP norm, or NaN
*/
- public static double getLPNormP(AbstractMaterializeKNNPreprocessor<?, ?, ?> kNN) {
- DistanceFunction<?, ?> distanceFunction = kNN.getDistanceQuery().getDistanceFunction();
+ public static double getLPNormP(AbstractMaterializeKNNPreprocessor<?> kNN) {
+ DistanceFunction<?> distanceFunction = kNN.getDistanceQuery().getDistanceFunction();
if(LPNormDistanceFunction.class.isInstance(distanceFunction)) {
return ((LPNormDistanceFunction) distanceFunction).getP();
}
@@ -132,8 +131,8 @@ public class DistanceFunctionVisualization extends AbstractVisFactory { * @param kNN kNN preprocessor
* @return true when angular
*/
- public static boolean isAngularDistance(AbstractMaterializeKNNPreprocessor<?, ?, ?> kNN) {
- DistanceFunction<?, ?> distanceFunction = kNN.getDistanceQuery().getDistanceFunction();
+ public static boolean isAngularDistance(AbstractMaterializeKNNPreprocessor<?> kNN) {
+ DistanceFunction<?> distanceFunction = kNN.getDistanceQuery().getDistanceFunction();
if(CosineDistanceFunction.class.isInstance(distanceFunction)) {
return true;
}
@@ -152,13 +151,13 @@ public class DistanceFunctionVisualization extends AbstractVisFactory { * @param angle Opening angle in radians
* @return path element
*/
- public static Element drawCosine(SVGPlot svgp, Projection2D proj, NumberVector<?> mid, double angle) {
+ public static Element drawCosine(SVGPlot svgp, Projection2D proj, NumberVector mid, double angle) {
// Project origin
double[] pointOfOrigin = proj.fastProjectDataToRenderSpace(new double[proj.getInputDimensionality()]);
-
+
// direction of the selected Point
double[] selPoint = proj.fastProjectDataToRenderSpace(mid);
-
+
double[] range1, range2;
{
// Rotation plane:
@@ -195,7 +194,7 @@ public class DistanceFunctionVisualization extends AbstractVisFactory { range1 = proj.fastProjectDataToRenderSpace(r1);
range2 = proj.fastProjectDataToRenderSpace(r2);
}
-
+
// Continue lines to viewport.
{
CanvasSize viewport = proj.estimateViewport();
@@ -213,7 +212,7 @@ public class DistanceFunctionVisualization extends AbstractVisFactory { VMath.timesEquals(start2, viewport.continueToMargin(range2, start2));
VMath.plusEquals(start1, range1);
VMath.plusEquals(start2, range2);
-
+
// TODO: add filled variant?
SVGPath path = new SVGPath();
path.moveTo(start1);
@@ -233,9 +232,8 @@ public class DistanceFunctionVisualization extends AbstractVisFactory { * @apiviz.has SelectionResult oneway - - visualizes
* @apiviz.has DBIDSelection oneway - - visualizes
*
- * @param <D> Distance type
*/
- public class Instance<D extends NumberDistance<D, ?>> extends AbstractScatterplotVisualization implements DataStoreListener {
+ public class Instance extends AbstractScatterplotVisualization implements DataStoreListener {
/**
* Generic tags to indicate the type of element. Used in IDs, CSS-Classes
* etc.
@@ -249,7 +247,7 @@ public class DistanceFunctionVisualization extends AbstractVisFactory { /**
* The selection result we work on
*/
- private AbstractMaterializeKNNPreprocessor<? extends NumberVector<?>, D, ?> result;
+ private AbstractMaterializeKNNPreprocessor<? extends NumberVector> result;
/**
* Constructor
@@ -277,18 +275,18 @@ public class DistanceFunctionVisualization extends AbstractVisFactory { DBIDs selection = selContext.getSelectedIds();
for(DBIDIter i = selection.iter(); i.valid(); i.advance()) {
- final KNNList<D> knn = result.get(i);
- for(DistanceDBIDListIter<D> iter = knn.iter(); iter.valid(); iter.advance()) {
+ final KNNList knn = result.get(i);
+ for(DoubleDBIDListIter iter = knn.iter(); iter.valid(); iter.advance()) {
try {
double[] v = proj.fastProjectDataToRenderSpace(rel.get(iter));
- if (v[0] != v[0] || v[1] != v[1]) {
+ if(v[0] != v[0] || v[1] != v[1]) {
continue; // NaN!
}
Element dot = svgp.svgCircle(v[0], v[1], size);
SVGUtil.addCSSClass(dot, KNNMARKER);
layer.appendChild(dot);
- Element lbl = svgp.svgText(v[0] + size, v[1] + size, iter.getDistance().toString());
+ Element lbl = svgp.svgText(v[0] + size, v[1] + size, Double.toString(iter.doubleValue()));
SVGUtil.addCSSClass(lbl, KNNDIST);
layer.appendChild(lbl);
}
@@ -297,21 +295,21 @@ public class DistanceFunctionVisualization extends AbstractVisFactory { }
}
// Last element
- DistanceDBIDPair<D> last = knn.get(knn.size() - 1);
+ DoubleDBIDPair last = knn.get(knn.size() - 1);
// Draw hypersphere if possible
{
final Element dist;
if(p == 1.0) {
- dist = SVGHyperSphere.drawManhattan(svgp, proj, rel.get(i), last.getDistance().doubleValue());
+ dist = SVGHyperSphere.drawManhattan(svgp, proj, rel.get(i), last.doubleValue());
}
else if(p == 2.0) {
- dist = SVGHyperSphere.drawEuclidean(svgp, proj, rel.get(i), last.getDistance().doubleValue());
+ dist = SVGHyperSphere.drawEuclidean(svgp, proj, rel.get(i), last.doubleValue());
}
else if(!Double.isNaN(p)) {
- dist = SVGHyperSphere.drawLp(svgp, proj, rel.get(i), last.getDistance().doubleValue(), p);
+ dist = SVGHyperSphere.drawLp(svgp, proj, rel.get(i), last.doubleValue(), p);
}
else if(angular) {
- final NumberVector<?> refvec = rel.get(i);
+ final NumberVector refvec = rel.get(i);
// Recompute the angle - it could be cosine or arccosine distance
double maxangle = Math.acos(VectorUtil.cosAngle(refvec, rel.get(last)));
dist = drawCosine(svgp, proj, refvec, maxangle);
diff --git a/src/de/lmu/ifi/dbs/elki/visualization/visualizers/scatterplot/selection/MoveObjectsToolVisualization.java b/src/de/lmu/ifi/dbs/elki/visualization/visualizers/scatterplot/selection/MoveObjectsToolVisualization.java index 0f9f99a4..7c49395c 100644 --- a/src/de/lmu/ifi/dbs/elki/visualization/visualizers/scatterplot/selection/MoveObjectsToolVisualization.java +++ b/src/de/lmu/ifi/dbs/elki/visualization/visualizers/scatterplot/selection/MoveObjectsToolVisualization.java @@ -160,7 +160,7 @@ public class MoveObjectsToolVisualization extends AbstractVisFactory { private void updateDB(DBIDs dbids, Vector movingVector) {
throw new AbortException("FIXME: INCOMPLETE TRANSITION");
/*
- * NumberVector<?> nv = null; database.accumulateDataStoreEvents();
+ * NumberVector nv = null; database.accumulateDataStoreEvents();
* Representation<DatabaseObjectMetadata> mrep =
* database.getMetadataQuery(); for(DBID dbid : dbids) { NV obj =
* database.get(dbid); // Copy metadata to keep DatabaseObjectMetadata
diff --git a/src/de/lmu/ifi/dbs/elki/visualization/visualizers/scatterplot/selection/SelectionToolCubeVisualization.java b/src/de/lmu/ifi/dbs/elki/visualization/visualizers/scatterplot/selection/SelectionToolCubeVisualization.java index f088d219..9289c350 100644 --- a/src/de/lmu/ifi/dbs/elki/visualization/visualizers/scatterplot/selection/SelectionToolCubeVisualization.java +++ b/src/de/lmu/ifi/dbs/elki/visualization/visualizers/scatterplot/selection/SelectionToolCubeVisualization.java @@ -76,8 +76,7 @@ public class SelectionToolCubeVisualization extends AbstractVisFactory { private static final String NAME = "Range Selection";
/**
- * Constructor, adhering to
- * {@link de.lmu.ifi.dbs.elki.utilities.optionhandling.Parameterizable}.
+ * Constructor. */
public SelectionToolCubeVisualization() {
super();
@@ -261,7 +260,7 @@ public class SelectionToolCubeVisualization extends AbstractVisFactory { selection.clear();
candidates: for (DBIDIter iditer = rel.iterDBIDs(); iditer.valid(); iditer.advance()) {
- NumberVector<?> dbTupel = rel.get(iditer);
+ NumberVector dbTupel = rel.get(iditer);
for (int i = 0; i < dim; i++) {
if (ranges != null && ranges[i] != null) {
if (dbTupel.doubleValue(i) < ranges[i].first || dbTupel.doubleValue(i) > ranges[i].second) {
diff --git a/src/de/lmu/ifi/dbs/elki/visualization/visualizers/scatterplot/selection/SelectionToolDotVisualization.java b/src/de/lmu/ifi/dbs/elki/visualization/visualizers/scatterplot/selection/SelectionToolDotVisualization.java index 6fa8200c..06b0e2ec 100644 --- a/src/de/lmu/ifi/dbs/elki/visualization/visualizers/scatterplot/selection/SelectionToolDotVisualization.java +++ b/src/de/lmu/ifi/dbs/elki/visualization/visualizers/scatterplot/selection/SelectionToolDotVisualization.java @@ -75,8 +75,7 @@ public class SelectionToolDotVisualization extends AbstractVisFactory { }
/**
- * Constructor, adhering to
- * {@link de.lmu.ifi.dbs.elki.utilities.optionhandling.Parameterizable}
+ * Constructor. */
public SelectionToolDotVisualization() {
super();
diff --git a/src/de/lmu/ifi/dbs/elki/visualization/visualizers/scatterplot/selection/package-info.java b/src/de/lmu/ifi/dbs/elki/visualization/visualizers/scatterplot/selection/package-info.java index 86214f53..00422c31 100644 --- a/src/de/lmu/ifi/dbs/elki/visualization/visualizers/scatterplot/selection/package-info.java +++ b/src/de/lmu/ifi/dbs/elki/visualization/visualizers/scatterplot/selection/package-info.java @@ -5,7 +5,7 @@ This file is part of ELKI: Environment for Developing KDD-Applications Supported by Index-Structures - Copyright (C) 2013 + Copyright (C) 2014 Ludwig-Maximilians-Universität München Lehr- und Forschungseinheit für Datenbanksysteme ELKI Development Team diff --git a/src/de/lmu/ifi/dbs/elki/visualization/visualizers/thumbs/ThumbnailThread.java b/src/de/lmu/ifi/dbs/elki/visualization/visualizers/thumbs/ThumbnailThread.java index bf210fce..48a2b900 100644 --- a/src/de/lmu/ifi/dbs/elki/visualization/visualizers/thumbs/ThumbnailThread.java +++ b/src/de/lmu/ifi/dbs/elki/visualization/visualizers/thumbs/ThumbnailThread.java @@ -4,7 +4,7 @@ package de.lmu.ifi.dbs.elki.visualization.visualizers.thumbs; This file is part of ELKI: Environment for Developing KDD-Applications Supported by Index-Structures - Copyright (C) 2013 + Copyright (C) 2014 Ludwig-Maximilians-Universität München Lehr- und Forschungseinheit für Datenbanksysteme ELKI Development Team diff --git a/src/de/lmu/ifi/dbs/elki/visualization/visualizers/thumbs/ThumbnailVisualization.java b/src/de/lmu/ifi/dbs/elki/visualization/visualizers/thumbs/ThumbnailVisualization.java index 651f41c0..8ade1819 100644 --- a/src/de/lmu/ifi/dbs/elki/visualization/visualizers/thumbs/ThumbnailVisualization.java +++ b/src/de/lmu/ifi/dbs/elki/visualization/visualizers/thumbs/ThumbnailVisualization.java @@ -4,7 +4,7 @@ package de.lmu.ifi.dbs.elki.visualization.visualizers.thumbs; This file is part of ELKI: Environment for Developing KDD-Applications Supported by Index-Structures - Copyright (C) 2013 + Copyright (C) 2014 Ludwig-Maximilians-Universität München Lehr- und Forschungseinheit für Datenbanksysteme ELKI Development Team diff --git a/src/de/lmu/ifi/dbs/elki/visualization/visualizers/visunproj/ClusterEvaluationVisualization.java b/src/de/lmu/ifi/dbs/elki/visualization/visualizers/visunproj/EvaluationVisualization.java index 8d87945e..ea2ba9bc 100644 --- a/src/de/lmu/ifi/dbs/elki/visualization/visualizers/visunproj/ClusterEvaluationVisualization.java +++ b/src/de/lmu/ifi/dbs/elki/visualization/visualizers/visunproj/EvaluationVisualization.java @@ -4,7 +4,7 @@ package de.lmu.ifi.dbs.elki.visualization.visualizers.visunproj; This file is part of ELKI: Environment for Developing KDD-Applications Supported by Index-Structures - Copyright (C) 2013 + Copyright (C) 2014 Ludwig-Maximilians-Universität München Lehr- und Forschungseinheit für Datenbanksysteme ELKI Development Team @@ -28,20 +28,11 @@ import java.util.ArrayList; import org.apache.batik.util.SVGConstants; import org.w3c.dom.Element; -import de.lmu.ifi.dbs.elki.data.Clustering; -import de.lmu.ifi.dbs.elki.evaluation.clustering.BCubed; -import de.lmu.ifi.dbs.elki.evaluation.clustering.ClusterContingencyTable; -import de.lmu.ifi.dbs.elki.evaluation.clustering.EditDistance; -import de.lmu.ifi.dbs.elki.evaluation.clustering.Entropy; -import de.lmu.ifi.dbs.elki.evaluation.clustering.EvaluateClustering; -import de.lmu.ifi.dbs.elki.evaluation.clustering.PairCounting; -import de.lmu.ifi.dbs.elki.evaluation.clustering.SetMatchingPurity; -import de.lmu.ifi.dbs.elki.math.MeanVariance; +import de.lmu.ifi.dbs.elki.result.EvaluationResult; import de.lmu.ifi.dbs.elki.result.HierarchicalResult; import de.lmu.ifi.dbs.elki.result.Result; import de.lmu.ifi.dbs.elki.result.ResultUtil; import de.lmu.ifi.dbs.elki.utilities.FormatUtil; -import de.lmu.ifi.dbs.elki.utilities.datastructures.hierarchy.Hierarchy; import de.lmu.ifi.dbs.elki.visualization.VisualizationTask; import de.lmu.ifi.dbs.elki.visualization.style.StyleLibrary; import de.lmu.ifi.dbs.elki.visualization.svg.SVGPlot; @@ -54,6 +45,10 @@ import de.lmu.ifi.dbs.elki.visualization.visualizers.Visualization; /** * Pseudo-Visualizer, that lists the cluster evaluation results found. * + * TODO: add indicator whether high values are better or low. + * + * TODO: add indication/warning when values are out-of-bounds. + * * @author Erich Schubert * @author Sascha Goldhofer * @@ -63,11 +58,11 @@ import de.lmu.ifi.dbs.elki.visualization.visualizers.Visualization; * de.lmu.ifi.dbs.elki.evaluation.clustering.EvaluateClustering.ScoreResult * oneway - - visualizes */ -public class ClusterEvaluationVisualization extends AbstractVisFactory { +public class EvaluationVisualization extends AbstractVisFactory { /** * Name for this visualizer. */ - private static final String NAME = "Cluster Evaluation"; + private static final String NAME = "Evaluation Bar Chart"; /** * Constant: width of score bars @@ -82,14 +77,14 @@ public class ClusterEvaluationVisualization extends AbstractVisFactory { /** * Constructor. */ - public ClusterEvaluationVisualization() { + public EvaluationVisualization() { super(); } @Override public void processNewResult(HierarchicalResult baseResult, Result newResult) { - final ArrayList<EvaluateClustering.ScoreResult> srs = ResultUtil.filterResults(newResult, EvaluateClustering.ScoreResult.class); - for (EvaluateClustering.ScoreResult sr : srs) { + final ArrayList<EvaluationResult> srs = ResultUtil.filterResults(newResult, EvaluationResult.class); + for(EvaluationResult sr : srs) { final VisualizationTask task = new VisualizationTask(NAME, sr, null, this); task.width = .4; task.height = 1.5; @@ -98,9 +93,9 @@ public class ClusterEvaluationVisualization extends AbstractVisFactory { } } - private double addBarChart(SVGPlot svgp, Element parent, double ypos, String label, double maxValue, double value) { + private double addBarChart(SVGPlot svgp, Element parent, double ypos, String label, double value, double minValue, double maxValue, double baseValue) { SVGScoreBar barchart = new SVGScoreBar(); - barchart.setFill(value, maxValue); + barchart.setFill(value, baseValue == baseValue ? baseValue : minValue, maxValue); barchart.showValues(FormatUtil.NF4); barchart.addLabel(label); parent.appendChild(barchart.build(svgp, 0.0, ypos, BARLENGTH, BARHEIGHT)); @@ -120,71 +115,29 @@ public class ClusterEvaluationVisualization extends AbstractVisFactory { @Override public Visualization makeVisualization(VisualizationTask task) { // TODO: make a utility class to wrap SVGPlot + parent layer + ypos. + // TODO: use CSSClass and StyleLibrary double ypos = -.5; // Skip space before first header SVGPlot svgp = task.getPlot(); Element parent = svgp.svgElement(SVGConstants.SVG_G_TAG); - EvaluateClustering.ScoreResult sr = task.getResult(); - ClusterContingencyTable cont = sr.getContingencyTable(); + EvaluationResult sr = task.getResult(); - for (Hierarchy.Iter<Result> parents = task.getContext().getHierarchy().iterParents(sr); parents.valid(); parents.advance()) { - Result r = parents.get(); - if (r instanceof Clustering) { - ypos = addHeader(svgp, parent, ypos, r.getLongName()); - } + for(String header : sr.getHeaderLines()) { + ypos = addHeader(svgp, parent, ypos, header); } - // TODO: use CSSClass and StyleLibrary - - ypos = addHeader(svgp, parent, ypos, "Pair counting measures"); - - PairCounting paircount = cont.getPaircount(); - ypos = addBarChart(svgp, parent, ypos, "Jaccard", 1, paircount.jaccard()); - ypos = addBarChart(svgp, parent, ypos, "F1-Measure", 1, paircount.f1Measure()); - ypos = addBarChart(svgp, parent, ypos, "Precision", 1, paircount.precision()); - ypos = addBarChart(svgp, parent, ypos, "Recall", 1, paircount.recall()); - ypos = addBarChart(svgp, parent, ypos, "Rand", 1, paircount.randIndex()); - ypos = addBarChart(svgp, parent, ypos, "ARI", 1, paircount.adjustedRandIndex()); - ypos = addBarChart(svgp, parent, ypos, "FowlkesMallows", 1, paircount.fowlkesMallows()); - - ypos = addHeader(svgp, parent, ypos, "Entropy based measures"); - - Entropy entropy = cont.getEntropy(); - ypos = addBarChart(svgp, parent, ypos, "NMI Joint", 1, entropy.entropyNMIJoint()); - ypos = addBarChart(svgp, parent, ypos, "NMI Sqrt", 1, entropy.entropyNMISqrt()); - ypos = addHeader(svgp, parent, ypos, "BCubed-based measures"); - - BCubed bcubed = cont.getBCubed(); - ypos = addBarChart(svgp, parent, ypos, "F1-Measure", 1, bcubed.f1Measure()); - ypos = addBarChart(svgp, parent, ypos, "Recall", 1, bcubed.recall()); - ypos = addBarChart(svgp, parent, ypos, "Precision", 1, bcubed.precision()); - - ypos = addHeader(svgp, parent, ypos, "Set-Matching-based measures"); - - SetMatchingPurity setm = cont.getSetMatching(); - ypos = addBarChart(svgp, parent, ypos, "F1-Measure", 1, setm.f1Measure()); - ypos = addBarChart(svgp, parent, ypos, "Purity", 1, setm.purity()); - ypos = addBarChart(svgp, parent, ypos, "Inverse Purity", 1, setm.inversePurity()); - - ypos = addHeader(svgp, parent, ypos, "Editing-distance measures"); - - EditDistance edit = cont.getEdit(); - ypos = addBarChart(svgp, parent, ypos, "F1-Measure", 1, edit.f1Measure()); - ypos = addBarChart(svgp, parent, ypos, "Precision", 1, edit.editDistanceFirst()); - ypos = addBarChart(svgp, parent, ypos, "Recall", 1, edit.editDistanceSecond()); - - ypos = addHeader(svgp, parent, ypos, "Gini measures"); - - final MeanVariance gini = cont.averageSymmetricGini(); - ypos = addBarChart(svgp, parent, ypos, "Mean +-" + FormatUtil.format(gini.getSampleStddev(), FormatUtil.NF4), 1, gini.getMean()); + for(EvaluationResult.MeasurementGroup g : sr) { + ypos = addHeader(svgp, parent, ypos, g.getName()); + for(EvaluationResult.Measurement m : g) { + ypos = addBarChart(svgp, parent, ypos, m.getName(), m.getVal(), m.getMin(), m.getMax(), m.getExp()); + } + } // scale vis - double cols = 10; // Math.max(10, (int) (i * task.getHeight() / - // task.getWidth())); - double rows = ypos; + double cols = 10; final StyleLibrary style = task.getContext().getStyleResult().getStyleLibrary(); final double margin = style.getSize(StyleLibrary.MARGIN); - final String transform = SVGUtil.makeMarginTransform(task.getWidth(), task.getHeight(), cols, rows, margin / StyleLibrary.SCALE); + final String transform = SVGUtil.makeMarginTransform(task.getWidth(), task.getHeight(), cols, ypos, margin / StyleLibrary.SCALE); SVGUtil.setAtt(parent, SVGConstants.SVG_TRANSFORM_ATTRIBUTE, transform); return new StaticVisualizationInstance(task, parent); diff --git a/src/de/lmu/ifi/dbs/elki/visualization/visualizers/visunproj/HistogramVisualization.java b/src/de/lmu/ifi/dbs/elki/visualization/visualizers/visunproj/HistogramVisualization.java index 77f096fb..60feb778 100644 --- a/src/de/lmu/ifi/dbs/elki/visualization/visualizers/visunproj/HistogramVisualization.java +++ b/src/de/lmu/ifi/dbs/elki/visualization/visualizers/visunproj/HistogramVisualization.java @@ -4,7 +4,7 @@ package de.lmu.ifi.dbs.elki.visualization.visualizers.visunproj; This file is part of ELKI: Environment for Developing KDD-Applications Supported by Index-Structures - Copyright (C) 2013 + Copyright (C) 2014 Ludwig-Maximilians-Universität München Lehr- und Forschungseinheit für Datenbanksysteme ELKI Development Team @@ -71,8 +71,7 @@ public class HistogramVisualization extends AbstractVisFactory { private static final String SERIESID = "series"; /** - * Constructor, adhering to - * {@link de.lmu.ifi.dbs.elki.utilities.optionhandling.Parameterizable} + * Constructor. */ public HistogramVisualization() { super(); @@ -82,7 +81,7 @@ public class HistogramVisualization extends AbstractVisFactory { public Visualization makeVisualization(VisualizationTask task) { VisualizerContext context = task.getContext(); SVGPlot svgp = task.getPlot(); - HistogramResult<? extends NumberVector<?>> curve = task.getResult(); + HistogramResult<? extends NumberVector> curve = task.getResult(); final StyleLibrary style = context.getStyleResult().getStyleLibrary(); final double sizex = StyleLibrary.SCALE; @@ -96,7 +95,7 @@ public class HistogramVisualization extends AbstractVisFactory { int dim = -1; DoubleMinMax xminmax = new DoubleMinMax(); DoubleMinMax yminmax = new DoubleMinMax(); - for (NumberVector<?> vec : curve) { + for (NumberVector vec : curve) { xminmax.put(vec.doubleValue(0)); if (dim < 0) { dim = vec.getDimensionality(); @@ -104,7 +103,7 @@ public class HistogramVisualization extends AbstractVisFactory { // TODO: test and throw always assert (dim == vec.getDimensionality()); } - for (int i = 0; i < dim; i++) { + for (int i = 1; i < dim; i++) { yminmax.put(vec.doubleValue(i)); } } @@ -117,7 +116,7 @@ public class HistogramVisualization extends AbstractVisFactory { double range = xminmax.getMax() - xminmax.getMin(); double binwidth = range / (size - 1); - LinearScale xscale = new LinearScale(xminmax.getMin() - binwidth * .5, xminmax.getMax() + binwidth * .5); + LinearScale xscale = new LinearScale(xminmax.getMin() - binwidth * .49999, xminmax.getMax() + binwidth * .49999); LinearScale yscale = new LinearScale(yminmax.getMin(), yminmax.getMax()); SVGPath[] path = new SVGPath[dim]; @@ -126,7 +125,7 @@ public class HistogramVisualization extends AbstractVisFactory { } // draw curves. - for (NumberVector<?> vec : curve) { + for (NumberVector vec : curve) { for (int d = 0; d < dim; d++) { path[d].lineTo(sizex * (xscale.getScaled(vec.doubleValue(0) - binwidth * .5)), sizey * (1 - yscale.getScaled(vec.doubleValue(d + 1)))); path[d].lineTo(sizex * (xscale.getScaled(vec.doubleValue(0) + binwidth * .5)), sizey * (1 - yscale.getScaled(vec.doubleValue(d + 1)))); @@ -164,8 +163,8 @@ public class HistogramVisualization extends AbstractVisFactory { @Override public void processNewResult(HierarchicalResult baseResult, Result newResult) { - List<HistogramResult<? extends NumberVector<?>>> histograms = ResultUtil.filterResults(newResult, HistogramResult.class); - for (HistogramResult<? extends NumberVector<?>> histogram : histograms) { + List<HistogramResult<? extends NumberVector>> histograms = ResultUtil.filterResults(newResult, HistogramResult.class); + for (HistogramResult<? extends NumberVector> histogram : histograms) { final VisualizationTask task = new VisualizationTask(NAME, histogram, null, this); task.width = 2.0; task.height = 1.0; diff --git a/src/de/lmu/ifi/dbs/elki/visualization/visualizers/visunproj/KeyVisualization.java b/src/de/lmu/ifi/dbs/elki/visualization/visualizers/visunproj/KeyVisualization.java index f18ef371..9576f3ca 100644 --- a/src/de/lmu/ifi/dbs/elki/visualization/visualizers/visunproj/KeyVisualization.java +++ b/src/de/lmu/ifi/dbs/elki/visualization/visualizers/visunproj/KeyVisualization.java @@ -4,7 +4,7 @@ package de.lmu.ifi.dbs.elki.visualization.visualizers.visunproj; This file is part of ELKI: Environment for Developing KDD-Applications Supported by Index-Structures - Copyright (C) 2013 + Copyright (C) 2014 Ludwig-Maximilians-Universität München Lehr- und Forschungseinheit für Datenbanksysteme ELKI Development Team diff --git a/src/de/lmu/ifi/dbs/elki/visualization/visualizers/visunproj/LabelVisualization.java b/src/de/lmu/ifi/dbs/elki/visualization/visualizers/visunproj/LabelVisualization.java index 0fe96e50..0738d499 100644 --- a/src/de/lmu/ifi/dbs/elki/visualization/visualizers/visunproj/LabelVisualization.java +++ b/src/de/lmu/ifi/dbs/elki/visualization/visualizers/visunproj/LabelVisualization.java @@ -4,7 +4,7 @@ package de.lmu.ifi.dbs.elki.visualization.visualizers.visunproj; This file is part of ELKI: Environment for Developing KDD-Applications Supported by Index-Structures - Copyright (C) 2013 + Copyright (C) 2014 Ludwig-Maximilians-Universität München Lehr- und Forschungseinheit für Datenbanksysteme ELKI Development Team diff --git a/src/de/lmu/ifi/dbs/elki/visualization/visualizers/visunproj/PixmapVisualizer.java b/src/de/lmu/ifi/dbs/elki/visualization/visualizers/visunproj/PixmapVisualizer.java index 60080373..14e9c809 100644 --- a/src/de/lmu/ifi/dbs/elki/visualization/visualizers/visunproj/PixmapVisualizer.java +++ b/src/de/lmu/ifi/dbs/elki/visualization/visualizers/visunproj/PixmapVisualizer.java @@ -4,7 +4,7 @@ package de.lmu.ifi.dbs.elki.visualization.visualizers.visunproj; This file is part of ELKI: Environment for Developing KDD-Applications Supported by Index-Structures - Copyright (C) 2013 + Copyright (C) 2014 Ludwig-Maximilians-Universität München Lehr- und Forschungseinheit für Datenbanksysteme ELKI Development Team @@ -55,8 +55,7 @@ public class PixmapVisualizer extends AbstractVisFactory { private static final String NAME = "Pixmap Visualizer"; /** - * Constructor, adhering to - * {@link de.lmu.ifi.dbs.elki.utilities.optionhandling.Parameterizable} + * Constructor. */ public PixmapVisualizer() { super(); diff --git a/src/de/lmu/ifi/dbs/elki/visualization/visualizers/visunproj/SettingsVisualization.java b/src/de/lmu/ifi/dbs/elki/visualization/visualizers/visunproj/SettingsVisualization.java index d39d5bfd..ade20347 100644 --- a/src/de/lmu/ifi/dbs/elki/visualization/visualizers/visunproj/SettingsVisualization.java +++ b/src/de/lmu/ifi/dbs/elki/visualization/visualizers/visunproj/SettingsVisualization.java @@ -4,7 +4,7 @@ package de.lmu.ifi.dbs.elki.visualization.visualizers.visunproj; This file is part of ELKI: Environment for Developing KDD-Applications Supported by Index-Structures - Copyright (C) 2013 + Copyright (C) 2014 Ludwig-Maximilians-Universität München Lehr- und Forschungseinheit für Datenbanksysteme ELKI Development Team @@ -32,9 +32,8 @@ import de.lmu.ifi.dbs.elki.result.HierarchicalResult; import de.lmu.ifi.dbs.elki.result.Result; import de.lmu.ifi.dbs.elki.result.ResultUtil; import de.lmu.ifi.dbs.elki.result.SettingsResult; +import de.lmu.ifi.dbs.elki.utilities.optionhandling.parameterization.TrackedParameter; import de.lmu.ifi.dbs.elki.utilities.optionhandling.parameters.ClassParameter; -import de.lmu.ifi.dbs.elki.utilities.optionhandling.parameters.Parameter; -import de.lmu.ifi.dbs.elki.utilities.pairs.Pair; import de.lmu.ifi.dbs.elki.visualization.VisualizationTask; import de.lmu.ifi.dbs.elki.visualization.VisualizerContext; import de.lmu.ifi.dbs.elki.visualization.style.StyleLibrary; @@ -61,8 +60,7 @@ public class SettingsVisualization extends AbstractVisFactory { private static final String NAME = "Settings"; /** - * Constructor, adhering to - * {@link de.lmu.ifi.dbs.elki.utilities.optionhandling.Parameterizable} + * Constructor. */ public SettingsVisualization() { super(); @@ -74,7 +72,7 @@ public class SettingsVisualization extends AbstractVisFactory { VisualizerContext context = task.getContext(); SVGPlot svgp = task.getPlot(); - Collection<Pair<Object, Parameter<?>>> settings = sr.getSettings(); + Collection<TrackedParameter> settings = sr.getSettings(); Element layer = svgp.svgElement(SVGConstants.SVG_G_TAG); @@ -82,17 +80,17 @@ public class SettingsVisualization extends AbstractVisFactory { int i = 0; Object last = null; - for(Pair<Object, Parameter<?>> setting : settings) { - if(setting.first != last && setting.first != null) { + for(TrackedParameter setting : settings) { + if(setting.getOwner() != last && setting.getOwner() != null) { String name; try { - if(setting.first instanceof Class) { - name = ((Class<?>) setting.first).getName(); + if(setting.getOwner() instanceof Class) { + name = ((Class<?>) setting.getOwner()).getName(); } else { - name = setting.first.getClass().getName(); + name = setting.getOwner().getClass().getName(); } - if(ClassParameter.class.isInstance(setting.first)) { - name = ((ClassParameter<?>) setting.first).getValue().getName(); + if(ClassParameter.class.isInstance(setting.getOwner())) { + name = ((ClassParameter<?>) setting.getOwner()).getValue().getName(); } } catch(NullPointerException e) { @@ -102,14 +100,14 @@ public class SettingsVisualization extends AbstractVisFactory { object.setAttribute(SVGConstants.SVG_STYLE_ATTRIBUTE, "font-size: 0.6; font-weight: bold"); layer.appendChild(object); i++; - last = setting.first; + last = setting.getOwner(); } // get name and value - String name = setting.second.getOptionID().getName(); + String name = setting.getParameter().getOptionID().getName(); String value = "[unset]"; try { - if(setting.second.isDefined()) { - value = setting.second.getValueAsString(); + if(setting.getParameter().isDefined()) { + value = setting.getParameter().getValueAsString(); } } catch(NullPointerException e) { diff --git a/src/de/lmu/ifi/dbs/elki/visualization/visualizers/visunproj/SimilarityMatrixVisualizer.java b/src/de/lmu/ifi/dbs/elki/visualization/visualizers/visunproj/SimilarityMatrixVisualizer.java index b4570a32..d804d8c0 100644 --- a/src/de/lmu/ifi/dbs/elki/visualization/visualizers/visunproj/SimilarityMatrixVisualizer.java +++ b/src/de/lmu/ifi/dbs/elki/visualization/visualizers/visunproj/SimilarityMatrixVisualizer.java @@ -4,7 +4,7 @@ package de.lmu.ifi.dbs.elki.visualization.visualizers.visunproj; This file is part of ELKI: Environment for Developing KDD-Applications Supported by Index-Structures - Copyright (C) 2013 + Copyright (C) 2014 Ludwig-Maximilians-Universität München Lehr- und Forschungseinheit für Datenbanksysteme ELKI Development Team @@ -60,8 +60,7 @@ public class SimilarityMatrixVisualizer extends AbstractVisFactory { private static final String NAME = "Similarity Matrix Visualizer"; /** - * Constructor, adhering to - * {@link de.lmu.ifi.dbs.elki.utilities.optionhandling.Parameterizable} + * Constructor. */ public SimilarityMatrixVisualizer() { super(); diff --git a/src/de/lmu/ifi/dbs/elki/visualization/visualizers/visunproj/XYCurveVisualization.java b/src/de/lmu/ifi/dbs/elki/visualization/visualizers/visunproj/XYCurveVisualization.java index 691ab925..2a218065 100644 --- a/src/de/lmu/ifi/dbs/elki/visualization/visualizers/visunproj/XYCurveVisualization.java +++ b/src/de/lmu/ifi/dbs/elki/visualization/visualizers/visunproj/XYCurveVisualization.java @@ -4,7 +4,7 @@ package de.lmu.ifi.dbs.elki.visualization.visualizers.visunproj; This file is part of ELKI: Environment for Developing KDD-Applications Supported by Index-Structures - Copyright (C) 2013 + Copyright (C) 2014 Ludwig-Maximilians-Universität München Lehr- und Forschungseinheit für Datenbanksysteme ELKI Development Team |