[rules-dev] 3 issues with true modify, but PatientAdmissionScheduleApp does work

Edson Tirelli ed.tirelli at gmail.com
Tue Mar 9 17:00:46 EST 2010


   Geoffrey,

   All planner tests are green now (revision #32010).

   Thanks,
      Edson

2010/3/8 Edson Tirelli <ed.tirelli at gmail.com>

>
>    Hey Geoffrey,
>
>    The fixes for accumulate are already there. It is no longer cloning the
> tuple memory and whenever possible, it uses indexing instead of full
> iteration.
>
>    Working on the NPE now.
>
>
>    Edson
>
> 2010/3/7 Geoffrey De Smet <ge0ffrey.spam at gmail.com>
>
>> Edson,
>>
>> > I believe fixed the infinite loop
>> >> problem. Would you please take a look if it works for you?
>>
>> Yes, it's no longer there, thanks :)
>> Examination now suffers from the same NPE as the NQueens smoke test.
>>
>> On one PAS testdata I actually had 5%, but on another PAS testdata only
>> 1%.
>>
>> I believe the cloning in accumulates fix will allow me to do the score
>> calculation as it should be done (one rule instead of two rules)
>> and also further help performance.
>> I 'll run some experiments in that direction as soon as you give me the
>> sign that cloning in accumulates has been fixed.
>>
>> With kind regards,
>> Geoffrey De Smet
>>
>>
>> Edson Tirelli schreef:
>> >
>> >    Geoffrey,
>> >
>> >    I just committed some code that I believe fixed the infinite loop
>> > problem. Would you please take a look if it works for you? I will take a
>> > look at the other problems now... thanks for reporting that.
>> >
>> >    Regarding the performance, the main benefit of true modify is not a
>> > straight gain on performance, but the reduction of the garbage
>> > collection stress. Just to explain, the code now is actually more
>> > complex, but the idea is that the algorithm pays off by instantiating a
>> > lot less objects now, specially LeftTuples. I would not be surprised if
>> > the 4% gain you see is due to less object instantiation+garbage
>> > collection work. This is obviously dependent on the use case, but one
>> > really interesting statistic to see would be if you can profile how many
>> > instances of LeftTuple were created with the previous algorithm compared
>> > to now.
>> >
>> >    Having said that, there are some performance improvements for
>> > specific cases, like on accumulate that before would frequently clone
>> > lists of tuples and iterate and now it avoids both the cloning and the
>> > iteration on specific cases. For those cases, we expect gains of 30% on
>> > the node, but that is just the node, not the whole kbase.
>> >
>> >    Also, as you mentioned, true modify opens the door for several other
>> > optimizations that we will work on as soon as it is stable again.
>> >
>> >    Thanks,
>> >       Edson
>> >
>> > 2010/3/7 Geoffrey De Smet <ge0ffrey.spam at gmail.com
>> > <mailto:ge0ffrey.spam at gmail.com>>
>> >
>> >     Found another issue with the true modify changes: 3 of my examples
>> don't
>> >     work (NQueens, Travelingtournament, Examination), due to distinct
>> >     causes.
>> >
>> >     PatientAdmissionScheduling does work and it's about 4% faster on
>> first
>> >     sight.
>> >     It's a linear improvement, not an exponential improvement.
>> >     Nothing world shocking (yet), but every little bit helps :)
>> >     Edson and Mark believe that true modify allows for new optimization,
>> >     which I believe might be an exponential improvement.
>> >
>> >     Once examination works I'll test if I can remove the TMS workaround
>> I
>> >     needed before.
>> >     This will be a huge performance boost, but only for that specific
>> >     example.
>> >
>> >
>> >     Here's the bug list:
>> >
>> >     1) Infinite loop in
>> >     org.drools.core.util.LeftTupleList.get(LeftTupleList.java:102)
>> >
>> >     2) NPE in
>> >     org.drools.core.util.RightTupleList.matches(RightTupleList.java:190)
>> >     because this.first is null in
>> >     return this.hashCode == tupleHashCode && this.index.equal(
>> >     this.first.getFactHandle().getObject(),
>> >
>> >     tuple );
>> >
>> >     3) NPE in
>> >
>> org.drools.reteoo.SingleLeftTupleSinkAdapter#propagateModifyChildLeftTuple,
>> >     line 198:
>> >     the leftTuple or the sink is null
>> >            childLeftTuple.getLeftTupleSink().modifyLeftTuple(
>> >     childLeftTuple,
>> >                                                               context,
>> >
>> >     workingMemory );
>> >
>> >     Here are the stacktraces:
>> >
>> >     1)
>> >
>> >       1.
>> >          To run:
>> >       2.
>> >          module: drools-planner-examples
>> >       3.
>> >          main class:
>> >
>>  org.drools.planner.examples.examination.app.ExaminationBenchmarkApp
>> >       4.
>> >          VM params: -Xms256m -Xmx512m -server
>> >       5.
>> >          program params: short
>> >       6.
>> >          working dir:
>> >
>> >
>>  /home/ge0ffrey/projects/jboss/drools/drools-planner/drools-planner-examples
>> >       7.
>> >
>> >       8.
>> >
>> >       9.
>> >          More logging? open log4j-benchmark.xml and turn on debug
>> logging
>> >          for org.drools.planner
>> >      10.
>> >
>> >      11.
>> >
>> >      12.
>> >          2010-03-03 19:47:34,625 [main] INFO  Solving with random seed
>> (0).
>> >      13.
>> >          2010-03-03 19:47:34,626 [main] DEBUG Solution is already
>> >     initialized.
>> >      14.
>> >          2010-03-03 19:47:34,752 [main] INFO  Initialization time spend
>> >          (129) for score (0hard/-8154soft). Updating best solution and
>> best
>> >          score.
>> >      15.
>> >          2010-03-03 19:47:34,948 [main] DEBUG     Move (489 {D180|S47} @
>> 17
>> >          {D210} + 4 {C77} => 25 {D210}) with score (-47hard/-8190soft)
>> and
>> >          acceptChance (1.0).
>> >      16.
>> >          2010-03-03 19:47:34,972 [main] DEBUG     Move (373 {D180|S157}
>> @
>> >          23 {D210} + 0 {C260} => 16 {D210}) with score
>> (-158hard/-8219soft)
>> >          and acceptChance (1.0).
>> >      17.
>> >          2010-03-03 19:47:34,985 [main] DEBUG     Move (530 {D120|S152}
>> @
>> >          16 {D210} + 0 {C260} => 39 {D210}) with score
>> (-153hard/-8481soft)
>> >          and acceptChance (1.0).
>> >      18.
>> >          2010-03-03 19:47:35,001 [main] DEBUG     Move (132 {D120|S61} @
>> 53
>> >          {D210} + 5 {C65} => 24 {D210}) with score (-64hard/-8243soft)
>> and
>> >          acceptChance (1.0).
>> >      19.
>> >          2010-03-03 19:47:35,011 [main] DEBUG     Move (553 {D180|S169}
>> @
>> >          51 {D210} + 0 {C260} => 37 {D210}) with score
>> (-168hard/-8323soft)
>> >          and acceptChance (1.0).
>> >      20.
>> >          2010-03-03 19:52:03
>> >      21.
>> >          Full thread dump Java HotSpot(TM) Server VM (14.2-b01 mixed
>> mode):
>> >      22.
>> >
>> >      23.
>> >          ...
>> >      24.
>> >
>> >      25.
>> >          "main" prio=10 tid=0x08b2b800 nid=0x1104 runnable [0xb6aa6000]
>> >      26.
>> >             java.lang.Thread.State: RUNNABLE
>> >      27.
>> >                  at
>> >
>> >
>>  org.drools.common.DefaultFactHandle.hashCode(DefaultFactHandle.java:136)
>> >      28.
>> >                  at
>> org.drools.reteoo.LeftTuple.hashCode(LeftTuple.java:445)
>> >      29.
>> >                  at
>> org.drools.reteoo.LeftTuple.equals(LeftTuple.java:461)
>> >      30.
>> >                  at
>> >          org.drools.core.util.LeftTupleList.get(LeftTupleList.java:102)
>> >      31.
>> >                  at
>> >
>>  org.drools.core.util.LeftTupleList.contains(LeftTupleList.java:96)
>> >      32.
>> >                  at
>> >
>> >
>>  org.drools.reteoo.EvalConditionNode.modifyLeftTuple(EvalConditionNode.java:235)
>> >      33.
>> >                  at
>> >
>> >
>>  org.drools.reteoo.SingleLeftTupleSinkAdapter.propagateModifyChildLeftTuple(SingleLeftTupleSinkAdapter.java:209)
>> >      34.
>> >                  at
>> >          org.drools.reteoo.JoinNode.modifyRightTuple(JoinNode.java:221)
>> >      35.
>> >                  at
>> >     org.drools.reteoo.BetaNode.modifyObject(BetaNode.java:317)
>> >      36.
>> >                  at
>> >
>> >
>>  org.drools.reteoo.CompositeObjectSinkAdapter.doPropagateModifyObject(CompositeObjectSinkAdapter.java:444)
>> >      37.
>> >                  at
>> >
>> >
>>  org.drools.reteoo.CompositeObjectSinkAdapter.propagateModifyObject(CompositeObjectSinkAdapter.java:412)
>> >      38.
>> >                  at
>> >
>> >
>>  org.drools.reteoo.ObjectTypeNode.modifyObject(ObjectTypeNode.java:262)
>> >      39.
>> >                  at
>> >
>> >
>>  org.drools.reteoo.EntryPointNode.modifyObject(EntryPointNode.java:174)
>> >      40.
>> >                  at
>> >
>> >
>>  org.drools.common.AbstractWorkingMemory.update(AbstractWorkingMemory.java:1392)
>> >      41.
>> >                  at
>> >
>> >
>>  org.drools.common.AbstractWorkingMemory.update(AbstractWorkingMemory.java:1288)
>> >      42.
>> >                  at
>> >
>> >
>>  org.drools.planner.examples.examination.solver.move.ExaminationMoveHelper.movePeriod(ExaminationMoveHelper.java:17)
>> >      43.
>> >                  at
>> >
>> >
>>  org.drools.planner.examples.examination.solver.move.PeriodChangeMove.doMove(PeriodChangeMove.java:37)
>> >      44.
>> >                  at
>> >
>> >
>>  org.drools.planner.core.localsearch.decider.DefaultDecider.doMove(DefaultDecider.java:117)
>> >      45.
>> >                  at
>> >
>> >
>>  org.drools.planner.core.localsearch.decider.DefaultDecider.decideNextStep(DefaultDecider.java:95)
>> >      46.
>> >                  at
>> >
>> >
>>  org.drools.planner.core.localsearch.DefaultLocalSearchSolver.solveImplementation(DefaultLocalSearchSolver.java:105)
>> >      47.
>> >                  at
>> >
>> >
>>  org.drools.planner.core.AbstractSolver.solve(AbstractSolver.java:41)
>> >      48.
>> >                  at
>> >
>> >
>>  org.drools.planner.benchmark.SolverBenchmarkSuite.benchmark(SolverBenchmarkSuite.java:196)
>> >      49.
>> >                  at
>> >
>> >
>>  org.drools.planner.benchmark.XmlSolverBenchmarker.benchmark(XmlSolverBenchmarker.java:72)
>> >      50.
>> >                  at
>> >
>> >
>>  org.drools.planner.examples.common.app.CommonBenchmarkApp.process(CommonBenchmarkApp.java:25)
>> >      51.
>> >                  at
>> >
>> >
>>  org.drools.planner.examples.examination.app.ExaminationBenchmarkApp.main(ExaminationBenchmarkApp.java:27)
>> >      52.
>> >                  at sun.reflect.NativeMethodAccessorImpl.invoke0(Native
>> >     Method)
>> >      53.
>> >                  at
>> >
>> >
>>  sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
>> >      54.
>> >                  at
>> >
>> >
>>  sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
>> >      55.
>> >                  at java.lang.reflect.Method.invoke(Method.java:597)
>> >      56.
>> >                  at
>> >
>> >
>>  com.intellij.rt.execution.application.AppMain.main(AppMain.java:110)
>> >
>> >
>> >
>> >     2) Run NQueensSmokeTest
>> >
>> >     java.lang.NullPointerException
>> >        at
>> >     org.drools.core.util.RightTupleList.matches(RightTupleList.java:190)
>> >        at
>> >
>> org.drools.core.util.RightTupleIndexHashTable.get(RightTupleIndexHashTable.java:301)
>> >        at
>> >
>> org.drools.core.util.RightTupleIndexHashTable.getFirst(RightTupleIndexHashTable.java:87)
>> >        at org.drools.reteoo.JoinNode.modifyLeftTuple(JoinNode.java:260)
>> >        at org.drools.reteoo.BetaNode.modifyLeftTuple(BetaNode.java:336)
>> >        at
>> >
>> org.drools.reteoo.CompositeLeftTupleSinkAdapter.doPropagateModifyObject(CompositeLeftTupleSinkAdapter.java:204)
>> >        at
>> >
>> org.drools.reteoo.CompositeLeftTupleSinkAdapter.propagateModifyObject(CompositeLeftTupleSinkAdapter.java:219)
>> >        at
>> >
>> org.drools.reteoo.LeftInputAdapterNode.modifyObject(LeftInputAdapterNode.java:154)
>> >        at
>> >
>> org.drools.reteoo.CompositeObjectSinkAdapter.doPropagateModifyObject(CompositeObjectSinkAdapter.java:444)
>> >        at
>> >
>> org.drools.reteoo.CompositeObjectSinkAdapter.propagateModifyObject(CompositeObjectSinkAdapter.java:412)
>> >        at
>> >
>> org.drools.reteoo.ObjectTypeNode.modifyObject(ObjectTypeNode.java:262)
>> >        at
>> >
>> org.drools.reteoo.EntryPointNode.modifyObject(EntryPointNode.java:174)
>> >        at
>> >
>> org.drools.common.AbstractWorkingMemory.update(AbstractWorkingMemory.java:1392)
>> >        at
>> >
>> org.drools.common.AbstractWorkingMemory.update(AbstractWorkingMemory.java:1288)
>> >        at
>> >
>> org.drools.planner.examples.nqueens.solver.move.YChangeMove.doMove(YChangeMove.java:38)
>> >        at
>> >
>> org.drools.planner.core.localsearch.decider.DefaultDecider.doMove(DefaultDecider.java:119)
>> >        at
>> >
>> org.drools.planner.core.localsearch.decider.DefaultDecider.decideNextStep(DefaultDecider.java:95)
>> >        at
>> >
>> org.drools.planner.core.localsearch.DefaultLocalSearchSolver.solveImplementation(DefaultLocalSearchSolver.java:105)
>> >        at
>> >     org.drools.planner.core.AbstractSolver.solve(AbstractSolver.java:41)
>> >        at
>> >
>> org.drools.planner.examples.nqueens.NQueensSmokeTest.testSmoke(NQueensSmokeTest.java:30)
>> >        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
>> >        at
>> >
>> sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
>> >        at
>> >
>> sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
>> >        at
>> >
>> com.intellij.junit3.JUnit3IdeaTestRunner.doRun(JUnit3IdeaTestRunner.java:108)
>> >        at
>> >
>> com.intellij.junit3.JUnit3IdeaTestRunner.startRunnerWithArgs(JUnit3IdeaTestRunner.java:42)
>> >        at
>> >
>> com.intellij.rt.execution.junit.JUnitStarter.prepareStreamsAndStart(JUnitStarter.java:165)
>> >        at
>> >
>> com.intellij.rt.execution.junit.JUnitStarter.main(JUnitStarter.java:60)
>> >        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
>> >        at
>> >
>> sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
>> >        at
>> >     com.intellij.rt.execution.application.AppMain.main(AppMain.java:110)
>> >
>> >     3) Run SmartTravelingTournamentBenchmarkApp
>> >
>> >     Exception in thread "main" java.lang.NullPointerException
>> >        at
>> >
>> org.drools.reteoo.SingleLeftTupleSinkAdapter.propagateModifyChildLeftTuple(SingleLeftTupleSinkAdapter.java:198)
>> >        at org.drools.reteoo.JoinNode.modifyLeftTuple(JoinNode.java:304)
>> >        at org.drools.reteoo.BetaNode.modifyLeftTuple(BetaNode.java:336)
>> >        at
>> >
>> org.drools.reteoo.CompositeLeftTupleSinkAdapter.doPropagateModifyObject(CompositeLeftTupleSinkAdapter.java:204)
>> >        at
>> >
>> org.drools.reteoo.CompositeLeftTupleSinkAdapter.propagateModifyObject(CompositeLeftTupleSinkAdapter.java:219)
>> >        at
>> >
>> org.drools.reteoo.LeftInputAdapterNode.modifyObject(LeftInputAdapterNode.java:154)
>> >        at
>> >
>> org.drools.reteoo.CompositeObjectSinkAdapter.doPropagateModifyObject(CompositeObjectSinkAdapter.java:444)
>> >        at
>> >
>> org.drools.reteoo.CompositeObjectSinkAdapter.propagateModifyObject(CompositeObjectSinkAdapter.java:412)
>> >        at
>> >
>> org.drools.reteoo.ObjectTypeNode.modifyObject(ObjectTypeNode.java:262)
>> >        at
>> >
>> org.drools.reteoo.EntryPointNode.modifyObject(EntryPointNode.java:174)
>> >        at
>> >
>> org.drools.common.AbstractWorkingMemory.update(AbstractWorkingMemory.java:1392)
>> >        at
>> >
>> org.drools.common.AbstractWorkingMemory.update(AbstractWorkingMemory.java:1288)
>> >        at
>> >
>> org.drools.planner.examples.travelingtournament.solver.smart.move.MultipleMatchListRotateMove.rotateList(MultipleMatchListRotateMove.java:59)
>> >        at
>> >
>> org.drools.planner.examples.travelingtournament.solver.smart.move.MultipleMatchListRotateMove.doMove(MultipleMatchListRotateMove.java:44)
>> >        at
>> >
>> org.drools.planner.core.localsearch.decider.DefaultDecider.doMove(DefaultDecider.java:117)
>> >        at
>> >
>> org.drools.planner.core.localsearch.decider.DefaultDecider.decideNextStep(DefaultDecider.java:95)
>> >        at
>> >
>> org.drools.planner.core.localsearch.DefaultLocalSearchSolver.solveImplementation(DefaultLocalSearchSolver.java:105)
>> >        at
>> >     org.drools.planner.core.AbstractSolver.solve(AbstractSolver.java:41)
>> >        at
>> >
>> org.drools.planner.benchmark.SolverBenchmarkSuite.benchmark(SolverBenchmarkSuite.java:196)
>> >        at
>> >
>> org.drools.planner.benchmark.XmlSolverBenchmarker.benchmark(XmlSolverBenchmarker.java:72)
>> >        at
>> >
>> org.drools.planner.examples.common.app.CommonBenchmarkApp.process(CommonBenchmarkApp.java:25)
>> >        at
>> >
>> org.drools.planner.examples.travelingtournament.app.smart.SmartTravelingTournamentBenchmarkApp.main(SmartTravelingTournamentBenchmarkApp.java:28)
>> >        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
>> >        at
>> >
>> sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
>> >        at
>> >
>> sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
>> >        at java.lang.reflect.Method.invoke(Method.java:597)
>> >        at
>> >     com.intellij.rt.execution.application.AppMain.main(AppMain.java:110)
>> >
>> >     --
>> >     With kind regards,
>> >     Geoffrey De Smet
>> >
>> >     _______________________________________________
>> >     rules-dev mailing list
>> >     rules-dev at lists.jboss.org <mailto:rules-dev at lists.jboss.org>
>> >     https://lists.jboss.org/mailman/listinfo/rules-dev
>> >
>> >
>> >
>> >
>> > --
>> >  Edson Tirelli
>> >  JBoss Drools Core Development
>> >  JBoss by Red Hat @ www.jboss.com <http://www.jboss.com>
>> >
>> >
>> > ------------------------------------------------------------------------
>> >
>> > _______________________________________________
>> > rules-dev mailing list
>> > rules-dev at lists.jboss.org
>> > https://lists.jboss.org/mailman/listinfo/rules-dev
>>
>> _______________________________________________
>> rules-dev mailing list
>> rules-dev at lists.jboss.org
>> https://lists.jboss.org/mailman/listinfo/rules-dev
>>
>
>
>
> --
>  Edson Tirelli
>  JBoss Drools Core Development
>  JBoss by Red Hat @ www.jboss.com
>



-- 
 Edson Tirelli
 JBoss Drools Core Development
 JBoss by Red Hat @ www.jboss.com
-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://lists.jboss.org/pipermail/rules-dev/attachments/20100309/eb082183/attachment-0001.html 


More information about the rules-dev mailing list