summaryrefslogtreecommitdiff
path: root/src/de/lmu/ifi/dbs/elki/index/tree/spatial/rstarvariants/AbstractRStarTreeFactory.java
diff options
context:
space:
mode:
Diffstat (limited to 'src/de/lmu/ifi/dbs/elki/index/tree/spatial/rstarvariants/AbstractRStarTreeFactory.java')
-rw-r--r--src/de/lmu/ifi/dbs/elki/index/tree/spatial/rstarvariants/AbstractRStarTreeFactory.java134
1 files changed, 48 insertions, 86 deletions
diff --git a/src/de/lmu/ifi/dbs/elki/index/tree/spatial/rstarvariants/AbstractRStarTreeFactory.java b/src/de/lmu/ifi/dbs/elki/index/tree/spatial/rstarvariants/AbstractRStarTreeFactory.java
index ace5ad41..48b84302 100644
--- a/src/de/lmu/ifi/dbs/elki/index/tree/spatial/rstarvariants/AbstractRStarTreeFactory.java
+++ b/src/de/lmu/ifi/dbs/elki/index/tree/spatial/rstarvariants/AbstractRStarTreeFactory.java
@@ -4,7 +4,7 @@ package de.lmu.ifi.dbs.elki.index.tree.spatial.rstarvariants;
This file is part of ELKI:
Environment for Developing KDD-Applications Supported by Index-Structures
- Copyright (C) 2012
+ Copyright (C) 2013
Ludwig-Maximilians-Universität München
Lehr- und Forschungseinheit für Datenbanksysteme
ELKI Development Team
@@ -27,7 +27,7 @@ import de.lmu.ifi.dbs.elki.data.NumberVector;
import de.lmu.ifi.dbs.elki.data.type.TypeInformation;
import de.lmu.ifi.dbs.elki.data.type.TypeUtil;
import de.lmu.ifi.dbs.elki.index.Index;
-import de.lmu.ifi.dbs.elki.index.tree.TreeIndexFactory;
+import de.lmu.ifi.dbs.elki.index.PagedIndexFactory;
import de.lmu.ifi.dbs.elki.index.tree.spatial.SpatialEntry;
import de.lmu.ifi.dbs.elki.index.tree.spatial.rstarvariants.strategies.bulk.BulkSplit;
import de.lmu.ifi.dbs.elki.index.tree.spatial.rstarvariants.strategies.insert.CombinedInsertionStrategy;
@@ -36,6 +36,7 @@ import de.lmu.ifi.dbs.elki.index.tree.spatial.rstarvariants.strategies.overflow.
import de.lmu.ifi.dbs.elki.index.tree.spatial.rstarvariants.strategies.overflow.OverflowTreatment;
import de.lmu.ifi.dbs.elki.index.tree.spatial.rstarvariants.strategies.split.SplitStrategy;
import de.lmu.ifi.dbs.elki.index.tree.spatial.rstarvariants.strategies.split.TopologicalSplitter;
+import de.lmu.ifi.dbs.elki.persistent.PageFileFactory;
import de.lmu.ifi.dbs.elki.utilities.optionhandling.OptionID;
import de.lmu.ifi.dbs.elki.utilities.optionhandling.constraints.GreaterConstraint;
import de.lmu.ifi.dbs.elki.utilities.optionhandling.constraints.LessConstraint;
@@ -56,76 +57,21 @@ import de.lmu.ifi.dbs.elki.utilities.optionhandling.parameters.ObjectParameter;
* @param <E> Entry type
* @param <I> Index type
*/
-public abstract class AbstractRStarTreeFactory<O extends NumberVector<?>, N extends AbstractRStarTreeNode<N, E>, E extends SpatialEntry, I extends AbstractRStarTree<N, E> & Index> extends TreeIndexFactory<O, I> {
+public abstract class AbstractRStarTreeFactory<O extends NumberVector<?>, N extends AbstractRStarTreeNode<N, E>, E extends SpatialEntry, I extends AbstractRStarTree<N, E, S> & Index, S extends AbstractRTreeSettings> extends PagedIndexFactory<O, I> {
/**
- * Fast-insertion parameter. Optional.
+ * Tree settings
*/
- public static OptionID INSERTION_STRATEGY_ID = new OptionID("rtree.insertionstrategy", "The strategy to use for object insertion.");
-
- /**
- * Split strategy parameter. Optional.
- */
- public static OptionID SPLIT_STRATEGY_ID = new OptionID("rtree.splitstrategy", "The strategy to use for node splitting.");
-
- /**
- * Parameter for bulk strategy
- */
- public static final OptionID BULK_SPLIT_ID = new OptionID("spatial.bulkstrategy", "The class to perform the bulk split with.");
-
- /**
- * Parameter for the relative minimum fill.
- */
- public static final OptionID MINIMUM_FILL_ID = new OptionID("rtree.minimum-fill", "Minimum relative fill required for data pages.");
-
- /**
- * Overflow treatment.
- */
- public static OptionID OVERFLOW_STRATEGY_ID = new OptionID("rtree.overflowtreatment", "The strategy to use for handling overflows.");
-
- /**
- * Strategy to find the insertion node with.
- */
- protected InsertionStrategy insertionStrategy;
-
- /**
- * The strategy for bulk load.
- */
- protected BulkSplit bulkSplitter;
-
- /**
- * The strategy for splitting nodes
- */
- protected SplitStrategy nodeSplitter;
-
- /**
- * Overflow treatment strategy
- */
- protected OverflowTreatment overflowTreatment;
-
- /**
- * Relative minimum fill
- */
- protected double minimumFill;
+ protected S settings;
/**
* Constructor.
*
- * @param fileName
- * @param pageSize
- * @param cacheSize
- * @param bulkSplitter the strategy to use for bulk splitting
- * @param insertionStrategy the strategy to find the insertion child
- * @param nodeSplitter the strategy to use for splitting nodes
- * @param overflowTreatment the strategy to use for overflow treatment
- * @param minimumFill the relative minimum fill
+ * @param pageFileFactory Page file factory
+ * @param settings Tree settings
*/
- public AbstractRStarTreeFactory(String fileName, int pageSize, long cacheSize, BulkSplit bulkSplitter, InsertionStrategy insertionStrategy, SplitStrategy nodeSplitter, OverflowTreatment overflowTreatment, double minimumFill) {
- super(fileName, pageSize, cacheSize);
- this.insertionStrategy = insertionStrategy;
- this.bulkSplitter = bulkSplitter;
- this.nodeSplitter = nodeSplitter;
- this.overflowTreatment = overflowTreatment;
- this.minimumFill = minimumFill;
+ public AbstractRStarTreeFactory(PageFileFactory<?> pageFileFactory, S settings) {
+ super(pageFileFactory);
+ this.settings = settings;
}
@Override
@@ -139,53 +85,69 @@ public abstract class AbstractRStarTreeFactory<O extends NumberVector<?>, N exte
* @author Erich Schubert
*
* @apiviz.exclude
+ *
+ * @param <O> Object type
+ * @param <S> Settings class
*/
- public abstract static class Parameterizer<O extends NumberVector<?>> extends TreeIndexFactory.Parameterizer<O> {
+ public abstract static class Parameterizer<O extends NumberVector<?>, S extends AbstractRTreeSettings> extends PagedIndexFactory.Parameterizer<O> {
+ /**
+ * Fast-insertion parameter. Optional.
+ */
+ public static OptionID INSERTION_STRATEGY_ID = new OptionID("rtree.insertionstrategy", "The strategy to use for object insertion.");
+
/**
- * Insertion strategy
+ * Split strategy parameter. Optional.
*/
- protected InsertionStrategy insertionStrategy = null;
+ public static OptionID SPLIT_STRATEGY_ID = new OptionID("rtree.splitstrategy", "The strategy to use for node splitting.");
/**
- * The strategy for splitting nodes
+ * Parameter for bulk strategy
*/
- protected SplitStrategy nodeSplitter = null;
+ public static final OptionID BULK_SPLIT_ID = new OptionID("spatial.bulkstrategy", "The class to perform the bulk split with.");
/**
- * Bulk loading strategy
+ * Parameter for the relative minimum fill.
*/
- protected BulkSplit bulkSplitter = null;
+ public static final OptionID MINIMUM_FILL_ID = new OptionID("rtree.minimum-fill", "Minimum relative fill required for data pages.");
/**
- * Overflow treatment strategy
+ * Overflow treatment.
*/
- protected OverflowTreatment overflowTreatment = null;
+ public static OptionID OVERFLOW_STRATEGY_ID = new OptionID("rtree.overflowtreatment", "The strategy to use for handling overflows.");
/**
- * Relative minimum fill
+ * Tree settings
+ */
+ protected S settings;
+
+ /**
+ * Create the settings object
+ *
+ * @return Settings instance.
*/
- protected double minimumFill;
+ abstract protected S createSettings();
@Override
protected void makeOptions(Parameterization config) {
super.makeOptions(config);
- ObjectParameter<InsertionStrategy> insertionStrategyP = new ObjectParameter<InsertionStrategy>(INSERTION_STRATEGY_ID, InsertionStrategy.class, CombinedInsertionStrategy.class);
+ settings = createSettings();
+ ObjectParameter<InsertionStrategy> insertionStrategyP = new ObjectParameter<>(INSERTION_STRATEGY_ID, InsertionStrategy.class, CombinedInsertionStrategy.class);
if (config.grab(insertionStrategyP)) {
- insertionStrategy = insertionStrategyP.instantiateClass(config);
+ settings.insertionStrategy = insertionStrategyP.instantiateClass(config);
}
- ObjectParameter<SplitStrategy> splitStrategyP = new ObjectParameter<SplitStrategy>(SPLIT_STRATEGY_ID, SplitStrategy.class, TopologicalSplitter.class);
+ ObjectParameter<SplitStrategy> splitStrategyP = new ObjectParameter<>(SPLIT_STRATEGY_ID, SplitStrategy.class, TopologicalSplitter.class);
if (config.grab(splitStrategyP)) {
- nodeSplitter = splitStrategyP.instantiateClass(config);
+ settings.nodeSplitter = splitStrategyP.instantiateClass(config);
}
DoubleParameter minimumFillP = new DoubleParameter(MINIMUM_FILL_ID, 0.4);
minimumFillP.addConstraint(new GreaterConstraint(0.0));
minimumFillP.addConstraint(new LessConstraint(0.5));
if (config.grab(minimumFillP)) {
- minimumFill = minimumFillP.getValue();
+ settings.relativeMinFill = minimumFillP.getValue();
}
- ObjectParameter<OverflowTreatment> overflowP = new ObjectParameter<OverflowTreatment>(OVERFLOW_STRATEGY_ID, OverflowTreatment.class, LimitedReinsertOverflowTreatment.class);
+ ObjectParameter<OverflowTreatment> overflowP = new ObjectParameter<>(OVERFLOW_STRATEGY_ID, OverflowTreatment.class, LimitedReinsertOverflowTreatment.class);
if (config.grab(overflowP)) {
- overflowTreatment = overflowP.instantiateClass(config);
+ settings.setOverflowTreatment(overflowP.instantiateClass(config));
}
configBulkLoad(config);
}
@@ -196,13 +158,13 @@ public abstract class AbstractRStarTreeFactory<O extends NumberVector<?>, N exte
* @param config Parameterization
*/
protected void configBulkLoad(Parameterization config) {
- ObjectParameter<BulkSplit> bulkSplitP = new ObjectParameter<BulkSplit>(BULK_SPLIT_ID, BulkSplit.class, true);
+ ObjectParameter<BulkSplit> bulkSplitP = new ObjectParameter<>(BULK_SPLIT_ID, BulkSplit.class, true);
if (config.grab(bulkSplitP)) {
- bulkSplitter = bulkSplitP.instantiateClass(config);
+ settings.bulkSplitter = bulkSplitP.instantiateClass(config);
}
}
@Override
- protected abstract AbstractRStarTreeFactory<O, ?, ?, ?> makeInstance();
+ protected abstract AbstractRStarTreeFactory<O, ?, ?, ?, ?> makeInstance();
}
}