summaryrefslogtreecommitdiff
path: root/src/de/lmu/ifi/dbs/elki/distance/distancefunction/adapter/AbstractSimilarityAdapter.java
diff options
context:
space:
mode:
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.java94
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();
}
}