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 ADDED
@@ -0,0 +1,10 @@
1
+ guard 'minitest' do
2
+ watch(%r|^spec/(.*)_spec\.rb|)
3
+ watch(%r|^lib/(.*)([^/]+)\.rb|) { |m| "spec/#{m[1]}#{m[2]}_spec.rb" }
4
+ watch(%r|^spec/spec_helper\.rb|) { "spec" }
5
+ end
6
+
7
+ guard 'bundler' do
8
+ watch('Gemfile')
9
+ watch(/^.+\.gemspec/)
10
+ end
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
- scaled_probality.each_with_index do |p,i|
35
- if p > 1
36
- large_worklist[large_worklist_counter] = i
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] = i
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
@@ -1,3 +1,3 @@
1
1
  module Vose
2
- VERSION = "0.1.2"
2
+ VERSION = "0.2.0"
3
3
  end
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
@@ -20,4 +20,5 @@ Gem::Specification.new do |gem|
20
20
  gem.add_development_dependency("ruby_gntp")
21
21
  gem.add_development_dependency("guard-minitest")
22
22
  gem.add_development_dependency("guard-bundler")
23
+ gem.add_development_dependency("rinruby")
23
24
  end
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.1.2
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-05-13 00:00:00.000000000 Z
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: &70253871221700 !ruby/object:Gem::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: *70253871221700
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: &70253871221140 !ruby/object:Gem::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: *70253871221140
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: &70253871220680 !ruby/object:Gem::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: *70253871220680
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: &70253871220260 !ruby/object:Gem::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: *70253871220260
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.11
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