works like a charm :-)
thanks ----------------- http://www.codessentials.com - Your essential software, for free! Follow us at http://twitter.com/#!/Codessentials ________________________________ From: Geoffrey De Smet <[email protected]> To: Michiel Vermandel <[email protected]>; Rules Users List <[email protected]> Sent: Wednesday, January 23, 2013 2:26 PM Subject: Re: CustomSolverPhaseCommand throws The entity ... was never added to this ScoreDirector. Basically, this is fixed for 6.0.0.Beta1 (unreleased). Read further if you want to understand why this was a problem before 6.0.0.Beta1 Op 23-01-13 14:13, Michiel Vermandel schreef: Hi, > > >I am trying to use a CustomSolverPhaseCommand (SolutionInitializer) to analyze >what happens if I start with a given configuration. > > >I get java.lang.IllegalArgumentException: The entity ({T= Inspect B747-XA2.I#0 >[1->3] null null}) was never added to this ScoreDirector. > > >If I keep the constructionHeuristic phase before the SolutionInitializer then >it works, but if I remove the constructionHeuristic phase and thus start with >my SolutionInitializerthen I get the exception. > > > >I reduced my SolutionInitializer to a minmal but the issue remains. >What am I doing wrong? > > >This is my SolutionInitializer: > > > >package planner.solution; > >import org.drools.planner.core.phase.custom.CustomSolverPhaseCommand; >import org.drools.planner.core.score.Score; >import org.drools.planner.core.score.director.ScoreDirector; >import org.slf4j.Logger; >import org.slf4j.LoggerFactory; > >import planner.app.InspectionSchedule; >import planner.domain.Task; > >public class SolutionInitializer implements CustomSolverPhaseCommand { > > private Logger logger = LoggerFactory.getLogger(this.getClass()); > > public void changeWorkingSolution(ScoreDirector scoreDirector) { > > InspectionSchedule schedule = (InspectionSchedule) scoreDirector.getWorkingSolution(); > Task task = schedule.getTasks().get(0); > if task.getPeriod() returns null, then 5.5 has not inserted that Task into the working memory yet (while 6.0 will), so you need to do something like if (task.getPeriod() == null) { scoreDirector.beforeEntityAdded(task); scoreDirector.afterEntityAdded(task); } // and continue with beforeVariableChanged (although you can optimize this if-else stuff) scoreDirector.beforeVariableChanged(task, "period"); > task.setPeriod(schedule.getPeriods().get(0)); > scoreDirector.afterVariableChanged(task, "period"); > > score = scoreDirector.calculateScore(); > logger.debug("Score after custom: " + score); > > } > >} > > >planning configuration: > > ><?xml version="1.0" encoding="UTF-8"?> ><solver> > <environmentMode>DEBUG</environmentMode> > > <!-- Domain model configuration --> > <solutionClass>be.axi.planner.app.InspectionSchedule</solutionClass> > <planningEntityClass>be.axi.planner.domain.Task</planningEntityClass> > > <!-- Score configuration --> > <scoreDirectorFactory> > <scoreDefinitionType>HARD_AND_SOFT</scoreDefinitionType> > <scoreDrl>/inspectionRules.drl</scoreDrl> > </scoreDirectorFactory> > > <customSolverPhase> > <customSolverPhaseCommandClass>be.axi.planner.solution.SolutionInitializer</customSolverPhaseCommandClass> > </customSolverPhase> > > <localSearch> > <termination> > <terminationCompositionStyle>OR</terminationCompositionStyle> > <maximumSecondsSpend>3600</maximumSecondsSpend> > <scoreAttained>0hard/0soft</scoreAttained> > </termination> > <unionMoveSelector> > <changeMoveSelector> > <valueSelector> > <planningVariableName>type</planningVariableName> > </valueSelector> > </changeMoveSelector> > <changeMoveSelector> > <valueSelector> > <planningVariableName>spector</planningVariableName> > </valueSelector> > </changeMoveSelector> > <changeMoveSelector> > <valueSelector> > <planningVariableName>period</planningVariableName> > </valueSelector> > </changeMoveSelector> > </unionMoveSelector> > > <acceptor> > <planningEntityTabuSize>7</planningEntityTabuSize> > </acceptor> > <forager> > <minimalAcceptedSelection>1000</minimalAcceptedSelection> > </forager> > </localSearch> ></solver> > > > >Stack trace: > > > >java.lang.IllegalArgumentException: The entity ({T= Inspect B747-XA2.I#0 >[1->3] null null}) was never added to this ScoreDirector. > at org.drools.planner.core.score.director.drools.DroolsScoreDirector.afterVariableChanged(DroolsScoreDirector.java:125) > at planner.solution.SolutionInitializer.changeWorkingSolution(SolutionInitializer2.java:24) > at org.drools.planner.core.phase.custom.DefaultCustomSolverPhase.solve(DefaultCustomSolverPhase.java:58) > at org.drools.planner.core.solver.DefaultSolver.runSolverPhases(DefaultSolver.java:190) > at org.drools.planner.core.solver.DefaultSolver.solve(DefaultSolver.java:155) > at planner.app.InspectionSchedule.solve(InspectionSchedule.java:192) > at planner.testcore.AbstractPlanningTestClass.solve(AbstractPlanningTestClass.java:288) > at planner.testcore.AbstractPlanningTestClass.solve(AbstractPlanningTestClass.java:298) > at planner.testcore.AbstractPlanningTestClass.solve(AbstractPlanningTestClass.java:315) > at planner.TaskGroupingTest.communitySuccess02(TaskGroupingTest.java:289) > at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) > at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source) > at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) > at java.lang.reflect.Method.invoke(Unknown Source) > at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:44) > at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:15) > at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:41) > at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:20) > at org.junit.internal.runners.statements.RunBefores.evaluate(RunBefores.java:28) > at org.junit.runners.BlockJUnit4ClassRunner.runNotIgnored(BlockJUnit4ClassRunner.java:79) > at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:71) > at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:49) > at org.junit.runners.ParentRunner$3.run(ParentRunner.java:193) > at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:52) > at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:191) > at org.junit.runners.ParentRunner.access$000(ParentRunner.java:42) > at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:184) > at org.junit.runners.ParentRunner.run(ParentRunner.java:236) > at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:50) > at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38) > at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:467) > at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:683) > at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:390) > at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:197) > >Thanks, > > >Michiel > >----------------- >http://www.codessentials.com - Your essential software, for free! >Follow us at http://twitter.com/#!/Codessentials > > >_______________________________________________ rules-users mailing list [email protected] https://lists.jboss.org/mailman/listinfo/rules-users
_______________________________________________ rules-users mailing list [email protected] https://lists.jboss.org/mailman/listinfo/rules-users
