1 package jp.sourceforge.stigmata.birthmarks.comparators;
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;
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>.
17 * @author Haruaki TAMADA
19 public class PlainBirthmarkComparator extends AbstractBirthmarkComparator{
20 public PlainBirthmarkComparator(BirthmarkSpi spi){
25 public double compare(Birthmark b1, Birthmark b2, BirthmarkContext context){
26 if(!b1.getType().equals(b2.getType())){
30 BirthmarkElement[] element1 = b1.getElements();
31 BirthmarkElement[] element2 = b2.getElements();
32 int len = element1.length + element2.length;
34 for(int i = 0; i < element1.length && i < element2.length; i++){
35 if(element1[i].equals(element2[i])){
40 double similarity = (double)frac / (double)len;
41 if(len == 0 && frac == 0){
48 public int getCompareCount(Birthmark b1, Birthmark b2){
49 return b1.getElementCount() + b2.getElementCount();