diff options
Diffstat (limited to 'src/de/lmu/ifi/dbs/elki/distance/distancefunction/adapter/AbstractSimilarityAdapter.java')
-rw-r--r-- | src/de/lmu/ifi/dbs/elki/distance/distancefunction/adapter/AbstractSimilarityAdapter.java | 94 |
1 files changed, 48 insertions, 46 deletions
diff --git a/src/de/lmu/ifi/dbs/elki/distance/distancefunction/adapter/AbstractSimilarityAdapter.java b/src/de/lmu/ifi/dbs/elki/distance/distancefunction/adapter/AbstractSimilarityAdapter.java index b2bd9a72..44398dff 100644 --- a/src/de/lmu/ifi/dbs/elki/distance/distancefunction/adapter/AbstractSimilarityAdapter.java +++ b/src/de/lmu/ifi/dbs/elki/distance/distancefunction/adapter/AbstractSimilarityAdapter.java @@ -4,7 +4,7 @@ package de.lmu.ifi.dbs.elki.distance.distancefunction.adapter; 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 @@ -30,17 +30,16 @@ import de.lmu.ifi.dbs.elki.database.query.similarity.SimilarityQuery; import de.lmu.ifi.dbs.elki.database.relation.Relation; import de.lmu.ifi.dbs.elki.distance.distancefunction.AbstractDatabaseDistanceFunction; import de.lmu.ifi.dbs.elki.distance.distancefunction.DistanceFunction; -import de.lmu.ifi.dbs.elki.distance.distancevalue.DoubleDistance; -import de.lmu.ifi.dbs.elki.distance.distancevalue.NumberDistance; -import de.lmu.ifi.dbs.elki.distance.similarityfunction.FractionalSharedNearestNeighborSimilarityFunction; import de.lmu.ifi.dbs.elki.distance.similarityfunction.NormalizedSimilarityFunction; +import de.lmu.ifi.dbs.elki.distance.similarityfunction.SimilarityFunction; +import de.lmu.ifi.dbs.elki.utilities.ClassGenericsUtil; 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.parameterization.Parameterization; import de.lmu.ifi.dbs.elki.utilities.optionhandling.parameters.ObjectParameter; /** - * Adapter from a normalized similarity function to a distance function. + * Adapter from a similarity function to a distance function. * * Note: The derived distance function will usually not satisfy the triangle * equation. @@ -51,33 +50,18 @@ import de.lmu.ifi.dbs.elki.utilities.optionhandling.parameters.ObjectParameter; * * @param <O> object class to process */ -public abstract class AbstractSimilarityAdapter<O> extends AbstractDatabaseDistanceFunction<O, DoubleDistance> { - /** - * Parameter to specify the similarity function to derive the distance between - * database objects from. Must extend - * {@link de.lmu.ifi.dbs.elki.distance.similarityfunction.NormalizedSimilarityFunction} - * . - * <p> - * Key: {@code -adapter.similarityfunction} - * </p> - * <p> - * Default value: - * {@link de.lmu.ifi.dbs.elki.distance.similarityfunction.FractionalSharedNearestNeighborSimilarityFunction} - * </p> - */ - public static final OptionID SIMILARITY_FUNCTION_ID = new OptionID("adapter.similarityfunction", "Similarity function to derive the distance between database objects from."); - +public abstract class AbstractSimilarityAdapter<O> extends AbstractDatabaseDistanceFunction<O> { /** * Holds the similarity function. */ - protected NormalizedSimilarityFunction<? super O> similarityFunction; + protected SimilarityFunction<? super O> similarityFunction; /** * Constructor. * * @param similarityFunction Similarity function to use. */ - public AbstractSimilarityAdapter(NormalizedSimilarityFunction<? super O> similarityFunction) { + public AbstractSimilarityAdapter(SimilarityFunction<? super O> similarityFunction) { super(); this.similarityFunction = similarityFunction; } @@ -93,20 +77,15 @@ public abstract class AbstractSimilarityAdapter<O> extends AbstractDatabaseDista } @Override - public DoubleDistance getDistanceFactory() { - return DoubleDistance.FACTORY; - } - - @Override - abstract public <T extends O> DistanceQuery<T, DoubleDistance> instantiate(Relation<T> database); + abstract public <T extends O> DistanceQuery<T> instantiate(Relation<T> database); @Override public boolean equals(Object obj) { - if (obj == null) { + if(obj == null) { return false; } // Same subclass - if (!this.getClass().equals(obj.getClass())) { + if(!this.getClass().equals(obj.getClass())) { return false; } // Same similarity function @@ -121,11 +100,11 @@ public abstract class AbstractSimilarityAdapter<O> extends AbstractDatabaseDista * * @param <O> Object type */ - public abstract static class Instance<O> extends AbstractDatabaseDistanceFunction.Instance<O, DoubleDistance> { + public abstract static class Instance<O> extends AbstractDatabaseDistanceFunction.Instance<O> { /** * The similarity query we use. */ - private SimilarityQuery<? super O, ? extends NumberDistance<?, ?>> similarityQuery; + private SimilarityQuery<? super O> similarityQuery; /** * Constructor. @@ -134,7 +113,7 @@ public abstract class AbstractSimilarityAdapter<O> extends AbstractDatabaseDista * @param parent Parent distance function * @param similarityQuery Similarity query */ - public Instance(Relation<O> database, DistanceFunction<? super O, DoubleDistance> parent, SimilarityQuery<? super O, ? extends NumberDistance<?, ?>> similarityQuery) { + public Instance(Relation<O> database, DistanceFunction<? super O> parent, SimilarityQuery<? super O> similarityQuery) { super(database, parent); this.similarityQuery = similarityQuery; } @@ -148,14 +127,8 @@ public abstract class AbstractSimilarityAdapter<O> extends AbstractDatabaseDista public abstract double transform(double similarity); @Override - public DoubleDistance distance(DBIDRef id1, DBIDRef id2) { - final NumberDistance<?, ?> sim = similarityQuery.similarity(id1, id2); - return new DoubleDistance(transform(sim.doubleValue())); - } - - @Override - public DoubleDistance getDistanceFactory() { - return DoubleDistance.FACTORY; + public double distance(DBIDRef id1, DBIDRef id2) { + return transform(similarityQuery.similarity(id1, id2)); } } @@ -166,19 +139,48 @@ public abstract class AbstractSimilarityAdapter<O> extends AbstractDatabaseDista * * @apiviz.exclude */ - public abstract static class Parameterizer<O> extends AbstractParameterizer { + public abstract static class Parameterizer<O, S extends SimilarityFunction<? super O>> extends AbstractParameterizer { + /** + * Parameter to specify the similarity function to derive the distance + * between database objects from. Must extend + * {@link de.lmu.ifi.dbs.elki.distance.similarityfunction.SimilarityFunction} + * . + * <p> + * Key: {@code -adapter.similarityfunction} + * </p> + */ + public static final OptionID SIMILARITY_FUNCTION_ID = new OptionID("adapter.similarityfunction", // + "Similarity function to derive the distance between database objects from."); + /** * Holds the similarity function. */ - protected NormalizedSimilarityFunction<? super O> similarityFunction = null; + protected S similarityFunction = null; + + /** + * Arbitrary Similarity functions + */ + protected Class<SimilarityFunction<? super O>> ARBITRARY_SIMILARITY = ClassGenericsUtil.uglyCastIntoSubclass(SimilarityFunction.class); + + /** + * Normalized similarity functions + */ + protected Class<NormalizedSimilarityFunction<? super O>> NORMALIZED_SIMILARITY = ClassGenericsUtil.uglyCastIntoSubclass(NormalizedSimilarityFunction.class); @Override protected void makeOptions(Parameterization config) { super.makeOptions(config); - final ObjectParameter<NormalizedSimilarityFunction<? super O>> param = new ObjectParameter<>(SIMILARITY_FUNCTION_ID, NormalizedSimilarityFunction.class, FractionalSharedNearestNeighborSimilarityFunction.class); - if (config.grab(param)) { + final ObjectParameter<S> param = new ObjectParameter<>(SIMILARITY_FUNCTION_ID, getSimilarityRestriction()); + if(config.grab(param)) { similarityFunction = param.instantiateClass(config); } } + + /** + * Get the similarity function restriction. + * + * @return Distance function supported. + */ + protected abstract Class<? extends S> getSimilarityRestriction(); } } |