OSDN Git Service

122c107ca43c2c9365c7ebcfa51756b7de3e9872
[stigmata/stigmata.git] / src / main / java / jp / sourceforge / stigmata / filter / SimilarityComparisonPairFilter.java
1 package jp.sourceforge.stigmata.filter;
2
3 /*
4  * $Id$
5  */
6
7 import java.util.ArrayList;
8 import java.util.List;
9
10 import jp.sourceforge.stigmata.ComparisonPair;
11 import jp.sourceforge.stigmata.spi.ComparisonPairFilterSpi;
12
13 /**
14  * 
15  * @author Haruaki TAMADA
16  * @version $Revision$ 
17  */
18 public class SimilarityComparisonPairFilter extends AbstractComparisonPairFilter{
19     private static final double EQUALS_THRESHOLD = 5E-5;
20
21     private static List<Criterion> CRITERIA = new ArrayList<Criterion>();
22     static{
23         CRITERIA.add(Criterion.GREATER_EQUALS);
24         CRITERIA.add(Criterion.GREATER_THAN);
25         CRITERIA.add(Criterion.LESS_EQUALS);
26         CRITERIA.add(Criterion.LESS_THAN);
27         CRITERIA.add(Criterion.EQUALS_AS);
28         CRITERIA.add(Criterion.NOT_EQUALS_AS); 
29     };
30
31     private double threshold;
32
33     public SimilarityComparisonPairFilter(ComparisonPairFilterSpi service){
34         super(service);
35         setThreshold(0.8d);
36     }
37     
38     @Override
39     public boolean isFiltered(ComparisonPair pair){
40         double similarity = pair.calculateSimilarity();
41         boolean flag;
42         switch(getCriterion()){
43         case GREATER_EQUALS:
44             flag = similarity >= getThreshold();
45             break;
46         case GREATER_THAN:
47             flag = similarity > getThreshold();
48             break;
49         case LESS_EQUALS:
50             flag = similarity <= getThreshold();
51             break;
52         case LESS_THAN:
53             flag = similarity < getThreshold();
54             break;
55         case EQUALS_AS:
56             flag = (similarity - getThreshold()) <= EQUALS_THRESHOLD;
57             break;
58         case NOT_EQUALS_AS:
59             flag = (similarity - getThreshold()) > EQUALS_THRESHOLD;
60             break;
61         default:
62             flag = false;
63             break;
64         }
65         return flag;
66     }
67
68     public static Criterion[] getValidCriteria(){
69         return CRITERIA.toArray(new Criterion[CRITERIA.size()]);
70     }
71
72     @Override
73     public Criterion[] getAcceptableCriteria(){
74         return getValidCriteria();
75     }
76
77     public double getThreshold(){
78         return threshold;
79     }
80
81     public void setThreshold(double threshold){
82         if(threshold < 0d || threshold >= 1.0d){
83             throw new IllegalArgumentException("threshold must be 0.0-1.0");
84         }
85         this.threshold = threshold;
86     }
87
88     @Override
89     public String toString(){
90         StringBuffer sb = new StringBuffer();
91         sb.append("similarity");
92         switch(getCriterion()){
93         case GREATER_EQUALS: sb.append(" >= "); break;
94         case GREATER_THAN:   sb.append(" >  "); break;
95         case LESS_EQUALS:    sb.append(" <= "); break;
96         case LESS_THAN:      sb.append(" <  "); break;
97         case EQUALS_AS:      sb.append(" == "); break;
98         case NOT_EQUALS_AS:  sb.append(" != "); break;
99         }
100         sb.append(getThreshold());
101         return new String(sb);
102     }
103 }