vose 0.1.2 → 0.2.0

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