OSDN Git Service

implements comparator
authortama3 <tama3@acee48c3-7b26-0410-bdac-b3d0e5314bbc>
Wed, 3 Dec 2008 11:22:25 +0000 (11:22 +0000)
committertama3 <tama3@acee48c3-7b26-0410-bdac-b3d0e5314bbc>
Wed, 3 Dec 2008 11:22:25 +0000 (11:22 +0000)
git-svn-id: svn+ssh://svn.sourceforge.jp/svnroot/stigmata/plugins/trunk@335 acee48c3-7b26-0410-bdac-b3d0e5314bbc

wsp/src/main/java/jp/sourceforge/stigmata/birthmarks/wsp/StackPatternBasedBirthmarkComparator.java
wsp/src/main/java/jp/sourceforge/stigmata/birthmarks/wsp/StackPatternBasedBirthmarkElement.java
wsp/src/test/java/jp/sourceforge/stigmata/birthmarks/wsp/StackPatternBasedBirthmarkComparatorTest.java [new file with mode: 0644]

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;
+    }
 }
index 5ace5f5..b2e330a 100644 (file)
@@ -24,4 +24,8 @@ public class StackPatternBasedBirthmarkElement extends BirthmarkElement{
     public StackPattern getPattern(){
         return pattern;
     }
+
+    public int getWeight(){
+        return pattern.getWeight();
+    }
 }
diff --git a/wsp/src/test/java/jp/sourceforge/stigmata/birthmarks/wsp/StackPatternBasedBirthmarkComparatorTest.java b/wsp/src/test/java/jp/sourceforge/stigmata/birthmarks/wsp/StackPatternBasedBirthmarkComparatorTest.java
new file mode 100644 (file)
index 0000000..4540974
--- /dev/null
@@ -0,0 +1,46 @@
+package jp.sourceforge.stigmata.birthmarks.wsp;
+
+/*
+ * $Id$
+ */
+
+import org.junit.Assert;
+import org.junit.Before;
+import org.junit.Test;
+
+/**
+ * 
+ * @author Haruaki Tamada
+ * @version $Revision$
+ */
+public class StackPatternBasedBirthmarkComparatorTest{
+    private StackPatternBasedBirthmarkComparator comparator;
+
+    @Before
+    public void setup(){
+        StackPatternBasedBirthmarkService service = new StackPatternBasedBirthmarkService();
+        comparator = new StackPatternBasedBirthmarkComparator(service);
+    }
+
+    @Test
+    public void testCalculateWeightOfWcs(){
+        int[][] wcs = new int[][] {
+            {  6,  6,  9,  3, },
+            { 21, 18, 18,  6, },
+            {  9,  6, 12,  3, },
+            {  6,  9, 30,  9, },
+        };
+        Assert.assertEquals(60, comparator.calculateWeight(wcs));
+    }
+
+    @Test
+    public void testCalculateWeightOfWcs2(){
+        int[][] wcs = new int[][] {
+            { 16,  5,  0,  6, },
+            {  3,  0, 15,  6, },
+            {  2, 10,  0,  3, },
+            {  0,  2,  3,  9, },
+        };
+        Assert.assertEquals(50, comparator.calculateWeight(wcs));
+    }
+}