2010/11/2 赵侃侃 <kevin...@gmail.com> > I get the following errors: > > Rule Compilation error : [Rule name='no B for 2 minutes'] > com/sample/Rule_no_B_for_2_minutes_0.java (7:571) : Main cannot be resolved > Rule Compilation error : [Rule name='B arrives'] > com/sample/Rule_B_arrives_0.java (7:632) : Main cannot be resolved > > It seems that 'Main.getClock()' can't be resolved. >
Well, it's obvious that you can omit the println, or use some function returning the pseudo-time. > > Besides, is it possible not to retract EventB when it arrives? Those events > might be checked against other rules. > > You can omit the retract, but then you must add no-loop true as in "ticker 120". > Out of interest in the last, what are other possible techniques? > > Run a separate timer thread, i.e., a ticker written in Java. -W > Best Regards, > Kevin Zhao > > 2010/11/1 Wolfgang Laun <wolfgang.l...@gmail.com> > > Absence of events can only be detected by checking the past. >> This means that a trigger must be inserted whenever it's time >> to check the last two minutes. This check cannot be done in >> a uniform way for all players because the arrival of an EventB >> is the start of another 2 minute interval. The solution is based >> on a ticker which inserts the trigger (Checker) whenever 120 >> seconds have gone by. (There are also other techniques to do this.) >> >> declare EventB >> @role( event ) >> end >> >> declare Checker >> @role( event ) >> end >> >> rule "ticker 120" >> no-loop true >> timer(int:0s 1s) >> when >> $p: Player( $index: index, $ticks: ticks ) >> then >> if( $ticks == 120 ){ >> modify( $p ){ setTicks( 1 ) } >> insert( new Checker( $index ) ); >> } else { >> modify( $p ){ setTicks( $ticks + 1 ) } >> } >> end >> >> >> rule "no B for 2 minutes" >> when >> $c : Checker( $index: index ) >> not EventB( index == $index, this before[0s,2m] $c ) >> then >> System.out.println( "at " + Main.getClock() + ": no B:" + $index + " >> in last 2 minutes" ); >> retract( $c ); >> end >> >> rule "B arrives" >> when >> $p : Player( $index: index ) >> $b : EventB( index == $index ) >> then >> System.out.println( "at " + Main.getClock() + ": B:" + $index + ", >> reset ticks" ); >> modify( $p ){ setTicks( 0 ) } >> retract( $b ); >> end >> >> 2010/10/31 赵侃侃 <kevin...@gmail.com> >> >> this.session = createSession(); >>> SessionPseudoClock clock = session.getSessionClock(); >>> session.insert( new Player( 1 ) ); >>> session.insert( new Player( 2 ) ); >>> >>> clock.advanceTime( 3*60, TimeUnit.SECONDS ); >>> session.insert(new EventB(1)); >>> session.fireAllRules(); >>> >>> clock.advanceTime( 3*60, TimeUnit.SECONDS ); >>> session.fireAllRules(); >>> >>> session.dispose(); >>> >>> The above code gives the following output: >>> >>> no B:2 in last 2 minutes >>> no B:1 in last 2 minutes >>> >>> what I expect is: >>> >>> no B:2 in last 2 minutes >>> no B:2 in last 2 minutes >>> no B:1 in last 2 minutes >>> >>> Any ideas? >>> >>> Best Regards, >>> Kevin Zhao >>> >>> 2010/10/29 Wolfgang Laun <wolfgang.l...@gmail.com> >>> >>>> System.out.println( "Test no B" ); >>>> session = kBase.newStatefulKnowledgeSession( config, null ); >>>> clock = session.getSessionClock(); >>>> session.insert( new Player( 1 ) ); >>>> clock.advanceTime( 3*60, TimeUnit.SECONDS ); >>>> session.fireAllRules(); >>>> session.dispose(); >>>> >>>> The rule fires with this test, (kBase in STREAM mode). >>>> -W >>>> >>>> 2010/10/29 赵侃侃 <kevin...@gmail.com> >>>> >>>> The "no B:x for 2 minutes" will not fire if nothing comes in even after >>>>> 2minutes. e.g. if no characters get killed then no events will come in. >>>>> If I add a timer to this rule, say like timer (2m 1s), then the rule >>>>> will fire every second after 2 minutes. >>>>> >>>>> Best Regards, >>>>> Kevin >>>>> >>>>> 2010/10/29 Wolfgang Laun <wolfgang.l...@gmail.com> >>>>> >>>>>> OK; your original version somehow put me off the right track. >>>>>> This rule will fire as soon as there is no B:n according to the >>>>>> Player index for 2 minutes. >>>>>> >>>>>> rule "no B:x for 2 minutes" >>>>>> when >>>>>> $b : Player( $index: index ) >>>>>> not ( EventB( index == $index) over window:time( 2m ) ) >>>>>> then >>>>>> System.out.println( "no B:" + $index + " in last 2 minutes" ); >>>>>> end >>>>>> >>>>>> This would fire whenever there's no B at all for 2 minutes: >>>>>> >>>>>> rule "no B for 2 minutes" >>>>>> when >>>>>> not ( EventB() over window:time( 2m ) ) >>>>>> then >>>>>> System.out.println( "no B:" + $index + " in last 2 minutes" ); >>>>>> end >>>>>> >>>>>> >>>>>> >>>>>> 2010/10/28 赵侃侃 <kevin...@gmail.com> >>>>>> >>>>>>> My last mail should actually read: >>>>>>> >>>>>>> A player may have multiple characters and the rule should fire when >>>>>>> *ALL* of its characters live longer than 2 minutes. that's why >>>>>>> "characters" do not have a unique identification and there isn't any >>>>>>> event >>>>>>> representing a character birth. >>>>>>> >>>>>>> Best Regards, >>>>>>> Kevin Zhao >>>>>>> >>>>>>> 在 2010年10月28日 下午9:50,赵侃侃 <kevin...@gmail.com>写道: >>>>>>> >>>>>>> A player may have multiple characters and the rule should fire when >>>>>>>> any of its characters live longer than 2 minutes. that's why >>>>>>>> "characters" >>>>>>>> do not have a unique identification and there isn't any event >>>>>>>> representing >>>>>>>> a character birth. >>>>>>>> >>>>>>>> Best Regards, >>>>>>>> Kevin Zhao >>>>>>>> >>>>>>>> 2010/10/28 Wolfgang Laun <wolfgang.l...@gmail.com> >>>>>>>> >>>>>>>>> If EventB( index == 3 ) signifies that the "character" owned by >>>>>>>>> player 3 has been killed: what is the event that this character has >>>>>>>>> been >>>>>>>>> born? Life is the time between birth and death; these two are >>>>>>>>> well-defined >>>>>>>>> (well, mostly) events, and they ought to be represented by clean-cut >>>>>>>>> events >>>>>>>>> in any application. Then it's no problem to write rules firing when a >>>>>>>>> "character" lives longer or shorter than any time. Also, "characters" >>>>>>>>> may >>>>>>>>> have to have a unique identification beyond their player-owner. >>>>>>>>> >>>>>>>>> If you are constantly shifting your specs, we won't be getting any >>>>>>>>> closer to a solution, though. >>>>>>>>> >>>>>>>>> >>>>>>>>> -W >>>>>>>>> >>>>>>>>> >>>>>>>>> 2010/10/28 赵侃侃 <kevin...@gmail.com> >>>>>>>>> >>>>>>>>>> To be honest, I don't quite understand the rules you wrote. Let me >>>>>>>>>> explain this a little bit with a real world scenario. >>>>>>>>>> Assume this is an on-line game that EventB indicates a 'kill' >>>>>>>>>> event that a player is losing its character who might be killed by >>>>>>>>>> some >>>>>>>>>> other player. >>>>>>>>>> The property index points to the player who owns this character. >>>>>>>>>> What I'm looking for here is to find out when a player's character >>>>>>>>>> survives >>>>>>>>>> in 2 minutes. The number of players in a game is at least 2 but can >>>>>>>>>> be up to >>>>>>>>>> any number. >>>>>>>>>> >>>>>>>>>> Best Regards, >>>>>>>>>> Kevin Zhao >>>>>>>>>> >>>>>>>>>> 2010/10/28 Wolfgang Laun <wolfgang.l...@gmail.com> >>>>>>>>>> >>>>>>>>>>> >>>>>>>>>>> >>>>>>>>>>> 2010/10/28 赵侃侃 <kevin...@gmail.com> >>>>>>>>>>> >>>>>>>>>>>> Hello Wolfgang, >>>>>>>>>>>> >>>>>>>>>>>> Index is just like the index in an array. the value can be any >>>>>>>>>>>> from 0 to the array length. >>>>>>>>>>>> for the previous example, the length is 1 so index can be either >>>>>>>>>>>> 0 or 1. but in the real case, the length can be an arbitrary >>>>>>>>>>>> number. >>>>>>>>>>>> >>>>>>>>>>>> another question, there are 2 rules here, do both of them have >>>>>>>>>>>> to be applied? >>>>>>>>>>>> >>>>>>>>>>> >>>>>>>>>>> One creates and inserts the PatternConsumer which blocks repeated >>>>>>>>>>> usage of the pair of EventB facts that have been successfully >>>>>>>>>>> paired. >>>>>>>>>>> Otherwise a sequence EventB:0, EventB:1, EventB:2 would fire 2 >>>>>>>>>>> times. >>>>>>>>>>> >>>>>>>>>>> If the positive condition is more complex, e.g., you need *all* >>>>>>>>>>> index values 0,...,L-1 within 2m, then other conditions will be >>>>>>>>>>> required >>>>>>>>>>> (and that's what I meant with "more precisesly"). If any pair a,b >>>>>>>>>>> from >>>>>>>>>>> [0..L-1] will do, then the modified version (!=) should be OK. >>>>>>>>>>> >>>>>>>>>>> -W >>>>>>>>>>> >>>>>>>>>>> >>>>>>>>>>> >>>>>>>>>>>> >>>>>>>>>>>> Best Regards, >>>>>>>>>>>> Kevin Zhao >>>>>>>>>>>> >>>>>>>>>>>> 2010/10/28 Wolfgang Laun <wolfgang.l...@gmail.com> >>>>>>>>>>>> >>>>>>>>>>>> Kindly state your requirements precisely. >>>>>>>>>>>>> >>>>>>>>>>>>> Perhaps >>>>>>>>>>>>> not ( EventB ( index != $index,... ) >>>>>>>>>>>>> is what you need. >>>>>>>>>>>>> -W >>>>>>>>>>>>> >>>>>>>>>>>>> 2010/10/28 赵侃侃 <kevin...@gmail.com> >>>>>>>>>>>>> >>>>>>>>>>>>> I haven't tested this rule, but what about the case that >>>>>>>>>>>>>> property index would have arbitrary number of possible values? >>>>>>>>>>>>>> >>>>>>>>>>>>>> 2010/10/27 Wolfgang Laun <wolfgang.l...@gmail.com> >>>>>>>>>>>>>> >>>>>>>>>>>>>>> Omitting the Entry Points: >>>>>>>>>>>>>>> >>>>>>>>>>>>>>> rule "B-0-1-not OK" >>>>>>>>>>>>>>> when >>>>>>>>>>>>>>> $b : EventB( $index: index ) >>>>>>>>>>>>>>> not ( PatternConsumer( id == "B01", events contains $b ) ) >>>>>>>>>>>>>>> not ( EventB( index == (1 - $index), this after[0s,2m] $b >>>>>>>>>>>>>>> ) ) >>>>>>>>>>>>>>> then >>>>>>>>>>>>>>> System.out.println( "B:" + $index + ", but no B:" + >>>>>>>>>>>>>>> (1-$index) ); >>>>>>>>>>>>>>> end >>>>>>>>>>>>>>> >>>>>>>>>>>>>>> rule "B-0-1" >>>>>>>>>>>>>>> when >>>>>>>>>>>>>>> $b1 : EventB( $index: index ) >>>>>>>>>>>>>>> $b2 : EventB( index == (1 - $index), this after[0s,2m] $b1 >>>>>>>>>>>>>>> ) >>>>>>>>>>>>>>> then >>>>>>>>>>>>>>> insert( new PatternConsumer( "B01", $b1, $b2 ) ); >>>>>>>>>>>>>>> System.out.println( "B:" + $index + "+B:" + (1-$index) ); >>>>>>>>>>>>>>> end >>>>>>>>>>>>>>> >>>>>>>>>>>>>>> -W >>>>>>>>>>>>>>> >>>>>>>>>>>>>>> 2010/10/27 赵侃侃 <kevin...@gmail.com>: >>>>>>>>>>>>>>> > Hello, >>>>>>>>>>>>>>> > With the help from the community I managed to get my first >>>>>>>>>>>>>>> rule working, and >>>>>>>>>>>>>>> > I'm trying to write my second rule on my own but it just >>>>>>>>>>>>>>> doesn't seem to >>>>>>>>>>>>>>> > work correctly. >>>>>>>>>>>>>>> > Here is the scenario, what I want is to identify a pattern >>>>>>>>>>>>>>> that there's no >>>>>>>>>>>>>>> > EventB coming in within 2 minutes with a particular index >>>>>>>>>>>>>>> value. >>>>>>>>>>>>>>> > For example, EventB would have a property named index and >>>>>>>>>>>>>>> assume the value >>>>>>>>>>>>>>> > of index would be either 0 or 1. >>>>>>>>>>>>>>> > Before firing the rules, I would manually insert facts of >>>>>>>>>>>>>>> possibleIndex with >>>>>>>>>>>>>>> > value 0 and 1 into the workingMemory. >>>>>>>>>>>>>>> > Within 2 minutes, if there only comes one EventB with index >>>>>>>>>>>>>>> valued 0 then >>>>>>>>>>>>>>> > the system should report no EventB coming in with index >>>>>>>>>>>>>>> value 1 in last 2 >>>>>>>>>>>>>>> > minutes. >>>>>>>>>>>>>>> > Vice versa, in the case of only coming one EventB with >>>>>>>>>>>>>>> index valued 1 then >>>>>>>>>>>>>>> > the system should report no EventB coming in with index >>>>>>>>>>>>>>> value 0 in last 2 >>>>>>>>>>>>>>> > minutes. >>>>>>>>>>>>>>> > If within 2 minutes, there comes 2 EventB with both value 0 >>>>>>>>>>>>>>> and 1 then >>>>>>>>>>>>>>> > nothing should report. >>>>>>>>>>>>>>> > Here is what I wrote, but it doesn't seem to work >>>>>>>>>>>>>>> correctly. >>>>>>>>>>>>>>> > I used a timer to fire this rule every 10 seconds because I >>>>>>>>>>>>>>> don't think the >>>>>>>>>>>>>>> > rule would run automatically if I don't add that. (not too >>>>>>>>>>>>>>> sure though) >>>>>>>>>>>>>>> > rule "no B in 2 minutes" >>>>>>>>>>>>>>> > timer (0 10s) >>>>>>>>>>>>>>> > when >>>>>>>>>>>>>>> > possibleIndex( $index : index ) from entry-point "Event >>>>>>>>>>>>>>> stream" >>>>>>>>>>>>>>> > $p : PatternConsumer ( name == 'no B' && index == $index ) >>>>>>>>>>>>>>> > not ( EventB( index == $index && this after[0ms,2m] $p) >>>>>>>>>>>>>>> over window:time(2m) >>>>>>>>>>>>>>> > from entry-point "Event stream" ) >>>>>>>>>>>>>>> > then >>>>>>>>>>>>>>> > PatternConsumer pc = new PatternConsumer( "no B", $index ); >>>>>>>>>>>>>>> > insert(pc); >>>>>>>>>>>>>>> > System.out.println("no B in 2 minutes " + $index); >>>>>>>>>>>>>>> > end >>>>>>>>>>>>>>> > Best Regards, >>>>>>>>>>>>>>> > Kevin Zhao >>>>>>>>>>>>>>> > _______________________________________________ >>>>>>>>>>>>>>> > 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 >>>>>>>>>>>>>>> >>>>>>>>>>>>>> >>>>>>>>>>>>>> >>>>>>>>>>>>>> _______________________________________________ >>>>>>>>>>>>>> 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 >>>>>>>>>>>>> >>>>>>>>>>>>> >>>>>>>>>>>> >>>>>>>>>>>> _______________________________________________ >>>>>>>>>>>> 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 >>>>>>>>>>> >>>>>>>>>>> >>>>>>>>>> >>>>>>>>>> _______________________________________________ >>>>>>>>>> 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 >>>>>>>>> >>>>>>>>> >>>>>>>> >>>>>>> >>>>>>> _______________________________________________ >>>>>>> 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 >>>>>> >>>>>> >>>>> >>>>> _______________________________________________ >>>>> 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 >>>> >>>> >>> >>> _______________________________________________ >>> 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 >> >> > > _______________________________________________ > 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