OSDN Git Service

implements comparator
[stigmata/stigmata-plugins.git] / wsp / src / main / java / jp / sourceforge / stigmata / birthmarks / wsp / StackPatternBasedBirthmarkComparator.java
index d47b2e4..1dbc118 100644 (file)
@@ -6,6 +6,7 @@ package jp.sourceforge.stigmata.birthmarks.wsp;
 
 import jp.sourceforge.stigmata.Birthmark;
 import jp.sourceforge.stigmata.BirthmarkContext;
+import jp.sourceforge.stigmata.BirthmarkElement;
 import jp.sourceforge.stigmata.birthmarks.comparators.AbstractBirthmarkComparator;
 import jp.sourceforge.stigmata.spi.BirthmarkSpi;
 
@@ -21,8 +22,68 @@ public class StackPatternBasedBirthmarkComparator extends AbstractBirthmarkCompa
 
     @Override
     public double compare(Birthmark b1, Birthmark b2, BirthmarkContext context){
-        // TODO implement this method.
-        return 0;
+        int[][] wcs = createMatrix(b1, b2);
+        int weightOfWcs = calculateWeight(wcs);
+        int weightOfBirthmark1 = 0;
+        for(BirthmarkElement element: b1){
+            weightOfBirthmark1 += ((StackPatternBasedBirthmarkElement)element).getWeight();
+        }
+
+        return (double)weightOfWcs / (double)weightOfBirthmark1;
     }
 
+    int calculateWeight(int[][] wcs){
+        int weight = 0;
+        boolean[][] availableFlag = new boolean[wcs.length][wcs[0].length];
+        for(int i = 0; i < wcs.length; i++){
+            for(int j = 0; j < wcs[i].length; j++){
+                availableFlag[i][j] = true;
+            }
+        }
+
+        int length = wcs.length;
+        if(length < wcs[0].length){
+            length = wcs[0].length;
+        }
+        for(int k = 0; k < length; k++){
+            int max = Integer.MIN_VALUE;
+            int column = -1;
+            int row = -1;
+            for(int i = 0; i < wcs.length; i++){
+                for(int j = 0; j < wcs[i].length; j++){
+                    if(max < wcs[i][j] && availableFlag[i][j]){
+                        max = wcs[i][j];
+                        row = i;
+                        column = j;
+                    }
+                }
+            }
+            if(column >= 0 && row >= 0){
+                for(int i = 0; i < wcs.length; i++){
+                    availableFlag[i][column] = false;
+                }
+                for(int j = 0; j < wcs[0].length; j++){
+                    availableFlag[row][j] = false;
+                }
+                weight += wcs[column][row];
+            }
+        }
+
+        return weight;
+    }
+
+    private int[][] createMatrix(Birthmark b1, Birthmark b2){
+        BirthmarkElement[] elementsA = b1.getElements();
+        BirthmarkElement[] elementsB = b2.getElements();
+
+        int[][] matrix = new int[elementsA.length][elementsB.length];
+        for(int i = 0; i < elementsA.length; i++){
+            for(int j = 0; j < elementsB.length; j++){
+                StackPatternBasedBirthmarkElement wsp1 = (StackPatternBasedBirthmarkElement)elementsA[i];
+                StackPatternBasedBirthmarkElement wsp2 = (StackPatternBasedBirthmarkElement)elementsB[j];
+                matrix[i][j] = wsp1.getPattern().calculateWeight(wsp2.getPattern());
+            }
+        }
+        return matrix;
+    }
 }