wongi-engine 0.4.0.pre.alpha10 → 0.4.0.pre.alpha11
Sign up to get free protection for your applications and to get access to all the features.
- 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
|