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.
- data/examples/paradox.rb +4 -2
- data/examples/test.rb +5 -2
- data/lib/probdsl.rb +69 -48
- metadata +8 -6
data/examples/paradox.rb
CHANGED
@@ -28,9 +28,11 @@ puts <<HERE
|
|
28
28
|
|
29
29
|
The same experiment using a simulation (t = 10s):
|
30
30
|
HERE
|
31
|
-
|
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
|
-
|
35
|
+
end
|
36
|
+
puts "loops: #{k}"
|
37
|
+
puts prob.normalize.probability(true)
|
36
38
|
|
data/examples/test.rb
CHANGED
data/lib/probdsl.rb
CHANGED
@@ -8,59 +8,79 @@ module ProbDSL
|
|
8
8
|
include DelimCC
|
9
9
|
include Probably
|
10
10
|
|
11
|
-
class
|
12
|
-
def
|
13
|
-
|
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
|
17
|
-
|
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
|
-
|
24
|
-
|
25
|
-
|
23
|
+
def flatten
|
24
|
+
self.dep do |m|
|
25
|
+
m.call.flatten
|
26
|
+
end
|
26
27
|
end
|
27
28
|
|
28
|
-
def
|
29
|
-
|
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
|
-
|
33
|
-
|
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
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
def
|
42
|
-
|
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
|
46
|
-
|
47
|
-
|
48
|
-
|
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
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
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).
|
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).
|
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.
|
111
|
+
tmp[tree.eval_pick] += 1.0
|
112
|
+
n += 1
|
91
113
|
end
|
92
|
-
|
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
|
125
|
-
|
126
|
-
|
127
|
-
|
128
|
-
|
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
|
-
-
|
9
|
-
version: 0.0.
|
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-
|
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
|
-
-
|
31
|
-
version: 0.0.
|
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
|
-
|
43
|
+
- 0
|
44
|
+
- 3
|
45
|
+
version: 0.0.3
|
44
46
|
type: :runtime
|
45
47
|
version_requirements: *id002
|
46
48
|
description:
|