This is an interesting side effect. Sliding windows are applied to
the source pattern in Drools, meaning CPUReportEvent in your example.
So alpha constraints are applied before the sliding window, while beta
constraints are applied after. Now, for time-based windows, there is
no difference since the temporal constraint is based on an event
property, but for length windows that apply a constraint on the set of
events instead of individual events, that matters and I would risk
saying it is an undesirable side effect as it limits the
expressiveness of the language.
We will have to change this behavior for the next release. Can you
please create a JIRA for this and attach your report and comments from
this thread? I will do some research on how to support both use cases
and implement that for next release.
Thanks,
Edson
2010/12/8 Wolfgang Laun <wolfgang.laun(a)gmail.com>:
Constraints restrict what you see through a window; they do not
modify or
qualify the window. Thus, basically you see the last three CPUReportEvents,
and new activations are possible for each new event of this type. Other
patterns (such as ComEntity) create (in your case: two) alpha network nodes,
with which the renewed triplet is joined; now the restriction in the
CPUReportEvent
pattern reduces what goes into the collect and, ultimately, into the List.
While this (hopefully) explains why things happen the way you've observed,
it won't help you in fixing your problem. I would add a field
List<CPUReportEvent> reports to ComEntity and write these
two rules:
rule "register event"
when
$e: CPUReportEvent( $comEntity: comEntity )
$c: ComEntity( this == $comEntity, $reports: reports )
then
$reports.add( $e );
if( $reports.size() > 3 ) $reports.remove(0);
update( $c );
retract( $e ); # optional, depends on what else needs to be done with $e
end
rule "compute average"
when
ComEntity( $reports: reports )
Number( $avg: doubleValue ) from accumulate( CPUReportEvent($a: amount)
from $reports, average($a) )
then
... $avg...
end
-W
On 8 December 2010 15:04, AberAber <maryellenbench(a)hotmail.com> wrote:
>
> I have been working with sliding windows, and they do not appear to work
> properly in DROOLS 5.1.1 or I am misunderstanding how they work. My goal
> is
> to have the last X number of samples averaged or summed. I've tried two
> mechanism, the accumulate/from, and the collect, and they both behave
> similarly wrong (or different than I expect), but this was much easier to
> follow so I've posted it for help.
>
> The way I have the code structured, I receive values for two nodes, 1 and
> 2
> every second or two, which each contain random values. After each value
> received I pass the CPUReportEvent and fire the rules. The results are
> bizarre. Sometimes it resets back to 1 count, sometimes it keeps the
> value
> to the previous one. It seems to also fire both rules when really only
> one
> should've been triggered? Can someone explain the results and how to
> adjust
> it to work for my specs? Thanks!
>
> I can't see into the accumulate function, so here's the collect function,
> but they perform identically.
>
>
> package com.sample
>
> import com.sample.DroolsTest.Message;
> import com.sample.DroolsInput;
> import com.sample.CPUReportEvent;
> import com.ComEntity;
> import java.util.Iterator
> import java.util.ArrayList
>
>
> declare CPUReportEvent
> // declare a fact type as an event, default is 'fact'
> @role( event )
> end
>
> rule "collect with length window"
> no-loop true
> when
> $comEntity : ComEntity()
> $list : ACPrrayList () from collect(
> CPUReportEvent(comEntity == $comEntity)
> over window:length(3) )
> then
> System.out.print("Entity " + $comEntity.getName() + " fired of
count "
> +
> $list.size() + " value");
>
> Double sum = 0.0;
> Double count = 0.0;
> for(Iterator it = $list.iterator();it.hasNext();) {
> CPUReportEvent report = (CPUReportEvent) it.next();
> System.out.print(" " + report.getAmount());
> sum = sum + report.getAmount();
> count = count + 1.0;
> }
>
> if (count > 0.0)
> {
> Double avg = (sum / count);
> System.out.print(" - Sum " + sum + " avg " + avg + "
count " +
> count);
> }
>
> System.out.println();
>
> end
>
>
> RESULTS:
> Node1 : 7.0
> Entity Node2 fired of count 0 value
> Entity Node1 fired of count 1 value 7.0 - Sum 7.0 avg 7.0 count 1.0
> Node2 : 94.0
> Entity Node2 fired of count 1 value 94.0 - Sum 94.0 avg 94.0 count 1.0
> Node1 : 43.0
> Entity Node1 fired of count 2 value 7.0 43.0 - Sum 50.0 avg 25.0 count 2.0
> Node2 : 85.0
> Entity Node2 fired of count 2 value 94.0 85.0 - Sum 179.0 avg 89.5 count
> 2.0
> Entity Node1 fired of count 1 value 43.0 - Sum 43.0 avg 43.0 count 1.0
> Node1 : 88.0
> Entity Node2 fired of count 1 value 85.0 - Sum 85.0 avg 85.0 count 1.0
> Entity Node1 fired of count 2 value 43.0 88.0 - Sum 131.0 avg 65.5 count
> 2.0
> Node2 : 47.0
> Entity Node2 fired of count 2 value 85.0 47.0 - Sum 132.0 avg 66.0 count
> 2.0
> Entity Node1 fired of count 1 value 88.0 - Sum 88.0 avg 88.0 count 1.0
> Node1 : 39.0
> Entity Node2 fired of count 1 value 47.0 - Sum 47.0 avg 47.0 count 1.0
> Entity Node1 fired of count 2 value 88.0 39.0 - Sum 127.0 avg 63.5 count
> 2.0
> Node1 : 0.0
> Entity Node1 fired of count 2 value 39.0 0.0 - Sum 39.0 avg 19.5 count 2.0
>
>
>
> When I set the window to 4, the results are similar but never get past a
> count of 2.
>
>
> Node2 : 87.0
> Entity Node2 fired of count 1 value 87.0 - Sum 87.0 avg 87.0 count 1.0
> Entity Node1 fired of count 0 value
> Node1 : 39.0
> Entity Node1 fired of count 1 value 39.0 - Sum 39.0 avg 39.0 count 1.0
> Node2 : 11.0
> Entity Node2 fired of count 2 value 87.0 11.0 - Sum 98.0 avg 49.0 count
> 2.0
> Node1 : 48.0
> Entity Node1 fired of count 2 value 39.0 48.0 - Sum 87.0 avg 43.5 count
> 2.0
> Node2 : 33.0
> Entity Node2 fired of count 2 value 11.0 33.0 - Sum 44.0 avg 22.0 count
> 2.0
> Node1 : 69.0
> Entity Node1 fired of count 2 value 48.0 69.0 - Sum 117.0 avg 58.5 count
> 2.0
> Node2 : 63.0
> Entity Node2 fired of count 2 value 33.0 63.0 - Sum 96.0 avg 48.0 count
> 2.0
> Node1 : 82.0
> Entity Node1 fired of count 2 value 69.0 82.0 - Sum 151.0 avg 75.5 count
> 2.0
> Node2 : 94.0
> Entity Node2 fired of count 2 value 63.0 94.0 - Sum 157.0 avg 78.5 count
> 2.0
> Node1 : 65.0
> Entity Node1 fired of count 2 value 82.0 65.0 - Sum 147.0 avg 73.5 count
> 2.0
>
>
> And here's sliding window length of 5:
> Node1 : 34.0
> Entity Node2 fired of count 0 value
> Entity Node1 fired of count 1 value 34.0 - Sum 34.0 avg 34.0 count 1.0
> Node1 : 3.0
> Entity Node1 fired of count 2 value 34.0 3.0 - Sum 37.0 avg 18.5 count 2.0
> Node2 : 92.0
> Entity Node2 fired of count 1 value 92.0 - Sum 92.0 avg 92.0 count 1.0
> Node1 : 61.0
> Entity Node1 fired of count 3 value 34.0 3.0 61.0 - Sum 98.0 avg
> 32.666666666666664 count 3.0
> Node1 : 65.0
> Entity Node1 fired of count 4 value 34.0 3.0 61.0 65.0 - Sum 163.0 avg
> 40.75
> count 4.0
> Node2 : 81.0
> Entity Node2 fired of count 2 value 92.0 81.0 - Sum 173.0 avg 86.5 count
> 2.0
> Entity Node1 fired of count 3 value 3.0 61.0 65.0 - Sum 129.0 avg 43.0
> count
> 3.0
> Node1 : 29.0
> Entity Node1 fired of count 3 value 61.0 65.0 29.0 - Sum 155.0 avg
> 51.666666666666664 count 3.0
> Node2 : 28.0
> Entity Node2 fired of count 2 value 81.0 28.0 - Sum 109.0 avg 54.5 count
> 2.0
> Node2 : 46.0
> Entity Node2 fired of count 3 value 81.0 28.0 46.0 - Sum 155.0 avg
> 51.666666666666664 count 3.0
> Entity Node1 fired of count 2 value 65.0 29.0 - Sum 94.0 avg 47.0 count
> 2.0
> Node2 : 55.0
> Entity Node2 fired of count 4 value 81.0 28.0 46.0 55.0 - Sum 210.0 avg
> 52.5
> count 4.0
> Entity Node1 fired of count 1 value 29.0 - Sum 29.0 avg 29.0 count 1.0
> --
> View this message in context:
>
http://drools-java-rules-engine.46999.n3.nabble.com/DROOLS-problem-with-s...
> Sent from the Drools - User mailing list archive at
Nabble.com.
> _______________________________________________
> rules-users mailing list
> rules-users(a)lists.jboss.org
>
https://lists.jboss.org/mailman/listinfo/rules-users
_______________________________________________
rules-users mailing list
rules-users(a)lists.jboss.org
https://lists.jboss.org/mailman/listinfo/rules-users