rb_probdsl 0.0.3 → 0.0.4

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