wongi-engine 0.4.0.pre.alpha10 → 0.4.0.pre.alpha11
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/beta/aggregate_node.rb +6 -5
- data/lib/wongi-engine/beta/beta_node.rb +2 -1
- data/lib/wongi-engine/dsl/action/statement_generator.rb +10 -2
- data/lib/wongi-engine/network.rb +6 -9
- data/lib/wongi-engine/overlay.rb +26 -26
- data/lib/wongi-engine/token.rb +26 -13
- data/lib/wongi-engine/version.rb +1 -1
- data/spec/bug_specs/issue_4_spec.rb +12 -12
- data/spec/high_level_spec.rb +2 -2
- metadata +1 -1
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: c6618cdaae22d90fec75bb11bbfeb27477d9aca0661d0de91ab04ce3b434ce6e
|
4
|
+
data.tar.gz: c9973d3a202faa0882653e99a3db546af9b02f6d1e09af075e4749681903743b
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 2ec734eba8278f9ed3b8571b67a5e7449c4d172143673953d568bc4299383dc60579c295457010a3e9160de5698ecd529713dad80940751fce6c8b599d05dc91
|
7
|
+
data.tar.gz: ead1a3405786c7be13882c24ce8457ff31efa003bd9a84722073ff543ddff028b201c5d769756a2fadadfa84bbf0d5289db810f4e06d574c6b5960cb3a55302e
|
@@ -61,12 +61,13 @@ module Wongi::Engine
|
|
61
61
|
aggregated = aggregate.call(tokens.map(&map))
|
62
62
|
assignment = { var => aggregated }
|
63
63
|
children = child ? [child] : self.children
|
64
|
-
tokens.each do |token|
|
65
|
-
# TODO: optimize this to work with a diff of actual changes
|
66
|
-
beta_deactivate_children(token: token, children: children)
|
67
|
-
end
|
68
64
|
children.each do |beta|
|
69
|
-
|
65
|
+
new_token = Token.new(beta, tokens, nil, assignment)
|
66
|
+
# nothing changed, skip useless traversal
|
67
|
+
next if beta.tokens.find { _1.duplicate?(new_token) }
|
68
|
+
|
69
|
+
beta.tokens.select { |child| tokens.any? { child.child_of?(_1) } }.each { beta.beta_deactivate(_1) }
|
70
|
+
beta.beta_activate(new_token)
|
70
71
|
end
|
71
72
|
end
|
72
73
|
end
|
@@ -26,6 +26,8 @@ module Wongi::Engine
|
|
26
26
|
end
|
27
27
|
|
28
28
|
private def should_assert?(wme, token)
|
29
|
+
return true if rete.bypass_consistency_checks?
|
30
|
+
|
29
31
|
considered_tokens = Set.new
|
30
32
|
tokens_to_consider = [token]
|
31
33
|
until tokens_to_consider.empty?
|
@@ -33,11 +35,17 @@ module Wongi::Engine
|
|
33
35
|
considered_tokens.add(token)
|
34
36
|
|
35
37
|
# self-affirming reasoning
|
36
|
-
|
38
|
+
if token.wme == wme
|
39
|
+
# puts "detected self-affirming"
|
40
|
+
return false
|
41
|
+
end
|
37
42
|
|
38
43
|
# asserting this WME would invalidate the match
|
39
44
|
# TODO: clean up
|
40
|
-
|
45
|
+
if token.node.is_a?(NegNode) && wme =~ token.node.alpha.template && token.node.matches?(token, wme) # how much is actually necessary?
|
46
|
+
# puts "detected self-negating"
|
47
|
+
return false
|
48
|
+
end
|
41
49
|
|
42
50
|
token.parents.each { |parent| tokens_to_consider.push(parent) unless considered_tokens.include?(parent) }
|
43
51
|
|
data/lib/wongi-engine/network.rb
CHANGED
@@ -3,9 +3,12 @@ require 'wongi-engine/network/debug'
|
|
3
3
|
|
4
4
|
module Wongi::Engine
|
5
5
|
class Network
|
6
|
+
include CoreExt
|
6
7
|
attr_accessor :alpha_top, :beta_top, :queries, :results, :alpha_hash
|
7
8
|
attr_reader :productions, :overlays
|
8
9
|
|
10
|
+
attr_predicate :bypass_consistency_checks
|
11
|
+
|
9
12
|
include NetworkParts::Collectable
|
10
13
|
private :overlays
|
11
14
|
private :alpha_hash, :alpha_hash=
|
@@ -202,9 +205,8 @@ module Wongi::Engine
|
|
202
205
|
compile_alpha Template.new(s, p, o)
|
203
206
|
end
|
204
207
|
|
205
|
-
# TODO: pick an alpha with fewer candidates to go through
|
206
208
|
def initial_fill(alpha)
|
207
|
-
default_overlay.select(:_, :_, :_).each do |wme|
|
209
|
+
default_overlay.select(:_, :_, :_).to_a.each do |wme|
|
208
210
|
alpha.activate wme if wme =~ alpha.template
|
209
211
|
end
|
210
212
|
end
|
@@ -253,16 +255,11 @@ module Wongi::Engine
|
|
253
255
|
end
|
254
256
|
|
255
257
|
def select(s, p, o, &block)
|
256
|
-
|
257
|
-
if block_given?
|
258
|
-
matching.each(&block)
|
259
|
-
else
|
260
|
-
matching.each
|
261
|
-
end
|
258
|
+
current_overlay.select(s, p, o, &block)
|
262
259
|
end
|
263
260
|
|
264
261
|
def find(s, p, o)
|
265
|
-
|
262
|
+
select(s, p, o).first
|
266
263
|
end
|
267
264
|
|
268
265
|
protected
|
data/lib/wongi-engine/overlay.rb
CHANGED
@@ -142,12 +142,12 @@ module Wongi::Engine
|
|
142
142
|
when 1
|
143
143
|
case args.first
|
144
144
|
when Template
|
145
|
-
|
145
|
+
each_by_template(args.first)
|
146
146
|
else
|
147
147
|
raise ArgumentError
|
148
148
|
end
|
149
149
|
when 3
|
150
|
-
|
150
|
+
each_by_template(Template.new(*args))
|
151
151
|
else
|
152
152
|
raise ArgumentError
|
153
153
|
end
|
@@ -165,25 +165,21 @@ module Wongi::Engine
|
|
165
165
|
end
|
166
166
|
|
167
167
|
def generators(wme)
|
168
|
-
|
169
|
-
|
168
|
+
Enumerator.new do |y|
|
169
|
+
generator_tracker.for_wme(wme).each { y << _1 }
|
170
170
|
if parent
|
171
|
-
parent.generators(wme).reject {
|
172
|
-
else
|
173
|
-
Set.new
|
171
|
+
parent.generators(wme).reject { hidden_token?(_1) }.each { y << _1 }
|
174
172
|
end
|
175
|
-
|
173
|
+
end
|
176
174
|
end
|
177
175
|
|
178
176
|
def generated_wmes(token)
|
179
|
-
|
180
|
-
|
177
|
+
Enumerator.new do |y|
|
178
|
+
generator_tracker.for_token(token).each { y << _1 }
|
181
179
|
if parent && !hidden_token?(token)
|
182
|
-
parent.generated_wmes(token).reject { hidden_wme?(_1) }.
|
183
|
-
else
|
184
|
-
Set.new
|
180
|
+
parent.generated_wmes(token).reject { hidden_wme?(_1) }.each { y << _1 }
|
185
181
|
end
|
186
|
-
|
182
|
+
end
|
187
183
|
end
|
188
184
|
|
189
185
|
private def own_manual?(wme)
|
@@ -202,7 +198,9 @@ module Wongi::Engine
|
|
202
198
|
has_own_wme?(wme) ? wme : nil
|
203
199
|
end
|
204
200
|
|
205
|
-
private def has_own_wme?(wme)
|
201
|
+
private def has_own_wme?(wme)
|
202
|
+
wmes.include?(wme)
|
203
|
+
end
|
206
204
|
|
207
205
|
private def find_parents_wme(wme)
|
208
206
|
return unless parent
|
@@ -218,28 +216,29 @@ module Wongi::Engine
|
|
218
216
|
end
|
219
217
|
end
|
220
218
|
|
221
|
-
|
222
|
-
|
219
|
+
def each_by_template(template)
|
220
|
+
Enumerator.new do |y|
|
221
|
+
each_own_wme_by_template(template, y)
|
222
|
+
each_parent_wme_by_template(template, y)
|
223
|
+
end
|
223
224
|
end
|
224
225
|
|
225
|
-
private def
|
226
|
+
private def each_own_wme_by_template(template, y)
|
226
227
|
if template.concrete?
|
227
228
|
wme = find_own_wme(WME.from_concrete_template(template))
|
228
|
-
|
229
|
+
y << wme if wme
|
229
230
|
elsif template.root?
|
230
|
-
wmes
|
231
|
+
wmes.each { y << _1 }
|
231
232
|
else
|
232
233
|
indexes.map { |index|
|
233
234
|
index.collections_for_template(template)
|
234
|
-
}.compact.first
|
235
|
+
}.compact.first.each { y << _1 }
|
235
236
|
end
|
236
237
|
end
|
237
238
|
|
238
|
-
private def
|
239
|
+
private def each_parent_wme_by_template(template, y)
|
239
240
|
if parent
|
240
|
-
parent.
|
241
|
-
else
|
242
|
-
Set.new
|
241
|
+
parent.each_by_template(template).reject { hidden_wme?(_1) }.each { y << _1 }
|
243
242
|
end
|
244
243
|
end
|
245
244
|
|
@@ -309,7 +308,8 @@ module Wongi::Engine
|
|
309
308
|
def remove_token(token)
|
310
309
|
# p remove_token: {token:}
|
311
310
|
|
312
|
-
|
311
|
+
# capture the entire enumerated state
|
312
|
+
wmes = generated_wmes(token).to_a
|
313
313
|
|
314
314
|
if own_node_tokens(token.node).find { _1.equal?(token) }.nil?
|
315
315
|
if parents_node_tokens(token.node).find { _1.equal?(token) }
|
data/lib/wongi-engine/token.rb
CHANGED
@@ -27,12 +27,18 @@ module Wongi::Engine
|
|
27
27
|
@assignments[variable] = value
|
28
28
|
end
|
29
29
|
|
30
|
+
def own_assignments
|
31
|
+
@assignments
|
32
|
+
end
|
33
|
+
|
30
34
|
def assignments
|
31
|
-
|
35
|
+
parents.each_with_object({}) do |parent, acc|
|
36
|
+
acc.merge!(parent.assignments)
|
37
|
+
end.merge(own_assignments)
|
32
38
|
end
|
33
39
|
|
34
40
|
def [](var)
|
35
|
-
a =
|
41
|
+
a = assignment(var)
|
36
42
|
a.respond_to?(:call) ? a.call(self) : a
|
37
43
|
end
|
38
44
|
|
@@ -40,8 +46,23 @@ module Wongi::Engine
|
|
40
46
|
vars.map { self[_1] }
|
41
47
|
end
|
42
48
|
|
49
|
+
def assignment(x)
|
50
|
+
return @assignments[x] if has_own_var?(x)
|
51
|
+
|
52
|
+
parents.each do |parent|
|
53
|
+
a = parent.assignment(x)
|
54
|
+
return a if a
|
55
|
+
end
|
56
|
+
|
57
|
+
nil
|
58
|
+
end
|
59
|
+
|
43
60
|
def has_var?(x)
|
44
|
-
|
61
|
+
has_own_var?(x) || parents.any? { _1.has_var?(x) }
|
62
|
+
end
|
63
|
+
|
64
|
+
def has_own_var?(x)
|
65
|
+
@assignments.key?(x)
|
45
66
|
end
|
46
67
|
|
47
68
|
# TODO: ignore assignments?
|
@@ -49,12 +70,12 @@ module Wongi::Engine
|
|
49
70
|
instance_of?(other.class) &&
|
50
71
|
parents == other.parents &&
|
51
72
|
wme == other.wme &&
|
52
|
-
|
73
|
+
own_assignments == other.own_assignments
|
53
74
|
end
|
54
75
|
|
55
76
|
def to_s
|
56
77
|
str = "TOKEN [ #{object_id} ancestors=#{ancestors.map(&:object_id).map(&:to_s).join('.')} "
|
57
|
-
|
78
|
+
assignments.each_pair { |key, value| str << "#{key}=#{value.is_a?(TokenAssignment) ? "#{value.call} (#{value})" : value} " }
|
58
79
|
str << "]"
|
59
80
|
str
|
60
81
|
end
|
@@ -62,13 +83,5 @@ module Wongi::Engine
|
|
62
83
|
def inspect
|
63
84
|
to_s
|
64
85
|
end
|
65
|
-
|
66
|
-
protected
|
67
|
-
|
68
|
-
def all_assignments
|
69
|
-
parents.each_with_object({}) do |parent, acc|
|
70
|
-
acc.merge!(parent.assignments)
|
71
|
-
end.merge(@assignments)
|
72
|
-
end
|
73
86
|
end
|
74
87
|
end
|
data/lib/wongi-engine/version.rb
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
require 'spec_helper'
|
2
2
|
|
3
3
|
describe "issue 4" do
|
4
|
-
it "
|
4
|
+
it "correctly retracts pre-added items from within a rule" do
|
5
5
|
engine = Wongi::Engine.create
|
6
6
|
|
7
7
|
10.times { |i| engine << [i, :is_number, true] }
|
@@ -22,11 +22,11 @@ describe "issue 4" do
|
|
22
22
|
numbers = engine.select :_, :is_number, true
|
23
23
|
evens = engine.select :_, :is_even, true
|
24
24
|
|
25
|
-
expect(numbers.
|
26
|
-
expect(evens.
|
25
|
+
expect(numbers.count).to eq(0)
|
26
|
+
expect(evens.count).to eq(10)
|
27
27
|
end
|
28
28
|
|
29
|
-
it "
|
29
|
+
it "correctly retracts post-added items from within a rule" do
|
30
30
|
engine = Wongi::Engine.create
|
31
31
|
|
32
32
|
engine.rule 'segregate' do
|
@@ -47,8 +47,8 @@ describe "issue 4" do
|
|
47
47
|
numbers = engine.select :_, :is_number, true
|
48
48
|
evens = engine.select :_, :is_even, true
|
49
49
|
|
50
|
-
expect(numbers.
|
51
|
-
expect(evens.
|
50
|
+
expect(numbers.count).to eq(0)
|
51
|
+
expect(evens.count).to eq(5)
|
52
52
|
end
|
53
53
|
|
54
54
|
# cascaded processing affects this
|
@@ -80,9 +80,9 @@ describe "issue 4" do
|
|
80
80
|
evens = engine.select :_, :is_even, true
|
81
81
|
odds = engine.select :_, :is_odd, true
|
82
82
|
|
83
|
-
expect(numbers.
|
84
|
-
expect(evens.
|
85
|
-
expect(odds.
|
83
|
+
expect(numbers.count).to eq(0)
|
84
|
+
expect(evens.count).to eq(5)
|
85
|
+
expect(odds.count).to eq(5)
|
86
86
|
end
|
87
87
|
|
88
88
|
it "does not lose track when another rule affects a set" do
|
@@ -126,8 +126,8 @@ describe "issue 4" do
|
|
126
126
|
evens = engine.select :_, :is_even, true
|
127
127
|
odds = engine.select :_, :is_odd, true
|
128
128
|
|
129
|
-
expect(numbers.
|
130
|
-
expect(evens.
|
131
|
-
expect(odds.
|
129
|
+
expect(numbers.count).to eq(5)
|
130
|
+
expect(evens.count).to eq(5)
|
131
|
+
expect(odds.count).to eq(5)
|
132
132
|
end
|
133
133
|
end
|
data/spec/high_level_spec.rb
CHANGED
@@ -115,10 +115,10 @@ describe Wongi::Engine::Network do
|
|
115
115
|
engine << ["Bob", :age, 43]
|
116
116
|
|
117
117
|
items = engine.select "Alice", :younger, "Bob"
|
118
|
-
expect(items.
|
118
|
+
expect(items.count).to eq(1)
|
119
119
|
|
120
120
|
items = engine.select "Bob", :older, "Alice"
|
121
|
-
expect(items.
|
121
|
+
expect(items.count).to eq(1)
|
122
122
|
end
|
123
123
|
|
124
124
|
it 'uses collectors' do
|