vose 0.1.2 → 0.2.0
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/Guardfile +10 -0
- data/lib/vose.rb +10 -12
- data/lib/vose/version.rb +1 -1
- data/spec/vose_spec.rb +7 -1
- data/vose.gemspec +1 -0
- metadata +48 -11
data/Guardfile
ADDED
data/lib/vose.rb
CHANGED
@@ -4,7 +4,7 @@ module Vose
|
|
4
4
|
class InvalidArgumentException < RuntimeError; end;
|
5
5
|
|
6
6
|
class AliasMethod
|
7
|
-
attr_reader :limit
|
7
|
+
attr_reader :limit, :prob
|
8
8
|
|
9
9
|
def initialize(probabilities)
|
10
10
|
raise InvalidArgumentException if probabilities.empty?
|
@@ -13,7 +13,7 @@ module Vose
|
|
13
13
|
@limit = probabilities.length
|
14
14
|
sum = probabilities.reduce(:+)
|
15
15
|
|
16
|
-
scale = limit / sum.to_f
|
16
|
+
scale = @limit / sum.to_f
|
17
17
|
scaled_probality = []
|
18
18
|
probabilities.each do |p|
|
19
19
|
scaled_probality << (p * scale)
|
@@ -26,26 +26,24 @@ module Vose
|
|
26
26
|
end
|
27
27
|
|
28
28
|
def preprocess(scaled_probality)
|
29
|
-
small_worklist =
|
30
|
-
large_worklist =
|
29
|
+
small_worklist = Array.new(limit) { 0 }
|
30
|
+
large_worklist = Array.new(limit) { 0 }
|
31
31
|
small_worklist_counter = 0
|
32
32
|
large_worklist_counter = 0
|
33
33
|
|
34
|
-
|
35
|
-
if
|
36
|
-
large_worklist[large_worklist_counter] =
|
37
|
-
large_worklist_counter+=1
|
34
|
+
0.upto(limit-1) do |j|
|
35
|
+
if scaled_probality[j] > 1
|
36
|
+
large_worklist[large_worklist_counter+=1] = j
|
38
37
|
else
|
39
|
-
small_worklist[small_worklist_counter] =
|
40
|
-
small_worklist_counter+=1
|
38
|
+
small_worklist[small_worklist_counter+=1] = j
|
41
39
|
end
|
42
40
|
end
|
43
41
|
|
44
42
|
while small_worklist_counter != 0 && large_worklist_counter != 0
|
45
|
-
small_worklist_counter-=1
|
46
|
-
large_worklist_counter-=1
|
47
43
|
current_small_worklist_index = small_worklist[small_worklist_counter].to_i
|
48
44
|
current_large_worklist_index = large_worklist[large_worklist_counter].to_i
|
45
|
+
small_worklist_counter-=1
|
46
|
+
large_worklist_counter-=1
|
49
47
|
|
50
48
|
@prob[current_small_worklist_index] = scaled_probality[current_small_worklist_index]
|
51
49
|
@alias[current_small_worklist_index] = current_large_worklist_index
|
data/lib/vose/version.rb
CHANGED
data/spec/vose_spec.rb
CHANGED
@@ -30,7 +30,7 @@ describe Vose::AliasMethod do
|
|
30
30
|
vose = Vose::AliasMethod.new probabilities
|
31
31
|
results = []
|
32
32
|
100000.times { results << vose.next }
|
33
|
-
|
33
|
+
|
34
34
|
sum = probabilities.reduce(:+)
|
35
35
|
expected_percentages = probabilities.map{|p| p/sum}
|
36
36
|
results.must_match_probability expected_percentages
|
@@ -43,5 +43,11 @@ describe Vose::AliasMethod do
|
|
43
43
|
100000.times { results << vose.next }
|
44
44
|
results.must_match_probability probabilities
|
45
45
|
end
|
46
|
+
|
47
|
+
it "accounts for zero values" do
|
48
|
+
probabilities = [0, 0, 0, 3]
|
49
|
+
vose = Vose::AliasMethod.new probabilities
|
50
|
+
vose.next.must_equal 3
|
51
|
+
end
|
46
52
|
end
|
47
53
|
end
|
data/vose.gemspec
CHANGED
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: vose
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.2.0
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,11 +9,11 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2012-
|
12
|
+
date: 2012-07-22 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: pry
|
16
|
-
requirement:
|
16
|
+
requirement: !ruby/object:Gem::Requirement
|
17
17
|
none: false
|
18
18
|
requirements:
|
19
19
|
- - ! '>='
|
@@ -21,10 +21,15 @@ dependencies:
|
|
21
21
|
version: '0'
|
22
22
|
type: :development
|
23
23
|
prerelease: false
|
24
|
-
version_requirements:
|
24
|
+
version_requirements: !ruby/object:Gem::Requirement
|
25
|
+
none: false
|
26
|
+
requirements:
|
27
|
+
- - ! '>='
|
28
|
+
- !ruby/object:Gem::Version
|
29
|
+
version: '0'
|
25
30
|
- !ruby/object:Gem::Dependency
|
26
31
|
name: ruby_gntp
|
27
|
-
requirement:
|
32
|
+
requirement: !ruby/object:Gem::Requirement
|
28
33
|
none: false
|
29
34
|
requirements:
|
30
35
|
- - ! '>='
|
@@ -32,10 +37,15 @@ dependencies:
|
|
32
37
|
version: '0'
|
33
38
|
type: :development
|
34
39
|
prerelease: false
|
35
|
-
version_requirements:
|
40
|
+
version_requirements: !ruby/object:Gem::Requirement
|
41
|
+
none: false
|
42
|
+
requirements:
|
43
|
+
- - ! '>='
|
44
|
+
- !ruby/object:Gem::Version
|
45
|
+
version: '0'
|
36
46
|
- !ruby/object:Gem::Dependency
|
37
47
|
name: guard-minitest
|
38
|
-
requirement:
|
48
|
+
requirement: !ruby/object:Gem::Requirement
|
39
49
|
none: false
|
40
50
|
requirements:
|
41
51
|
- - ! '>='
|
@@ -43,10 +53,15 @@ dependencies:
|
|
43
53
|
version: '0'
|
44
54
|
type: :development
|
45
55
|
prerelease: false
|
46
|
-
version_requirements:
|
56
|
+
version_requirements: !ruby/object:Gem::Requirement
|
57
|
+
none: false
|
58
|
+
requirements:
|
59
|
+
- - ! '>='
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: '0'
|
47
62
|
- !ruby/object:Gem::Dependency
|
48
63
|
name: guard-bundler
|
49
|
-
requirement:
|
64
|
+
requirement: !ruby/object:Gem::Requirement
|
50
65
|
none: false
|
51
66
|
requirements:
|
52
67
|
- - ! '>='
|
@@ -54,7 +69,28 @@ dependencies:
|
|
54
69
|
version: '0'
|
55
70
|
type: :development
|
56
71
|
prerelease: false
|
57
|
-
version_requirements:
|
72
|
+
version_requirements: !ruby/object:Gem::Requirement
|
73
|
+
none: false
|
74
|
+
requirements:
|
75
|
+
- - ! '>='
|
76
|
+
- !ruby/object:Gem::Version
|
77
|
+
version: '0'
|
78
|
+
- !ruby/object:Gem::Dependency
|
79
|
+
name: rinruby
|
80
|
+
requirement: !ruby/object:Gem::Requirement
|
81
|
+
none: false
|
82
|
+
requirements:
|
83
|
+
- - ! '>='
|
84
|
+
- !ruby/object:Gem::Version
|
85
|
+
version: '0'
|
86
|
+
type: :development
|
87
|
+
prerelease: false
|
88
|
+
version_requirements: !ruby/object:Gem::Requirement
|
89
|
+
none: false
|
90
|
+
requirements:
|
91
|
+
- - ! '>='
|
92
|
+
- !ruby/object:Gem::Version
|
93
|
+
version: '0'
|
58
94
|
description: ! 'Vose: Sample random values from a discrete probability distribution.
|
59
95
|
|
60
96
|
'
|
@@ -66,6 +102,7 @@ extra_rdoc_files: []
|
|
66
102
|
files:
|
67
103
|
- .gitignore
|
68
104
|
- Gemfile
|
105
|
+
- Guardfile
|
69
106
|
- LICENSE
|
70
107
|
- README.md
|
71
108
|
- Rakefile
|
@@ -94,7 +131,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
94
131
|
version: '0'
|
95
132
|
requirements: []
|
96
133
|
rubyforge_project:
|
97
|
-
rubygems_version: 1.8.
|
134
|
+
rubygems_version: 1.8.23
|
98
135
|
signing_key:
|
99
136
|
specification_version: 3
|
100
137
|
summary: Vose is a Ruby implementation of the Vose Alias Method. It allows for sampling
|