rb_probdsl 0.0.3 → 0.0.4

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.
@@ -28,9 +28,11 @@ puts <<HERE
28
28
 
29
29
  The same experiment using a simulation (t = 10s):
30
30
  HERE
31
- puts collecting(loop_t 10) {
31
+ prob, k = collecting(loop_t 10) do
32
32
  d1 = die; d2 = die
33
33
  guard d1 == 4 || d2 == 4
34
34
  d1 + d2 == 7
35
- }.normalize.probability(true)
35
+ end
36
+ puts "loops: #{k}"
37
+ puts prob.normalize.probability(true)
36
38
 
@@ -62,7 +62,10 @@ puts(collecting(loop_k 1000) {
62
62
 
63
63
  p 'test8'
64
64
 
65
- puts(collecting(loop_t 30) {
65
+ prob, k = collecting(loop_t 30) do
66
66
  die + die
67
- })
67
+ end
68
+
69
+ puts "loops: #{k}"
70
+ puts prob
68
71
 
@@ -8,59 +8,79 @@ module ProbDSL
8
8
  include DelimCC
9
9
  include Probably
10
10
 
11
- class PNone
12
- def reify
13
- nil
11
+ class PDistribution < Distribution
12
+ def eval
13
+ self.dep do |m|
14
+ m.call.eval
15
+ end
14
16
  end
15
17
 
16
- def pick
17
- nil
18
+ def eval_pick
19
+ cont,* = pick
20
+ cont.call.eval_pick
18
21
  end
19
- end
20
-
21
- PNil = PNone.new
22
22
 
23
- class PValue
24
- def initialize(v)
25
- @value = v
23
+ def flatten
24
+ self.dep do |m|
25
+ m.call.flatten
26
+ end
26
27
  end
27
28
 
28
- def reify
29
- Probably.mk_const @value
29
+ def to_d
30
+ tmp = self.map { |f|
31
+ f.call
32
+ }
33
+ shift do |cont|
34
+ tmp.map {|f|
35
+ proc { cont.call(f) }
36
+ }
37
+ # self.map { |f|
38
+ # proc { cont.call(f.call) }
39
+ # }
40
+ end
30
41
  end
42
+ end
31
43
 
32
- def pick
33
- @value
44
+ class PNone
45
+ def eval; nil; end
46
+ def eval_pick; nil; end
47
+ def flatten; nil; end
48
+
49
+ def call; nil; end
50
+
51
+ def to_d
52
+ nil
34
53
  end
35
54
  end
36
55
 
37
- # Tree Node in Decision tree.
38
- # All sub nodes are unevaluated, so tree expansion is lazy
39
- # and therefore different evaluation strategies may be implemented.
40
- class PChoice
41
- def initialize(&blk)
42
- @fn = blk
56
+ class PValue
57
+ attr_reader :value
58
+
59
+ def initialize(v); @value = v; end
60
+ def eval; PDistribution.mk_const @value; end
61
+ def eval_pick; @value; end
62
+
63
+ def flatten
64
+ PDistribution.mk_const self
43
65
  end
44
66
 
45
- def reify
46
- d = @fn.call
47
- d.dep do |m|
48
- k = m[0]
49
- v = m[1]
50
- tmp = k.call(v)
51
- tmp.reify
52
- end
67
+ def call; @value end
68
+
69
+ def eql?(b)
70
+ @value = b.value
53
71
  end
54
72
 
55
- def pick
56
- dist = @fn.call
57
- picked,probability = dist.pick
58
- cont = picked[0]
59
- value = picked[1]
60
- cont.call(value).pick
73
+ def hash
74
+ @value.hash
75
+ end
76
+
77
+ def to_d
78
+ @value
61
79
  end
62
80
  end
63
81
 
82
+ PNil = PNone.new
83
+
64
84
  def run_prob(&blk)
65
85
  reset {
66
86
  value = blk.call
@@ -73,7 +93,7 @@ module ProbDSL
73
93
  end
74
94
 
75
95
  def prob(&blk)
76
- run_prob(&blk).reify
96
+ run_prob(&blk).eval
77
97
  end
78
98
 
79
99
  def norm_prob(&blk)
@@ -81,15 +101,17 @@ module ProbDSL
81
101
  end
82
102
 
83
103
  def pick(&blk)
84
- run_prob(&blk).pick
104
+ run_prob(&blk).eval_pick
85
105
  end
86
106
 
87
107
  def collect(pred, tree)
88
108
  tmp = Hash.new(0)
109
+ n = 0
89
110
  while (pred.call)
90
- tmp[tree.pick] += 1.0
111
+ tmp[tree.eval_pick] += 1.0
112
+ n += 1
91
113
  end
92
- Distribution.new :MAP, tmp
114
+ [PDistribution.new(:MAP, tmp), n]
93
115
  end
94
116
 
95
117
  def collecting(pred, &blk)
@@ -121,16 +143,15 @@ module ProbDSL
121
143
  end
122
144
 
123
145
  def dist(data)
124
- shift { |cont|
125
- PChoice.new do
126
- map = Hash.new(0)
127
- data.each do |prob, dist|
128
- map[[cont, dist]] += prob
129
- end
130
-
131
- Distribution.new :MAP, map
146
+ shift do |cont|
147
+ map = Hash.new 0
148
+ data.each do |prob, value|
149
+ tmp = proc { cont.call value }
150
+ map[tmp] = prob
132
151
  end
133
- }
152
+
153
+ PDistribution.new :MAP, map
154
+ end
134
155
  end
135
156
 
136
157
  def uniform(data)
metadata CHANGED
@@ -5,8 +5,8 @@ version: !ruby/object:Gem::Version
5
5
  segments:
6
6
  - 0
7
7
  - 0
8
- - 3
9
- version: 0.0.3
8
+ - 4
9
+ version: 0.0.4
10
10
  platform: ruby
11
11
  authors:
12
12
  - Steffen Siering
@@ -14,7 +14,7 @@ autorequire:
14
14
  bindir: bin
15
15
  cert_chain: []
16
16
 
17
- date: 2010-03-26 00:00:00 +01:00
17
+ date: 2010-03-27 00:00:00 +01:00
18
18
  default_executable:
19
19
  dependencies:
20
20
  - !ruby/object:Gem::Dependency
@@ -27,8 +27,8 @@ dependencies:
27
27
  segments:
28
28
  - 0
29
29
  - 0
30
- - 2
31
- version: 0.0.2
30
+ - 3
31
+ version: 0.0.3
32
32
  type: :runtime
33
33
  version_requirements: *id001
34
34
  - !ruby/object:Gem::Dependency
@@ -40,7 +40,9 @@ dependencies:
40
40
  - !ruby/object:Gem::Version
41
41
  segments:
42
42
  - 0
43
- version: "0"
43
+ - 0
44
+ - 3
45
+ version: 0.0.3
44
46
  type: :runtime
45
47
  version_requirements: *id002
46
48
  description: