wongi-engine 0.4.0.pre.alpha8 → 0.4.0.pre.alpha10
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.
- checksums.yaml +4 -4
- data/lib/wongi-engine/alpha_index.rb +2 -2
- data/lib/wongi-engine/beta/aggregate_node.rb +1 -2
- data/lib/wongi-engine/dsl/action/statement_generator.rb +4 -17
- data/lib/wongi-engine/generator_tracker.rb +32 -0
- data/lib/wongi-engine/join_results.rb +80 -0
- data/lib/wongi-engine/network.rb +4 -6
- data/lib/wongi-engine/overlay.rb +74 -184
- data/lib/wongi-engine/template.rb +0 -12
- data/lib/wongi-engine/token.rb +1 -34
- data/lib/wongi-engine/version.rb +1 -1
- data/lib/wongi-engine.rb +2 -0
- data/spec/alpha_index_spec.rb +6 -6
- data/spec/overlay_spec.rb +1 -6
- metadata +4 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 0dc2418ab6ffabbb410e83db899bed0479fc5912ec24bc6bf5c01f40ca306aa1
|
4
|
+
data.tar.gz: 4f22e6752c8dfe568eaae071cc7d10b062dee6ddaf8c8ddb2dc201773b7378a1
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 6f0d335b747ae2495a2cb259d4d538cb4b66f7f97fabb41ffd8c7dc78750df54c04990e60eea1913155388488d867e7090c71aee1ae647d0fdcf20447c455e00
|
7
|
+
data.tar.gz: d1db63d17198447da1f6761897cda0e5db7af1dc880203146e0deae4c30de89fe0486049ece689e1394d773a9bac79c67cc85ecf45a2655eee84ec25eab7855a
|
@@ -6,11 +6,11 @@ module Wongi::Engine
|
|
6
6
|
|
7
7
|
def initialize(pattern)
|
8
8
|
@pattern = pattern
|
9
|
-
@index = Hash.new { |h, k| h[k] =
|
9
|
+
@index = Hash.new { |h, k| h[k] = Set.new }
|
10
10
|
end
|
11
11
|
|
12
12
|
def add(wme)
|
13
|
-
collection_for_wme(wme).
|
13
|
+
collection_for_wme(wme).add(wme)
|
14
14
|
end
|
15
15
|
|
16
16
|
def remove(wme)
|
@@ -57,9 +57,8 @@ module Wongi::Engine
|
|
57
57
|
[tokens]
|
58
58
|
end
|
59
59
|
|
60
|
-
|
61
60
|
groups.each do |tokens|
|
62
|
-
aggregated =
|
61
|
+
aggregated = aggregate.call(tokens.map(&map))
|
63
62
|
assignment = { var => aggregated }
|
64
63
|
children = child ? [child] : self.children
|
65
64
|
tokens.each do |token|
|
@@ -3,8 +3,6 @@ require "set"
|
|
3
3
|
module Wongi::Engine
|
4
4
|
module DSL::Action
|
5
5
|
class StatementGenerator < BaseAction
|
6
|
-
GeneratorOrigin = Struct.new(:token, :action)
|
7
|
-
|
8
6
|
attr_reader :template
|
9
7
|
private :template
|
10
8
|
|
@@ -23,9 +21,7 @@ module Wongi::Engine
|
|
23
21
|
production.tracer.trace(action: self, wme: wme) if production.tracer
|
24
22
|
|
25
23
|
if should_assert?(wme, token)
|
26
|
-
|
27
|
-
token.generated_wmes << wme
|
28
|
-
overlay.assert(wme, generator: origin)
|
24
|
+
overlay.assert(wme, generator: token)
|
29
25
|
end
|
30
26
|
end
|
31
27
|
|
@@ -43,27 +39,18 @@ module Wongi::Engine
|
|
43
39
|
# TODO: clean up
|
44
40
|
return false if token.node.is_a?(NegNode) && wme =~ token.node.alpha.template && token.node.matches?(token, wme) # how much is actually necessary?
|
45
41
|
|
46
|
-
|
42
|
+
token.parents.each { |parent| tokens_to_consider.push(parent) unless considered_tokens.include?(parent) }
|
47
43
|
|
48
44
|
next unless token.wme
|
49
45
|
|
50
|
-
overlay.generators(token.wme).each do |
|
51
|
-
tokens_to_consider.push(
|
46
|
+
overlay.generators(token.wme).each do |generating_token|
|
47
|
+
tokens_to_consider.push(generating_token) unless considered_tokens.include?(generating_token)
|
52
48
|
end
|
53
49
|
end
|
54
50
|
|
55
51
|
# we could not prove that the new WME should not be asserted
|
56
52
|
true
|
57
53
|
end
|
58
|
-
|
59
|
-
def deexecute(token)
|
60
|
-
origin = GeneratorOrigin.new(token, self)
|
61
|
-
|
62
|
-
generated = token.generated_wmes.select { overlay.generators(_1).include?(origin) }
|
63
|
-
generated.each do |wme|
|
64
|
-
overlay.retract wme, generator: origin
|
65
|
-
end
|
66
|
-
end
|
67
54
|
end
|
68
55
|
end
|
69
56
|
end
|
@@ -0,0 +1,32 @@
|
|
1
|
+
module Wongi::Engine
|
2
|
+
class GeneratorTracker
|
3
|
+
def initialize
|
4
|
+
@by_wme = Hash.new { |h, k| h[k] = Set.new }
|
5
|
+
@by_token = Hash.new { |h, k| h[k] = Set.new }
|
6
|
+
end
|
7
|
+
|
8
|
+
def add(wme, token)
|
9
|
+
@by_wme[wme].add(token)
|
10
|
+
@by_token[token.object_id].add(wme)
|
11
|
+
end
|
12
|
+
|
13
|
+
def for_wme(wme)
|
14
|
+
@by_wme.has_key?(wme) ? @by_wme[wme] : Set.new
|
15
|
+
end
|
16
|
+
|
17
|
+
def for_token(token)
|
18
|
+
@by_token.has_key?(token.object_id) ? @by_token[token.object_id] : Set.new
|
19
|
+
end
|
20
|
+
|
21
|
+
def remove_token(token)
|
22
|
+
wmes = for_token(token)
|
23
|
+
@by_token.delete(token.object_id)
|
24
|
+
wmes.each do |wme|
|
25
|
+
next unless @by_wme.key?(wme)
|
26
|
+
|
27
|
+
@by_wme[wme].delete(token)
|
28
|
+
@by_wme.delete(wme) if @by_wme[wme].empty?
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
@@ -0,0 +1,80 @@
|
|
1
|
+
module Wongi::Engine
|
2
|
+
class JoinResults
|
3
|
+
attr_reader :by_wme, :by_token, :hidden
|
4
|
+
private :by_wme, :by_token
|
5
|
+
private :hidden
|
6
|
+
def initialize
|
7
|
+
@by_wme = Hash.new { |h, k| h[k] = {} }
|
8
|
+
@by_token = Hash.new { |h, k| h[k] = {} }
|
9
|
+
@hidden = {}
|
10
|
+
end
|
11
|
+
|
12
|
+
def for(wme: nil, token: nil)
|
13
|
+
if wme
|
14
|
+
by_wme.key?(wme) ? by_wme[wme].keys : []
|
15
|
+
elsif token
|
16
|
+
by_token.key?(token.object_id) ? by_token[token.object_id].keys : []
|
17
|
+
else
|
18
|
+
[]
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|
22
|
+
def has?(jr)
|
23
|
+
by_wme.key?(jr.wme) && by_wme[jr.wme].key?(jr)
|
24
|
+
end
|
25
|
+
|
26
|
+
def hidden?(jr)
|
27
|
+
hidden.key?(jr)
|
28
|
+
end
|
29
|
+
|
30
|
+
def add(jr)
|
31
|
+
if hidden.key?(jr)
|
32
|
+
hidden.delete(jr)
|
33
|
+
else
|
34
|
+
by_wme[jr.wme][jr] = true
|
35
|
+
by_token[jr.token.object_id][jr] = true
|
36
|
+
end
|
37
|
+
end
|
38
|
+
|
39
|
+
def remove(jr)
|
40
|
+
unless has?(jr)
|
41
|
+
hide(jr)
|
42
|
+
return
|
43
|
+
end
|
44
|
+
|
45
|
+
if by_wme.key?(jr.wme)
|
46
|
+
by_wme[jr.wme].delete(jr)
|
47
|
+
if by_wme[jr.wme].empty?
|
48
|
+
by_wme.delete(jr.wme)
|
49
|
+
end
|
50
|
+
end
|
51
|
+
|
52
|
+
if by_token.key?(jr.token.object_id)
|
53
|
+
by_token[jr.token.object_id].delete(jr)
|
54
|
+
if by_token[jr.token.object_id].empty?
|
55
|
+
by_token.delete(jr.token.object_id)
|
56
|
+
end
|
57
|
+
end
|
58
|
+
end
|
59
|
+
|
60
|
+
def hide(jr)
|
61
|
+
hidden[jr] = true
|
62
|
+
end
|
63
|
+
|
64
|
+
def remove_token(token)
|
65
|
+
return unless by_token.key?(token.object_id)
|
66
|
+
|
67
|
+
by_token[token.object_id].keys.each do |jr|
|
68
|
+
remove(jr)
|
69
|
+
end
|
70
|
+
end
|
71
|
+
|
72
|
+
def remove_wme(wme)
|
73
|
+
return unless by_wme.key?(wme)
|
74
|
+
|
75
|
+
by_wme[wme].keys do |jr|
|
76
|
+
remove(jr)
|
77
|
+
end
|
78
|
+
end
|
79
|
+
end
|
80
|
+
end
|
data/lib/wongi-engine/network.rb
CHANGED
@@ -43,7 +43,7 @@ module Wongi::Engine
|
|
43
43
|
@overlays = [base_overlay]
|
44
44
|
|
45
45
|
self.alpha_top = AlphaMemory.new(Template.new(:_, :_, :_), self)
|
46
|
-
self.alpha_hash = { alpha_top.template
|
46
|
+
self.alpha_hash = { alpha_top.template => alpha_top }
|
47
47
|
self.beta_top = RootNode.new(nil)
|
48
48
|
beta_top.rete = self
|
49
49
|
beta_top.seed
|
@@ -67,7 +67,6 @@ module Wongi::Engine
|
|
67
67
|
block.call(child)
|
68
68
|
ensure
|
69
69
|
remove_overlay(child)
|
70
|
-
child.dispose!
|
71
70
|
end
|
72
71
|
|
73
72
|
def alphas
|
@@ -188,13 +187,12 @@ module Wongi::Engine
|
|
188
187
|
template.predicate = condition.predicate unless Template.variable?(condition.predicate)
|
189
188
|
template.object = condition.object unless Template.variable?(condition.object)
|
190
189
|
|
191
|
-
hash = template.hash
|
192
190
|
# puts "COMPILED CONDITION #{condition} WITH KEY #{key}"
|
193
|
-
return alpha_hash[
|
191
|
+
return alpha_hash[template] if alpha_hash.key?(template)
|
194
192
|
|
195
193
|
alpha = AlphaMemory.new(template, self)
|
196
194
|
|
197
|
-
alpha_hash[
|
195
|
+
alpha_hash[template] = alpha
|
198
196
|
initial_fill alpha
|
199
197
|
|
200
198
|
alpha
|
@@ -290,7 +288,7 @@ module Wongi::Engine
|
|
290
288
|
end
|
291
289
|
|
292
290
|
def lookup(s, p, o)
|
293
|
-
key = Template.
|
291
|
+
key = Template.new(s, p, o)
|
294
292
|
# puts "Lookup for #{key}"
|
295
293
|
alpha_hash[key]
|
296
294
|
end
|
data/lib/wongi-engine/overlay.rb
CHANGED
@@ -1,92 +1,13 @@
|
|
1
1
|
module Wongi::Engine
|
2
2
|
class Overlay
|
3
|
-
class JoinResults
|
4
|
-
attr_reader :by_wme, :by_token, :hidden
|
5
|
-
private :by_wme, :by_token
|
6
|
-
private :hidden
|
7
|
-
def initialize
|
8
|
-
@by_wme = Hash.new { |h, k| h[k] = {} }
|
9
|
-
@by_token = Hash.new { |h, k| h[k] = {} }
|
10
|
-
@hidden = {}
|
11
|
-
end
|
12
|
-
|
13
|
-
def for(wme: nil, token: nil)
|
14
|
-
if wme
|
15
|
-
by_wme.key?(wme.object_id) ? by_wme[wme.object_id].keys : []
|
16
|
-
elsif token
|
17
|
-
by_token.key?(token.object_id) ? by_token[token.object_id].keys : []
|
18
|
-
else
|
19
|
-
[]
|
20
|
-
end
|
21
|
-
end
|
22
3
|
|
23
|
-
|
24
|
-
by_wme.key?(jr.wme.object_id) && by_wme[jr.wme.object_id].key?(jr)
|
25
|
-
end
|
26
|
-
|
27
|
-
def hidden?(jr)
|
28
|
-
hidden.key?(jr)
|
29
|
-
end
|
30
|
-
|
31
|
-
def add(jr)
|
32
|
-
if hidden.key?(jr)
|
33
|
-
hidden.delete(jr)
|
34
|
-
else
|
35
|
-
by_wme[jr.wme.object_id][jr] = true
|
36
|
-
by_token[jr.token.object_id][jr] = true
|
37
|
-
end
|
38
|
-
end
|
39
|
-
|
40
|
-
def remove(jr)
|
41
|
-
unless has?(jr)
|
42
|
-
hide(jr)
|
43
|
-
return
|
44
|
-
end
|
45
|
-
|
46
|
-
if by_wme.key?(jr.wme.object_id)
|
47
|
-
by_wme[jr.wme.object_id].delete(jr)
|
48
|
-
if by_wme[jr.wme.object_id].empty?
|
49
|
-
by_wme.delete(jr.wme.object_id)
|
50
|
-
end
|
51
|
-
end
|
52
|
-
|
53
|
-
if by_token.key?(jr.token.object_id)
|
54
|
-
by_token[jr.token.object_id].delete(jr)
|
55
|
-
if by_token[jr.token.object_id].empty?
|
56
|
-
by_token.delete(jr.token.object_id)
|
57
|
-
end
|
58
|
-
end
|
59
|
-
end
|
60
|
-
|
61
|
-
def hide(jr)
|
62
|
-
hidden[jr] = true
|
63
|
-
end
|
64
|
-
|
65
|
-
def remove_token(token)
|
66
|
-
return unless by_token.key?(token.object_id)
|
67
|
-
|
68
|
-
by_token[token.object_id].keys.each do |jr|
|
69
|
-
remove(jr)
|
70
|
-
end
|
71
|
-
end
|
72
|
-
|
73
|
-
def remove_wme(wme)
|
74
|
-
return unless by_wme.key?(wme.object_id)
|
75
|
-
|
76
|
-
by_wme[wme.object_id].keys do |jr|
|
77
|
-
remove(jr)
|
78
|
-
end
|
79
|
-
end
|
80
|
-
end
|
81
|
-
|
82
|
-
attr_reader :rete, :parent, :wmes, :tokens, :indexes, :queue, :hidden_parent_wmes, :hidden_parent_tokens, :wme_generators, :hidden_parent_wme_generators, :wme_manual, :hidden_parent_wme_manual, :neg_join_results, :opt_join_results, :ncc_tokens, :ncc_tokens_owner, :hidden_ncc_tokens
|
4
|
+
attr_reader :rete, :parent, :wmes, :tokens, :indexes, :queue, :hidden_parent_wmes, :hidden_parent_tokens, :generator_tracker, :wme_manual, :hidden_parent_wme_manual, :neg_join_results, :opt_join_results, :ncc_tokens, :ncc_tokens_owner, :hidden_ncc_tokens
|
83
5
|
private :wmes, :tokens
|
84
6
|
private :indexes
|
85
7
|
private :queue
|
86
8
|
private :hidden_parent_wmes
|
87
9
|
private :hidden_parent_tokens
|
88
|
-
private :
|
89
|
-
private :hidden_parent_wme_generators
|
10
|
+
private :generator_tracker
|
90
11
|
private :wme_manual
|
91
12
|
private :hidden_parent_wme_manual
|
92
13
|
private :neg_join_results
|
@@ -99,7 +20,7 @@ module Wongi::Engine
|
|
99
20
|
@rete = rete
|
100
21
|
@parent = parent
|
101
22
|
|
102
|
-
@wmes =
|
23
|
+
@wmes = Set.new
|
103
24
|
@indexes = [
|
104
25
|
AlphaIndex.new(%i[subject]),
|
105
26
|
AlphaIndex.new(%i[predicate]),
|
@@ -111,10 +32,9 @@ module Wongi::Engine
|
|
111
32
|
@hidden_parent_wmes = {}
|
112
33
|
|
113
34
|
@tokens = Hash.new { |h, k| h[k] = [] }
|
114
|
-
@hidden_parent_tokens =
|
35
|
+
@hidden_parent_tokens = Set.new
|
115
36
|
|
116
|
-
@
|
117
|
-
@hidden_parent_wme_generators = {}
|
37
|
+
@generator_tracker = GeneratorTracker.new
|
118
38
|
|
119
39
|
@wme_manual = {}
|
120
40
|
@hidden_parent_wme_manual = {}
|
@@ -140,14 +60,6 @@ module Wongi::Engine
|
|
140
60
|
parent.ancestor?(other)
|
141
61
|
end
|
142
62
|
|
143
|
-
def dispose!
|
144
|
-
return if default?
|
145
|
-
|
146
|
-
tokens.each do |_node, tokens|
|
147
|
-
tokens.each(&:dispose!)
|
148
|
-
end
|
149
|
-
end
|
150
|
-
|
151
63
|
def <<(thing)
|
152
64
|
case thing
|
153
65
|
when Array
|
@@ -180,19 +92,23 @@ module Wongi::Engine
|
|
180
92
|
def run_queue
|
181
93
|
until queue.empty?
|
182
94
|
operation, wme, options = queue.shift
|
95
|
+
|
183
96
|
case operation
|
184
97
|
when :assert
|
185
|
-
|
98
|
+
existing_wme = find_ignoring_hidden(wme)
|
99
|
+
wme = existing_wme || wme
|
186
100
|
visible = !find(wme).nil?
|
187
101
|
add_wme(wme, **options)
|
188
102
|
rete.real_assert(wme) unless visible
|
103
|
+
|
189
104
|
when :retract
|
190
105
|
wme = find_ignoring_hidden(wme)
|
191
|
-
|
106
|
+
if wme # it's perhaps better to return quietly, because complicated cascades may delete a WME while we're going through the queue
|
107
|
+
visible = !find(wme).nil?
|
108
|
+
remove_wme(wme, **options)
|
109
|
+
rete.real_retract(wme) if visible
|
110
|
+
end
|
192
111
|
|
193
|
-
visible = !find(wme).nil?
|
194
|
-
remove_wme(wme, **options)
|
195
|
-
rete.real_retract(wme) if visible
|
196
112
|
end
|
197
113
|
end
|
198
114
|
end
|
@@ -238,9 +154,9 @@ module Wongi::Engine
|
|
238
154
|
end
|
239
155
|
|
240
156
|
def manual?(wme)
|
241
|
-
wme_manual.key?(wme
|
157
|
+
wme_manual.key?(wme) ||
|
242
158
|
if parent
|
243
|
-
parent.manual?(wme) && !hidden_parent_wme_manual.key?(wme
|
159
|
+
parent.manual?(wme) && !hidden_parent_wme_manual.key?(wme)
|
244
160
|
end
|
245
161
|
end
|
246
162
|
|
@@ -248,36 +164,34 @@ module Wongi::Engine
|
|
248
164
|
generators(wme).any?
|
249
165
|
end
|
250
166
|
|
251
|
-
def
|
252
|
-
|
167
|
+
def generators(wme)
|
168
|
+
own_generators = generator_tracker.for_wme(wme)
|
169
|
+
parent_generators =
|
253
170
|
if parent
|
254
|
-
parent.
|
171
|
+
parent.generators(wme).reject { |t| hidden_token?(t) }.to_set
|
255
172
|
else
|
256
|
-
|
173
|
+
Set.new
|
257
174
|
end
|
175
|
+
own_generators.union(parent_generators)
|
258
176
|
end
|
259
177
|
|
260
|
-
|
261
|
-
|
262
|
-
|
263
|
-
|
264
|
-
|
265
|
-
own_generators = wme_generators.key?(wme.object_id) ? wme_generators[wme.object_id] : []
|
266
|
-
parent_generators =
|
267
|
-
if parent
|
268
|
-
parent.generators(wme).reject { |g| hidden_parent_wme_generators.key?(g) }
|
178
|
+
def generated_wmes(token)
|
179
|
+
own_wmes = generator_tracker.for_token(token)
|
180
|
+
parent_wmes =
|
181
|
+
if parent && !hidden_token?(token)
|
182
|
+
parent.generated_wmes(token).reject { hidden_wme?(_1) }.to_set
|
269
183
|
else
|
270
|
-
|
184
|
+
Set.new
|
271
185
|
end
|
272
|
-
|
186
|
+
own_wmes.union(parent_wmes)
|
273
187
|
end
|
274
188
|
|
275
189
|
private def own_manual?(wme)
|
276
|
-
wme_manual.key?(wme
|
190
|
+
wme_manual.key?(wme)
|
277
191
|
end
|
278
192
|
|
279
193
|
private def own_generated?(wme)
|
280
|
-
|
194
|
+
generator_tracker.for_wme(wme).any?
|
281
195
|
end
|
282
196
|
|
283
197
|
private def find_wme(wme)
|
@@ -285,13 +199,11 @@ module Wongi::Engine
|
|
285
199
|
end
|
286
200
|
|
287
201
|
private def find_own_wme(wme)
|
288
|
-
|
289
|
-
index.collection_for_wme(wme)
|
290
|
-
}
|
291
|
-
smallest = collections.min_by(&:size)
|
292
|
-
smallest.find { _1 == wme }
|
202
|
+
has_own_wme?(wme) ? wme : nil
|
293
203
|
end
|
294
204
|
|
205
|
+
private def has_own_wme?(wme) = wmes.include?(wme)
|
206
|
+
|
295
207
|
private def find_parents_wme(wme)
|
296
208
|
return unless parent
|
297
209
|
|
@@ -325,9 +237,9 @@ module Wongi::Engine
|
|
325
237
|
|
326
238
|
private def select_parents_template(template)
|
327
239
|
if parent
|
328
|
-
parent.select(template).reject { hidden_wme?(_1) }
|
240
|
+
parent.select(template).reject { hidden_wme?(_1) }.to_set
|
329
241
|
else
|
330
|
-
|
242
|
+
Set.new
|
331
243
|
end
|
332
244
|
end
|
333
245
|
|
@@ -335,33 +247,18 @@ module Wongi::Engine
|
|
335
247
|
# p add_wme: { wme:, generator: !!generator }
|
336
248
|
|
337
249
|
# if we previously hid this locally, unhide it
|
338
|
-
hidden_parent_wmes.delete(wme
|
339
|
-
|
340
|
-
|
341
|
-
|
342
|
-
|
250
|
+
hidden_parent_wmes.delete(wme)
|
251
|
+
|
252
|
+
unless has_own_wme?(wme)
|
253
|
+
wmes.add(wme)
|
254
|
+
indexes.each { _1.add(wme) }
|
343
255
|
end
|
344
256
|
|
345
|
-
if
|
346
|
-
|
347
|
-
wme_generators[wme.object_id] << generator unless own_generated_by?(wme, generator)
|
348
|
-
else
|
349
|
-
wme_manual[wme.object_id] = true
|
350
|
-
end
|
351
|
-
elsif find_parents_wme(wme)
|
352
|
-
if generator
|
353
|
-
wme_generators[wme.object_id] << generator unless generated_by?(wme, generator)
|
354
|
-
else
|
355
|
-
wme_manual[wme.object_id] = true unless manual?(wme)
|
356
|
-
end
|
257
|
+
if generator
|
258
|
+
generator_tracker.add(wme, generator)
|
357
259
|
else
|
358
|
-
|
359
|
-
|
360
|
-
if generator
|
361
|
-
wme_generators[wme.object_id] << generator
|
362
|
-
else
|
363
|
-
wme_manual[wme.object_id] = true
|
364
|
-
end
|
260
|
+
hidden_parent_wme_manual.delete(wme)
|
261
|
+
wme_manual[wme] = true
|
365
262
|
end
|
366
263
|
end
|
367
264
|
|
@@ -369,15 +266,9 @@ module Wongi::Engine
|
|
369
266
|
# p remove_wme: { wme:, generator: !!generator }
|
370
267
|
|
371
268
|
if find_own_wme(wme)
|
372
|
-
if generator
|
373
|
-
if own_generated_by?(wme, generator)
|
374
|
-
wme_generators[wme.object_id].delete(generator)
|
375
|
-
wme_generators.delete(wme.object_id) if wme_generators[wme.object_id].empty?
|
376
|
-
end
|
377
|
-
elsif own_manual?(wme)
|
378
|
-
wme_manual.delete(wme.object_id)
|
379
|
-
end
|
269
|
+
wme_manual.delete(wme) if generator.nil?
|
380
270
|
|
271
|
+
# no remaining reasons to keep this WME around
|
381
272
|
if !own_generated?(wme) && !own_manual?(wme)
|
382
273
|
wmes.delete(wme)
|
383
274
|
indexes.each { _1.remove(wme) }
|
@@ -392,27 +283,14 @@ module Wongi::Engine
|
|
392
283
|
|
393
284
|
# must be parents' then
|
394
285
|
|
395
|
-
if generator
|
396
|
-
|
397
|
-
if
|
398
|
-
|
399
|
-
wme_generators.delete(wme.object_id) if wme_generators[wme.object_id].empty?
|
400
|
-
end
|
401
|
-
# if we're still generated, hide parents'
|
402
|
-
if generated_by?(wme, generator)
|
403
|
-
hidden_parent_wme_generators[generator] = true
|
404
|
-
end
|
405
|
-
else
|
406
|
-
if own_manual?(wme)
|
407
|
-
wme_manual.delete(wme.object_id)
|
408
|
-
end
|
409
|
-
if manual?(wme)
|
410
|
-
hidden_parent_wme_manual[wme.object_id] = true
|
411
|
-
end
|
286
|
+
if generator.nil?
|
287
|
+
wme_manual.delete(wme)
|
288
|
+
# if still manual, it must be from the parent
|
289
|
+
hidden_parent_wme_manual[wme] = true if manual?(wme)
|
412
290
|
end
|
413
291
|
|
414
292
|
if !manual?(wme) && !generated?(wme)
|
415
|
-
hidden_parent_wmes[wme
|
293
|
+
hidden_parent_wmes[wme] = true
|
416
294
|
end
|
417
295
|
end
|
418
296
|
|
@@ -420,7 +298,8 @@ module Wongi::Engine
|
|
420
298
|
# p add_token: {token:}
|
421
299
|
# TODO: is this really likely to happen? we don't normally restore deleted tokens but rather create new ones in the activation
|
422
300
|
if hidden_token?(token)
|
423
|
-
|
301
|
+
puts "odd case"
|
302
|
+
unhide_token(token)
|
424
303
|
return
|
425
304
|
end
|
426
305
|
|
@@ -429,9 +308,12 @@ module Wongi::Engine
|
|
429
308
|
|
430
309
|
def remove_token(token)
|
431
310
|
# p remove_token: {token:}
|
311
|
+
|
312
|
+
wmes = generated_wmes(token)
|
313
|
+
|
432
314
|
if own_node_tokens(token.node).find { _1.equal?(token) }.nil?
|
433
315
|
if parents_node_tokens(token.node).find { _1.equal?(token) }
|
434
|
-
|
316
|
+
hide_token(token)
|
435
317
|
|
436
318
|
# do not hide JRs from the WME side: it will be done in the alpha deactivation and the JRs have to stay visible until then
|
437
319
|
parent_neg_join_results_for(token: token).each { neg_join_results.hide(_1) }
|
@@ -441,10 +323,12 @@ module Wongi::Engine
|
|
441
323
|
hidden_ncc_tokens[token][ncc] = true
|
442
324
|
end
|
443
325
|
end
|
444
|
-
|
326
|
+
else
|
327
|
+
remove_own_token(token)
|
445
328
|
end
|
446
329
|
|
447
|
-
|
330
|
+
wmes.each { retract(_1, generator: token) }
|
331
|
+
|
448
332
|
end
|
449
333
|
|
450
334
|
def remove_own_token(token)
|
@@ -452,6 +336,7 @@ module Wongi::Engine
|
|
452
336
|
tokens[token.node.object_id].delete(token)
|
453
337
|
neg_join_results.remove_token(token)
|
454
338
|
opt_join_results.remove_token(token)
|
339
|
+
generator_tracker.remove_token(token)
|
455
340
|
|
456
341
|
# if this is an NCC partner token
|
457
342
|
if (owner = ncc_tokens_owner[token])
|
@@ -469,9 +354,6 @@ module Wongi::Engine
|
|
469
354
|
end
|
470
355
|
ncc_tokens.delete(token)
|
471
356
|
hidden_ncc_tokens.delete(token)
|
472
|
-
|
473
|
-
# we know we are the owner, and nobody wants it anymore, so this is the safe place to do it
|
474
|
-
token.dispose!
|
475
357
|
end
|
476
358
|
|
477
359
|
def node_tokens(beta)
|
@@ -486,7 +368,7 @@ module Wongi::Engine
|
|
486
368
|
|
487
369
|
private def parents_node_tokens(beta)
|
488
370
|
if parent
|
489
|
-
parent.node_tokens(beta).reject {
|
371
|
+
parent.node_tokens(beta).reject { hidden_token?(_1) }
|
490
372
|
else
|
491
373
|
[]
|
492
374
|
end
|
@@ -581,11 +463,19 @@ module Wongi::Engine
|
|
581
463
|
end
|
582
464
|
|
583
465
|
private def hidden_wme?(wme)
|
584
|
-
hidden_parent_wmes.key?(wme
|
466
|
+
hidden_parent_wmes.key?(wme)
|
585
467
|
end
|
586
468
|
|
587
469
|
private def hidden_token?(token)
|
588
|
-
hidden_parent_tokens.
|
470
|
+
hidden_parent_tokens.include?(token.object_id)
|
471
|
+
end
|
472
|
+
|
473
|
+
private def hide_token(token)
|
474
|
+
hidden_parent_tokens.add(token.object_id)
|
475
|
+
end
|
476
|
+
|
477
|
+
private def unhide_token(token)
|
478
|
+
hidden_parent_tokens.delete(token.object_id)
|
589
479
|
end
|
590
480
|
end
|
591
481
|
end
|
@@ -36,18 +36,6 @@ module Wongi::Engine
|
|
36
36
|
end
|
37
37
|
end
|
38
38
|
|
39
|
-
def hash
|
40
|
-
@hash ||= [subject.hash, predicate.hash, object.hash].hash
|
41
|
-
end
|
42
|
-
|
43
|
-
def eql?(other)
|
44
|
-
subject.eql?(other.subject) && predicate.eql?(other.predicate) && object.eql?(other.object)
|
45
|
-
end
|
46
|
-
|
47
|
-
def self.hash_for(*args)
|
48
|
-
args.map(&:hash).hash
|
49
|
-
end
|
50
|
-
|
51
39
|
def ==(other)
|
52
40
|
other.is_a?(Template) && subject == other.subject && predicate == other.predicate && object == other.object
|
53
41
|
end
|
data/lib/wongi-engine/token.rb
CHANGED
@@ -2,16 +2,13 @@ require 'set'
|
|
2
2
|
|
3
3
|
module Wongi::Engine
|
4
4
|
class Token
|
5
|
-
attr_reader :wme, :node, :
|
5
|
+
attr_reader :wme, :node, :parents
|
6
6
|
|
7
7
|
def initialize(node, parents, wme, assignments = {})
|
8
8
|
@node = node
|
9
9
|
@parents = Set.new(Array(parents))
|
10
10
|
@wme = wme
|
11
11
|
@assignments = assignments
|
12
|
-
@deleted = false
|
13
|
-
@ncc_results = []
|
14
|
-
@generated_wmes = []
|
15
12
|
end
|
16
13
|
|
17
14
|
def ancestors
|
@@ -66,23 +63,6 @@ module Wongi::Engine
|
|
66
63
|
to_s
|
67
64
|
end
|
68
65
|
|
69
|
-
# def destroy
|
70
|
-
# deleted!
|
71
|
-
# end
|
72
|
-
|
73
|
-
def dispose!
|
74
|
-
# parent.children.delete(self) if parent
|
75
|
-
# @parent = nil
|
76
|
-
@wme = nil
|
77
|
-
end
|
78
|
-
|
79
|
-
# for neg feedback loop protection
|
80
|
-
# def generated?(wme)
|
81
|
-
# return true if generated_wmes.any? { |w| w == wme }
|
82
|
-
#
|
83
|
-
# children.any? { |t| t.generated? wme }
|
84
|
-
# end
|
85
|
-
|
86
66
|
protected
|
87
67
|
|
88
68
|
def all_assignments
|
@@ -91,17 +71,4 @@ module Wongi::Engine
|
|
91
71
|
end.merge(@assignments)
|
92
72
|
end
|
93
73
|
end
|
94
|
-
|
95
|
-
class FakeToken < Token
|
96
|
-
def initialize(token, wme, assignments) # rubocop:disable Lint/MissingSuper
|
97
|
-
@parent = token
|
98
|
-
@wme = wme
|
99
|
-
@assignments = assignments
|
100
|
-
# @children = []
|
101
|
-
@neg_join_results = []
|
102
|
-
@opt_join_results = []
|
103
|
-
@ncc_results = []
|
104
|
-
@generated_wmes = []
|
105
|
-
end
|
106
|
-
end
|
107
74
|
end
|
data/lib/wongi-engine/version.rb
CHANGED
data/lib/wongi-engine.rb
CHANGED
@@ -28,6 +28,8 @@ require 'wongi-engine/beta'
|
|
28
28
|
require 'wongi-engine/dsl'
|
29
29
|
require 'wongi-engine/ruleset'
|
30
30
|
require 'wongi-engine/compiler'
|
31
|
+
require 'wongi-engine/join_results'
|
32
|
+
require 'wongi-engine/generator_tracker'
|
31
33
|
require 'wongi-engine/overlay'
|
32
34
|
require 'wongi-engine/enumerators'
|
33
35
|
require 'wongi-engine/network'
|
data/spec/alpha_index_spec.rb
CHANGED
@@ -18,7 +18,7 @@ describe Wongi::Engine::AlphaIndex do
|
|
18
18
|
|
19
19
|
it 'indexes by pattern' do
|
20
20
|
expect(collection.keys).to eq([key])
|
21
|
-
expect(collection[key]).to eq([wme])
|
21
|
+
expect(collection[key]).to eq(Set.new([wme]))
|
22
22
|
end
|
23
23
|
end
|
24
24
|
|
@@ -28,7 +28,7 @@ describe Wongi::Engine::AlphaIndex do
|
|
28
28
|
|
29
29
|
it 'indexes by pattern' do
|
30
30
|
expect(collection.keys).to eq([key])
|
31
|
-
expect(collection[key]).to eq([wme])
|
31
|
+
expect(collection[key]).to eq(Set.new([wme]))
|
32
32
|
end
|
33
33
|
end
|
34
34
|
|
@@ -38,7 +38,7 @@ describe Wongi::Engine::AlphaIndex do
|
|
38
38
|
|
39
39
|
it 'indexes by pattern' do
|
40
40
|
expect(collection.keys).to eq([key])
|
41
|
-
expect(collection[key]).to eq([wme])
|
41
|
+
expect(collection[key]).to eq(Set.new([wme]))
|
42
42
|
end
|
43
43
|
end
|
44
44
|
|
@@ -48,7 +48,7 @@ describe Wongi::Engine::AlphaIndex do
|
|
48
48
|
|
49
49
|
it 'indexes by pattern' do
|
50
50
|
expect(collection.keys).to eq([key])
|
51
|
-
expect(collection[key]).to eq([wme])
|
51
|
+
expect(collection[key]).to eq(Set.new([wme]))
|
52
52
|
end
|
53
53
|
end
|
54
54
|
|
@@ -58,7 +58,7 @@ describe Wongi::Engine::AlphaIndex do
|
|
58
58
|
|
59
59
|
it 'indexes by pattern' do
|
60
60
|
expect(collection.keys).to eq([key])
|
61
|
-
expect(collection[key]).to eq([wme])
|
61
|
+
expect(collection[key]).to eq(Set.new([wme]))
|
62
62
|
end
|
63
63
|
end
|
64
64
|
|
@@ -68,7 +68,7 @@ describe Wongi::Engine::AlphaIndex do
|
|
68
68
|
|
69
69
|
it 'indexes by pattern' do
|
70
70
|
expect(collection.keys).to eq([key])
|
71
|
-
expect(collection[key]).to eq([wme])
|
71
|
+
expect(collection[key]).to eq(Set.new([wme]))
|
72
72
|
end
|
73
73
|
end
|
74
74
|
|
data/spec/overlay_spec.rb
CHANGED
@@ -66,7 +66,7 @@ describe Wongi::Engine::Overlay do
|
|
66
66
|
expect(overlay.select(:_, :_, :_)).to have(wmes.length).items
|
67
67
|
|
68
68
|
expect(overlay.select(1, 11, 111)).to have(1).items
|
69
|
-
expect(overlay.select(1, 11, 111).first).to
|
69
|
+
expect(overlay.select(1, 11, 111).first).to eq(wmes.first)
|
70
70
|
end
|
71
71
|
end
|
72
72
|
|
@@ -136,11 +136,6 @@ describe Wongi::Engine::Overlay do
|
|
136
136
|
|
137
137
|
overlay.retract(wme)
|
138
138
|
expect(overlay.find(wme)).to be_nil
|
139
|
-
expect(child1.find(wme)).to be_nil
|
140
|
-
expect(child2.find(wme)).to be_nil
|
141
|
-
|
142
|
-
child1.assert(wme)
|
143
|
-
expect(overlay.find(wme)).to be_nil
|
144
139
|
expect(child1.find(wme)).to eq(wme)
|
145
140
|
expect(child2.find(wme)).to eq(wme)
|
146
141
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: wongi-engine
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.4.0.pre.
|
4
|
+
version: 0.4.0.pre.alpha10
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Valeri Sokolov
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2022-11-
|
11
|
+
date: 2022-11-05 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: pry
|
@@ -139,7 +139,9 @@ files:
|
|
139
139
|
- lib/wongi-engine/filter/inequality_test.rb
|
140
140
|
- lib/wongi-engine/filter/less_than_or_equal_test.rb
|
141
141
|
- lib/wongi-engine/filter/less_than_test.rb
|
142
|
+
- lib/wongi-engine/generator_tracker.rb
|
142
143
|
- lib/wongi-engine/graph.rb
|
144
|
+
- lib/wongi-engine/join_results.rb
|
143
145
|
- lib/wongi-engine/network.rb
|
144
146
|
- lib/wongi-engine/network/collectable.rb
|
145
147
|
- lib/wongi-engine/network/debug.rb
|