wongi-engine 0.0.5 → 0.0.6

Sign up to get free protection for your applications and to get access to all the features.
data/README.md CHANGED
@@ -411,6 +411,14 @@ The Rete implementation in this library largely follows the outline presented in
411
411
 
412
412
  ## Changelog
413
413
 
414
+ ### 0.0.6
415
+
416
+ * fixed a bug caused by retracting facts from within a rule action (#4)
417
+
418
+ ### 0.0.5
419
+
420
+ * fixed a bug with multiple `assert` tests following the same node (#2)
421
+
414
422
  ### 0.0.4
415
423
 
416
424
  * reintegrated RDF support
@@ -2,7 +2,7 @@ module Wongi::Engine
2
2
 
3
3
  class AlphaMemory
4
4
 
5
- attr_reader :betas, :template, :rete, :wmes
5
+ attr_reader :betas, :template, :rete
6
6
 
7
7
  def initialize template, rete = nil
8
8
  @template = template
@@ -34,13 +34,21 @@ module Wongi::Engine
34
34
  end
35
35
 
36
36
  def inspect
37
- "<Alpha #{__id__} template=#{template} wmes=#{wmes}>"
37
+ "<Alpha #{__id__} template=#{template} wmes=#{@wmes}>"
38
38
  end
39
39
 
40
40
  def to_s
41
41
  inspect
42
42
  end
43
43
 
44
+ def wmes
45
+ Enumerator.new do |y|
46
+ @wmes.dup.each do |wme|
47
+ y << wme unless wme.deleted?
48
+ end
49
+ end
50
+ end
51
+
44
52
  end
45
53
 
46
54
  end
@@ -72,7 +72,7 @@ module Wongi
72
72
 
73
73
  def beta_activate token
74
74
  ws = ' ' * depth
75
- self.alpha.wmes.uniq.each do |wme|
75
+ self.alpha.wmes.each do |wme|
76
76
  collected = collect_assignments( wme )
77
77
  if matches?( token, wme ) && passes_filters?( token, wme, collected )
78
78
  propagate_activation token, wme, collected
@@ -393,14 +393,13 @@ module Wongi::Engine
393
393
  end
394
394
 
395
395
  def best_alpha template
396
- raise
397
396
  candidates = alpha_hash.values.select do |alpha|
398
397
  template =~ alpha.template
399
398
  end
400
399
  result = candidates.inject do |best, alpha|
401
400
  if best.nil?
402
401
  alpha
403
- elsif alpha.wmes.length < best.wmes.length
402
+ elsif alpha.wmes.to_a.length < best.wmes.to_a.length
404
403
  alpha
405
404
  else
406
405
  best
@@ -1,5 +1,5 @@
1
1
  module Wongi
2
2
  module Engine
3
- VERSION = "0.0.5"
3
+ VERSION = "0.0.6"
4
4
  end
5
5
  end
@@ -9,6 +9,7 @@ module Wongi::Engine
9
9
 
10
10
  def initialize s, p, o, r = nil
11
11
 
12
+ @deleted = false
12
13
  @alphas = []
13
14
  @tokens = []
14
15
  @generating_tokens = []
@@ -53,8 +54,13 @@ module Wongi::Engine
53
54
  !manual?
54
55
  end
55
56
 
57
+ def deleted?
58
+ @deleted
59
+ end
60
+
56
61
  def destroy
57
62
 
63
+ @deleted = true
58
64
  alphas.each { |alpha| alpha.remove self }.clear
59
65
  while tokens.first
60
66
  tokens.first.delete # => will remove itself from the array
@@ -0,0 +1,94 @@
1
+ require 'spec_helper'
2
+
3
+ describe "issue 4" do
4
+
5
+ it "should correctly retract pre-added items from within a rule" do
6
+
7
+ engine = Wongi::Engine.create
8
+
9
+ 10.times{ |i| engine << [i, :is_number, true] }
10
+
11
+ engine.rule 'segregate' do
12
+ forall {
13
+ has :Number, :is_number, true
14
+ }
15
+ make {
16
+ action { |token|
17
+ number = token[:Number]
18
+ engine << [number, :is_even, true]
19
+ engine.retract [number, :is_number, true]
20
+ }
21
+ }
22
+ end
23
+
24
+ numbers = engine.select :_, :is_number, true
25
+ evens = engine.select :_, :is_even, true
26
+
27
+ numbers.should be_empty
28
+ evens.should have(10).items
29
+
30
+ end
31
+
32
+ it "should correctly retract post-added items from within a rule" do
33
+
34
+ engine = Wongi::Engine.create
35
+
36
+ engine.rule 'segregate' do
37
+ forall {
38
+ has :Number, :is_number, true
39
+ }
40
+ make {
41
+ action { |token|
42
+ number = token[:Number]
43
+ engine << [number, :is_even, true]
44
+ engine.retract [number, :is_number, true]
45
+ }
46
+ }
47
+ end
48
+
49
+ 10.times{ |i| engine << [i, :is_number, true] }
50
+
51
+ numbers = engine.select :_, :is_number, true
52
+ evens = engine.select :_, :is_even, true
53
+
54
+ numbers.should be_empty
55
+ evens.should have(10).items
56
+
57
+ end
58
+
59
+ it "should correctly retract later items from within a rule" do
60
+
61
+ engine = Wongi::Engine.create
62
+
63
+ 10.times{ |i| engine << [i, :is_number, true] }
64
+
65
+ engine.rule 'segregate' do
66
+ forall {
67
+ has :Number, :is_number, true
68
+ }
69
+ make {
70
+ action { |token|
71
+ number = token[:Number]
72
+ if number % 2 == 0
73
+ engine << [number, :is_even, true]
74
+ engine.retract [number, :is_number, true]
75
+ engine.retract [number + 1, :is_number, true]
76
+ else
77
+ # this should never be reached
78
+ engine << [number, :is_odd, true]
79
+ end
80
+ }
81
+ }
82
+ end
83
+
84
+ numbers = engine.select :_, :is_number, true
85
+ evens = engine.select :_, :is_even, true
86
+ odds = engine.select :_, :is_odd, true
87
+
88
+ numbers.should be_empty
89
+ evens.should have(5).items
90
+ odds.should be_empty
91
+
92
+ end
93
+
94
+ end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: wongi-engine
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.5
4
+ version: 0.0.6
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2012-12-13 00:00:00.000000000 Z
12
+ date: 2013-01-24 00:00:00.000000000 Z
13
13
  dependencies: []
14
14
  description: A rule engine.
15
15
  email:
@@ -76,6 +76,7 @@ files:
76
76
  - lib/wongi-engine/version.rb
77
77
  - lib/wongi-engine/wme.rb
78
78
  - lib/wongi-engine/wme_match_data.rb
79
+ - spec/bug_specs/issue_4_spec.rb
79
80
  - spec/dataset_spec.rb
80
81
  - spec/dsl_spec.rb
81
82
  - spec/filter_specs/assert_test_spec.rb
@@ -114,6 +115,7 @@ signing_key:
114
115
  specification_version: 3
115
116
  summary: A rule engine.
116
117
  test_files:
118
+ - spec/bug_specs/issue_4_spec.rb
117
119
  - spec/dataset_spec.rb
118
120
  - spec/dsl_spec.rb
119
121
  - spec/filter_specs/assert_test_spec.rb