OSDN Git Service

96d8b54672f2a01c897fa26f571146d2f88c7ace
[stigmata/stigmata.git] / src / main / java / jp / sourceforge / stigmata / birthmarks / comparators / LogicalAndBirthmarkComparator.java
1 package jp.sourceforge.stigmata.birthmarks.comparators;
2
3 /*
4  * $Id$
5  */
6
7 import java.util.HashSet;
8 import java.util.Set;
9
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;
14
15 /**
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)|.
19  * 
20  * @author Haruaki TAMADA
21  * @version $Revision$ 
22  */
23 public class LogicalAndBirthmarkComparator extends AbstractBirthmarkComparator{
24     public LogicalAndBirthmarkComparator(BirthmarkSpi spi){
25         super(spi);
26     }
27
28     @Override
29     public double compare(Birthmark b1, Birthmark b2, BirthmarkContext context){
30         if(!b1.getType().equals(b2.getType())){
31             return Double.NaN;
32         }
33
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]);
40
41         Set<BirthmarkElement> set = new HashSet<BirthmarkElement>();
42         for(BirthmarkElement elem: set1){
43             if(set2.contains(elem)) set.add(elem);
44         }
45         for(BirthmarkElement elem: set2){
46             if(set1.contains(elem)) set.add(elem);
47         }
48
49         int len = set1.size() + set2.size();
50         int frac = set.size() * 2;
51
52         double similarity = (double)frac / (double)len;
53         if(len == 0 && frac == 0){
54             similarity = 1d;
55         }
56         return similarity;
57     }
58
59     @Override
60     public int getCompareCount(Birthmark b1, Birthmark b2){
61         return b1.getElementCount() + b2.getElementCount();
62     }
63 }