[jboss-svn-commits] JBL Code SVN: r33289 - in labs/jbossrules/trunk/drools-planner: drools-planner-core/src/main/java/org/drools/planner/benchmark/statistic and 4 other directories.

jboss-svn-commits at lists.jboss.org jboss-svn-commits at lists.jboss.org
Tue Jun 1 15:46:14 EDT 2010


Author: ge0ffrey
Date: 2010-06-01 15:46:13 -0400 (Tue, 01 Jun 2010)
New Revision: 33289

Modified:
   labs/jbossrules/trunk/drools-planner/drools-planner-core/src/main/java/org/drools/planner/benchmark/SolverBenchmarkSuite.java
   labs/jbossrules/trunk/drools-planner/drools-planner-core/src/main/java/org/drools/planner/benchmark/statistic/BestScoreStatistic.java
   labs/jbossrules/trunk/drools-planner/drools-planner-core/src/main/java/org/drools/planner/core/Solver.java
   labs/jbossrules/trunk/drools-planner/drools-planner-core/src/main/java/org/drools/planner/core/localsearch/DefaultLocalSearchSolver.java
   labs/jbossrules/trunk/drools-planner/drools-planner-core/src/main/java/org/drools/planner/core/score/definition/HardAndSoftScoreDefinition.java
   labs/jbossrules/trunk/drools-planner/drools-planner-core/src/main/java/org/drools/planner/core/score/definition/ScoreDefinition.java
   labs/jbossrules/trunk/drools-planner/drools-planner-core/src/main/java/org/drools/planner/core/score/definition/SimpleScoreDefinition.java
   labs/jbossrules/trunk/drools-planner/src/main/assembly/docs/UpgradeFromPreviousVersionRecipe.txt
Log:
JBRULES-2441 + summary chart

Modified: labs/jbossrules/trunk/drools-planner/drools-planner-core/src/main/java/org/drools/planner/benchmark/SolverBenchmarkSuite.java
===================================================================
--- labs/jbossrules/trunk/drools-planner/drools-planner-core/src/main/java/org/drools/planner/benchmark/SolverBenchmarkSuite.java	2010-06-01 18:03:58 UTC (rev 33288)
+++ labs/jbossrules/trunk/drools-planner/drools-planner-core/src/main/java/org/drools/planner/benchmark/SolverBenchmarkSuite.java	2010-06-01 19:46:13 UTC (rev 33289)
@@ -1,10 +1,12 @@
 package org.drools.planner.benchmark;
 
+import java.awt.image.BufferedImage;
 import java.io.File;
 import java.io.FileInputStream;
 import java.io.FileOutputStream;
 import java.io.IOException;
 import java.io.InputStreamReader;
+import java.io.OutputStream;
 import java.io.OutputStreamWriter;
 import java.io.Reader;
 import java.io.Writer;
@@ -20,6 +22,8 @@
 import java.util.Map;
 import java.util.HashMap;
 
+import javax.imageio.ImageIO;
+
 import com.thoughtworks.xstream.XStream;
 import com.thoughtworks.xstream.annotations.XStreamAlias;
 import com.thoughtworks.xstream.annotations.XStreamImplicit;
@@ -28,9 +32,14 @@
 import org.drools.planner.config.localsearch.LocalSearchSolverConfig;
 import org.drools.planner.core.Solver;
 import org.drools.planner.core.score.Score;
+import org.drools.planner.core.score.definition.ScoreDefinition;
 import org.drools.planner.core.solution.Solution;
 import org.drools.planner.benchmark.statistic.BestScoreStatistic;
 import org.drools.planner.benchmark.statistic.SolverStatistic;
+import org.jfree.chart.ChartFactory;
+import org.jfree.chart.JFreeChart;
+import org.jfree.chart.plot.PlotOrientation;
+import org.jfree.data.category.DefaultCategoryDataset;
 
 /**
  * @author Geoffrey De Smet
@@ -204,6 +213,7 @@
                 writeSolvedSolution(xStream, solverBenchmark, result, solvedSolution);
             }
         }
+        writeGraphSummary();
         if (solverStatisticType != SolverStatisticType.NONE) {
             List<CharSequence> htmlFragments = new ArrayList<CharSequence>(unsolvedSolutionFileToStatisticMap.size());
             for (Map.Entry<File, SolverStatistic> entry : unsolvedSolutionFileToStatisticMap.entrySet()) {
@@ -220,6 +230,34 @@
         benchmarkingEnded();
     }
 
+    private void writeGraphSummary() {
+        DefaultCategoryDataset dataset = new DefaultCategoryDataset();
+
+        for (SolverBenchmark solverBenchmark : solverBenchmarkList) {
+            ScoreDefinition scoreDefinition = solverBenchmark.getLocalSearchSolverConfig().getScoreDefinitionConfig()
+                    .buildScoreDefinition();
+            for (SolverBenchmarkResult result : solverBenchmark.getSolverBenchmarkResultList()) {
+                Double scoreGraphValue = scoreDefinition.translateScoreToGraphValue(result.getScore());
+                dataset.addValue(scoreGraphValue, solverBenchmark.getName(), result.getUnsolvedSolutionFile().getName());
+            }
+        }
+        JFreeChart chart = ChartFactory.createBarChart(
+            "Best score summary", "Data", "Score",
+            dataset, PlotOrientation.VERTICAL, true, true, false
+        );
+        BufferedImage chartImage = chart.createBufferedImage(800, 600);
+        File chartSummaryFile = new File(solverStatisticFilesDirectory, "summary.png");
+        OutputStream out = null;
+        try {
+            out = new FileOutputStream(chartSummaryFile);
+            ImageIO.write(chartImage, "png", out);
+        } catch (IOException e) {
+            throw new IllegalArgumentException("Problem writing graphStatisticFile: " + chartSummaryFile, e);
+        } finally {
+            IOUtils.closeQuietly(out);
+        }
+    }
+
     private void writeHtmlOverview(List<CharSequence> htmlFragments) {
         File htmlOverviewFile = new File(solverStatisticFilesDirectory, "index.html");
         Writer writer = null;

Modified: labs/jbossrules/trunk/drools-planner/drools-planner-core/src/main/java/org/drools/planner/benchmark/statistic/BestScoreStatistic.java
===================================================================
--- labs/jbossrules/trunk/drools-planner/drools-planner-core/src/main/java/org/drools/planner/benchmark/statistic/BestScoreStatistic.java	2010-06-01 18:03:58 UTC (rev 33288)
+++ labs/jbossrules/trunk/drools-planner/drools-planner-core/src/main/java/org/drools/planner/benchmark/statistic/BestScoreStatistic.java	2010-06-01 19:46:13 UTC (rev 33289)
@@ -20,6 +20,7 @@
 import org.drools.planner.core.score.SimpleScore;
 import org.drools.planner.core.score.HardAndSoftScore;
 import org.apache.commons.io.IOUtils;
+import org.drools.planner.core.score.definition.ScoreDefinition;
 import org.jfree.chart.ChartFactory;
 import org.jfree.chart.JFreeChart;
 import org.jfree.chart.axis.NumberAxis;
@@ -41,6 +42,7 @@
     // key is the configName
     private Map<String, BestScoreStatisticListener> bestScoreStatisticListenerMap
             = new HashMap<String, BestScoreStatisticListener>();
+    private ScoreDefinition scoreDefinition = null;
 
     public void addListener(Solver solver, String configName) {
         if (configNameList.contains(configName)) {
@@ -51,6 +53,14 @@
         BestScoreStatisticListener bestScoreStatisticListener = new BestScoreStatisticListener();
         solver.addEventListener(bestScoreStatisticListener);
         bestScoreStatisticListenerMap.put(configName, bestScoreStatisticListener);
+        if (scoreDefinition == null) {
+            scoreDefinition = solver.getScoreDefinition();
+        } else {
+            if (!scoreDefinition.getClass().equals(solver.getScoreDefinition().getClass())) {
+                throw new IllegalStateException("The scoreDefinition (" + solver.getScoreDefinition()
+                        + ") should be of the same class as the other scoreDefinition (" + scoreDefinition + ")");
+            }
+        }
     }
 
     public void removeListener(Solver solver, String configName) {
@@ -128,9 +138,9 @@
                     writer.append(",");
                     Score score = timeToBestScoresLine.getConfigNameToScoreMap().get(configName);
                     if (score != null) {
-                        Integer scoreAlias = extractScoreAlias(score);
-                        if (scoreAlias != null) {
-                            writer.append(scoreAlias.toString());
+                        Double scoreGraphValue = scoreDefinition.translateScoreToGraphValue(score);
+                        if (scoreGraphValue != null) {
+                            writer.append(scoreGraphValue.toString());
                         }
                     }
                 }
@@ -154,9 +164,9 @@
             for (BestScoreStatisticPoint statisticPoint : statisticPointList) {
                 long timeMillisSpend = statisticPoint.getTimeMillisSpend();
                 Score score = statisticPoint.getScore();
-                Integer scoreAlias = extractScoreAlias(score);
-                if (scoreAlias != null) {
-                    configSeries.add(timeMillisSpend, scoreAlias);
+                Double scoreGraphValue = scoreDefinition.translateScoreToGraphValue(score);
+                if (scoreGraphValue != null) {
+                    configSeries.add(timeMillisSpend, scoreGraphValue);
                 }
             }
             seriesCollection.addSeries(configSeries);
@@ -184,24 +194,4 @@
         return "  <img src=\"" + graphStatisticFile.getName() + "\"/>";
     }
 
-    private Integer extractScoreAlias(Score score) {
-        // TODO Plugging in other Score implementations instead of SimpleScore and HardAndSoftScore should be possible
-        // TODO https://jira.jboss.org/jira/browse/JBRULES-2441
-        Integer scoreAlias;
-        if (score instanceof SimpleScore) {
-            SimpleScore simpleScore = (SimpleScore) score;
-            scoreAlias = simpleScore.getScore();
-        } else if (score instanceof HardAndSoftScore) {
-            HardAndSoftScore hardAndSoftScore = (HardAndSoftScore) score;
-            if (hardAndSoftScore.getHardScore() == 0) {
-                scoreAlias = hardAndSoftScore.getSoftScore();
-            } else {
-                scoreAlias = null;
-            }
-        } else {
-            throw new IllegalStateException("Score class (" + score.getClass() + ") not supported.");
-        }
-        return scoreAlias;
-    }
-
 }

Modified: labs/jbossrules/trunk/drools-planner/drools-planner-core/src/main/java/org/drools/planner/core/Solver.java
===================================================================
--- labs/jbossrules/trunk/drools-planner/drools-planner-core/src/main/java/org/drools/planner/core/Solver.java	2010-06-01 18:03:58 UTC (rev 33288)
+++ labs/jbossrules/trunk/drools-planner/drools-planner-core/src/main/java/org/drools/planner/core/Solver.java	2010-06-01 19:46:13 UTC (rev 33289)
@@ -2,6 +2,7 @@
 
 import java.util.concurrent.Future;
 
+import org.drools.planner.core.score.definition.ScoreDefinition;
 import org.drools.planner.core.solution.Solution;
 import org.drools.planner.core.event.SolverEventListener;
 
@@ -17,7 +18,10 @@
      * @param startingSolution never null
      */
     void setStartingSolution(Solution startingSolution);
-    
+
+    /**
+     * @return never null after solving
+     */
     Solution getBestSolution();
 
     /**
@@ -63,4 +67,9 @@
      */
     void removeEventListener(SolverEventListener eventListener);
 
+    /**
+     * @return never null
+     */
+    ScoreDefinition getScoreDefinition();
+
 }

Modified: labs/jbossrules/trunk/drools-planner/drools-planner-core/src/main/java/org/drools/planner/core/localsearch/DefaultLocalSearchSolver.java
===================================================================
--- labs/jbossrules/trunk/drools-planner/drools-planner-core/src/main/java/org/drools/planner/core/localsearch/DefaultLocalSearchSolver.java	2010-06-01 18:03:58 UTC (rev 33288)
+++ labs/jbossrules/trunk/drools-planner/drools-planner-core/src/main/java/org/drools/planner/core/localsearch/DefaultLocalSearchSolver.java	2010-06-01 19:46:13 UTC (rev 33289)
@@ -43,6 +43,10 @@
         localSearchSolverScope.setScoreDefinition(scoreDefinition);
     }
 
+    public ScoreDefinition getScoreDefinition() {
+        return localSearchSolverScope.getScoreDefinition();
+    }
+
     public void setScoreCalculator(ScoreCalculator scoreCalculator) {
         localSearchSolverScope.setWorkingScoreCalculator(scoreCalculator);
     }

Modified: labs/jbossrules/trunk/drools-planner/drools-planner-core/src/main/java/org/drools/planner/core/score/definition/HardAndSoftScoreDefinition.java
===================================================================
--- labs/jbossrules/trunk/drools-planner/drools-planner-core/src/main/java/org/drools/planner/core/score/definition/HardAndSoftScoreDefinition.java	2010-06-01 18:03:58 UTC (rev 33288)
+++ labs/jbossrules/trunk/drools-planner/drools-planner-core/src/main/java/org/drools/planner/core/score/definition/HardAndSoftScoreDefinition.java	2010-06-01 19:46:13 UTC (rev 33289)
@@ -83,4 +83,12 @@
         return timeGradient;
     }
 
+    public Double translateScoreToGraphValue(HardAndSoftScore score) {
+        if (score.getHardScore() == 0) {
+            return Double.valueOf(score.getSoftScore());
+        } else {
+            return null;
+        }
+    }
+
 }

Modified: labs/jbossrules/trunk/drools-planner/drools-planner-core/src/main/java/org/drools/planner/core/score/definition/ScoreDefinition.java
===================================================================
--- labs/jbossrules/trunk/drools-planner/drools-planner-core/src/main/java/org/drools/planner/core/score/definition/ScoreDefinition.java	2010-06-01 18:03:58 UTC (rev 33288)
+++ labs/jbossrules/trunk/drools-planner/drools-planner-core/src/main/java/org/drools/planner/core/score/definition/ScoreDefinition.java	2010-06-01 19:46:13 UTC (rev 33289)
@@ -48,4 +48,11 @@
      */
     double calculateTimeGradient(S startScore, S endScore, S score);
 
+    /**
+     * 
+     * @param score never null
+     * @return null if should not be shown on the graph
+     */
+    Double translateScoreToGraphValue(S score);
+
 }

Modified: labs/jbossrules/trunk/drools-planner/drools-planner-core/src/main/java/org/drools/planner/core/score/definition/SimpleScoreDefinition.java
===================================================================
--- labs/jbossrules/trunk/drools-planner/drools-planner-core/src/main/java/org/drools/planner/core/score/definition/SimpleScoreDefinition.java	2010-06-01 18:03:58 UTC (rev 33288)
+++ labs/jbossrules/trunk/drools-planner/drools-planner-core/src/main/java/org/drools/planner/core/score/definition/SimpleScoreDefinition.java	2010-06-01 19:46:13 UTC (rev 33289)
@@ -47,4 +47,8 @@
         return ((double) scoreDelta) / ((double) scoreTotal);
     }
 
+    public Double translateScoreToGraphValue(SimpleScore score) {
+        return Double.valueOf(score.getScore());
+    }
+
 }

Modified: labs/jbossrules/trunk/drools-planner/src/main/assembly/docs/UpgradeFromPreviousVersionRecipe.txt
===================================================================
--- labs/jbossrules/trunk/drools-planner/src/main/assembly/docs/UpgradeFromPreviousVersionRecipe.txt	2010-06-01 18:03:58 UTC (rev 33288)
+++ labs/jbossrules/trunk/drools-planner/src/main/assembly/docs/UpgradeFromPreviousVersionRecipe.txt	2010-06-01 19:46:13 UTC (rev 33289)
@@ -286,3 +286,16 @@
 
 A custom ConstraintOccurrence implementation should now use the weight in its equals/hashcode methods.
 IntConstraintOccurrence and DoubleConstraintOccurrence have been changed as needed.
+
+From 5.1.0.m2 to 5.1.0.cr1
+--------------------------
+
+Custom ScoreDefinition implementations needs to implement the Double translateScoreToGraphValue(S score) method.
+After in *ScoreDefinition.java:
+    public Double translateScoreToGraphValue(HardAndSoftScore score) {
+        if (score.getHardScore() == 0) {
+            return Double.valueOf(score.getSoftScore());
+        } else {
+            return null;
+        }
+    }



More information about the jboss-svn-commits mailing list