wongi-engine 0.0.16 → 0.0.17

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -73,6 +73,7 @@ module Wongi::Engine
73
73
  tests, assignment = *JoinNode.compile( self, context.earlier, context.parameters )
74
74
  alpha = context.rete.compile_alpha( self )
75
75
  context.node = context.node.beta_memory.join_node( alpha, tests, assignment, @filters, context.alpha_deaf )
76
+ context.node.context = context
76
77
  context.node.debug = debug?
77
78
  context.earlier << self
78
79
  context
@@ -104,6 +105,7 @@ module Wongi::Engine
104
105
  raise DefinitionError.new("Negative matches may not introduce new variables: #{assignment.variables}") unless assignment.root?
105
106
  alpha = context.rete.compile_alpha( self )
106
107
  context.node = context.node.neg_node( alpha, tests, context.alpha_deaf, unsafe )
108
+ context.node.context = context
107
109
  context.node.debug = debug?
108
110
  context.earlier << self
109
111
  context
@@ -118,6 +120,7 @@ module Wongi::Engine
118
120
  tests, assignment = *JoinNode.compile( self, context.earlier, context.parameters )
119
121
  alpha = context.rete.compile_alpha( self )
120
122
  context.node = context.node.beta_memory.optional_node( alpha, tests, assignment, context.alpha_deaf )
123
+ context.node.context = context
121
124
  context.node.debug = debug?
122
125
  context.earlier << self
123
126
  context
@@ -1,138 +1,132 @@
1
- module Wongi::Engine
2
-
3
- class Token
4
-
5
- include CoreExt
6
-
7
- attr_reader :wme, :children
8
- attr_accessor :node, :owner, :parent
9
- attr_reader :neg_join_results
10
- attr_reader :opt_join_results
11
- attr_reader :ncc_results
12
- attr_reader :generated_wmes
13
- attr_predicate :has_optional
14
-
15
- def initialize token, wme, assignments
16
- @parent, @wme, @assignments = token, wme, assignments
17
- @children = []
18
- @deleted = false
19
- @neg_join_results = []
20
- @opt_join_results = []
21
- @ncc_results = []
22
- @generated_wmes = []
23
- token.children << self if token
24
- wme.tokens << self if wme
25
- end
26
-
27
- def ancestors
28
- if parent
29
- parent.ancestors.unshift parent
30
- else
31
- []
32
- end
33
- end
34
-
35
- def subst variable, value
36
- @cached_assignments = nil
37
- if @assignments.has_key? variable
38
- @assignments[ variable ] = value
39
- end
40
- end
41
-
42
- def assignments
43
- @cached_assignments ||= all_assignments
44
- end
45
-
46
- def [] var
47
- assignments[ var ]
48
- end
49
-
50
- def duplicate? node, parent, wme, assignments
51
- self.node.equal?(node) && self.parent.equal?(parent) && self.wme.equal?(wme) && self.assignments == assignments
52
- end
53
-
54
- def to_s
55
- str = "TOKEN [ parent=#{parent ? parent.object_id : 'nil'} "
56
- all_assignments.each_pair { |key, value| str << "#{key} => #{value} " }
57
- str << "]"
58
- str
59
- end
60
-
61
- def wmes
62
- if parent
63
- parent.wmes + (wme ? [wme] : [])
64
- else
65
- wme ? [wme] : []
66
- end
67
- end
68
-
69
- def delete
70
- delete_children
71
- #@node.tokens.delete self unless @node.kind_of?( NccPartner )
72
- @wme.tokens.delete self if @wme
73
- @parent.children.delete self if @parent
74
-
75
- retract_generated
76
- @deleted = true
77
- @node.delete_token self
78
- end
79
-
80
- def deleted?
81
- @deleted
82
- end
83
-
84
- def delete_children
85
- children = @children
86
- @children = []
87
- children.each do |token|
88
- token.parent = nil
89
- token.delete
90
- end
91
- end
92
-
93
- def generated? wme
94
- return true if generated_wmes.any? { |w| w == wme }
95
- return children.any? { |t| t.generated? wme }
96
- end
97
-
98
- protected
99
-
100
- def retract_generated
101
- for_retraction = []
102
-
103
- @generated_wmes.dup.each do |wme|
104
- unless wme.manual? # => TODO: does this ever fail at all?
105
- wme.generating_tokens.delete self
106
- if wme.generating_tokens.empty?
107
- for_retraction << wme
108
- end
109
- end
110
- end
111
- @generated_wmes = []
112
- for_retraction.each { |wme| wme.rete.retract wme, true }
113
-
114
- end
115
-
116
- def all_assignments
117
- raise "Assignments is not a hash" unless @assignments.kind_of?( Hash )
118
- if @parent
119
- @parent.assignments.merge @assignments
120
- else
121
- @assignments
122
- end
123
- end
124
-
125
- end
126
-
127
- class FakeToken < Token
128
- def initialize token, wme, assignments
129
- @parent, @wme, @assignments = token, wme, assignments
130
- @children = []
131
- @neg_join_results = []
132
- @opt_join_results = []
133
- @ncc_results = []
134
- @generated_wmes = []
135
- end
136
- end
137
-
138
- end
1
+ module Wongi::Engine
2
+
3
+ class Token
4
+
5
+ include CoreExt
6
+
7
+ attr_reader :children
8
+ attr_accessor :node, :owner, :parent
9
+ attr_reader :neg_join_results
10
+ attr_reader :opt_join_results
11
+ attr_reader :ncc_results
12
+ attr_reader :generated_wmes
13
+ attr_predicate :has_optional
14
+
15
+ def initialize token, wme, assignments
16
+ @parent, @wme, @assignments = token, wme, assignments
17
+ @children = []
18
+ @deleted = false
19
+ @neg_join_results = []
20
+ @opt_join_results = []
21
+ @ncc_results = []
22
+ @generated_wmes = []
23
+ token.children << self if token
24
+ wme.tokens << self if wme
25
+ end
26
+
27
+ def ancestors
28
+ if parent
29
+ parent.ancestors.unshift parent
30
+ else
31
+ []
32
+ end
33
+ end
34
+
35
+ def subst variable, value
36
+ @cached_assignments = nil
37
+ if @assignments.has_key? variable
38
+ @assignments[ variable ] = value.respond_to?(:call) ? value : Proc.new { value }
39
+ end
40
+ end
41
+
42
+ def assignments
43
+ @cached_assignments ||= all_assignments
44
+ end
45
+
46
+ def [] var
47
+ if a = assignments[ var ]
48
+ a.call( self )
49
+ end
50
+ end
51
+
52
+ def duplicate? parent, wme, assignments
53
+ self.parent.equal?(parent) && @wme.equal?(wme) && self.assignments == assignments
54
+ end
55
+
56
+ def to_s
57
+ str = "TOKEN [ parent=#{parent ? parent.object_id : 'nil'} "
58
+ all_assignments.each_pair { |key, value| str << "#{key} => #{value} " }
59
+ str << "]"
60
+ str
61
+ end
62
+
63
+ def destroy
64
+ delete_children
65
+ #@node.tokens.delete self unless @node.kind_of?( NccPartner )
66
+ @wme.tokens.delete self if @wme
67
+ @parent.children.delete self if @parent
68
+
69
+ retract_generated
70
+ @deleted = true
71
+ @node.delete_token self
72
+ end
73
+
74
+ def deleted?
75
+ @deleted
76
+ end
77
+
78
+ def delete_children
79
+ children = @children
80
+ @children = []
81
+ children.each do |token|
82
+ token.parent = nil
83
+ token.destroy
84
+ end
85
+ end
86
+
87
+ def generated? wme
88
+ return true if generated_wmes.any? { |w| w == wme }
89
+ return children.any? { |t| t.generated? wme }
90
+ end
91
+
92
+ protected
93
+
94
+ def retract_generated
95
+ for_retraction = []
96
+
97
+ @generated_wmes.dup.each do |wme|
98
+ unless wme.manual? # => TODO: does this ever fail at all?
99
+ wme.generating_tokens.delete self
100
+ if wme.generating_tokens.empty?
101
+ for_retraction << wme
102
+ end
103
+ end
104
+ end
105
+ @generated_wmes = []
106
+ for_retraction.each { |wme| wme.rete.retract wme, true }
107
+
108
+ end
109
+
110
+ def all_assignments
111
+ raise "Assignments is not a hash" unless @assignments.kind_of?( Hash )
112
+ if @parent
113
+ @parent.assignments.merge @assignments
114
+ else
115
+ @assignments
116
+ end
117
+ end
118
+
119
+ end
120
+
121
+ class FakeToken < Token
122
+ def initialize token, wme, assignments
123
+ @parent, @wme, @assignments = token, wme, assignments
124
+ @children = []
125
+ @neg_join_results = []
126
+ @opt_join_results = []
127
+ @ncc_results = []
128
+ @generated_wmes = []
129
+ end
130
+ end
131
+
132
+ end
@@ -1,5 +1,5 @@
1
1
  module Wongi
2
2
  module Engine
3
- VERSION = "0.0.16"
3
+ VERSION = "0.0.17"
4
4
  end
5
5
  end
@@ -1,138 +1,138 @@
1
- module Wongi::Engine
2
-
3
- class WME < Struct.new( :subject, :predicate, :object )
4
-
5
- attr_reader :rete
6
-
7
- attr_reader :alphas, :tokens, :generating_tokens
8
- attr_reader :neg_join_results, :opt_join_results
9
-
10
- def initialize s, p, o, r = nil
11
-
12
- @deleted = false
13
- @alphas = []
14
- @tokens = []
15
- @generating_tokens = []
16
- @neg_join_results = []
17
- @opt_join_results = []
18
-
19
- @rete = r
20
-
21
- if r
22
- super( r.import(s), r.import(p), r.import(o) )
23
- else
24
- super( s, p, o )
25
- end
26
-
27
- end
28
-
29
- def import_into r
30
- self.class.new subject, predicate, object, r
31
- end
32
-
33
- def dup
34
- self.class.new subject, predicate, object, rete
35
- end
36
-
37
- def == other
38
- subject == other.subject && predicate == other.predicate && object == other.object
39
- end
40
-
41
- def =~ template
42
- raise "Cannot match a WME against a #{template.class}" unless Template === template
43
- result = match_member( self.subject, template.subject ) & match_member( self.predicate, template.predicate ) & match_member( self.object, template.object )
44
- if result.match?
45
- result
46
- end
47
- end
48
-
49
- def manual?
50
- generating_tokens.empty?
51
- end
52
-
53
- def generated?
54
- !manual?
55
- end
56
-
57
- def deleted?
58
- @deleted
59
- end
60
-
61
- def destroy
62
- return if deleted?
63
- @deleted = true
64
- alphas.each { |alpha| alpha.remove self }.clear
65
- while tokens.first
66
- tokens.first.delete # => will remove itself from the array
67
- end
68
-
69
- destroy_neg_join_results
70
- destroy_opt_join_results
71
-
72
- end
73
-
74
- def inspect
75
- "<WME #{subject.inspect} #{predicate.inspect} #{object.inspect}>"
76
- end
77
-
78
- def to_s
79
- inspect
80
- end
81
-
82
- def hash
83
- @hash ||= array_form.map( &:hash ).hash
84
- end
85
-
86
- protected
87
-
88
- def array_form
89
- @array_form ||= [ subject, predicate, object ]
90
- end
91
-
92
- def destroy_neg_join_results
93
- neg_join_results.each do |njr|
94
-
95
- token = njr.owner
96
- results = token.neg_join_results
97
- results.delete njr
98
-
99
- if results.empty? #&& !rete.in_snapshot?
100
- token.node.children.each { |beta|
101
- beta.beta_activate token, nil, { }
102
- }
103
- end
104
-
105
- end.clear
106
- end
107
-
108
- def destroy_opt_join_results
109
- opt_join_results.each do |ojr|
110
-
111
- token = ojr.owner
112
- results = token.opt_join_results
113
- results.delete ojr
114
-
115
- if results.empty?
116
- token.delete_children
117
- token.node.children.each { |beta|
118
- beta.beta_activate token
119
- }
120
- end
121
-
122
- end.clear
123
- end
124
-
125
- def match_member mine, theirs
126
- result = WMEMatchData.new
127
- if theirs == :_ || mine == theirs
128
- result.match!
129
- elsif Template.variable? theirs
130
- result.match!
131
- result[theirs] = mine
132
- end
133
- result
134
- end
135
-
136
- end
137
-
138
- end
1
+ module Wongi::Engine
2
+
3
+ class WME < Struct.new( :subject, :predicate, :object )
4
+
5
+ attr_reader :rete
6
+
7
+ attr_reader :alphas, :tokens, :generating_tokens
8
+ attr_reader :neg_join_results, :opt_join_results
9
+
10
+ def initialize s, p, o, r = nil
11
+
12
+ @deleted = false
13
+ @alphas = []
14
+ @tokens = []
15
+ @generating_tokens = []
16
+ @neg_join_results = []
17
+ @opt_join_results = []
18
+
19
+ @rete = r
20
+
21
+ if r
22
+ super( r.import(s), r.import(p), r.import(o) )
23
+ else
24
+ super( s, p, o )
25
+ end
26
+
27
+ end
28
+
29
+ def import_into r
30
+ self.class.new subject, predicate, object, r
31
+ end
32
+
33
+ def dup
34
+ self.class.new subject, predicate, object, rete
35
+ end
36
+
37
+ def == other
38
+ subject == other.subject && predicate == other.predicate && object == other.object
39
+ end
40
+
41
+ def =~ template
42
+ raise "Cannot match a WME against a #{template.class}" unless Template === template
43
+ result = match_member( self.subject, template.subject ) & match_member( self.predicate, template.predicate ) & match_member( self.object, template.object )
44
+ if result.match?
45
+ result
46
+ end
47
+ end
48
+
49
+ def manual?
50
+ generating_tokens.empty?
51
+ end
52
+
53
+ def generated?
54
+ !manual?
55
+ end
56
+
57
+ def deleted?
58
+ @deleted
59
+ end
60
+
61
+ def destroy
62
+ return if deleted?
63
+ @deleted = true
64
+ alphas.each { |alpha| alpha.remove self }.clear
65
+ tokens = @tokens
66
+ @tokens = []
67
+ tokens.each &:destroy
68
+
69
+ destroy_neg_join_results
70
+ destroy_opt_join_results
71
+
72
+ end
73
+
74
+ def inspect
75
+ "<WME #{subject.inspect} #{predicate.inspect} #{object.inspect}>"
76
+ end
77
+
78
+ def to_s
79
+ inspect
80
+ end
81
+
82
+ def hash
83
+ @hash ||= array_form.map( &:hash ).hash
84
+ end
85
+
86
+ protected
87
+
88
+ def array_form
89
+ @array_form ||= [ subject, predicate, object ]
90
+ end
91
+
92
+ def destroy_neg_join_results
93
+ neg_join_results.each do |njr|
94
+
95
+ token = njr.owner
96
+ results = token.neg_join_results
97
+ results.delete njr
98
+
99
+ if results.empty? #&& !rete.in_snapshot?
100
+ token.node.children.each { |beta|
101
+ beta.beta_activate token, nil, { }
102
+ }
103
+ end
104
+
105
+ end.clear
106
+ end
107
+
108
+ def destroy_opt_join_results
109
+ opt_join_results.each do |ojr|
110
+
111
+ token = ojr.owner
112
+ results = token.opt_join_results
113
+ results.delete ojr
114
+
115
+ if results.empty?
116
+ token.delete_children
117
+ token.node.children.each { |beta|
118
+ beta.beta_activate token
119
+ }
120
+ end
121
+
122
+ end.clear
123
+ end
124
+
125
+ def match_member mine, theirs
126
+ result = WMEMatchData.new
127
+ if theirs == :_ || mine == theirs
128
+ result.match!
129
+ elsif Template.variable? theirs
130
+ result.match!
131
+ result[theirs] = mine
132
+ end
133
+ result
134
+ end
135
+
136
+ end
137
+
138
+ end