Sfoglia il codice sorgente

Changed comparison algorithm to enable parallel comparison.

Timur Sağlam 5 anni fa
parent
commit
6484028bbd

+ 34 - 26
jplag/src/main/java/jplag/strategy/NormalComparisonStrategy.java

@@ -1,6 +1,7 @@
 package jplag.strategy;
 package jplag.strategy;
 
 
 import java.util.ArrayList;
 import java.util.ArrayList;
+import java.util.Collections;
 import java.util.List;
 import java.util.List;
 import java.util.Vector;
 import java.util.Vector;
 
 
@@ -15,44 +16,51 @@ public class NormalComparisonStrategy extends AbstractComparisonStrategy {
     public NormalComparisonStrategy(JPlagOptions options, GreedyStringTiling greedyStringTiling) {
     public NormalComparisonStrategy(JPlagOptions options, GreedyStringTiling greedyStringTiling) {
         super(options, greedyStringTiling);
         super(options, greedyStringTiling);
     }
     }
-    
+
     @Override
     @Override
     public JPlagResult compareSubmissions(Vector<Submission> submissions, Submission baseCodeSubmission) {
     public JPlagResult compareSubmissions(Vector<Submission> submissions, Submission baseCodeSubmission) {
+        long start = System.currentTimeMillis();
         if (baseCodeSubmission != null) {
         if (baseCodeSubmission != null) {
             compareSubmissionsToBaseCode(submissions, baseCodeSubmission);
             compareSubmissionsToBaseCode(submissions, baseCodeSubmission);
         }
         }
-        
+
         long timeBeforeStartInMillis = System.currentTimeMillis();
         long timeBeforeStartInMillis = System.currentTimeMillis();
-        int i, j, numberOfSubmissions = submissions.size();
-        Submission first, second;
-        List<JPlagComparison> comparisons = new ArrayList<>();
-        JPlagComparison comparison;
-        
-        for (i = 0; i < (numberOfSubmissions - 1); i++) {
-            first = submissions.elementAt(i);
-            if (first.tokenList == null) {
-                continue;
-            }
-            for (j = (i + 1); j < numberOfSubmissions; j++) {
-                second = submissions.elementAt(j);
-                if (second.tokenList == null) {
-                    continue;
-                }
-                comparison = greedyStringTiling.compare(first, second);
 
 
-                // TODO SH: Why does this differ from the results shown in the result web page?
-                System.out.println("Comparing " + first.name + "-" + second.name + ": " + comparison.percent());
-                if (baseCodeSubmission != null) {
-                    comparison.baseCodeMatchesA = baseCodeMatches.get(comparison.firstSubmission.name);
-                    comparison.baseCodeMatchesB = baseCodeMatches.get(comparison.secondSubmission.name);
+        List<SubmissionTuple> tuples = new ArrayList<>();
+        for (int i = 0; i < (submissions.size() - 1); i++) {
+            Submission first = submissions.elementAt(i);
+            if (first.tokenList != null) {
+                for (int j = (i + 1); j < submissions.size(); j++) {
+                    Submission second = submissions.elementAt(j);
+                    if (second.tokenList != null) {
+                        tuples.add(new SubmissionTuple(first, second));
+                    }
                 }
                 }
-                if (isAboveSimilarityThreshold(comparison)) {
+            }
+        }
+
+        List<JPlagComparison> comparisons = Collections.synchronizedList(new ArrayList<>());
+        tuples.parallelStream().forEach(it -> {
+            JPlagComparison comparison = greedyStringTiling.compare(it.getLeft(), it.getRight());
+            // TODO SH: Why does this differ from the results shown in the result web page?
+            System.out.println("Comparing " + it.getLeft().name + "-" + it.getRight().name + ": " + comparison.percent());
+            if (baseCodeSubmission != null) {
+                comparison.bcMatchesA = baseCodeMatches.get(comparison.firstSubmission.name);
+                comparison.bcMatchesB = baseCodeMatches.get(comparison.secondSubmission.name);
+            }
+            if (isAboveSimilarityThreshold(comparison)) {
+                synchronized (comparisons) {
                     comparisons.add(comparison);
                     comparisons.add(comparison);
                 }
                 }
             }
             }
-        }
+        });
+
         long durationInMillis = System.currentTimeMillis() - timeBeforeStartInMillis;
         long durationInMillis = System.currentTimeMillis() - timeBeforeStartInMillis;
-        return new JPlagResult(comparisons, durationInMillis, numberOfSubmissions, options);
+        long end = System.currentTimeMillis();
+        System.out.println("------------");
+        System.out.println("Timed: " + (end - start)); // Seq: 113162
+        System.out.println("------------");
+        return new JPlagResult(comparisons, durationInMillis, submissions.size(), options);
     }
     }
 
 
 }
 }