diff options
Diffstat (limited to 'src/de/lmu/ifi/dbs/elki/visualization/visualizers/scatterplot')
26 files changed, 181 insertions, 194 deletions
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 |