Thanks for the reply Ernest.

I have a thread calling Rete.run(). Inside the jess script I create a 
hardware interface and hardware monitor much the same as your example 
in the temperature controller in your book - chap 14. The hardware 
sensor opens a data source which are timestamped instantaneous values 
and the monitor class (like the thermometer class) gets data values 
from the hardware interface inside a run() method and fires events for 
Jess to reason with. This all works fine.

My rules also rely on time periods. I classify data into categories 
depending on their values and initiate the relevant category using a 
rule. A rule input by the user might have the following semantics:

"Determine if there are any periods of time 20 seconds or more where 
data values are greater than 143."

(defrule Initiates
 (mon (reading ?r&:(>= ?r 143))
 (tstamp ?t&:(> ?t 0)))
 (pTime(running ?run&:(= ?run FALSE)))
 =>
 (printout t ">>>>>>>Initiates: Data "?r" bpm, timestamp "?t", Fluent 
truth val:  "?run  crlf)
 ;; start the timer which also functions as a flag to indicate
 ;; that this category is active
 (call ?pT startPropTimer))

So if the category hasn't been activated before (running is false) and 
the data value is > 143 then I initiate the time dependent category by 
starting the propTimer. Property 'running' and method startPropTimer() 
are in a class called PropTimer. This class is connected to Jess 
using:

(defclass pTime PropTime)
(bind ?pT (new PropTime)
(definstance pTime ?pT)

The Initiates rule works OK.

The terminates rule is a problem. It's function ius to terminate the 
category due to the propTimer expiring.

(defrule Terminates
    ;Terminate when timer reaches 7000, example only
    (pTime(elapsedTime ?et&:(>= ?et 7000)))
    =>
    (printout t ">>>>>>>Terminates: Elapsed time:  "?et  crlf)
    (call ?pT stopPropTimer))

I will use some kind of flag to indicate the start and end times of 
the category and may even save all the data in between these times to 
a file or something.

So I guess, in response to your prompt, I have only one thread; the 
one that starts the rete engine. The timer events are simply fired 
from within a loop inside calcTime() - the facts are picked up by Jess 
but the terminates rule won't act on them. I have a trace as follows 
from watch facts:

<=> f-0 (MAIN::pTime (class <Java-Object:java.lang.Class>) 
(elapsedTime 5860) (running TRUE) (OBJECT <Java-Object:PropTime>))
<=> f-0 (MAIN::pTime (class <Java-Object:java.lang.Class>) 
(elapsedTime 5875) (running TRUE) (OBJECT <Java-Object:PropTime>))
<=> f-0 (MAIN::pTime (class <Java-Object:java.lang.Class>) 
(elapsedTime 5891) (running TRUE) (OBJECT <Java-Object:PropTime>)) 
etc...

These facts appear after the Initiates rule has fired and before the 
terminates rule fires. But, as I mentioned originally, terminates only 
fires when the loop inside calcTime() finishes.

I hope this is clearer now?

Thanks again.
Mike






----- Original Message ----- 
From: "Ernest Friedman-Hill" <[EMAIL PROTECTED]>
To: <[email protected]>
Sent: Friday, January 05, 2007 1:50 PM
Subject: Re: JESS: Shadow facts not working


: Off the top of my head, I'm not sure Jess (or other clients of your
: class) will react to change events being fired during a call to a
: getter method; not only calcTime(), but also presumably Jess will be
: calling getElapsedTime(), and the results might be odd.
:
: But from your description, I suspect the problem is more pedestrian.
: How many threads are involved? For it to work the way you're
: expecting, there would need to be two: one calling calcTime(), and
: the other calling Rete.run() (or the equivalent.) It sounds to me as
: if you just have one that calls run() after calling calcTime(). If
: I'm wrong, then will you please describe what you're doing?
:
: On Jan 4, 2007, at 7:37 PM, Mike Stacey wrote:
:
: > I have a java class which is a bean and fires events when 
properties
: > change. My rules fire when this property attains certain values. 
The
: > property is a timer which calculates the elapsed time since some
: > previous event happened. This is implemented in a loop within the
: > java class. My jess rule needs to fire when the timer gets to a
: > particular elapsed time.
: >
: > Problem: The rule doesn't fire until the method returns, by which
: > time the timer has run further than it needs to. I have checked 
with
: > watch facts and the facts are being asserted in jess continuously 
but
: > yet the rule doesn't fire until the caclTime() method exits.
: >
: > In the examle below, when the Terminates rule fires the timer has
: > reached a bit over 10000 instead of 7000. Any suggestions would be
: > greatly appreciated of course. I hope the following is clear 
enough
: > to follow...
: >
: > The java code
: > -------------
: > Class PropTime
: >
: >    public void calcTime()
: >     {
: >     long etime = getElapsedTime();
: >         // Loop condition only for test purposes at the moment
: >     while(etime < 10000)
: >     {
: >     etime = getElapsedTime();
: >     }
: >     }
: >
: >     /** Returns elapsed time in milliseconds.
: >       * PROBLEM: 'Terminates' rule not firing until calcTime() 
returns
: >       */
: >
: >     public long getElapsedTime()
: >     {
: >        if (startTime == -1)
: >        {
: >        elapsedTime = 0;
: >        System.out.println("0");
: >        }
: >        if (running)
: >        {
: >        oldElapsedTime = elapsedTime;
: >        elapsedTime = System.currentTimeMillis() - startTime;
: >            // Terminate rule should fire when this reaches a given
: > value
: >        eventSupport.firePropertyChange("elapsedTime", new
: > Long(oldElapsedTime), new Long(elapsedTime));
: >        }
: >        else
: >        {
: >        elapsedTime = stopTime-startTime;
: >        }
: >        return elapsedTime;
: >     }
: >
: > The jess code
: > -------------
: >
: > (defclass pTime PropTime);; create deftemplate from javabean
: > (bind ?pT (new PropTime));; create bean
: > (definstance pTime ?pT);; add bean (shadow fact) to jess memory
: >
: > ; PROBLEM: This rule doesn't fire until the calcTime() method
: > ; finishes
: >
: > (defrule Terminates
: >     ; Terminate when timer reaches 7000
: >     (pTime(elapsedTime ?et&:(>= ?et 7000)))
: >      =>
: >     (printout t ">>>>>>>Terminates: Elapsed time:  "?et  crlf)
: >     (call ?pT stopPropTimer))
: >
: >
: >
: 
 > --------------------------------------------------------------------
: > To unsubscribe, send the words 'unsubscribe jess-users
: > [EMAIL PROTECTED]'
: > in the BODY of a message to [EMAIL PROTECTED], NOT to the list
: > (use your own address!) List problems? Notify owner-jess-
: > [EMAIL PROTECTED]
: 
 > --------------------------------------------------------------------
:
: ---------------------------------------------------------
: Ernest Friedman-Hill
: Advanced Software Research          Phone: (925) 294-2154
: Sandia National Labs                FAX:   (925) 294-2234
: PO Box 969, MS 9012                 [EMAIL PROTECTED]
: Livermore, CA 94550                 http://www.jessrules.com
:
: --------------------------------------------------------------------
: To unsubscribe, send the words 'unsubscribe jess-users 
[EMAIL PROTECTED]'
: in the BODY of a message to [EMAIL PROTECTED], NOT to the list
: (use your own address!) List problems? Notify 
[EMAIL PROTECTED]
: --------------------------------------------------------------------
:
:
:
: -- 
: No virus found in this incoming message.
: Checked by AVG Free Edition.
: Version: 7.5.432 / Virus Database: 268.16.5/616 - Release Date: 
4/01/2007 1:34 PM
:
: 

--------------------------------------------------------------------
To unsubscribe, send the words 'unsubscribe jess-users [EMAIL PROTECTED]'
in the BODY of a message to [EMAIL PROTECTED], NOT to the list
(use your own address!) List problems? Notify [EMAIL PROTECTED]
--------------------------------------------------------------------

Reply via email to