diff options
Diffstat (limited to 'src/de/lmu/ifi/dbs/elki/distance/distancefunction/external/DiskCacheBasedFloatDistanceFunction.java')
-rw-r--r-- | src/de/lmu/ifi/dbs/elki/distance/distancefunction/external/DiskCacheBasedFloatDistanceFunction.java | 71 |
1 files changed, 13 insertions, 58 deletions
diff --git a/src/de/lmu/ifi/dbs/elki/distance/distancefunction/external/DiskCacheBasedFloatDistanceFunction.java b/src/de/lmu/ifi/dbs/elki/distance/distancefunction/external/DiskCacheBasedFloatDistanceFunction.java index cd84853b..8b823056 100644 --- a/src/de/lmu/ifi/dbs/elki/distance/distancefunction/external/DiskCacheBasedFloatDistanceFunction.java +++ b/src/de/lmu/ifi/dbs/elki/distance/distancefunction/external/DiskCacheBasedFloatDistanceFunction.java @@ -4,7 +4,7 @@ package de.lmu.ifi.dbs.elki.distance.distancefunction.external; 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,38 +26,26 @@ package de.lmu.ifi.dbs.elki.distance.distancefunction.external; import java.io.File; import java.io.IOException; -import de.lmu.ifi.dbs.elki.database.ids.DBIDRef; -import de.lmu.ifi.dbs.elki.database.ids.DBIDUtil; -import de.lmu.ifi.dbs.elki.distance.distancefunction.AbstractDBIDDistanceFunction; -import de.lmu.ifi.dbs.elki.distance.distancevalue.FloatDistance; +import de.lmu.ifi.dbs.elki.distance.distancefunction.AbstractDBIDRangeDistanceFunction; import de.lmu.ifi.dbs.elki.persistent.OnDiskUpperTriangleMatrix; import de.lmu.ifi.dbs.elki.utilities.documentation.Description; import de.lmu.ifi.dbs.elki.utilities.documentation.Title; -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.AbstractParameterizer; -import de.lmu.ifi.dbs.elki.utilities.optionhandling.OptionID; import de.lmu.ifi.dbs.elki.utilities.optionhandling.WrongParameterValueException; import de.lmu.ifi.dbs.elki.utilities.optionhandling.parameterization.Parameterization; import de.lmu.ifi.dbs.elki.utilities.optionhandling.parameters.FileParameter; /** - * Provides a DistanceFunction that is based on float distances given by a - * distance matrix of an external file. + * Distance function that is based on float distances given by a distance matrix + * of an external binary matrix file. * * @author Erich Schubert */ @Title("File based float distance for database objects.") @Description("Loads float distance values from an external matrix.") -public class DiskCacheBasedFloatDistanceFunction extends AbstractDBIDDistanceFunction<FloatDistance> { +public class DiskCacheBasedFloatDistanceFunction extends AbstractDBIDRangeDistanceFunction { // TODO: constructor with file. - - /** - * Parameter that specifies the name of the distance matrix file. - * <p> - * Key: {@code -distance.matrix} - * </p> - */ - public static final OptionID MATRIX_ID = new OptionID("distance.matrix", "The name of the file containing the distance matrix."); /** * Magic to identify double cache matrices @@ -65,11 +53,6 @@ public class DiskCacheBasedFloatDistanceFunction extends AbstractDBIDDistanceFun public static final int FLOAT_CACHE_MAGIC = 23423411; /** - * Storage required for a float value. - */ - private static final int FLOAT_SIZE = 4; - - /** * The distance cache */ private OnDiskUpperTriangleMatrix cache; @@ -84,47 +67,19 @@ public class DiskCacheBasedFloatDistanceFunction extends AbstractDBIDDistanceFun this.cache = cache; } - /** - * Returns the distance between the two objects specified by their objects - * ids. If a cache is used, the distance value is looked up in the cache. If - * the distance does not yet exists in cache, it will be computed an put to - * cache. If no cache is used, the distance is computed. - * - * @param id1 first object id - * @param id2 second object id - * @return the distance between the two objects specified by their objects ids - */ @Override - public FloatDistance distance(DBIDRef id1, DBIDRef id2) { - if(id1 == null) { - return getDistanceFactory().undefinedDistance(); - } - if(id2 == null) { - return getDistanceFactory().undefinedDistance(); - } - final int intid1 = DBIDUtil.asInteger(id1); - final int intid2 = DBIDUtil.asInteger(id2); - if(intid1 < 0 || intid2 < 0) { - throw new AbortException("Negative DBIDs not supported in OnDiskCache"); - } + public double distance(int i1, int i2) { // the smaller id is the first key - if(intid1 > intid2) { - return distance(id2, id1); + if(i1 > i2) { + return distance(i2, i1); } - float distance; try { - distance = cache.getRecordBuffer(intid1, intid2).getFloat(); + return cache.getRecordBuffer(i1, i2).getFloat(); } catch(IOException e) { - throw new RuntimeException("Read error when loading distance " + id1 + "," + id2 + " from cache file.", e); + throw new RuntimeException("Read error when loading distance " + i1 + "," + i2 + " from cache file.", e); } - return new FloatDistance(distance); - } - - @Override - public FloatDistance getDistanceFactory() { - return FloatDistance.FACTORY; } @Override @@ -152,11 +107,11 @@ public class DiskCacheBasedFloatDistanceFunction extends AbstractDBIDDistanceFun @Override protected void makeOptions(Parameterization config) { super.makeOptions(config); - final FileParameter param = new FileParameter(MATRIX_ID, FileParameter.FileType.INPUT_FILE); + final FileParameter param = new FileParameter(DiskCacheBasedDoubleDistanceFunction.Parameterizer.MATRIX_ID, FileParameter.FileType.INPUT_FILE); if(config.grab(param)) { File matrixfile = param.getValue(); try { - cache = new OnDiskUpperTriangleMatrix(matrixfile, FLOAT_CACHE_MAGIC, 0, FLOAT_SIZE, false); + cache = new OnDiskUpperTriangleMatrix(matrixfile, FLOAT_CACHE_MAGIC, 0, ByteArrayUtil.SIZE_FLOAT, false); } catch(IOException e) { config.reportError(new WrongParameterValueException(param, matrixfile.toString(), e)); |