quick-sampler 0.1.4 → 0.1.5
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 +4 -4
- data/lib/quick/sampler/base.rb +1 -1
- data/lib/quick/sampler/dsl/simple_combinators.rb +36 -2
- data/lib/quick/sampler/dsl/simple_values.rb +18 -0
- data/lib/quick/sampler/dsl.rb +7 -6
- data/lib/quick/sampler/version.rb +1 -1
- data/spec/quick/sampler/dsl/combine_spec.rb +11 -0
- data/spec/quick/sampler/dsl/merge_spec.rb +19 -0
- data/spec/quick/sampler/dsl/simple_values_spec.rb +22 -0
- metadata +6 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 35617377a366c985607e9bd8c955f2a51885625a
|
4
|
+
data.tar.gz: c2becb43c4867529b643533629c6c9256df079d6
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 8d2a1fe1f914b0a12fa11e2eb81ffb97b986d3b5ffc6049d4bf435f7cdd02f280f66be459fd1a6b59bb5d726445952d4b89b02709489ea19b53ba7729bc51c2c
|
7
|
+
data.tar.gz: cf867a49b484f43542de4353fb47f1408f9e8dce55e1681b971f2bf57dc29523364f2a919b9ac38200b056b13c6ff7c9313136759feea72dd5e1e79e5b45aae9
|
data/lib/quick/sampler/base.rb
CHANGED
@@ -32,8 +32,12 @@ module Quick
|
|
32
32
|
def one_of_weighted expression_weights
|
33
33
|
total_weight, expressions = expression_weights
|
34
34
|
.reduce([0, {}]) { |(total_weight, expressions), (expression, weight)|
|
35
|
-
|
36
|
-
|
35
|
+
if weight > 0
|
36
|
+
total_weight += weight
|
37
|
+
[total_weight, expressions.merge(total_weight => expression)]
|
38
|
+
else
|
39
|
+
[total_weight, expressions]
|
40
|
+
end
|
37
41
|
}
|
38
42
|
|
39
43
|
feed {
|
@@ -123,6 +127,36 @@ module Quick
|
|
123
127
|
send_to(the_class, :new, *args)
|
124
128
|
end
|
125
129
|
|
130
|
+
# Custom sampler combinator
|
131
|
+
#
|
132
|
+
# `combine` allows to implement a custom combination of samplers: the
|
133
|
+
# method expects individual samplers as arguments and the combination
|
134
|
+
# implementation as a block. The resulting sampler will sample each of
|
135
|
+
# the supplied sub-samplers, pass the sampled values to the block and emit
|
136
|
+
# block result as combined sample.
|
137
|
+
#
|
138
|
+
# @param [*Quick::Sampler] *samplers
|
139
|
+
# samplers to combine
|
140
|
+
# @return [Quick::Sampler]
|
141
|
+
# a combination sampler
|
142
|
+
# @yieldparam [*Anything] samples
|
143
|
+
# sampled values from each of the combined samplers
|
144
|
+
# @yieldreturn [Anything]
|
145
|
+
# combined sampled value
|
146
|
+
def combine *samplers, &block
|
147
|
+
list_like(*samplers).map(&block)
|
148
|
+
end
|
149
|
+
|
150
|
+
# Sampler of merged hashes
|
151
|
+
#
|
152
|
+
# @param [Hash, *Quick::Sampler<Hash>] *samplers
|
153
|
+
# `Hash`es or samplers emitting `Hash` values to merge
|
154
|
+
# @return [Quick::Sampler<Hash>]
|
155
|
+
# a sampler emitting merged hash
|
156
|
+
def merge *samplers
|
157
|
+
combine(*samplers) { |hashes| hashes.reduce(:merge) }
|
158
|
+
end
|
159
|
+
|
126
160
|
private
|
127
161
|
|
128
162
|
def recursive_sample value
|
@@ -92,6 +92,24 @@ module Quick
|
|
92
92
|
send_to( send_to(repertoire, :sample, size), :join )
|
93
93
|
end
|
94
94
|
|
95
|
+
# "Probability" sampler
|
96
|
+
#
|
97
|
+
# @return [Quick::Sampler<Float>]
|
98
|
+
# a sampler emitting a float in range `0.0..1.0`
|
99
|
+
def probability
|
100
|
+
pick_from(0..1.0)
|
101
|
+
end
|
102
|
+
|
103
|
+
# Weighted truth sampler
|
104
|
+
#
|
105
|
+
# @param [Float] weight
|
106
|
+
# probably of emitting `true`
|
107
|
+
# @return [Quick::Sampler<Boolean>]
|
108
|
+
# a sampler emitting `true` with probability `weight` or false with probability `(1.0 - weight)`
|
109
|
+
def weighted_truth weight
|
110
|
+
one_of_weighted true => weight, false => (1 - weight)
|
111
|
+
end
|
112
|
+
|
95
113
|
end
|
96
114
|
end
|
97
115
|
end
|
data/lib/quick/sampler/dsl.rb
CHANGED
@@ -35,15 +35,16 @@ module Quick
|
|
35
35
|
"Quick Sampler DSL"
|
36
36
|
end
|
37
37
|
|
38
|
-
#
|
38
|
+
# Sample an enumerable or block
|
39
39
|
#
|
40
|
-
#
|
41
|
-
# or a powerful albeit confusing DSL verb
|
40
|
+
# The block is ignored if `enum` parameter isn't `nil`
|
42
41
|
#
|
42
|
+
# @param [Enumerable] enum
|
43
|
+
# an enumerable to sample values from
|
43
44
|
# @yieldreturn [<Sample>] a sampled value
|
44
|
-
|
45
|
-
|
46
|
-
Fluidiom.new(Base.new(
|
45
|
+
def feed enum = nil, &block
|
46
|
+
enum ||= block if block_given?
|
47
|
+
Fluidiom.new(Base.new(enum))
|
47
48
|
end
|
48
49
|
|
49
50
|
private
|
@@ -0,0 +1,11 @@
|
|
1
|
+
describe Quick::Sampler::DSL do
|
2
|
+
it { is_expected.to have_method :combine }
|
3
|
+
|
4
|
+
describe "#combine" do
|
5
|
+
let(:dsl) { described_class.new }
|
6
|
+
let(:english) { dsl.feed(["one", "two"]) }
|
7
|
+
let(:dutch) { dsl.feed(["één", "twee"]) }
|
8
|
+
subject(:combined) { dsl.combine(english, dutch) {|e,d| "#{e} = #{d}"}.force }
|
9
|
+
it { is_expected.to eq ["one = één", "two = twee"] }
|
10
|
+
end
|
11
|
+
end
|
@@ -0,0 +1,19 @@
|
|
1
|
+
describe Quick::Sampler::DSL do
|
2
|
+
it { is_expected.to have_method :merge }
|
3
|
+
|
4
|
+
describe "#merge" do
|
5
|
+
let(:dsl) { described_class.new }
|
6
|
+
let(:defaults_hash) { { prime: 7, negative: -42} }
|
7
|
+
let(:first_sampler) { dsl.feed( [{prime: 13}, {negative: -43}] ) }
|
8
|
+
let(:second_sampler) { dsl.feed( [{string: "one"}, {string: "two"}] ) }
|
9
|
+
subject(:merged) {
|
10
|
+
dsl.merge(defaults_hash, first_sampler, second_sampler).force
|
11
|
+
}
|
12
|
+
it {
|
13
|
+
is_expected.to contain_exactly(
|
14
|
+
{ prime: 13, negative: -42, string: "one" },
|
15
|
+
{ prime: 7, negative: -43, string: "two" },
|
16
|
+
)
|
17
|
+
}
|
18
|
+
end
|
19
|
+
end
|
@@ -32,4 +32,26 @@ describe Quick::Sampler::DSL do
|
|
32
32
|
it { is_expected.to all match /^[a-z]{1,10}$/ }
|
33
33
|
end
|
34
34
|
end
|
35
|
+
|
36
|
+
describe "#probability" do
|
37
|
+
subject(:samples) { dsl.probability.first(5) }
|
38
|
+
it { is_expected.to all (be >= 0.0).and be <= 1.0 }
|
39
|
+
end
|
40
|
+
|
41
|
+
describe "#weighted_truth" do
|
42
|
+
describe "improbable truth" do
|
43
|
+
subject(:samples) { dsl.weighted_truth(0.0).first(5) }
|
44
|
+
it { is_expected.to all be false }
|
45
|
+
end
|
46
|
+
|
47
|
+
describe "certain truth" do
|
48
|
+
subject(:samples) { dsl.weighted_truth(1.0).first(5) }
|
49
|
+
it { is_expected.to all be true }
|
50
|
+
end
|
51
|
+
|
52
|
+
describe "maybe" do
|
53
|
+
subject(:samples) { dsl.weighted_truth(0.5).first(5) }
|
54
|
+
it { is_expected.to all be(true).or be(false) }
|
55
|
+
end
|
56
|
+
end
|
35
57
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: quick-sampler
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.
|
4
|
+
version: 0.1.5
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Artem Baguinski
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2015-04-
|
11
|
+
date: 2015-04-08 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
@@ -123,8 +123,10 @@ files:
|
|
123
123
|
- lib/quick/sampler/version.rb
|
124
124
|
- quick-sampler.gemspec
|
125
125
|
- spec/quick/sampler/compile_spec.rb
|
126
|
+
- spec/quick/sampler/dsl/combine_spec.rb
|
126
127
|
- spec/quick/sampler/dsl/hash_like_spec.rb
|
127
128
|
- spec/quick/sampler/dsl/list_like_spec.rb
|
129
|
+
- spec/quick/sampler/dsl/merge_spec.rb
|
128
130
|
- spec/quick/sampler/dsl/send_to_spec.rb
|
129
131
|
- spec/quick/sampler/dsl/simple_values_spec.rb
|
130
132
|
- spec/spec_helper.rb
|
@@ -154,8 +156,10 @@ specification_version: 4
|
|
154
156
|
summary: Composable samplers of random data
|
155
157
|
test_files:
|
156
158
|
- spec/quick/sampler/compile_spec.rb
|
159
|
+
- spec/quick/sampler/dsl/combine_spec.rb
|
157
160
|
- spec/quick/sampler/dsl/hash_like_spec.rb
|
158
161
|
- spec/quick/sampler/dsl/list_like_spec.rb
|
162
|
+
- spec/quick/sampler/dsl/merge_spec.rb
|
159
163
|
- spec/quick/sampler/dsl/send_to_spec.rb
|
160
164
|
- spec/quick/sampler/dsl/simple_values_spec.rb
|
161
165
|
- spec/spec_helper.rb
|