[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