wongi-engine 0.0.5 → 0.0.6

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