1 package jp.sourceforge.stigmata.birthmarks.comparators;
7 import java.util.HashSet;
10 import jp.sourceforge.stigmata.Birthmark;
11 import jp.sourceforge.stigmata.BirthmarkContext;
12 import jp.sourceforge.stigmata.BirthmarkElement;
13 import jp.sourceforge.stigmata.spi.BirthmarkSpi;
16 * this comparator calculate following formula.
17 * let f(p) and f(q) be given birthmarks, then
18 * similarity of those birthmarks are defined by |f(p) and f(q)|/|f(p) or f(q)|.
20 * @author Haruaki TAMADA
23 public class LogicalAndBirthmarkComparator extends AbstractBirthmarkComparator{
24 public LogicalAndBirthmarkComparator(BirthmarkSpi spi){
29 public double compare(Birthmark b1, Birthmark b2, BirthmarkContext context){
30 if(!b1.getType().equals(b2.getType())){
34 BirthmarkElement[] element1 = b1.getElements();
35 BirthmarkElement[] element2 = b2.getElements();
36 Set<BirthmarkElement> set1 = new HashSet<BirthmarkElement>();
37 for(int i = 0; i < element1.length; i++) set1.add(element1[i]);
38 Set<BirthmarkElement> set2 = new HashSet<BirthmarkElement>();
39 for(int i = 0; i < element2.length; i++) set2.add(element2[i]);
41 Set<BirthmarkElement> set = new HashSet<BirthmarkElement>();
42 for(BirthmarkElement elem: set1){
43 if(set2.contains(elem)) set.add(elem);
45 for(BirthmarkElement elem: set2){
46 if(set1.contains(elem)) set.add(elem);
49 int len = set1.size() + set2.size();
50 int frac = set.size() * 2;
52 double similarity = (double)frac / (double)len;
53 if(len == 0 && frac == 0){
60 public int getCompareCount(Birthmark b1, Birthmark b2){
61 return b1.getElementCount() + b2.getElementCount();