diff options
Diffstat (limited to 'src/de/lmu/ifi/dbs/elki/application/cache/CacheDoubleDistanceRangeQueries.java')
-rw-r--r-- | src/de/lmu/ifi/dbs/elki/application/cache/CacheDoubleDistanceRangeQueries.java | 68 |
1 files changed, 27 insertions, 41 deletions
diff --git a/src/de/lmu/ifi/dbs/elki/application/cache/CacheDoubleDistanceRangeQueries.java b/src/de/lmu/ifi/dbs/elki/application/cache/CacheDoubleDistanceRangeQueries.java index f61874dd..bf9ecdb0 100644 --- a/src/de/lmu/ifi/dbs/elki/application/cache/CacheDoubleDistanceRangeQueries.java +++ b/src/de/lmu/ifi/dbs/elki/application/cache/CacheDoubleDistanceRangeQueries.java @@ -4,7 +4,7 @@ package de.lmu.ifi.dbs.elki.application.cache; This file is part of ELKI: Environment for Developing KDD-Applications Supported by Index-Structures - Copyright (C) 2013 + Copyright (C) 2014 Ludwig-Maximilians-Universität München Lehr- und Forschungseinheit für Datenbanksysteme ELKI Development Team @@ -33,20 +33,17 @@ import java.nio.channels.FileLock; import de.lmu.ifi.dbs.elki.application.AbstractApplication; import de.lmu.ifi.dbs.elki.database.Database; import de.lmu.ifi.dbs.elki.database.ids.DBIDIter; -import de.lmu.ifi.dbs.elki.database.ids.distance.DistanceDBIDList; -import de.lmu.ifi.dbs.elki.database.ids.distance.DistanceDBIDListIter; -import de.lmu.ifi.dbs.elki.database.ids.distance.DoubleDistanceDBIDList; -import de.lmu.ifi.dbs.elki.database.ids.distance.DoubleDistanceDBIDListIter; +import de.lmu.ifi.dbs.elki.database.ids.DoubleDBIDList; +import de.lmu.ifi.dbs.elki.database.ids.DoubleDBIDListIter; import de.lmu.ifi.dbs.elki.database.query.DatabaseQuery; import de.lmu.ifi.dbs.elki.database.query.distance.DistanceQuery; import de.lmu.ifi.dbs.elki.database.query.range.RangeQuery; import de.lmu.ifi.dbs.elki.database.relation.Relation; import de.lmu.ifi.dbs.elki.distance.distancefunction.DistanceFunction; -import de.lmu.ifi.dbs.elki.distance.distancevalue.DoubleDistance; import de.lmu.ifi.dbs.elki.logging.Logging; import de.lmu.ifi.dbs.elki.logging.progress.FiniteProgress; -import de.lmu.ifi.dbs.elki.persistent.ByteArrayUtil; import de.lmu.ifi.dbs.elki.utilities.exceptions.AbortException; +import de.lmu.ifi.dbs.elki.utilities.io.ByteArrayUtil; import de.lmu.ifi.dbs.elki.utilities.optionhandling.OptionID; import de.lmu.ifi.dbs.elki.utilities.optionhandling.constraints.CommonConstraints; import de.lmu.ifi.dbs.elki.utilities.optionhandling.parameterization.Parameterization; @@ -78,7 +75,7 @@ public class CacheDoubleDistanceRangeQueries<O> extends AbstractApplication { /** * Distance function that is to be cached. */ - private DistanceFunction<O, DoubleDistance> distance; + private DistanceFunction<O> distance; /** * Query radius. @@ -106,7 +103,7 @@ public class CacheDoubleDistanceRangeQueries<O> extends AbstractApplication { * @param radius Query radius * @param out Matrix output file */ - public CacheDoubleDistanceRangeQueries(InputStep input, DistanceFunction<O, DoubleDistance> distance, double radius, File out) { + public CacheDoubleDistanceRangeQueries(InputStep input, DistanceFunction<O> distance, double radius, File out) { super(); this.input = input; this.distance = distance; @@ -118,11 +115,10 @@ public class CacheDoubleDistanceRangeQueries<O> extends AbstractApplication { public void run() { Database database = input.getDatabase(); Relation<O> relation = database.getRelation(distance.getInputTypeRestriction()); - DistanceQuery<O, DoubleDistance> distanceQuery = database.getDistanceQuery(relation, distance); - DoubleDistance rad = new DoubleDistance(radius); - RangeQuery<O, DoubleDistance> rangeQ = database.getRangeQuery(distanceQuery, rad, DatabaseQuery.HINT_HEAVY_USE); + DistanceQuery<O> distanceQuery = database.getDistanceQuery(relation, distance); + RangeQuery<O> rangeQ = database.getRangeQuery(distanceQuery, radius, DatabaseQuery.HINT_HEAVY_USE); - LOG.verbose("Performing range queries with radius " + rad); + LOG.verbose("Performing range queries with radius " + radius); // open file. try (RandomAccessFile file = new RandomAccessFile(out, "rw"); @@ -139,16 +135,16 @@ public class CacheDoubleDistanceRangeQueries<O> extends AbstractApplication { FiniteProgress prog = LOG.isVerbose() ? new FiniteProgress("Computing range queries", relation.size(), LOG) : null; - for (DBIDIter it = relation.iterDBIDs(); it.valid(); it.advance()) { - final DistanceDBIDList<DoubleDistance> nn = rangeQ.getRangeForDBID(it, rad); + for(DBIDIter it = relation.iterDBIDs(); it.valid(); it.advance()) { + final DoubleDBIDList nn = rangeQ.getRangeForDBID(it, radius); final int nnsize = nn.size(); // Grow the buffer when needed: - if (nnsize * 12 + 10 > bufsize) { - while (nnsize * 12 + 10 > bufsize) { + if(nnsize * 12 + 10 > bufsize) { + while(nnsize * 12 + 10 > bufsize) { bufsize <<= 1; } - LOG.verbose("Resizing buffer to "+bufsize+" to store "+nnsize+" results:"); + LOG.verbose("Resizing buffer to " + bufsize + " to store " + nnsize + " results:"); buffer = ByteBuffer.allocateDirect(bufsize); } @@ -156,32 +152,22 @@ public class CacheDoubleDistanceRangeQueries<O> extends AbstractApplication { ByteArrayUtil.writeUnsignedVarint(buffer, it.internalGetIndex()); ByteArrayUtil.writeUnsignedVarint(buffer, nnsize); int c = 0; - if (nn instanceof DoubleDistanceDBIDList) { - for (DoubleDistanceDBIDListIter ni = ((DoubleDistanceDBIDList) nn).iter(); ni.valid(); ni.advance(), c++) { - ByteArrayUtil.writeUnsignedVarint(buffer, ni.internalGetIndex()); - buffer.putDouble(ni.doubleDistance()); - } - } else { - for (DistanceDBIDListIter<DoubleDistance> ni = nn.iter(); ni.valid(); ni.advance(), c++) { - ByteArrayUtil.writeUnsignedVarint(buffer, ni.internalGetIndex()); - buffer.putDouble(ni.getDistance().doubleValue()); - } + for(DoubleDBIDListIter ni = nn.iter(); ni.valid(); ni.advance(), c++) { + ByteArrayUtil.writeUnsignedVarint(buffer, ni.internalGetIndex()); + buffer.putDouble(ni.doubleValue()); } - if (c != nn.size()) { + if(c != nn.size()) { throw new AbortException("Sizes did not agree. Cache is invalid."); } buffer.flip(); channel.write(buffer); - if (prog != null) { - prog.incrementProcessed(LOG); - } - } - if (prog != null) { - prog.ensureCompleted(LOG); + LOG.incrementProcessed(prog); } + LOG.ensureCompleted(prog); lock.release(); - } catch (IOException e) { + } + catch(IOException e) { LOG.exception(e); } // FIXME: close! @@ -227,7 +213,7 @@ public class CacheDoubleDistanceRangeQueries<O> extends AbstractApplication { /** * Distance function that is to be cached. */ - private DistanceFunction<O, DoubleDistance> distance = null; + private DistanceFunction<O> distance = null; /** * Number of neighbors to precompute. @@ -244,18 +230,18 @@ public class CacheDoubleDistanceRangeQueries<O> extends AbstractApplication { super.makeOptions(config); input = config.tryInstantiate(InputStep.class); // Distance function parameter - final ObjectParameter<DistanceFunction<O, DoubleDistance>> dpar = new ObjectParameter<>(DISTANCE_ID, DistanceFunction.class); - if (config.grab(dpar)) { + final ObjectParameter<DistanceFunction<O>> dpar = new ObjectParameter<>(DISTANCE_ID, DistanceFunction.class); + if(config.grab(dpar)) { distance = dpar.instantiateClass(config); } final DoubleParameter kpar = new DoubleParameter(RADIUS_ID); kpar.addConstraint(CommonConstraints.GREATER_EQUAL_ZERO_DOUBLE); - if (config.grab(kpar)) { + if(config.grab(kpar)) { radius = kpar.doubleValue(); } // Output file parameter final FileParameter cpar = new FileParameter(CACHE_ID, FileParameter.FileType.OUTPUT_FILE); - if (config.grab(cpar)) { + if(config.grab(cpar)) { out = cpar.getValue(); } } |