package arida.ufc.br.moap.function.sim;
import arida.ufc.br.moap.function.api.ISimilarityFunction;
import java.util.HashSet;
import java.util.Map;
import java.util.Set;
/**
*
* @author igobrilhante
*/
public class TanimotoSimilarity<T> implements ISimilarityFunction<Map<T,Double>> {
public Double evaluate(Map<T,Double> map1,Map<T,Double> map2){
double sim = 0.0;
Set<T> union = new HashSet<T>(map1.keySet());
union.addAll(map2.keySet());
double a = 0.0;
double b = 0.0;
double c = 0.0;
boolean c1 = false;
boolean c2 = false;
for(T item : union){
c1 = map1.containsKey(item);
c2 = map2.containsKey(item);
if(c1 && c2){
a += (map1.get(item)*map2.get(item));
}
if(c1){
b += (map1.get(item)*map1.get(item));
}
if(c2){
c += (map2.get(item)*map2.get(item));
}
}
// System.out.println(String.format("Sim %s/%s+%s-%s = %s", a,b,c,a,b+c - a));
if(b+c - a > 0) { sim = (a)/(b+c - a); }
return sim;
}
@Override
public String getName() {
// TODO Auto-generated method stub
return "Tanimoto Similarity";
}
}