wongi-engine 0.0.17 → 0.1.0.alpha1

Sign up to get free protection for your applications and to get access to all the features.
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