summaryrefslogtreecommitdiff
path: root/src/de/lmu/ifi/dbs/elki/visualization
diff options
context:
space:
mode:
Diffstat (limited to 'src/de/lmu/ifi/dbs/elki/visualization')
-rw-r--r--src/de/lmu/ifi/dbs/elki/visualization/ExportVisualizations.java2
-rw-r--r--src/de/lmu/ifi/dbs/elki/visualization/VisualizationTask.java2
-rw-r--r--src/de/lmu/ifi/dbs/elki/visualization/VisualizerContext.java4
-rw-r--r--src/de/lmu/ifi/dbs/elki/visualization/VisualizerParameterizer.java26
-rw-r--r--src/de/lmu/ifi/dbs/elki/visualization/batikutil/AddCSSClass.java2
-rw-r--r--src/de/lmu/ifi/dbs/elki/visualization/batikutil/AttributeModifier.java2
-rw-r--r--src/de/lmu/ifi/dbs/elki/visualization/batikutil/BatikUtil.java2
-rw-r--r--src/de/lmu/ifi/dbs/elki/visualization/batikutil/CSSHoverClass.java2
-rw-r--r--src/de/lmu/ifi/dbs/elki/visualization/batikutil/CloneInlineImages.java2
-rw-r--r--src/de/lmu/ifi/dbs/elki/visualization/batikutil/DragableArea.java2
-rw-r--r--src/de/lmu/ifi/dbs/elki/visualization/batikutil/JSVGSynchronizedCanvas.java83
-rw-r--r--src/de/lmu/ifi/dbs/elki/visualization/batikutil/JSVGUpdateSynchronizer.java20
-rw-r--r--src/de/lmu/ifi/dbs/elki/visualization/batikutil/LazyCanvasResizer.java2
-rw-r--r--src/de/lmu/ifi/dbs/elki/visualization/batikutil/NodeAppendChild.java2
-rw-r--r--src/de/lmu/ifi/dbs/elki/visualization/batikutil/NodeReplaceChild.java2
-rw-r--r--src/de/lmu/ifi/dbs/elki/visualization/batikutil/NodeReplacer.java2
-rw-r--r--src/de/lmu/ifi/dbs/elki/visualization/batikutil/RemoveCSSClass.java2
-rw-r--r--src/de/lmu/ifi/dbs/elki/visualization/batikutil/ThumbnailRegistryEntry.java2
-rw-r--r--src/de/lmu/ifi/dbs/elki/visualization/batikutil/ThumbnailTranscoder.java2
-rw-r--r--src/de/lmu/ifi/dbs/elki/visualization/colors/ColorLibrary.java2
-rw-r--r--src/de/lmu/ifi/dbs/elki/visualization/colors/ListBasedColorLibrary.java2
-rw-r--r--src/de/lmu/ifi/dbs/elki/visualization/css/CSSClass.java2
-rw-r--r--src/de/lmu/ifi/dbs/elki/visualization/css/CSSClassManager.java2
-rw-r--r--src/de/lmu/ifi/dbs/elki/visualization/gui/ResultVisualizer.java3
-rw-r--r--src/de/lmu/ifi/dbs/elki/visualization/gui/ResultWindow.java49
-rw-r--r--src/de/lmu/ifi/dbs/elki/visualization/gui/SimpleSVGViewer.java2
-rw-r--r--src/de/lmu/ifi/dbs/elki/visualization/gui/detail/DetailView.java2
-rw-r--r--src/de/lmu/ifi/dbs/elki/visualization/gui/overview/DetailViewSelectedEvent.java2
-rw-r--r--src/de/lmu/ifi/dbs/elki/visualization/gui/overview/LayerMap.java2
-rw-r--r--src/de/lmu/ifi/dbs/elki/visualization/gui/overview/OverviewPlot.java323
-rw-r--r--src/de/lmu/ifi/dbs/elki/visualization/gui/overview/PlotItem.java2
-rw-r--r--src/de/lmu/ifi/dbs/elki/visualization/gui/overview/RectangleArranger.java2
-rw-r--r--src/de/lmu/ifi/dbs/elki/visualization/opticsplot/OPTICSColorAdapter.java4
-rw-r--r--src/de/lmu/ifi/dbs/elki/visualization/opticsplot/OPTICSColorFromStylingPolicy.java4
-rw-r--r--src/de/lmu/ifi/dbs/elki/visualization/opticsplot/OPTICSColorStatic.java4
-rw-r--r--src/de/lmu/ifi/dbs/elki/visualization/opticsplot/OPTICSCorrelationDimensionalityDistanceAdapter.java (renamed from src/de/lmu/ifi/dbs/elki/visualization/opticsplot/OPTICSCorrelationDimensionalityDistance.java)23
-rw-r--r--src/de/lmu/ifi/dbs/elki/visualization/opticsplot/OPTICSCut.java13
-rw-r--r--src/de/lmu/ifi/dbs/elki/visualization/opticsplot/OPTICSDistanceAdapter.java18
-rw-r--r--src/de/lmu/ifi/dbs/elki/visualization/opticsplot/OPTICSNumberDistanceAdapter.java (renamed from src/de/lmu/ifi/dbs/elki/visualization/opticsplot/OPTICSNumberDistance.java)20
-rw-r--r--src/de/lmu/ifi/dbs/elki/visualization/opticsplot/OPTICSPlot.java63
-rw-r--r--src/de/lmu/ifi/dbs/elki/visualization/projections/AbstractFullProjection.java18
-rw-r--r--src/de/lmu/ifi/dbs/elki/visualization/projections/AbstractProjection.java2
-rw-r--r--src/de/lmu/ifi/dbs/elki/visualization/projections/AbstractSimpleProjection.java2
-rw-r--r--src/de/lmu/ifi/dbs/elki/visualization/projections/AffineProjection.java8
-rw-r--r--src/de/lmu/ifi/dbs/elki/visualization/projections/CanvasSize.java2
-rw-r--r--src/de/lmu/ifi/dbs/elki/visualization/projections/FullProjection.java18
-rw-r--r--src/de/lmu/ifi/dbs/elki/visualization/projections/OPTICSProjection.java20
-rw-r--r--src/de/lmu/ifi/dbs/elki/visualization/projections/Projection.java2
-rw-r--r--src/de/lmu/ifi/dbs/elki/visualization/projections/Projection1D.java6
-rw-r--r--src/de/lmu/ifi/dbs/elki/visualization/projections/Projection2D.java10
-rw-r--r--src/de/lmu/ifi/dbs/elki/visualization/projections/ProjectionParallel.java2
-rw-r--r--src/de/lmu/ifi/dbs/elki/visualization/projections/Simple1D.java6
-rw-r--r--src/de/lmu/ifi/dbs/elki/visualization/projections/Simple2D.java8
-rw-r--r--src/de/lmu/ifi/dbs/elki/visualization/projections/SimpleParallel.java2
-rw-r--r--src/de/lmu/ifi/dbs/elki/visualization/projector/HistogramFactory.java6
-rw-r--r--src/de/lmu/ifi/dbs/elki/visualization/projector/HistogramProjector.java4
-rw-r--r--src/de/lmu/ifi/dbs/elki/visualization/projector/OPTICSProjector.java22
-rw-r--r--src/de/lmu/ifi/dbs/elki/visualization/projector/OPTICSProjectorFactory.java13
-rw-r--r--src/de/lmu/ifi/dbs/elki/visualization/projector/ParallelPlotFactory.java4
-rw-r--r--src/de/lmu/ifi/dbs/elki/visualization/projector/ParallelPlotProjector.java4
-rw-r--r--src/de/lmu/ifi/dbs/elki/visualization/projector/Projector.java2
-rw-r--r--src/de/lmu/ifi/dbs/elki/visualization/projector/ProjectorFactory.java5
-rw-r--r--src/de/lmu/ifi/dbs/elki/visualization/projector/ScatterPlotFactory.java6
-rw-r--r--src/de/lmu/ifi/dbs/elki/visualization/projector/ScatterPlotProjector.java4
-rw-r--r--src/de/lmu/ifi/dbs/elki/visualization/savedialog/SVGSaveDialog.java2
-rw-r--r--src/de/lmu/ifi/dbs/elki/visualization/savedialog/SaveOptionsPanel.java2
-rw-r--r--src/de/lmu/ifi/dbs/elki/visualization/style/ClassStylingPolicy.java2
-rw-r--r--src/de/lmu/ifi/dbs/elki/visualization/style/ClusterStylingPolicy.java2
-rw-r--r--src/de/lmu/ifi/dbs/elki/visualization/style/PropertiesBasedStyleLibrary.java2
-rw-r--r--src/de/lmu/ifi/dbs/elki/visualization/style/SingleObjectsStylingPolicy.java2
-rw-r--r--src/de/lmu/ifi/dbs/elki/visualization/style/StyleLibrary.java2
-rw-r--r--src/de/lmu/ifi/dbs/elki/visualization/style/StyleResult.java2
-rw-r--r--src/de/lmu/ifi/dbs/elki/visualization/style/StylingPolicy.java2
-rw-r--r--src/de/lmu/ifi/dbs/elki/visualization/style/lines/DashedLineStyleLibrary.java2
-rw-r--r--src/de/lmu/ifi/dbs/elki/visualization/style/lines/LineStyleLibrary.java2
-rw-r--r--src/de/lmu/ifi/dbs/elki/visualization/style/lines/SolidLineStyleLibrary.java2
-rw-r--r--src/de/lmu/ifi/dbs/elki/visualization/style/lines/package-info.java2
-rw-r--r--src/de/lmu/ifi/dbs/elki/visualization/style/marker/CircleMarkers.java2
-rw-r--r--src/de/lmu/ifi/dbs/elki/visualization/style/marker/MarkerLibrary.java2
-rw-r--r--src/de/lmu/ifi/dbs/elki/visualization/style/marker/MinimalMarkers.java2
-rw-r--r--src/de/lmu/ifi/dbs/elki/visualization/style/marker/PrettyMarkers.java2
-rw-r--r--src/de/lmu/ifi/dbs/elki/visualization/svg/SVGArrow.java2
-rw-r--r--src/de/lmu/ifi/dbs/elki/visualization/svg/SVGButton.java2
-rw-r--r--src/de/lmu/ifi/dbs/elki/visualization/svg/SVGCheckbox.java2
-rw-r--r--src/de/lmu/ifi/dbs/elki/visualization/svg/SVGCloneVisible.java2
-rw-r--r--src/de/lmu/ifi/dbs/elki/visualization/svg/SVGEffects.java2
-rw-r--r--src/de/lmu/ifi/dbs/elki/visualization/svg/SVGHyperCube.java6
-rw-r--r--src/de/lmu/ifi/dbs/elki/visualization/svg/SVGHyperSphere.java15
-rw-r--r--src/de/lmu/ifi/dbs/elki/visualization/svg/SVGPath.java2
-rw-r--r--src/de/lmu/ifi/dbs/elki/visualization/svg/SVGPlot.java2
-rw-r--r--src/de/lmu/ifi/dbs/elki/visualization/svg/SVGScoreBar.java31
-rw-r--r--src/de/lmu/ifi/dbs/elki/visualization/svg/SVGSimpleLinearAxis.java2
-rw-r--r--src/de/lmu/ifi/dbs/elki/visualization/svg/SVGUtil.java2
-rw-r--r--src/de/lmu/ifi/dbs/elki/visualization/svg/UpdateRunner.java17
-rw-r--r--src/de/lmu/ifi/dbs/elki/visualization/svg/UpdateSynchronizer.java2
-rw-r--r--src/de/lmu/ifi/dbs/elki/visualization/svg/VoronoiDraw.java2
-rw-r--r--src/de/lmu/ifi/dbs/elki/visualization/visualizers/AbstractVisFactory.java2
-rw-r--r--src/de/lmu/ifi/dbs/elki/visualization/visualizers/AbstractVisualization.java2
-rw-r--r--src/de/lmu/ifi/dbs/elki/visualization/visualizers/StaticVisualizationInstance.java2
-rw-r--r--src/de/lmu/ifi/dbs/elki/visualization/visualizers/VisFactory.java5
-rw-r--r--src/de/lmu/ifi/dbs/elki/visualization/visualizers/Visualization.java2
-rw-r--r--src/de/lmu/ifi/dbs/elki/visualization/visualizers/VisualizerUtil.java2
-rw-r--r--src/de/lmu/ifi/dbs/elki/visualization/visualizers/histogram/AbstractHistogramVisualization.java2
-rw-r--r--src/de/lmu/ifi/dbs/elki/visualization/visualizers/histogram/ColoredHistogramVisualizer.java4
-rw-r--r--src/de/lmu/ifi/dbs/elki/visualization/visualizers/optics/AbstractOPTICSVisualization.java13
-rw-r--r--src/de/lmu/ifi/dbs/elki/visualization/visualizers/optics/OPTICSClusterVisualization.java40
-rw-r--r--src/de/lmu/ifi/dbs/elki/visualization/visualizers/optics/OPTICSPlotCutVisualization.java53
-rw-r--r--src/de/lmu/ifi/dbs/elki/visualization/visualizers/optics/OPTICSPlotSelectionVisualization.java25
-rw-r--r--src/de/lmu/ifi/dbs/elki/visualization/visualizers/optics/OPTICSPlotVisualizer.java16
-rw-r--r--src/de/lmu/ifi/dbs/elki/visualization/visualizers/optics/OPTICSSteepAreaVisualization.java53
-rw-r--r--src/de/lmu/ifi/dbs/elki/visualization/visualizers/pairsegments/CircleSegmentsVisualizer.java2
-rw-r--r--src/de/lmu/ifi/dbs/elki/visualization/visualizers/pairsegments/SegmentsStylingPolicy.java2
-rw-r--r--src/de/lmu/ifi/dbs/elki/visualization/visualizers/pairsegments/package-info.java2
-rw-r--r--src/de/lmu/ifi/dbs/elki/visualization/visualizers/parallel/AbstractParallelVisualization.java2
-rw-r--r--src/de/lmu/ifi/dbs/elki/visualization/visualizers/parallel/AxisReorderVisualization.java2
-rw-r--r--src/de/lmu/ifi/dbs/elki/visualization/visualizers/parallel/AxisVisibilityVisualization.java4
-rw-r--r--src/de/lmu/ifi/dbs/elki/visualization/visualizers/parallel/LineVisualization.java18
-rw-r--r--src/de/lmu/ifi/dbs/elki/visualization/visualizers/parallel/ParallelAxisVisualization.java2
-rw-r--r--src/de/lmu/ifi/dbs/elki/visualization/visualizers/parallel/cluster/ClusterOutlineVisualization.java175
-rw-r--r--src/de/lmu/ifi/dbs/elki/visualization/visualizers/parallel/cluster/ClusterParallelMeanVisualization.java21
-rw-r--r--src/de/lmu/ifi/dbs/elki/visualization/visualizers/parallel/cluster/package-info.java2
-rw-r--r--src/de/lmu/ifi/dbs/elki/visualization/visualizers/parallel/index/RTreeParallelVisualization.java3
-rw-r--r--src/de/lmu/ifi/dbs/elki/visualization/visualizers/parallel/index/package-info.java2
-rw-r--r--src/de/lmu/ifi/dbs/elki/visualization/visualizers/parallel/selection/SelectionAxisRangeVisualization.java2
-rw-r--r--src/de/lmu/ifi/dbs/elki/visualization/visualizers/parallel/selection/SelectionLineVisualization.java2
-rw-r--r--src/de/lmu/ifi/dbs/elki/visualization/visualizers/parallel/selection/SelectionToolAxisRangeVisualization.java7
-rw-r--r--src/de/lmu/ifi/dbs/elki/visualization/visualizers/parallel/selection/SelectionToolLineVisualization.java5
-rw-r--r--src/de/lmu/ifi/dbs/elki/visualization/visualizers/parallel/selection/package-info.java2
-rw-r--r--src/de/lmu/ifi/dbs/elki/visualization/visualizers/scatterplot/AbstractScatterplotVisualization.java4
-rw-r--r--src/de/lmu/ifi/dbs/elki/visualization/visualizers/scatterplot/AbstractTooltipVisualization.java2
-rw-r--r--src/de/lmu/ifi/dbs/elki/visualization/visualizers/scatterplot/AxisVisualization.java2
-rw-r--r--src/de/lmu/ifi/dbs/elki/visualization/visualizers/scatterplot/MarkerVisualization.java7
-rw-r--r--src/de/lmu/ifi/dbs/elki/visualization/visualizers/scatterplot/PolygonVisualization.java2
-rw-r--r--src/de/lmu/ifi/dbs/elki/visualization/visualizers/scatterplot/ReferencePointsVisualization.java11
-rw-r--r--src/de/lmu/ifi/dbs/elki/visualization/visualizers/scatterplot/TooltipScoreVisualization.java2
-rw-r--r--src/de/lmu/ifi/dbs/elki/visualization/visualizers/scatterplot/TooltipStringVisualization.java5
-rw-r--r--src/de/lmu/ifi/dbs/elki/visualization/visualizers/scatterplot/cluster/ClusterHullVisualization.java69
-rw-r--r--src/de/lmu/ifi/dbs/elki/visualization/visualizers/scatterplot/cluster/ClusterMeanVisualization.java6
-rw-r--r--src/de/lmu/ifi/dbs/elki/visualization/visualizers/scatterplot/cluster/ClusterOrderVisualization.java16
-rw-r--r--src/de/lmu/ifi/dbs/elki/visualization/visualizers/scatterplot/cluster/EMClusterVisualization.java33
-rw-r--r--src/de/lmu/ifi/dbs/elki/visualization/visualizers/scatterplot/cluster/VoronoiVisualization.java17
-rw-r--r--src/de/lmu/ifi/dbs/elki/visualization/visualizers/scatterplot/cluster/package-info.java2
-rw-r--r--src/de/lmu/ifi/dbs/elki/visualization/visualizers/scatterplot/density/DensityEstimationOverlay.java9
-rw-r--r--src/de/lmu/ifi/dbs/elki/visualization/visualizers/scatterplot/index/TreeMBRVisualization.java3
-rw-r--r--src/de/lmu/ifi/dbs/elki/visualization/visualizers/scatterplot/index/TreeSphereVisualization.java65
-rw-r--r--src/de/lmu/ifi/dbs/elki/visualization/visualizers/scatterplot/index/package-info.java2
-rw-r--r--src/de/lmu/ifi/dbs/elki/visualization/visualizers/scatterplot/outlier/BubbleVisualization.java8
-rw-r--r--src/de/lmu/ifi/dbs/elki/visualization/visualizers/scatterplot/outlier/COPVectorVisualization.java4
-rw-r--r--src/de/lmu/ifi/dbs/elki/visualization/visualizers/scatterplot/outlier/package-info.java2
-rw-r--r--src/de/lmu/ifi/dbs/elki/visualization/visualizers/scatterplot/selection/DistanceFunctionVisualization.java92
-rw-r--r--src/de/lmu/ifi/dbs/elki/visualization/visualizers/scatterplot/selection/MoveObjectsToolVisualization.java2
-rw-r--r--src/de/lmu/ifi/dbs/elki/visualization/visualizers/scatterplot/selection/SelectionToolCubeVisualization.java5
-rw-r--r--src/de/lmu/ifi/dbs/elki/visualization/visualizers/scatterplot/selection/SelectionToolDotVisualization.java3
-rw-r--r--src/de/lmu/ifi/dbs/elki/visualization/visualizers/scatterplot/selection/package-info.java2
-rw-r--r--src/de/lmu/ifi/dbs/elki/visualization/visualizers/thumbs/ThumbnailThread.java2
-rw-r--r--src/de/lmu/ifi/dbs/elki/visualization/visualizers/thumbs/ThumbnailVisualization.java2
-rw-r--r--src/de/lmu/ifi/dbs/elki/visualization/visualizers/visunproj/EvaluationVisualization.java (renamed from src/de/lmu/ifi/dbs/elki/visualization/visualizers/visunproj/ClusterEvaluationVisualization.java)97
-rw-r--r--src/de/lmu/ifi/dbs/elki/visualization/visualizers/visunproj/HistogramVisualization.java19
-rw-r--r--src/de/lmu/ifi/dbs/elki/visualization/visualizers/visunproj/KeyVisualization.java2
-rw-r--r--src/de/lmu/ifi/dbs/elki/visualization/visualizers/visunproj/LabelVisualization.java2
-rw-r--r--src/de/lmu/ifi/dbs/elki/visualization/visualizers/visunproj/PixmapVisualizer.java5
-rw-r--r--src/de/lmu/ifi/dbs/elki/visualization/visualizers/visunproj/SettingsVisualization.java32
-rw-r--r--src/de/lmu/ifi/dbs/elki/visualization/visualizers/visunproj/SimilarityMatrixVisualizer.java5
-rw-r--r--src/de/lmu/ifi/dbs/elki/visualization/visualizers/visunproj/XYCurveVisualization.java2
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