Property Reactive RuleML 2013

Post on 13-Dec-2014

985 views 4 download

Tags:

description

30 minute presentation for the RuleML 2013 paper submission on the Drools feature Propert yReactive

Transcript of Property Reactive RuleML 2013

Language and System Ergonomics

http://www.slideshare.net/MarkProctor/property-reactive-ruleml-2013Saturday, 13 July 13

Extending an Object-Oriented RETE Network with fine-grained

Reactivity to Property ModificationsMark Proctor, Mario Fusco and David Sottara

Saturday, 13 July 13

AgendaThe ProblemProperty Reactive

The techniqueRelated WorkThe ImplementationBenchmarking

Conclusion

Saturday, 13 July 13

The ProblemLoop Control

Saturday, 13 July 13

The problemReactive rule based systems are hard to write

Saturday, 13 July 13

Too Much!!!!Reactive rule based systems are hard to write

Saturday, 13 July 13

Reactive Rulerule <rule_name> <attribute><value> when <conditions> then <actions>end

Saturday, 13 July 13

Patterns

Person(age >= 18)field name restriction

constraintobject type

pattern

Saturday, 13 July 13

CashFlow Ruleselect * from AccountPeriod ap, Account acc, Cashflow cfwhere 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

Loop Problemrule “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

Loop Problemrule “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

Loop Problemrule “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

Loop Problemrule “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

Loop Problemrule “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

RefractionThis 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

W3C RIF RefractionRefraction

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

W3C RIF RefractionRepeatability

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

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

AAAAAAhhhhhhhhhh

Saturday, 13 July 13

Saturday, 13 July 13

Property ReactiveThe Technique

Saturday, 13 July 13

Saturday, 13 July 13

Annotate Class@PropertyReactivepublic class Employee { int salary; int lengthOfService

// getters and setters below}

Saturday, 13 July 13

Loop Problem Fixedrule “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

@Watchrule “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

@Watchrule “Record Salary Changes” when e : Employee( ) @Watch( salary )then insert( new SalaryChange( e, e.getSalary() );end

Saturday, 13 July 13

@Watch@Watch( salary, lengthOfService, age )

@Watch( * )

@Watch( !* )

@Watch( *, !salary )

@Watch( !*, salary )

Saturday, 13 July 13

Good FormGood Function

Saturday, 13 July 13

Property ReactiveRelated Work

Saturday, 13 July 13

Related WorkCLIPS COOL

Uses Triples for propertiesProperty Reactivity is just a useful side effect, not an intention.No @Watch like capability

JessSlot Specific no literature on implementationNo @Watch like capability

Saturday, 13 July 13

Related WorkYES/OPS

“New Trigger Conditions”Simple @Watches with “!” symbolNo literature on implementation

Saturday, 13 July 13

Property ReactiveThe Implementation

Saturday, 13 July 13

Class@PropertyReactivepublic 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

Propagation Masks@PropertyReactivepublic 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

Network Masksrule 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 : 000100inferred : 010101

declared : 000001inferred : 010101

declared : 010000inferred : 010101

modify ( bar ) { a = 1, c = 1 }// 000101

modify ( bar ) { b = 1, d = 1 }// 010010

Saturday, 13 July 13

Network Masksrule 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 ShareHere

declared : 001000inferred : 011111

declared : 000001inferred : 010101

declared : 010000inferred : 010101

declared : 001000inferred : 001110

declared : 000010inferred : 001110

b1 b2Saturday, 13 July 13

Network Masksrule 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

Network MasksBar

a => 1

c => 1

d => 1

e => V b => V

a1

a2 a3

Network ShareHere

declared : 001000inferred : 111111

declared : 000001inferred : 010101

declared : 010000inferred : 010101

declared : 001000inferred : 001110

declared : 000010inferred : 001110

b1 b2

@watch(f, d, !c)

b3

declared : 101000inferred : 101000

Saturday, 13 July 13

Network MasksBar

a => 1

c => 1

d => 1

e => V b => V

a1

a2 a3

Network ShareHere

declared : 001000inferred : 111111

declared : 000001inferred : 010101

declared : 010000inferred : 010101

declared : 001000inferred : 001110

declared : 000010inferred : 001110

b1 b2

@watch(f, d, !c)

b3

declared : 101000inferred : 101000

Saturday, 13 July 13

Property ReactiveBenchmark

Saturday, 13 July 13

Hardware i7-2820QM@2.30GHz Quad core CPU with HyperThreading8Gb of RAM, OpenJDK 1.7 Ubuntu Quetzal 64bit operating system

Saturday, 13 July 13

Classes A

int a1, int b1B

int b2, int b2

Saturday, 13 July 13

Benchmark #1

rule R0 when $a: A( $a1 : a1 < 10 ) then modify( $a ) { setA2( $a1 + 1 ) }; end

rule R0 no-loop when $a: A( $a1 : a1 < 10 ) then modify( $a ) { setA2( $a1 + 1 ) }; end

insert 1mill AInitial a1, a2 set to 1No-loop

2.275±0.080sProperty Reactive

2.265 ± 0.047sGain

0.44%Saturday, 13 July 13

Benchmark #4rule R3 whena: A( a1 < 10 )b: B( b1 < a.a1 )... x: X( x1 < w.w1, x2 > a.a2 )then modify( a ) { setA2( c.getC2() + 1 ) };end

Saturday, 13 July 13

Benchmark #4 Results

rule R3 whena: A( a1 < 10 )b: B( b1 < a.a1 )... x: X( x1 < w.w1, x2 > a.a2 )then modify( a ) { setA2( c.getC2() + 1 ) };end

Saturday, 13 July 13

Conclusion

Saturday, 13 July 13

Conclusion - AchievedEnabled and Disabled at a Class level for flexibilityComplimentary 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

Conclusion - Future Work@Watch

Can we push all or part of the @Watch higher up the alpha networkDiscriminates earlier, better performance

Further flexibility to control propagations based on rising and falling edges

onMatch, onReMatch, onUnmatch

Saturday, 13 July 13

Zen-like Calmness

Saturday, 13 July 13