OSDN Git Service

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