2. Extending an Object-Oriented RETE
Network with fine-grained
Reactivity to Property Modifications
Mark Proctor, Mario Fusco and David Sottara
Saturday, 13 July 13
9. CashFlow Ruleselect * from
AccountPeriod ap,
Account acc,
Cashflow cf
where cf.type == CREDIT and
acc.accountNo == cf.accountNo
cf.date >= ap.start and cf.date <= ap.end
rule “increase balance for AccountPeriod Credits”
when
ap : AccountPeriod()
acc : Account()
cf : CashFlow( type == CREDIT,
accountNo == acc.accountNo,
date >= ap.start && <= ap.end )
then
acc.balance += cf.amount;
end
acc.balance += cf.amount
Saturday, 13 July 13
10. Loop Problem
rule “Salary award for min 2 years service” when
e : Employee( lengthOfService > 2 )
then
modify( e ) { setSalary( e.getSalary() * 1.05 ) };
end
Saturday, 13 July 13
11. Loop Problem
rule “Salary award for min 2 years service” no-loop
when
e : Employee( lengthOfService > 2 )
then
modify( e ) { setSalary( e.getSalary() * 1.05 ) };
end
Saturday, 13 July 13
12. Loop Problem
rule “Salary award for min 2 years service” no-loop when
e : Employee( lengthOfService > 2 )
then
modify( e ) { setSalary( e.getSalary() * 1.05 ) };
end
rule “Salary award for min 8 years service” no-loop when
e : Employee( lengthOfService > 8 )
then
modify( e ) { setSalary( e.getSalary() * 1.05 ) };
end
Saturday, 13 July 13
13. Loop Problem
rule “Salary award for min 2 years service” when
e : Employee( lengthOfService > 2 )
not SalaryMin2Years( employee == e )
then
modify( e ) { setSalary( e.getSalary() * 1.05 ) };
insert ( new SalaryMin2Years(e) );
end
rule “Salary award for min 8 years service” when
e : Employee( lengthOfService > 8 )
not SalaryMin8Years( employee == e )
then
modify( e ) { setSalary( e.getSalary() * 1.05 ) };
insert ( new SalaryMin8Years(e) );
end
Saturday, 13 July 13
14. Loop Problem
rule “Year End” when
d : ChangeDate( )
e : Employee( )
then
modify( e ) { lengthOfService(
d.getYear() - e.getStartYear() ) };
end
rule “Salary award for min 8 years service” when
e : Employee( lengthOfService > 8 )
not SalaryMin8Years( employee == e )
then
modify( e ) { setSalary( e.getSalary() * 1.05 ) };
insert ( new SalaryMin8Years(e) );
end
Saturday, 13 July 13
15. Refraction
This term comes from the neurobiological
observation of a refractory period for a neuron,
which means that the neuron is not able to fire
immediately without first going through a
relaxation process.
In a similar way, OPS5 will not allow the same
instantiation in the conflict set from firing twice
in a row. This prevents the inference engine from
entering into an infinite loop.
Saturday, 13 July 13
16. W3C RIF Refraction
Refraction
When a rule instance is fired, it is removed
from the conflict set (and thus will not be
created again even its condition part
remains true), unless one of the objects in its
condition part is modified again. In the later
case, the repeatability concept determines
how the rule instance is treated
Saturday, 13 July 13
17. W3C RIF Refraction
Repeatability
After the execution of a rule instance, the
rule instance is removed from the conflict
set by the refraction. Later on, if one of the
objects in the condition part is modified and
if the rule evaluates to true, the
repeatability controls whether if the rule
instance can be created again.
Saturday, 13 July 13
18. Loop Problem (Refraction)
rule “Salary award for min 2 years service”
repeatable false when
e : Employee( lengthOfService > 2 )
then
modify( e ) { setSalary( e.getSalary() * 1.05 ) };
end
rule “Salary award for min 8 years service”
repeatable false when
e : Employee( lengthOfService > 8 )
then
modify( e ) { setSalary( e.getSalary() * 1.05 ) };
end
Saturday, 13 July 13
24. Loop Problem Fixed
rule “Salary award for min 2 years service” when
e : Employee( lengthOfService > 2 )
then
modify( e ) { setSalary( e.getSalary() * 1.05 ) };
end
rule “Salary award for min 8 years service” when
e : Employee( lengthOfService > 8 )
then
modify( e ) { setSalary( e.getSalary() * 1.05 ) };
end
Saturday, 13 July 13
25. @Watch
rule “Salary award for min 2 years service” when
e : Employee( salary < 1000, lengthOfService > 2 )
@Watch( !salary )
then
modify( e ) { setSalary( e.getSalary() * 1.05 ) };
end
Saturday, 13 July 13
26. @Watch
rule “Record Salary Changes” when
e : Employee( ) @Watch( salary )
then
insert( new SalaryChange( e, e.getSalary() );
end
Saturday, 13 July 13
30. Related Work
CLIPS COOL
Uses Triples for properties
Property Reactivity is just a useful side effect,
not an intention.
No @Watch like capability
Jess
Slot Specific
no literature on implementation
No @Watch like capability
Saturday, 13 July 13
33. Class
@PropertyReactive
public class Bar {
int a; // 1
int b; // 2
int c; // 4
int d; // 8
int e; // 16
int f; // 32
// getters and setters below
}
Saturday, 13 July 13
34. Propagation Masks
@PropertyReactive
public class Bar {
int a; // 1
int b; // 2
int c; // 4
int d; // 8
int e; // 16
int f; // 32
}
modify ( bar ) { a = 1 }
// 000001
modify ( bar ) { a = 1, c = 1 }
// 000101
modify ( bar ) { a = 1, c = 1, f = 1 }
// 100101
Saturday, 13 July 13
35. Network Masks
rule R1 when
Foo( $v : v )
bar : Bar( c >= 1, a >= 1, e >= $v ) then ... end
Bar
a => 1
c => 1
e => V
b1
a1
a2
Foo
declared : 000100
inferred : 010101
declared : 000001
inferred : 010101
declared : 010000
inferred : 010101
modify ( bar ) { a = 1, c = 1 }
// 000101
modify ( bar ) { b = 1, d = 1 }
// 010010
Saturday, 13 July 13
36. Network Masks
rule R1 when
Foo( $v : v )
Bar( c >= 1, a >= 1, e >= $v )
rule R2 when
Foo( $v : v )
Bar( c >= 1, d >= 1, b >= $v )
Bar
a => 1
c => 1
d => 1
e => V b => V
a1
a2 a3
Network
Share
Here
declared : 001000
inferred : 011111
declared : 000001
inferred : 010101
declared : 010000
inferred : 010101
declared : 001000
inferred : 001110
declared : 000010
inferred : 001110
b1 b2
Saturday, 13 July 13
37. Network Masks
rule R1 when
Foo( $v : v )
Bar( c >= 1, a >= 1, e >= $v )
rule R2 when
Foo( $v : v )
Bar( c >= 1, d >= 1, b >= $v )
rule R3 when Dummy( )
Bar( c >= 1 ) @Watch( f, d, !c )
Bar
a => 1
c => 1
d => 1
e => V b => V
@watch(f, d, !c)
b1 b2 b3
a1
a2 a3
Saturday, 13 July 13
38. Network Masks
Bar
a => 1
c => 1
d => 1
e => V b => V
a1
a2 a3
Network
Share
Here
declared : 001000
inferred : 111111
declared : 000001
inferred : 010101
declared : 010000
inferred : 010101
declared : 001000
inferred : 001110
declared : 000010
inferred : 001110
b1 b2
@watch(f, d, !c)
b3
declared : 101000
inferred : 101000
Saturday, 13 July 13
39. Network Masks
Bar
a => 1
c => 1
d => 1
e => V b => V
a1
a2 a3
Network
Share
Here
declared : 001000
inferred : 111111
declared : 000001
inferred : 010101
declared : 010000
inferred : 010101
declared : 001000
inferred : 001110
declared : 000010
inferred : 001110
b1 b2
@watch(f, d, !c)
b3
declared : 101000
inferred : 101000
Saturday, 13 July 13
47. Conclusion - Achieved
Enabled and Disabled at a Class level for flexibility
Complimentary and additional to RIF Refraction and
Repeatable, adding finer grained control.
@Watch provides even further declarative control.
Keeps rules clean.
Not Polluted with control logic.
Not any slower, and can give increased gains, by avoiding wasted
join evaluations.
Cost pushed to compile time, works with dynamic rules addition
and removal.
Good Form, Good Function
Saturday, 13 July 13
48. Conclusion - Future Work
@Watch
Can we push all or part of the @Watch higher up the alpha
network
Discriminates earlier, better performance
Further flexibility to control propagations based on rising and
falling edges
onMatch, onReMatch, onUnmatch
Saturday, 13 July 13