diff options
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.java | 134 |
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(); } } |