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

Geoffrey De Smet ge0ffrey.spam at gmail.com
Sun Mar 7 04:40:49 EST 2010


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



More information about the rules-dev mailing list