OSDN Git Service

Delete Subversion Tags (Revision, Id)
[stigmata/stigmata-core.git] / src / main / java / jp / sourceforge / stigmata / birthmarks / comparators / PlainBirthmarkComparator.java
1 package jp.sourceforge.stigmata.birthmarks.comparators;
2
3 import jp.sourceforge.stigmata.Birthmark;
4 import jp.sourceforge.stigmata.BirthmarkComparator;
5 import jp.sourceforge.stigmata.BirthmarkContext;
6 import jp.sourceforge.stigmata.BirthmarkElement;
7 import jp.sourceforge.stigmata.spi.BirthmarkSpi;
8
9 /**
10  * An implementation of {@link BirthmarkComparator
11  * <code>BirthmarkComparator</code>}.  Let <i>p</i> and <i>q</i> be
12  * programs, <i>f(p)</i> and <i>f(q)</i> be extracted birthmarks from
13  * <i>p</i> and <i>q</i>.  Let <i>|f(p)|</i> be a element count of
14  * <i>f(p)</i>.  Then, expression of comparing birthmarks algorithm of
15  * this class is defined as <i>|f(p) and f(q)|/(|f(p)| + |f(q)|)</i>.
16  * 
17  * @author Haruaki TAMADA
18  */
19 public class PlainBirthmarkComparator extends AbstractBirthmarkComparator{
20     public PlainBirthmarkComparator(BirthmarkSpi spi){
21         super(spi);
22     }
23
24     @Override
25     public double compare(Birthmark b1, Birthmark b2, BirthmarkContext context){
26         if(!b1.getType().equals(b2.getType())){
27             return Double.NaN;
28         }
29
30         BirthmarkElement[] element1 = b1.getElements();
31         BirthmarkElement[] element2 = b2.getElements();
32         int len = element1.length + element2.length;
33         int frac = 0;
34         for(int i = 0; i < element1.length && i < element2.length; i++){
35             if(element1[i].equals(element2[i])){
36                 frac += 2;
37             }
38         }
39
40         double similarity = (double)frac / (double)len;
41         if(len == 0 && frac == 0){
42             similarity = 1d;
43         }
44         return similarity;
45     }
46
47     @Override
48     public int getCompareCount(Birthmark b1, Birthmark b2){
49         return b1.getElementCount() + b2.getElementCount();
50     }
51 }