Edson,
NQueens now works (thanks),
but Examination [1] and SmartTravelingTournament still fail.
To run Examination, just create a java application config with these
settings:
Main class:
org.drools.planner.examples.examination.app.ExaminationBenchmarkApp
VM parameters: -Xms256m -Xmx512m -server
Program parameters: short
Working directory: ...drools/drools-planner/drools-planner-examples
[1] 2010-03-10 19:35:51,685 [main] INFO Initialization time spend (196)
for score (0hard/-8154soft). Updating best solution and best score.
Exception in thread "main" java.lang.NullPointerException
at org.drools.reteoo.AccumulateNode.getFirstMatch(AccumulateNode.java:913)
at org.drools.reteoo.AccumulateNode.splitList(AccumulateNode.java:861)
at
org.drools.reteoo.AccumulateNode.evaluateResultConstraints(AccumulateNode.java:581)
at
org.drools.reteoo.AccumulateNode.removePreviousMatchesForRightTuple(AccumulateNode.java:845)
at
org.drools.reteoo.AccumulateNode.modifyRightTuple(AccumulateNode.java:432)
at org.drools.reteoo.BetaNode.modifyObject(BetaNode.java:317)
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.examination.solver.move.ExaminationMoveHelper.moveRoom(ExaminationMoveHelper.java:24)
at
org.drools.planner.examples.examination.solver.move.RoomChangeMove.doMove(RoomChangeMove.java:37)
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.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.examination.app.ExaminationBenchmarkApp.main(ExaminationBenchmarkApp.java:27)
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)
[2] 2010-03-10 19:43:47,038 [main] INFO Initialization time spend (26)
for score (0hard/-93463soft). Updating best solution and best score.
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
Edson Tirelli schreef:
Geoffrey,
All planner tests are green now (revision #32010).
Thanks,
Edson
2010/3/8 Edson Tirelli <ed.tirelli(a)gmail.com <mailto:ed.tirelli@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(a)gmail.com
<mailto:ge0ffrey.spam@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(a)gmail.com
<mailto:ge0ffrey.spam@gmail.com>
> <mailto:ge0ffrey.spam@gmail.com
<mailto:ge0ffrey.spam@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(a)lists.jboss.org
<mailto:rules-dev@lists.jboss.org>
<mailto:rules-dev@lists.jboss.org
<mailto:rules-dev@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>
<
http://www.jboss.com>
>
>
>
------------------------------------------------------------------------
>
> _______________________________________________
> rules-dev mailing list
> rules-dev(a)lists.jboss.org <mailto:rules-dev@lists.jboss.org>
>
https://lists.jboss.org/mailman/listinfo/rules-dev
_______________________________________________
rules-dev mailing list
rules-dev(a)lists.jboss.org <mailto:rules-dev@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>
--
Edson Tirelli
JBoss Drools Core Development
JBoss by Red Hat @
www.jboss.com <
http://www.jboss.com>
------------------------------------------------------------------------
_______________________________________________
rules-dev mailing list
rules-dev(a)lists.jboss.org
https://lists.jboss.org/mailman/listinfo/rules-dev