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