Re: [rules-users] Drools 5.5 divide by 0 exception
Divide by zero exceptions usually occur when you try to divide by zero. So … first question … is consolidatdVolume.avgVolume ever zero? On 1 Nov 2013, at 16:17, gboro54 gbor...@gmail.com wrote: I have rules like the following: rule Add Baseline to Context if it does not exists exists or not greater then 0 no-loop true when $context:Context($id:id,baselineParticipation==null || baselineParticipation.baselineRatio==null||baselineParticipation.baselineRatio==0) then modify($firm) {setBaselineParticipation(new BaselineParticipation($id,new BigDecimal(0.00485)))}; end rule Calculate Participation Ratio no-loop true when $context:Context(consolidatdVolume!=null,consolidatdVolume.avgVolume0, volumeAccumulations[total]!=null,volumeAccumulations[total]0, $ratio:(volumeAccumulations[total]/consolidatdVolume.avgVolume)) then ConcurrentMap calculatedRatios=$firm.getCalculatedRatios(); calculatedRatios.put(fparticipationRatio,new BigDecimal($ratio)); modify($firm){setCalculatedRatios(calculatedRatios)}; end Despite the checks I get the following exception and any insight into why would be great: Exception executing consequence for rule Calculate Firm Participation Ratio in com.nasdaq.rms.nq.status: java.lang.ArithmeticException: / by zero Exception executing consequence for rule Calculate Firm Participation Ratio in com.nasdaq.rms.nq.status: java.lang.ArithmeticException: / by zero at org.drools.runtime.rule.impl.DefaultConsequenceExceptionHandler.handleException(DefaultConsequenceExceptionHandler.java:39) at org.drools.common.DefaultAgenda.fireActivation(DefaultAgenda.java:1297) at org.drools.common.DefaultAgenda.fireNextItem(DefaultAgenda.java:1221) at org.drools.common.DefaultAgenda.fireAllRules(DefaultAgenda.java:1456) at org.drools.common.AbstractWorkingMemory.fireAllRules(AbstractWorkingMemory.java:710) at org.drools.common.AbstractWorkingMemory.fireAllRules(AbstractWorkingMemory.java:674) at org.drools.impl.StatefulKnowledgeSessionImpl.fireAllRules(StatefulKnowledgeSessionImpl.java:230) at com.nasdaq.fq.rms.workflow.processor.rules.PerformanceStatusAssignmentProcessor.doWork(PerformanceStatusAssignmentProcessor.java:156) at com.ften.ssr.workqueue.WorkItemRunnable.run(WorkItemRunnable.java:48) at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615) at java.lang.Thread.run(Thread.java:724) Caused by: java.lang.ArithmeticException: / by zero at ConditionEvaluatorda6271cf5a744b6bbdb9c717cae2edb7.evaluate(Unknown Source) at org.drools.rule.constraint.MvelConstraint.evaluate(MvelConstraint.java:200) at org.drools.rule.constraint.MvelConstraint.isAllowed(MvelConstraint.java:157) at org.drools.reteoo.AlphaNode.modifyObject(AlphaNode.java:154) at org.drools.reteoo.CompositeObjectSinkAdapter.doPropagateModifyObject(CompositeObjectSinkAdapter.java:507) at org.drools.reteoo.CompositeObjectSinkAdapter.propagateModifyObject(CompositeObjectSinkAdapter.java:432) at org.drools.reteoo.AlphaNode.modifyObject(AlphaNode.java:157) at org.drools.reteoo.CompositeObjectSinkAdapter.doPropagateModifyObject(CompositeObjectSinkAdapter.java:507) at org.drools.reteoo.CompositeObjectSinkAdapter.propagateModifyObject(CompositeObjectSinkAdapter.java:432) at org.drools.reteoo.ObjectTypeNode.modifyObject(ObjectTypeNode.java:314) at org.drools.reteoo.EntryPointNode.modifyObject(EntryPointNode.java:265) at org.drools.common.NamedEntryPoint.update(NamedEntryPoint.java:483) at org.drools.common.NamedEntryPoint.update(NamedEntryPoint.java:383) at org.drools.base.DefaultKnowledgeHelper.update(DefaultKnowledgeHelper.java:337) at com.nasdaq.rms.nq.status.Rule_Calculate_Firm_Participation_Ratio_cfb033f33c2b404fb2bff8e1b9af0175.defaultConsequence(Unknown Source) at com.nasdaq.rms.nq.status.Rule_Calculate_Firm_Participation_Ratio_cfb033f33c2b404fb2bff8e1b9af0175DefaultConsequenceInvokerGenerated.evaluate(Unknown Source) at com.nasdaq.rms.nq.status.Rule_Calculate_Firm_Participation_Ratio_cfb033f33c2b404fb2bff8e1b9af0175DefaultConsequenceInvoker.evaluate(Unknown Source) at org.drools.common.DefaultAgenda.fireActivation(DefaultAgenda.java:1287) ... 10 more -- View this message in context: http://drools.46999.n3.nabble.com/Drools-5-5-divide-by-0-exception-tp4026582.html Sent from the Drools: User forum mailing list archive at Nabble.com. ___ rules-users mailing list
Re: [rules-users] Drools 5.5 divide by 0 exception
So move the math to the rhs? Will that resolve the issues in your opinion? -- View this message in context: http://drools.46999.n3.nabble.com/Drools-5-5-divide-by-0-exception-tp4026582p4026586.html Sent from the Drools: User forum mailing list archive at Nabble.com. ___ rules-users mailing list rules-users@lists.jboss.org https://lists.jboss.org/mailman/listinfo/rules-users
Re: [rules-users] Drools 5.5 divide by 0 exception
Could you expand upon why this is a poor practice? I assumed that if a part of the pattern doesn't match the expression evaluation is terminated laune wrote I can anticipate the answer where OP says that there is a constraint restricting argVolume to 0. However, I don't think that independent constraints such as we see them in this rule are evaluated as if they were in a single logical expression, with Java semantics. The seductive possibility of binding to a half-baked expression (i.e., $ratio:(volumeAccumulations[total]/consolidatdVolume.avgVolume)) should be discarded. This value can safely be computed on the RHS where the denominator's value being !=0 is asserted. -W On 01/11/2013, Stephen Masters lt; stephen.masters@ gt; wrote: Divide by zero exceptions usually occur when you try to divide by zero. So … first question … is consolidatdVolume.avgVolume ever zero? On 1 Nov 2013, at 16:17, gboro54 lt; gboro54@ gt; wrote: I have rules like the following: rule Add Baseline to Context if it does not exists exists or not greater then 0 no-loop true when $context:Context($id:id,baselineParticipation==null || baselineParticipation.baselineRatio==null||baselineParticipation.baselineRatio==0) then modify($firm) {setBaselineParticipation(new BaselineParticipation($id,new BigDecimal(0.00485)))}; end rule Calculate Participation Ratio no-loop true when $context:Context(consolidatdVolume!=null,consolidatdVolume.avgVolume0, volumeAccumulations[total]!=null,volumeAccumulations[total]0, $ratio:(volumeAccumulations[total]/consolidatdVolume.avgVolume)) then ConcurrentMap calculatedRatios=$firm.getCalculatedRatios(); calculatedRatios.put(fparticipationRatio,new BigDecimal($ratio)); modify($firm){setCalculatedRatios(calculatedRatios)}; end Despite the checks I get the following exception and any insight into why would be great: Exception executing consequence for rule Calculate Firm Participation Ratio in com.nasdaq.rms.nq.status: java.lang.ArithmeticException: / by zero Exception executing consequence for rule Calculate Firm Participation Ratio in com.nasdaq.rms.nq.status: java.lang.ArithmeticException: / by zero at org.drools.runtime.rule.impl.DefaultConsequenceExceptionHandler.handleException(DefaultConsequenceExceptionHandler.java:39) at org.drools.common.DefaultAgenda.fireActivation(DefaultAgenda.java:1297) at org.drools.common.DefaultAgenda.fireNextItem(DefaultAgenda.java:1221) at org.drools.common.DefaultAgenda.fireAllRules(DefaultAgenda.java:1456) at org.drools.common.AbstractWorkingMemory.fireAllRules(AbstractWorkingMemory.java:710) at org.drools.common.AbstractWorkingMemory.fireAllRules(AbstractWorkingMemory.java:674) at org.drools.impl.StatefulKnowledgeSessionImpl.fireAllRules(StatefulKnowledgeSessionImpl.java:230) at com.nasdaq.fq.rms.workflow.processor.rules.PerformanceStatusAssignmentProcessor.doWork(PerformanceStatusAssignmentProcessor.java:156) at com.ften.ssr.workqueue.WorkItemRunnable.run(WorkItemRunnable.java:48) at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615) at java.lang.Thread.run(Thread.java:724) Caused by: java.lang.ArithmeticException: / by zero at ConditionEvaluatorda6271cf5a744b6bbdb9c717cae2edb7.evaluate(Unknown Source) at org.drools.rule.constraint.MvelConstraint.evaluate(MvelConstraint.java:200) at org.drools.rule.constraint.MvelConstraint.isAllowed(MvelConstraint.java:157) at org.drools.reteoo.AlphaNode.modifyObject(AlphaNode.java:154) at org.drools.reteoo.CompositeObjectSinkAdapter.doPropagateModifyObject(CompositeObjectSinkAdapter.java:507) at org.drools.reteoo.CompositeObjectSinkAdapter.propagateModifyObject(CompositeObjectSinkAdapter.java:432) at org.drools.reteoo.AlphaNode.modifyObject(AlphaNode.java:157) at org.drools.reteoo.CompositeObjectSinkAdapter.doPropagateModifyObject(CompositeObjectSinkAdapter.java:507) at org.drools.reteoo.CompositeObjectSinkAdapter.propagateModifyObject(CompositeObjectSinkAdapter.java:432) at org.drools.reteoo.ObjectTypeNode.modifyObject(ObjectTypeNode.java:314) at org.drools.reteoo.EntryPointNode.modifyObject(EntryPointNode.java:265) at org.drools.common.NamedEntryPoint.update(NamedEntryPoint.java:483) at org.drools.common.NamedEntryPoint.update(NamedEntryPoint.java:383) at org.drools.base.DefaultKnowledgeHelper.update(DefaultKnowledgeHelper.java:337) at com.nasdaq.rms.nq.status.Rule_Calculate_Firm_Participation_Ratio_cfb033f33c2b404fb2bff8e1b9af0175.defaultConsequence(Unknown Source) at
Re: [rules-users] Drools 5.5 divide by 0 exception
If the left hand side guarantees that a 0, a right hand side expression b/a must be safe. -W On 01/11/2013, gboro54 gbor...@gmail.com wrote: So move the math to the rhs? Will that resolve the issues in your opinion? -- View this message in context: http://drools.46999.n3.nabble.com/Drools-5-5-divide-by-0-exception-tp4026582p4026586.html Sent from the Drools: User forum mailing list archive at Nabble.com. ___ rules-users mailing list rules-users@lists.jboss.org https://lists.jboss.org/mailman/listinfo/rules-users ___ rules-users mailing list rules-users@lists.jboss.org https://lists.jboss.org/mailman/listinfo/rules-users
Re: [rules-users] Drools 5.5 divide by 0 exception
Given that you don’t seem to using the result as a constraint, then I can’t see any benefit to it being on the LHS. So yes, It would be better on the RHS. Steve On 1 Nov 2013, at 17:58, Wolfgang Laun wolfgang.l...@gmail.com wrote: I can anticipate the answer where OP says that there is a constraint restricting argVolume to 0. However, I don't think that independent constraints such as we see them in this rule are evaluated as if they were in a single logical expression, with Java semantics. The seductive possibility of binding to a half-baked expression (i.e., $ratio:(volumeAccumulations[total]/consolidatdVolume.avgVolume)) should be discarded. This value can safely be computed on the RHS where the denominator's value being !=0 is asserted. -W On 01/11/2013, Stephen Masters stephen.mast...@me.com wrote: Divide by zero exceptions usually occur when you try to divide by zero. So … first question … is consolidatdVolume.avgVolume ever zero? On 1 Nov 2013, at 16:17, gboro54 gbor...@gmail.com wrote: I have rules like the following: rule Add Baseline to Context if it does not exists exists or not greater then 0 no-loop true when $context:Context($id:id,baselineParticipation==null || baselineParticipation.baselineRatio==null||baselineParticipation.baselineRatio==0) then modify($firm) {setBaselineParticipation(new BaselineParticipation($id,new BigDecimal(0.00485)))}; end rule Calculate Participation Ratio no-loop true when $context:Context(consolidatdVolume!=null,consolidatdVolume.avgVolume0, volumeAccumulations[total]!=null,volumeAccumulations[total]0, $ratio:(volumeAccumulations[total]/consolidatdVolume.avgVolume)) then ConcurrentMap calculatedRatios=$firm.getCalculatedRatios(); calculatedRatios.put(fparticipationRatio,new BigDecimal($ratio)); modify($firm){setCalculatedRatios(calculatedRatios)}; end Despite the checks I get the following exception and any insight into why would be great: Exception executing consequence for rule Calculate Firm Participation Ratio in com.nasdaq.rms.nq.status: java.lang.ArithmeticException: / by zero Exception executing consequence for rule Calculate Firm Participation Ratio in com.nasdaq.rms.nq.status: java.lang.ArithmeticException: / by zero at org.drools.runtime.rule.impl.DefaultConsequenceExceptionHandler.handleException(DefaultConsequenceExceptionHandler.java:39) at org.drools.common.DefaultAgenda.fireActivation(DefaultAgenda.java:1297) at org.drools.common.DefaultAgenda.fireNextItem(DefaultAgenda.java:1221) at org.drools.common.DefaultAgenda.fireAllRules(DefaultAgenda.java:1456) at org.drools.common.AbstractWorkingMemory.fireAllRules(AbstractWorkingMemory.java:710) at org.drools.common.AbstractWorkingMemory.fireAllRules(AbstractWorkingMemory.java:674) at org.drools.impl.StatefulKnowledgeSessionImpl.fireAllRules(StatefulKnowledgeSessionImpl.java:230) at com.nasdaq.fq.rms.workflow.processor.rules.PerformanceStatusAssignmentProcessor.doWork(PerformanceStatusAssignmentProcessor.java:156) at com.ften.ssr.workqueue.WorkItemRunnable.run(WorkItemRunnable.java:48) at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615) at java.lang.Thread.run(Thread.java:724) Caused by: java.lang.ArithmeticException: / by zero at ConditionEvaluatorda6271cf5a744b6bbdb9c717cae2edb7.evaluate(Unknown Source) at org.drools.rule.constraint.MvelConstraint.evaluate(MvelConstraint.java:200) at org.drools.rule.constraint.MvelConstraint.isAllowed(MvelConstraint.java:157) at org.drools.reteoo.AlphaNode.modifyObject(AlphaNode.java:154) at org.drools.reteoo.CompositeObjectSinkAdapter.doPropagateModifyObject(CompositeObjectSinkAdapter.java:507) at org.drools.reteoo.CompositeObjectSinkAdapter.propagateModifyObject(CompositeObjectSinkAdapter.java:432) at org.drools.reteoo.AlphaNode.modifyObject(AlphaNode.java:157) at org.drools.reteoo.CompositeObjectSinkAdapter.doPropagateModifyObject(CompositeObjectSinkAdapter.java:507) at org.drools.reteoo.CompositeObjectSinkAdapter.propagateModifyObject(CompositeObjectSinkAdapter.java:432) at org.drools.reteoo.ObjectTypeNode.modifyObject(ObjectTypeNode.java:314) at org.drools.reteoo.EntryPointNode.modifyObject(EntryPointNode.java:265) at org.drools.common.NamedEntryPoint.update(NamedEntryPoint.java:483) at org.drools.common.NamedEntryPoint.update(NamedEntryPoint.java:383) at org.drools.base.DefaultKnowledgeHelper.update(DefaultKnowledgeHelper.java:337) at
Re: [rules-users] Drools 5.5 divide by 0 exception
I changed the rules to the following so I will test and see: rule Add Baseline to Context if it does not exists exists or not greater then 0 no-loop true when $context:Context($id:id,baselineParticipation==null || baselineParticipation.baselineRatio==null||baselineParticipation.baselineRatio==0) then modify($firm) {setBaselineParticipation(new BaselineParticipation($id,new BigDecimal(0.00485)))}; end rule Calculate Participation Ratio no-loop true when $context:Context(consolidatdVolume!=null,consolidatdVolume.avgVolume!=0, volumeAccumulations[total]!=null,volumeAccumulations[total]!=0, $total:volumeAccumulations[total],$avg:consolidatdVolume.avgVolume) then ConcurrentMap calculatedRatios=$firm.getCalculatedRatios(); calculatedRatios.put(participationRatio,new BigDecimal($total/$avg)); modify($firm){setCalculatedRatios(calculatedRatios)}; end -- View this message in context: http://drools.46999.n3.nabble.com/Drools-5-5-divide-by-0-exception-tp4026582p4026589.html Sent from the Drools: User forum mailing list archive at Nabble.com. ___ rules-users mailing list rules-users@lists.jboss.org https://lists.jboss.org/mailman/listinfo/rules-users
Re: [rules-users] Drools 5.5 divide by 0 exception
Agreed. In this case it is possible to move to the RHS...but I have to ask what if I need to use the math as part of a constraint. Is it not safe to assume the divisor is 0 even if I do the check? That seems like an issue as I do have cases which this will be required Stephen Masters wrote Given that you don’t seem to using the result as a constraint, then I can’t see any benefit to it being on the LHS. So yes, It would be better on the RHS. Steve On 1 Nov 2013, at 17:58, Wolfgang Laun lt; wolfgang.laun@ gt; wrote: I can anticipate the answer where OP says that there is a constraint restricting argVolume to 0. However, I don't think that independent constraints such as we see them in this rule are evaluated as if they were in a single logical expression, with Java semantics. The seductive possibility of binding to a half-baked expression (i.e., $ratio:(volumeAccumulations[total]/consolidatdVolume.avgVolume)) should be discarded. This value can safely be computed on the RHS where the denominator's value being !=0 is asserted. -W On 01/11/2013, Stephen Masters lt; stephen.masters@ gt; wrote: Divide by zero exceptions usually occur when you try to divide by zero. So … first question … is consolidatdVolume.avgVolume ever zero? On 1 Nov 2013, at 16:17, gboro54 lt; gboro54@ gt; wrote: I have rules like the following: rule Add Baseline to Context if it does not exists exists or not greater then 0 no-loop true when $context:Context($id:id,baselineParticipation==null || baselineParticipation.baselineRatio==null||baselineParticipation.baselineRatio==0) then modify($firm) {setBaselineParticipation(new BaselineParticipation($id,new BigDecimal(0.00485)))}; end rule Calculate Participation Ratio no-loop true when $context:Context(consolidatdVolume!=null,consolidatdVolume.avgVolume0, volumeAccumulations[total]!=null,volumeAccumulations[total]0, $ratio:(volumeAccumulations[total]/consolidatdVolume.avgVolume)) then ConcurrentMap calculatedRatios=$firm.getCalculatedRatios(); calculatedRatios.put(fparticipationRatio,new BigDecimal($ratio)); modify($firm){setCalculatedRatios(calculatedRatios)}; end Despite the checks I get the following exception and any insight into why would be great: Exception executing consequence for rule Calculate Firm Participation Ratio in com.nasdaq.rms.nq.status: java.lang.ArithmeticException: / by zero Exception executing consequence for rule Calculate Firm Participation Ratio in com.nasdaq.rms.nq.status: java.lang.ArithmeticException: / by zero at org.drools.runtime.rule.impl.DefaultConsequenceExceptionHandler.handleException(DefaultConsequenceExceptionHandler.java:39) at org.drools.common.DefaultAgenda.fireActivation(DefaultAgenda.java:1297) at org.drools.common.DefaultAgenda.fireNextItem(DefaultAgenda.java:1221) at org.drools.common.DefaultAgenda.fireAllRules(DefaultAgenda.java:1456) at org.drools.common.AbstractWorkingMemory.fireAllRules(AbstractWorkingMemory.java:710) at org.drools.common.AbstractWorkingMemory.fireAllRules(AbstractWorkingMemory.java:674) at org.drools.impl.StatefulKnowledgeSessionImpl.fireAllRules(StatefulKnowledgeSessionImpl.java:230) at com.nasdaq.fq.rms.workflow.processor.rules.PerformanceStatusAssignmentProcessor.doWork(PerformanceStatusAssignmentProcessor.java:156) at com.ften.ssr.workqueue.WorkItemRunnable.run(WorkItemRunnable.java:48) at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615) at java.lang.Thread.run(Thread.java:724) Caused by: java.lang.ArithmeticException: / by zero at ConditionEvaluatorda6271cf5a744b6bbdb9c717cae2edb7.evaluate(Unknown Source) at org.drools.rule.constraint.MvelConstraint.evaluate(MvelConstraint.java:200) at org.drools.rule.constraint.MvelConstraint.isAllowed(MvelConstraint.java:157) at org.drools.reteoo.AlphaNode.modifyObject(AlphaNode.java:154) at org.drools.reteoo.CompositeObjectSinkAdapter.doPropagateModifyObject(CompositeObjectSinkAdapter.java:507) at org.drools.reteoo.CompositeObjectSinkAdapter.propagateModifyObject(CompositeObjectSinkAdapter.java:432) at org.drools.reteoo.AlphaNode.modifyObject(AlphaNode.java:157) at org.drools.reteoo.CompositeObjectSinkAdapter.doPropagateModifyObject(CompositeObjectSinkAdapter.java:507) at org.drools.reteoo.CompositeObjectSinkAdapter.propagateModifyObject(CompositeObjectSinkAdapter.java:432) at org.drools.reteoo.ObjectTypeNode.modifyObject(ObjectTypeNode.java:314) at org.drools.reteoo.EntryPointNode.modifyObject(EntryPointNode.java:265) at
Re: [rules-users] Drools 5.5 divide by 0 exception
I haven't read a statement yet that says that, in Drools, LHS terms, separated by a comma (!) must be executed in the order they are written, or that the C/Java semantics for logical expression evaluation is applied. -W On 01/11/2013, gboro54 gbor...@gmail.com wrote: Could you expand upon why this is a poor practice? I assumed that if a part of the pattern doesn't match the expression evaluation is terminated laune wrote I can anticipate the answer where OP says that there is a constraint restricting argVolume to 0. However, I don't think that independent constraints such as we see them in this rule are evaluated as if they were in a single logical expression, with Java semantics. The seductive possibility of binding to a half-baked expression (i.e., $ratio:(volumeAccumulations[total]/consolidatdVolume.avgVolume)) should be discarded. This value can safely be computed on the RHS where the denominator's value being !=0 is asserted. -W On 01/11/2013, Stephen Masters lt; stephen.masters@ gt; wrote: Divide by zero exceptions usually occur when you try to divide by zero. So … first question … is consolidatdVolume.avgVolume ever zero? On 1 Nov 2013, at 16:17, gboro54 lt; gboro54@ gt; wrote: I have rules like the following: rule Add Baseline to Context if it does not exists exists or not greater then 0 no-loop true when $context:Context($id:id,baselineParticipation==null || baselineParticipation.baselineRatio==null||baselineParticipation.baselineRatio==0) then modify($firm) {setBaselineParticipation(new BaselineParticipation($id,new BigDecimal(0.00485)))}; end rule Calculate Participation Ratio no-loop true when $context:Context(consolidatdVolume!=null,consolidatdVolume.avgVolume0, volumeAccumulations[total]!=null,volumeAccumulations[total]0, $ratio:(volumeAccumulations[total]/consolidatdVolume.avgVolume)) then ConcurrentMap calculatedRatios=$firm.getCalculatedRatios(); calculatedRatios.put(fparticipationRatio,new BigDecimal($ratio)); modify($firm){setCalculatedRatios(calculatedRatios)}; end Despite the checks I get the following exception and any insight into why would be great: Exception executing consequence for rule Calculate Firm Participation Ratio in com.nasdaq.rms.nq.status: java.lang.ArithmeticException: / by zero Exception executing consequence for rule Calculate Firm Participation Ratio in com.nasdaq.rms.nq.status: java.lang.ArithmeticException: / by zero at org.drools.runtime.rule.impl.DefaultConsequenceExceptionHandler.handleException(DefaultConsequenceExceptionHandler.java:39) at org.drools.common.DefaultAgenda.fireActivation(DefaultAgenda.java:1297) at org.drools.common.DefaultAgenda.fireNextItem(DefaultAgenda.java:1221) at org.drools.common.DefaultAgenda.fireAllRules(DefaultAgenda.java:1456) at org.drools.common.AbstractWorkingMemory.fireAllRules(AbstractWorkingMemory.java:710) at org.drools.common.AbstractWorkingMemory.fireAllRules(AbstractWorkingMemory.java:674) at org.drools.impl.StatefulKnowledgeSessionImpl.fireAllRules(StatefulKnowledgeSessionImpl.java:230) at com.nasdaq.fq.rms.workflow.processor.rules.PerformanceStatusAssignmentProcessor.doWork(PerformanceStatusAssignmentProcessor.java:156) at com.ften.ssr.workqueue.WorkItemRunnable.run(WorkItemRunnable.java:48) at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615) at java.lang.Thread.run(Thread.java:724) Caused by: java.lang.ArithmeticException: / by zero at ConditionEvaluatorda6271cf5a744b6bbdb9c717cae2edb7.evaluate(Unknown Source) at org.drools.rule.constraint.MvelConstraint.evaluate(MvelConstraint.java:200) at org.drools.rule.constraint.MvelConstraint.isAllowed(MvelConstraint.java:157) at org.drools.reteoo.AlphaNode.modifyObject(AlphaNode.java:154) at org.drools.reteoo.CompositeObjectSinkAdapter.doPropagateModifyObject(CompositeObjectSinkAdapter.java:507) at org.drools.reteoo.CompositeObjectSinkAdapter.propagateModifyObject(CompositeObjectSinkAdapter.java:432) at org.drools.reteoo.AlphaNode.modifyObject(AlphaNode.java:157) at org.drools.reteoo.CompositeObjectSinkAdapter.doPropagateModifyObject(CompositeObjectSinkAdapter.java:507) at org.drools.reteoo.CompositeObjectSinkAdapter.propagateModifyObject(CompositeObjectSinkAdapter.java:432) at org.drools.reteoo.ObjectTypeNode.modifyObject(ObjectTypeNode.java:314) at org.drools.reteoo.EntryPointNode.modifyObject(EntryPointNode.java:265) at org.drools.common.NamedEntryPoint.update(NamedEntryPoint.java:483) at org.drools.common.NamedEntryPoint.update(NamedEntryPoint.java:383) at
Re: [rules-users] Drools 5.5 divide by 0 exception
I made an assumption(thus why I am asking) for future cases I will use the separator to handle such cases as I would assume saying something like this would work: Object(a0 b0 a/b 100) laune wrote I haven't read a statement yet that says that, in Drools, LHS terms, separated by a comma (!) must be executed in the order they are written, or that the C/Java semantics for logical expression evaluation is applied. -W On 01/11/2013, gboro54 lt; gboro54@ gt; wrote: Could you expand upon why this is a poor practice? I assumed that if a part of the pattern doesn't match the expression evaluation is terminated laune wrote I can anticipate the answer where OP says that there is a constraint restricting argVolume to 0. However, I don't think that independent constraints such as we see them in this rule are evaluated as if they were in a single logical expression, with Java semantics. The seductive possibility of binding to a half-baked expression (i.e., $ratio:(volumeAccumulations[total]/consolidatdVolume.avgVolume)) should be discarded. This value can safely be computed on the RHS where the denominator's value being !=0 is asserted. -W On 01/11/2013, Stephen Masters lt; stephen.masters@ gt; wrote: Divide by zero exceptions usually occur when you try to divide by zero. So … first question … is consolidatdVolume.avgVolume ever zero? On 1 Nov 2013, at 16:17, gboro54 lt; gboro54@ gt; wrote: I have rules like the following: rule Add Baseline to Context if it does not exists exists or not greater then 0 no-loop true when $context:Context($id:id,baselineParticipation==null || baselineParticipation.baselineRatio==null||baselineParticipation.baselineRatio==0) then modify($firm) {setBaselineParticipation(new BaselineParticipation($id,new BigDecimal(0.00485)))}; end rule Calculate Participation Ratio no-loop true when $context:Context(consolidatdVolume!=null,consolidatdVolume.avgVolume0, volumeAccumulations[total]!=null,volumeAccumulations[total]0, $ratio:(volumeAccumulations[total]/consolidatdVolume.avgVolume)) then ConcurrentMap calculatedRatios=$firm.getCalculatedRatios(); calculatedRatios.put(fparticipationRatio,new BigDecimal($ratio)); modify($firm){setCalculatedRatios(calculatedRatios)}; end Despite the checks I get the following exception and any insight into why would be great: Exception executing consequence for rule Calculate Firm Participation Ratio in com.nasdaq.rms.nq.status: java.lang.ArithmeticException: / by zero Exception executing consequence for rule Calculate Firm Participation Ratio in com.nasdaq.rms.nq.status: java.lang.ArithmeticException: / by zero at org.drools.runtime.rule.impl.DefaultConsequenceExceptionHandler.handleException(DefaultConsequenceExceptionHandler.java:39) at org.drools.common.DefaultAgenda.fireActivation(DefaultAgenda.java:1297) at org.drools.common.DefaultAgenda.fireNextItem(DefaultAgenda.java:1221) at org.drools.common.DefaultAgenda.fireAllRules(DefaultAgenda.java:1456) at org.drools.common.AbstractWorkingMemory.fireAllRules(AbstractWorkingMemory.java:710) at org.drools.common.AbstractWorkingMemory.fireAllRules(AbstractWorkingMemory.java:674) at org.drools.impl.StatefulKnowledgeSessionImpl.fireAllRules(StatefulKnowledgeSessionImpl.java:230) at com.nasdaq.fq.rms.workflow.processor.rules.PerformanceStatusAssignmentProcessor.doWork(PerformanceStatusAssignmentProcessor.java:156) at com.ften.ssr.workqueue.WorkItemRunnable.run(WorkItemRunnable.java:48) at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615) at java.lang.Thread.run(Thread.java:724) Caused by: java.lang.ArithmeticException: / by zero at ConditionEvaluatorda6271cf5a744b6bbdb9c717cae2edb7.evaluate(Unknown Source) at org.drools.rule.constraint.MvelConstraint.evaluate(MvelConstraint.java:200) at org.drools.rule.constraint.MvelConstraint.isAllowed(MvelConstraint.java:157) at org.drools.reteoo.AlphaNode.modifyObject(AlphaNode.java:154) at org.drools.reteoo.CompositeObjectSinkAdapter.doPropagateModifyObject(CompositeObjectSinkAdapter.java:507) at org.drools.reteoo.CompositeObjectSinkAdapter.propagateModifyObject(CompositeObjectSinkAdapter.java:432) at org.drools.reteoo.AlphaNode.modifyObject(AlphaNode.java:157) at org.drools.reteoo.CompositeObjectSinkAdapter.doPropagateModifyObject(CompositeObjectSinkAdapter.java:507) at org.drools.reteoo.CompositeObjectSinkAdapter.propagateModifyObject(CompositeObjectSinkAdapter.java:432) at org.drools.reteoo.ObjectTypeNode.modifyObject(ObjectTypeNode.java:314) at org.drools.reteoo.EntryPointNode.modifyObject(EntryPointNode.java:265) at
Re: [rules-users] Drools 5.5 divide by 0 exception
Another question(on error interpretation) the stack trace seems to indicate an issue with the consequence and not the condition. Should it be assumed that seeing such errors could indicate an issue on either side of the rule? -- View this message in context: http://drools.46999.n3.nabble.com/Drools-5-5-divide-by-0-exception-tp4026582p4026594.html Sent from the Drools: User forum mailing list archive at Nabble.com. ___ rules-users mailing list rules-users@lists.jboss.org https://lists.jboss.org/mailman/listinfo/rules-users
Re: [rules-users] Drools 5.5 divide by 0 exception
Am I wrong or these are not the (only) rules that are being run? 1) The exception is thrown as the consequence of a rule called com.nasdaq.rms.nq.status.Rule_Calculate_Firm_Participation_Ratio_cfb033f33c2b404fb2bff8e1b9af0175 Rule Calculate Firm Participation Ratio, which is not shown. 2) The Rule Add baseline to context... modifies a $firm which is not bound anywhere in that rule.. 3) Looking at the stack trace, the consequence happens in a MVEL Constraint, which is in an Alpha Node immediately after an ObjectTypeNode. This usually means that the failing constraint is the first in the pattern, which is not the case in your Calculate Participation Ratio. (to Wolfgang's point: it is not mandatory, since and is commutative, but this is what usually happens in practice) You also have multiple threads... is that avgVolume computed using an accumulate somewhere? I wonder if there are critical races. On 11/01/2013 11:17 AM, gboro54 wrote: Agreed. In this case it is possible to move to the RHS...but I have to ask what if I need to use the math as part of a constraint. Is it not safe to assume the divisor is 0 even if I do the check? That seems like an issue as I do have cases which this will be required Stephen Masters wrote Given that you don’t seem to using the result as a constraint, then I can’t see any benefit to it being on the LHS. So yes, It would be better on the RHS. Steve On 1 Nov 2013, at 17:58, Wolfgang Laun lt; wolfgang.laun@ gt; wrote: I can anticipate the answer where OP says that there is a constraint restricting argVolume to 0. However, I don't think that independent constraints such as we see them in this rule are evaluated as if they were in a single logical expression, with Java semantics. The seductive possibility of binding to a half-baked expression (i.e., $ratio:(volumeAccumulations[total]/consolidatdVolume.avgVolume)) should be discarded. This value can safely be computed on the RHS where the denominator's value being !=0 is asserted. -W On 01/11/2013, Stephen Masters lt; stephen.masters@ gt; wrote: Divide by zero exceptions usually occur when you try to divide by zero. So … first question … is consolidatdVolume.avgVolume ever zero? On 1 Nov 2013, at 16:17, gboro54 lt; gboro54@ gt; wrote: I have rules like the following: rule Add Baseline to Context if it does not exists exists or not greater then 0 no-loop true when $context:Context($id:id,baselineParticipation==null || baselineParticipation.baselineRatio==null||baselineParticipation.baselineRatio==0) then modify($firm) {setBaselineParticipation(new BaselineParticipation($id,new BigDecimal(0.00485)))}; end rule Calculate Participation Ratio no-loop true when $context:Context(consolidatdVolume!=null,consolidatdVolume.avgVolume0, volumeAccumulations[total]!=null,volumeAccumulations[total]0, $ratio:(volumeAccumulations[total]/consolidatdVolume.avgVolume)) then ConcurrentMap calculatedRatios=$firm.getCalculatedRatios(); calculatedRatios.put(fparticipationRatio,new BigDecimal($ratio)); modify($firm){setCalculatedRatios(calculatedRatios)}; end Despite the checks I get the following exception and any insight into why would be great: Exception executing consequence for rule Calculate Firm Participation Ratio in com.nasdaq.rms.nq.status: java.lang.ArithmeticException: / by zero Exception executing consequence for rule Calculate Firm Participation Ratio in com.nasdaq.rms.nq.status: java.lang.ArithmeticException: / by zero at org.drools.runtime.rule.impl.DefaultConsequenceExceptionHandler.handleException(DefaultConsequenceExceptionHandler.java:39) at org.drools.common.DefaultAgenda.fireActivation(DefaultAgenda.java:1297) at org.drools.common.DefaultAgenda.fireNextItem(DefaultAgenda.java:1221) at org.drools.common.DefaultAgenda.fireAllRules(DefaultAgenda.java:1456) at org.drools.common.AbstractWorkingMemory.fireAllRules(AbstractWorkingMemory.java:710) at org.drools.common.AbstractWorkingMemory.fireAllRules(AbstractWorkingMemory.java:674) at org.drools.impl.StatefulKnowledgeSessionImpl.fireAllRules(StatefulKnowledgeSessionImpl.java:230) at com.nasdaq.fq.rms.workflow.processor.rules.PerformanceStatusAssignmentProcessor.doWork(PerformanceStatusAssignmentProcessor.java:156) at com.ften.ssr.workqueue.WorkItemRunnable.run(WorkItemRunnable.java:48) at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615) at java.lang.Thread.run(Thread.java:724) Caused by: java.lang.ArithmeticException: / by zero at ConditionEvaluatorda6271cf5a744b6bbdb9c717cae2edb7.evaluate(Unknown Source) at
Re: [rules-users] Drools 5.5 divide by 0 exception
$firm should be $context...To post the rule in the public sphere I had to modify some variables(legal company issues :-) ). The same goes for the rule name(my replacement of text is not very good). I understand Wolfgang's point...I just made a poor assumption(something as someone who has used drools for several years I shouldn't have done...every once and a while I guess I get a brain fart) Davide Sottara wrote Am I wrong or these are not the (only) rules that are being run? 1) The exception is thrown as the consequence of a rule called com.nasdaq.rms.nq.status.Rule_Calculate_Firm_Participation_Ratio_cfb033f33c2b404fb2bff8e1b9af0175 Rule Calculate Firm Participation Ratio, which is not shown. 2) The Rule Add baseline to context... modifies a $firm which is not bound anywhere in that rule.. 3) Looking at the stack trace, the consequence happens in a MVEL Constraint, which is in an Alpha Node immediately after an ObjectTypeNode. This usually means that the failing constraint is the first in the pattern, which is not the case in your Calculate Participation Ratio. (to Wolfgang's point: it is not mandatory, since and is commutative, but this is what usually happens in practice) You also have multiple threads... is that avgVolume computed using an accumulate somewhere? I wonder if there are critical races. On 11/01/2013 11:17 AM, gboro54 wrote: Agreed. In this case it is possible to move to the RHS...but I have to ask what if I need to use the math as part of a constraint. Is it not safe to assume the divisor is 0 even if I do the check? That seems like an issue as I do have cases which this will be required Stephen Masters wrote Given that you don’t seem to using the result as a constraint, then I can’t see any benefit to it being on the LHS. So yes, It would be better on the RHS. Steve On 1 Nov 2013, at 17:58, Wolfgang Laun lt; wolfgang.laun@ gt; wrote: I can anticipate the answer where OP says that there is a constraint restricting argVolume to 0. However, I don't think that independent constraints such as we see them in this rule are evaluated as if they were in a single logical expression, with Java semantics. The seductive possibility of binding to a half-baked expression (i.e., $ratio:(volumeAccumulations[total]/consolidatdVolume.avgVolume)) should be discarded. This value can safely be computed on the RHS where the denominator's value being !=0 is asserted. -W On 01/11/2013, Stephen Masters lt; stephen.masters@ gt; wrote: Divide by zero exceptions usually occur when you try to divide by zero. So … first question … is consolidatdVolume.avgVolume ever zero? On 1 Nov 2013, at 16:17, gboro54 lt; gboro54@ gt; wrote: I have rules like the following: rule Add Baseline to Context if it does not exists exists or not greater then 0 no-loop true when $context:Context($id:id,baselineParticipation==null || baselineParticipation.baselineRatio==null||baselineParticipation.baselineRatio==0) then modify($firm) {setBaselineParticipation(new BaselineParticipation($id,new BigDecimal(0.00485)))}; end rule Calculate Participation Ratio no-loop true when $context:Context(consolidatdVolume!=null,consolidatdVolume.avgVolume0, volumeAccumulations[total]!=null,volumeAccumulations[total]0, $ratio:(volumeAccumulations[total]/consolidatdVolume.avgVolume)) then ConcurrentMap calculatedRatios=$firm.getCalculatedRatios(); calculatedRatios.put(fparticipationRatio,new BigDecimal($ratio)); modify($firm){setCalculatedRatios(calculatedRatios)}; end Despite the checks I get the following exception and any insight into why would be great: Exception executing consequence for rule Calculate Firm Participation Ratio in com.nasdaq.rms.nq.status: java.lang.ArithmeticException: / by zero Exception executing consequence for rule Calculate Firm Participation Ratio in com.nasdaq.rms.nq.status: java.lang.ArithmeticException: / by zero at org.drools.runtime.rule.impl.DefaultConsequenceExceptionHandler.handleException(DefaultConsequenceExceptionHandler.java:39) at org.drools.common.DefaultAgenda.fireActivation(DefaultAgenda.java:1297) at org.drools.common.DefaultAgenda.fireNextItem(DefaultAgenda.java:1221) at org.drools.common.DefaultAgenda.fireAllRules(DefaultAgenda.java:1456) at org.drools.common.AbstractWorkingMemory.fireAllRules(AbstractWorkingMemory.java:710) at org.drools.common.AbstractWorkingMemory.fireAllRules(AbstractWorkingMemory.java:674) at org.drools.impl.StatefulKnowledgeSessionImpl.fireAllRules(StatefulKnowledgeSessionImpl.java:230) at com.nasdaq.fq.rms.workflow.processor.rules.PerformanceStatusAssignmentProcessor.doWork(PerformanceStatusAssignmentProcessor.java:156) at