wongi-engine 0.4.0.pre.alpha8 → 0.4.0.pre.alpha10

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: e9461adc4b75933300d9be090ac8825c90ddc2b5ba167ec7e47128e4622aa853
4
- data.tar.gz: ed1f2760dae84df0faee9d8ccc80849713b849299f2b4bc5520d8004f332879f
3
+ metadata.gz: 0dc2418ab6ffabbb410e83db899bed0479fc5912ec24bc6bf5c01f40ca306aa1
4
+ data.tar.gz: 4f22e6752c8dfe568eaae071cc7d10b062dee6ddaf8c8ddb2dc201773b7378a1
5
5
  SHA512:
6
- metadata.gz: c3f6c9b2f491c96758c319268b61e7654dcdeab9d0acfd41c582428245fcd5b52edd2f8fa34674882600b9ce6668df6ab48de11123fcf72819d7a9d53aa4e9a4
7
- data.tar.gz: fd2e4ac006478621202f2013d43e022186e48e3411c035e9d7f2a9c6557001b17125519a2280092507ca749ef065aa43f6f69b194e37393ce365f7ae7d5e1ee2
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).push(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 = self.aggregate.call(tokens.map(&self.map))
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
- origin = GeneratorOrigin.new(token, self)
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
- (token.parents - considered_tokens).each { |parent| tokens_to_consider.push(parent) }
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 |generator|
51
- tokens_to_consider.push(generator.token) unless considered_tokens.include?(generator.token)
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
@@ -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.hash => alpha_top }
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[hash] if alpha_hash.key?(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[hash] = alpha
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.hash_for(s, p, o)
291
+ key = Template.new(s, p, o)
294
292
  # puts "Lookup for #{key}"
295
293
  alpha_hash[key]
296
294
  end
@@ -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
- def has?(jr)
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 :wme_generators
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
- @wme_generators = Hash.new { |h, k| h[k] = [] }
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
- wme = find_ignoring_hidden(wme) || wme
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
- return if wme.nil? # it's perhaps better to return quietly, because complicated cascades may delete a WME while we're going through the queue
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.object_id) ||
157
+ wme_manual.key?(wme) ||
242
158
  if parent
243
- parent.manual?(wme) && !hidden_parent_wme_manual.key?(wme.object_id)
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 generated_by?(wme, gen)
252
- own_generated_by?(wme, gen) ||
167
+ def generators(wme)
168
+ own_generators = generator_tracker.for_wme(wme)
169
+ parent_generators =
253
170
  if parent
254
- parent.generated_by?(wme, gen) && !hidden_parent_wme_generators.key?(gen)
171
+ parent.generators(wme).reject { |t| hidden_token?(t) }.to_set
255
172
  else
256
- false
173
+ Set.new
257
174
  end
175
+ own_generators.union(parent_generators)
258
176
  end
259
177
 
260
- private def own_generated_by?(wme, gen)
261
- wme_generators.key?(wme.object_id) && wme_generators[wme.object_id].include?(gen)
262
- end
263
-
264
- def generators(wme)
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
- own_generators + parent_generators
186
+ own_wmes.union(parent_wmes)
273
187
  end
274
188
 
275
189
  private def own_manual?(wme)
276
- wme_manual.key?(wme.object_id)
190
+ wme_manual.key?(wme)
277
191
  end
278
192
 
279
193
  private def own_generated?(wme)
280
- wme_generators.key?(wme.object_id) && wme_generators[wme.object_id].any?
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
- collections = indexes.map { |index|
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.object_id)
339
- if generator
340
- hidden_parent_wme_generators.delete(generator)
341
- else
342
- hidden_parent_wme_manual.delete(wme.object_id)
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 find_own_wme(wme)
346
- if generator
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
- wmes << wme
359
- indexes.each { _1.add(wme) }
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
- # first, delete local
397
- if own_generated_by?(wme, generator)
398
- wme_generators[wme.object_id].delete(generator)
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.object_id] = true
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
- hidden_parent_tokens.delete(token.object_id)
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
- hidden_parent_tokens[token.object_id] = true
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
- return
326
+ else
327
+ remove_own_token(token)
445
328
  end
446
329
 
447
- remove_own_token(token)
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 { hidden_parent_tokens.key?(_1.object_id) }
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.object_id)
466
+ hidden_parent_wmes.key?(wme)
585
467
  end
586
468
 
587
469
  private def hidden_token?(token)
588
- hidden_parent_tokens.key?(token.object_id)
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
@@ -2,16 +2,13 @@ require 'set'
2
2
 
3
3
  module Wongi::Engine
4
4
  class Token
5
- attr_reader :wme, :node, :generated_wmes, :parents
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
@@ -1,5 +1,5 @@
1
1
  module Wongi
2
2
  module Engine
3
- VERSION = "0.4.0-alpha8".freeze
3
+ VERSION = "0.4.0-alpha10".freeze
4
4
  end
5
5
  end
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'
@@ -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 equal(wmes.first)
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.alpha8
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-03 00:00:00.000000000 Z
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