wongi-engine 0.0.17 → 0.1.0.alpha1

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
  SHA1:
3
- metadata.gz: 5ab2c246ebcf7d3a4a381b39195f950b72f9ac22
4
- data.tar.gz: 0378728b15e4a72274333ba56ac78e16c67bdb36
3
+ metadata.gz: a090dea5a39943ac1d887178b7d1b9a5df3f618c
4
+ data.tar.gz: ceca588238658bf643d067e3502643e554719ef5
5
5
  SHA512:
6
- metadata.gz: 66819b8d5b0165c204e091debcc4de62b1f7a03d4067fdc6d966bd2b17fb0d7196f08244cfa33c7426399caef75929bf6157abe8407170d908dd9009b4d2acb0
7
- data.tar.gz: 414beb220fd40675deff5563a1c8b59a79ed644e0ef1c688c3ce559f00c239e5516c39bc1a06ec44d95da7503ba56f1a5131be5fa4dfcc207ba2a3d7d0fa3a82
6
+ metadata.gz: cb3fc2402bcdfe4afbd0b0f5bf72aba18b32f40a89c013c429f0507414f7f243962f42dff3aa31bf412a5345f449eb6d13b152fc9f6120efacd2cade85b4290d
7
+ data.tar.gz: 39063e5d6c69a37bd3b10a52badf24666d79c0d887a110f528e3b94b498a5e21273c702e4c8e80f024e0b6d1d6723c8cdb91ab9cb200a4c56ad35b487580ffcf
data/.hgtags ADDED
@@ -0,0 +1 @@
1
+ b1dfd471a2a9e4a57f0e4932ac184faa5d6fa5b5 v0.1.0.alpha1
data/LICENSE CHANGED
@@ -1,4 +1,4 @@
1
- Copyright (c) 2012 Valeri Sokolov <ulfurinn@ulfurinn.net>
1
+ Copyright (c) 2012-2015 Valeri Sokolov <ulfurinn@ulfurinn.net>
2
2
 
3
3
  MIT License
4
4
 
@@ -21,11 +21,11 @@ module Wongi::Engine
21
21
  end
22
22
  end
23
23
 
24
- def remove wme
24
+ def deactivate wme
25
25
  @wmes.delete wme
26
- # we don't need to unlink ourselves from the wme
27
- # because this is only called from WME#destroy
28
- # so the wme will take care of it itself
26
+ betas.each do |beta|
27
+ beta.alpha_deactivate wme
28
+ end
29
29
  end
30
30
 
31
31
  def snapshot! alpha
@@ -23,14 +23,29 @@ module Wongi::Engine
23
23
  end
24
24
 
25
25
  def beta_activate token, wme = nil, assignments = { }
26
- propagate_activation token, nil, { @variable => @body }
26
+ children.each do |child|
27
+ child.beta_activate Token.new( child, token, nil, { @variable => @body } )
28
+ end
29
+ end
30
+
31
+ def beta_deactivate token
32
+ children.each do |child|
33
+ child.tokens.each do |t|
34
+ if t.parent == token
35
+ child.beta_deactivate t
36
+ #token.destroy
37
+ end
38
+ end
39
+ end
27
40
  end
28
41
 
29
42
  def refresh_child child
30
43
  tmp = children
31
44
  self.children = [ child ]
32
45
  parent.tokens.each do |token|
33
- beta_activate token
46
+ children.each do |child|
47
+ child.beta_activate Token.new( child, token, nil, { @variable => @body } )
48
+ end
34
49
  end
35
50
  self.children = tmp
36
51
  end
@@ -14,16 +14,14 @@ module Wongi::Engine
14
14
 
15
15
  def seed assignments = {}
16
16
  @seed = assignments
17
- t = Token.new( nil, nil, assignments )
18
- t.node = self
17
+ t = Token.new( self, nil, nil, assignments )
19
18
  @tokens << t
20
19
  end
21
20
 
22
21
  def subst valuations
23
22
  @tokens.first.destroy
24
23
 
25
- token = Token.new( nil, nil, @seed )
26
- token.node = self
24
+ token = Token.new( self, nil, nil, @seed )
27
25
  @tokens << token
28
26
 
29
27
  valuations.each { |variable, value| token.subst variable, value }
@@ -32,40 +30,38 @@ module Wongi::Engine
32
30
  end
33
31
  end
34
32
 
35
- def beta_activate token, wme, assignments
36
- dp "MEMORY beta-activated with #{wme} #{wme.object_id}"
37
- existing = @tokens.reject(&:deleted?).find { |et| et.duplicate? token, wme, assignments }
38
- if existing
39
- t = existing
40
- else
41
- t = Token.new( token, wme, assignments)
42
- t.node = self
43
- @tokens << t
33
+ def beta_activate token
34
+ existing = @tokens.reject(&:deleted?).find { |et| et.duplicate? token }
35
+ return if existing # TODO really?
36
+ @tokens << token
37
+ children.each do |child|
38
+ child.beta_activate token
44
39
  end
45
- self.children.each do |child|
46
- if child.kind_of? BetaMemory
47
- child.beta_activate t, nil, {}
48
- else
49
- child.beta_activate t
50
- end
40
+ token
41
+ end
42
+
43
+ def beta_deactivate token
44
+ return nil unless tokens.find token
45
+ @tokens.delete token
46
+ token.deleted!
47
+ if token.parent
48
+ token.parent.children.delete token # should this go into Token#destroy?
49
+ end
50
+ children.each do |child|
51
+ child.beta_deactivate token
51
52
  end
52
- t
53
+ token
53
54
  end
54
55
 
55
56
  def refresh_child child
56
57
  tokens.each do |token|
57
- case child
58
- when BetaMemory, NegNode
59
- child.beta_activate token, nil, {}
60
- else
61
- child.beta_activate token
62
- end
58
+ child.beta_activate token
63
59
  end
64
60
  end
65
61
 
66
- def delete_token token
67
- @tokens.delete token
68
- end
62
+ # def delete_token token
63
+ # @tokens.delete token
64
+ # end
69
65
 
70
66
  # => TODO: investigate if we really need this
71
67
  #def beta_memory
@@ -34,6 +34,13 @@ module Wongi::Engine
34
34
  end
35
35
  end
36
36
 
37
+ abstract :alpha_activate
38
+ abstract :alpha_deactivate
39
+ abstract :alpha_reactivate
40
+ abstract :beta_activate
41
+ abstract :beta_deactivate
42
+ abstract :beta_reactivate
43
+
37
44
  def beta_memory
38
45
  beta = children.find { |node| BetaMemory === node }
39
46
  if beta.nil?
@@ -44,11 +51,11 @@ module Wongi::Engine
44
51
  beta
45
52
  end
46
53
 
47
- def join_node alpha, tests, assignment, filters, alpha_deaf
48
- existing = children.find{ |node| JoinNode === node && node.equivalent?( alpha, tests, assignment, filters ) }
54
+ def join_node alpha, tests, assignment, alpha_deaf
55
+ existing = children.find{ |node| JoinNode === node && node.equivalent?( alpha, tests, assignment ) }
49
56
  return existing if existing
50
57
 
51
- node = JoinNode.new self, tests, assignment, filters
58
+ node = JoinNode.new self, tests, assignment
52
59
  node.alpha = alpha
53
60
  alpha.betas << node unless alpha_deaf
54
61
 
@@ -56,8 +63,7 @@ module Wongi::Engine
56
63
  end
57
64
 
58
65
  def optional_node alpha, tests, assignment, alpha_deaf
59
- node = OptionalNode.new self, tests, assignment
60
- node.alpha = alpha
66
+ node = OptionalNode.new self, alpha, tests, assignment
61
67
  alpha.betas << node unless alpha_deaf
62
68
  node
63
69
  end
@@ -147,12 +153,6 @@ module Wongi::Engine
147
153
 
148
154
  private
149
155
 
150
- def propagate_activation token, wme, assignments
151
- self.children.each do |child|
152
- child.beta_activate token, wme, assignments
153
- end
154
- end
155
-
156
156
  def dp message
157
157
  if debug?
158
158
  puts "#{indent}#{message}"
@@ -10,9 +10,22 @@ module Wongi
10
10
  self.test = test
11
11
  end
12
12
 
13
- def beta_activate token, wme = nil, assignments = { }
13
+ def beta_activate token
14
14
  if test.passes? token
15
- propagate_activation token, nil, {}
15
+ children.each do |child|
16
+ child.beta_activate Token.new( child, token, nil, {} )
17
+ end
18
+ end
19
+ end
20
+
21
+ def beta_deactivate token
22
+ children.each do |child|
23
+ child.tokens.each do |t|
24
+ if t.parent == token
25
+ child.beta_deactivate t
26
+ #token.destroy
27
+ end
28
+ end
16
29
  end
17
30
  end
18
31
 
@@ -5,6 +5,9 @@ module Wongi
5
5
  def call token = nil
6
6
  wme.send field
7
7
  end
8
+ def inspect
9
+ "subject of #{wme}"
10
+ end
8
11
  end
9
12
 
10
13
  class BetaTest
@@ -34,16 +37,14 @@ module Wongi
34
37
  attr_accessor :alpha
35
38
  attr_reader :tests
36
39
  attr_reader :assignment_pattern
37
- attr_reader :filters
38
40
 
39
- def initialize parent, tests, assignment, filters
41
+ def initialize parent, tests, assignment
40
42
  super(parent)
41
43
  @tests = tests
42
44
  @assignment_pattern = assignment
43
- @filters = filters
44
45
  end
45
46
 
46
- def equivalent? alpha, tests, assignment_pattern, filters
47
+ def equivalent? alpha, tests, assignment_pattern
47
48
  return false unless self.alpha == alpha
48
49
  return false unless self.assignment_pattern == assignment_pattern
49
50
  return false unless (self.tests.empty? && tests.empty?) || self.tests.length == tests.length && self.tests.all? { |my_test|
@@ -51,25 +52,27 @@ module Wongi
51
52
  my_test.equivalent? new_test
52
53
  }
53
54
  }
54
- return false unless (self.filters.empty? && filters.empty?) || self.filters.length == filters.length && self.filters.all? { |my_filter|
55
- filters.include? my_filter
56
- }
57
55
  true
58
56
  end
59
57
 
60
- def alpha= a
61
- @alpha = a
62
- # puts "\talpha = #{alpha}"
58
+ def alpha_activate wme
59
+ assignments = collect_assignments( wme )
60
+ parent.tokens.each do |token|
61
+ if matches?( token, wme )
62
+ children.each do |beta|
63
+ beta.beta_activate Token.new( beta, token, wme, assignments )
64
+ end
65
+ end
66
+ end
63
67
  end
64
68
 
65
- def alpha_activate wme
66
- dp "JOIN alpha-activated with #{wme}"
67
- collected = collect_assignments( wme )
68
- self.parent.tokens.each do |token|
69
- dp "-MATCHING #{token}"
70
- if matches?( token, wme ) && passes_filters?( token, wme, collected )
71
- dp "-JOIN MATCHED, PROPAGATING"
72
- propagate_activation token, wme, collected
69
+ def alpha_deactivate wme
70
+ children.each do |child|
71
+ child.tokens.each do |token|
72
+ if token.wme == wme
73
+ child.beta_deactivate token
74
+ #token.destroy
75
+ end
73
76
  end
74
77
  end
75
78
  end
@@ -78,23 +81,38 @@ module Wongi
78
81
  dp "JOIN beta-activated"
79
82
  self.alpha.wmes.each do |wme|
80
83
  dp "-TESTING WME #{wme}"
81
- collected = collect_assignments( wme )
82
- if matches?( token, wme ) && passes_filters?( token, wme, collected )
84
+ assignments = collect_assignments( wme )
85
+ if matches?( token, wme )
83
86
  dp "-WME MATCHED, PROPAGATING"
84
- propagate_activation token, wme, collected
87
+ children.each do |beta|
88
+ beta.beta_activate Token.new( beta, token, wme, assignments )
89
+ end
85
90
  else
86
91
  dp "-NO MATCH"
87
92
  end
88
93
  end
89
94
  end
90
95
 
96
+ def beta_deactivate token
97
+ children.each do |child|
98
+ child.tokens.each do |t|
99
+ if t.parent == token
100
+ child.beta_deactivate t
101
+ #token.destroy
102
+ end
103
+ end
104
+ end
105
+ end
106
+
91
107
  def refresh_child child
92
- tmp = children
93
- self.children = [ child ]
94
108
  alpha.wmes.each do |wme|
95
- alpha_activate wme
109
+ assignments = collect_assignments( wme )
110
+ parent.tokens.each do |token|
111
+ if matches?( token, wme )
112
+ child.beta_activate Token.new( child, token, wme, assignments )
113
+ end
114
+ end
96
115
  end
97
- self.children = tmp
98
116
  end
99
117
 
100
118
  def self.compile condition, earlier, parameters
@@ -136,11 +154,6 @@ module Wongi
136
154
  true
137
155
  end
138
156
 
139
- def passes_filters? token, wme, assignments
140
- t = FakeToken.new token, wme, assignments
141
- @filters.all? { |filter| filter.passes? t }
142
- end
143
-
144
157
  def collect_assignments wme
145
158
  assignments = {}
146
159
  return assignments if self.assignment_pattern.nil?
@@ -26,13 +26,10 @@ module Wongi
26
26
  @tokens = []
27
27
  end
28
28
 
29
- # def beta_activate token, wme, assignments
30
- # t = Token.new token, wme, assignments
31
- # t.node = self
32
- def beta_activate token, wme = nil, assignments = { } # => FIXME: beta_activate has different signatures for storing and non-storing nodes...
33
- t = Token.new token, nil, {}
34
- t.node = self
35
- tokens << t
29
+ def beta_activate token
30
+ return if @tokens.find { |t| t.parent == token }
31
+ t = Token.new self, token, nil, {}
32
+ @tokens << t
36
33
  partner.tokens.each do |ncc_token|
37
34
  next unless ncc_token.ancestors.find { |a| a.equal? token }
38
35
  t.ncc_results << ncc_token
@@ -40,7 +37,40 @@ module Wongi
40
37
  end
41
38
  if t.ncc_results.empty?
42
39
  children.each do |child|
43
- child.beta_activate t, nil, {}
40
+ child.beta_activate Token.new( child, t, nil, { } )
41
+ end
42
+ end
43
+ end
44
+
45
+ def beta_deactivate token
46
+ t = @tokens.find { |tok| tok.parent == token }
47
+ return unless @tokens.delete t
48
+ t.deleted!
49
+ partner.tokens.select { |ncc| ncc.owner == t }.each do |ncc_token|
50
+ ncc_token.owner = nil
51
+ t.ncc_results.delete ncc_token
52
+ end
53
+ children.each do |beta|
54
+ beta.tokens.select { |token| token.parent == t }.each do |token|
55
+ beta.beta_deactivate token
56
+ end
57
+ end
58
+ end
59
+
60
+ def ncc_activate token
61
+ token.deleted = false
62
+ @tokens << token unless @tokens.include?( token )
63
+ children.each do |child|
64
+ child.beta_activate Token.new( child, token, nil, { } )
65
+ end
66
+ end
67
+
68
+ def ncc_deactivate token
69
+ return unless @tokens.delete token
70
+ token.deleted!
71
+ children.each do |beta|
72
+ beta.tokens.select { |t| t.parent == token }.each do |t|
73
+ beta.beta_deactivate t
44
74
  end
45
75
  end
46
76
  end
@@ -48,19 +78,19 @@ module Wongi
48
78
  def refresh_child child
49
79
  tokens.each do |token|
50
80
  if token.ncc_results.empty?
51
- child.beta_activate token, nil, {}
81
+ child.beta_activate Token.new( child, t, nil, { } )
52
82
  end
53
83
  end
54
84
  end
55
85
 
56
- def delete_token token
57
- tokens.delete token
58
- token.ncc_results.each do |nccr|
59
- nccr.wme.tokens.delete( nccr ) if nccr.wme
60
- nccr.parent.children.delete nccr
61
- end
62
- token.ncc_results.clear
63
- end
86
+ # def delete_token token
87
+ # tokens.delete token
88
+ # token.ncc_results.each do |nccr|
89
+ # nccr.wme.tokens.delete( nccr ) if nccr.wme
90
+ # nccr.parent.children.delete nccr
91
+ # end
92
+ # token.ncc_results.clear
93
+ # end
64
94
 
65
95
  end
66
96
  end
@@ -14,31 +14,41 @@ module Wongi
14
14
  end
15
15
 
16
16
  def beta_activate token
17
- t = Token.new token, nil, {}
18
- t.node = self
19
- # owner = ncc.tokens.find do |ncc_token|
20
- # ncc_token.parent.node == divergent
21
- # end
22
- divergent_token = t.ancestors.find { |a| a.node == divergent }
23
- owner = ncc.tokens.find { |o| o.parent == divergent_token }
17
+ t = Token.new self, token, nil, {}
18
+ owner = owner_for( t )
19
+ tokens << t
24
20
  if owner
25
21
  owner.ncc_results << t
26
22
  t.owner = owner
27
- owner.delete_children
28
- else
29
- tokens << t
23
+ owner.node.ncc_deactivate owner
30
24
  end
31
25
  end
32
26
 
33
- def delete_token token
27
+ def beta_deactivate t
28
+ token = tokens.find { |tok| tok.parent == t }
29
+ return unless token
34
30
  token.owner.ncc_results.delete token
35
31
  if token.owner.ncc_results.empty?
36
- ncc.children.each do |node|
37
- node.beta_activate token.owner, nil, {}
38
- end
32
+ ncc.ncc_activate token.owner
39
33
  end
34
+ end
35
+
36
+ private
40
37
 
38
+ def owner_for token
39
+ divergent_token = token.ancestors.find { |t| t.node == divergent }
40
+ ncc.tokens.find { |t| t.ancestors.include? divergent_token }
41
41
  end
42
+
43
+ # def delete_token token
44
+ # token.owner.ncc_results.delete token
45
+ # if token.owner.ncc_results.empty?
46
+ # ncc.children.each do |node|
47
+ # node.beta_activate token.owner, nil, {}
48
+ # end
49
+ # end
50
+
51
+ # end
42
52
  end
43
53
  end
44
54
  end
@@ -1,11 +1,16 @@
1
1
  module Wongi
2
2
  module Engine
3
3
 
4
- NegJoinResult = Struct.new :owner, :wme
4
+ NegJoinResult = Struct.new :token, :wme do
5
+ def unlink
6
+ wme.neg_join_results.delete self
7
+ token.neg_join_results.delete self
8
+ end
9
+ end
5
10
 
6
11
  class NegNode < BetaNode
7
12
 
8
- attr_reader :tokens, :alpha, :tests
13
+ attr_reader :alpha, :tests
9
14
 
10
15
  def initialize parent, tests, alpha, unsafe
11
16
  super(parent)
@@ -18,36 +23,71 @@ module Wongi
18
23
  if matches?( token, wme ) && ( @unsafe || ! token.generated?( wme ) )# feedback loop protection
19
24
  # order matters for proper invalidation
20
25
  make_join_result(token, wme)
21
- token.delete_children #if token.neg_join_results.empty? # TODO why was this check here? it seems to break things
26
+ #token.delete_children #if token.neg_join_results.empty? # TODO why was this check here? it seems to break things
27
+ children.each do |child|
28
+ child.tokens.each do |t|
29
+ if t.parent == token
30
+ child.beta_deactivate t
31
+ #token.destroy
32
+ end
33
+ end
34
+ end
22
35
  end
23
36
  end
24
37
  end
25
38
 
26
- def beta_activate token, newwme, assignments
27
- existing = @tokens.find { |et| et.duplicate? token, newwme, assignments }
28
- if existing
29
- t = existing
30
- else
31
- t = Token.new( token, newwme, assignments)
32
- t.node = self
33
- @tokens << t
39
+ def alpha_deactivate wme
40
+ wme.neg_join_results.dup.each do |njr|
41
+ safe_tokens.each do |token|
42
+ next unless token == njr.token
43
+ njr.unlink
44
+ if token.neg_join_results.empty?
45
+ children.each do |child|
46
+ child.beta_activate Token.new( child, token, nil, {} )
47
+ end
48
+ end
49
+ end
34
50
  end
51
+ end
52
+
53
+ def beta_activate token
54
+ return if @tokens.find { |et| et.duplicate? token }
55
+ @tokens << token
35
56
  alpha.wmes.each do |wme|
36
- if matches?( t, wme )
37
- make_join_result(t, wme)
57
+ if matches?( token, wme )
58
+ make_join_result(token, wme)
38
59
  end
39
60
  end
40
- if t.neg_join_results.empty?
41
- self.children.each do |child|
42
- child.beta_activate t, nil, {}
61
+ if token.neg_join_results.empty?
62
+ children.each do |child|
63
+ child.beta_activate Token.new( child, token, nil, {} )
43
64
  end
44
65
  end
45
66
  end
46
67
 
68
+ def beta_deactivate token
69
+ return nil unless tokens.find token
70
+ @tokens.delete token
71
+ token.deleted!
72
+ if token.parent
73
+ token.parent.children.delete token # should this go into Token#destroy?
74
+ end
75
+ token.neg_join_results.each &:unlink
76
+ children.each do |child|
77
+ child.tokens.each do |t|
78
+ if t.parent == token
79
+ child.beta_deactivate t
80
+ #token.destroy
81
+ end
82
+ end
83
+ end
84
+ token
85
+ end
86
+
47
87
  def refresh_child child
48
88
  safe_tokens.each do |token|
49
89
  if token.neg_join_results.empty?
50
- child.beta_activate token, nil, {}
90
+ child.beta_activate Token.new( child, token, nil, {} )
51
91
  end
52
92
  end
53
93
  alpha.wmes.each do |wme|
@@ -55,13 +95,13 @@ module Wongi
55
95
  end
56
96
  end
57
97
 
58
- def delete_token token
59
- tokens.delete token
60
- token.neg_join_results.each do |njr|
61
- njr.wme.neg_join_results.delete njr if njr.wme
62
- end
63
- token.neg_join_results.clear
64
- end
98
+ # def delete_token token
99
+ # tokens.delete token
100
+ # token.neg_join_results.each do |njr|
101
+ # njr.wme.neg_join_results.delete njr if njr.wme
102
+ # end
103
+ # token.neg_join_results.clear
104
+ # end
65
105
 
66
106
  protected
67
107