pikk 0.1.0 → 0.1.1

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: bf7aa7541fa02b27196d7b6b9cabcdb2536c4cdd
4
- data.tar.gz: 327d936b477a78a99909ab1464d70a6e6342f9ed
3
+ metadata.gz: 9a54b718fdcbaeaab7308714745c25eac5307470
4
+ data.tar.gz: f2ac55e78df3d66096665e20d640a7ef3835f1a9
5
5
  SHA512:
6
- metadata.gz: 014c7f1788974167c6223e783270e9bf0c9bd44a04f563dedf8220d29cb43c86c222db373009fb822c2f4d5f7c1e2c37c527e4c624e7b540161eae3d7e304714
7
- data.tar.gz: ebeedc8cb072a64333a28797e46dd878fedb1325ae1176d715c8ff165c7a6e607d2dc8cc1fa137e57fc4495060685272cb83ed755dfa5ec2e0c818774133ca17
6
+ metadata.gz: 6173337493b12f7739043475480138ed2e8764fc7866d4e8aaedb87985c0e9303106ce904db7968e9a57533d2484efb083534f7600cfec3c2e9a7afb9bcbd1c9
7
+ data.tar.gz: f6b796f2fe5e5225d0fda61e24fa51a15d089de0e76d6a724c52804f4266645e24fbb15a1c0d41be0a5327596dedff90d5f7ce824d1019d7ea313c51b139d199
data/Gemfile.lock ADDED
@@ -0,0 +1,39 @@
1
+ PATH
2
+ remote: .
3
+ specs:
4
+ pikk (0.1.0)
5
+ terminal-table
6
+
7
+ GEM
8
+ remote: https://rubygems.org/
9
+ specs:
10
+ diff-lcs (1.3)
11
+ rake (10.5.0)
12
+ rspec (3.7.0)
13
+ rspec-core (~> 3.7.0)
14
+ rspec-expectations (~> 3.7.0)
15
+ rspec-mocks (~> 3.7.0)
16
+ rspec-core (3.7.1)
17
+ rspec-support (~> 3.7.0)
18
+ rspec-expectations (3.7.0)
19
+ diff-lcs (>= 1.2.0, < 2.0)
20
+ rspec-support (~> 3.7.0)
21
+ rspec-mocks (3.7.0)
22
+ diff-lcs (>= 1.2.0, < 2.0)
23
+ rspec-support (~> 3.7.0)
24
+ rspec-support (3.7.1)
25
+ terminal-table (1.8.0)
26
+ unicode-display_width (~> 1.1, >= 1.1.1)
27
+ unicode-display_width (1.3.0)
28
+
29
+ PLATFORMS
30
+ ruby
31
+
32
+ DEPENDENCIES
33
+ bundler (~> 1.16)
34
+ pikk!
35
+ rake (~> 10.0)
36
+ rspec (~> 3.0)
37
+
38
+ BUNDLED WITH
39
+ 1.16.1
data/README.md CHANGED
@@ -20,7 +20,42 @@ Or install it yourself as:
20
20
 
21
21
  ## Usage
22
22
 
23
- TODO: Write usage instructions here
23
+ > **WARNING!**
24
+ > **Your hash should have the keys `:name` and `:weight`!**
25
+
26
+ There are two methods. One is `single_select` and the other is `pool`. Former, select one hash object from the array by its weight, and return it. Latter, do an iteration of selection, 50 by default, and return the array.
27
+
28
+ ```ruby
29
+ require 'pikk'
30
+
31
+ ary = [{name: 'a', weight: 5.5}, {name: 'b', weight: 3}, {name: 'c', weight: 7}, {name: 'd', weight: 1.5}]
32
+
33
+ Pikk.single_select(ary)
34
+ # => {:name=>"c", :weight=>7, :count=>0, :probability=>0.4117647058823529}
35
+
36
+ Pikk.pool(ary)
37
+ # => [{:name=>"c", :weight=>7, :count=>22, :probability=>0.4117647058823529}, {:name=>"a", :weight=>5.5, :count=>15, :probability=>0.3235294117647059}, {:name=>"b", :weight=>3, :count=>8, :probability=>0.17647058823529413}, {:name=>"d", :weight=>1.5, :count=>5, :probability=>0.08823529411764706}]
38
+
39
+ Pikk.pool(ary, iteration: 100)
40
+ # => [{:name=>"c", :weight=>7, :count=>37, :probability=>0.4117647058823529}, {:name=>"a", :weight=>5.5, :count=>34, :probability=>0.3235294117647059}, {:name=>"b", :weight=>3, :count=>18, :probability=>0.17647058823529413}, {:name=>"d", :weight=>1.5, :count=>11, :probability=>0.08823529411764706}]
41
+
42
+ Pikk.pool(ary, pp: true)
43
+ # =>
44
+ # +-----------------+--------+-------+---------------------+--------------------+
45
+ # | Name | Weight | Count | Probability | (C/(P*I)) |
46
+ # +-----------------+--------+-------+---------------------+--------------------+
47
+ # | a | 5.5 | 19 | 0.3235294117647059 | 1.1745454545454546 |
48
+ # | b | 3 | 8 | 0.17647058823529413 | 0.9066666666666666 |
49
+ # | c | 7 | 19 | 0.4117647058823529 | 0.9228571428571429 |
50
+ # | d | 1.5 | 4 | 0.08823529411764706 | 0.9066666666666666 |
51
+ # +-----------------+--------+-------+---------------------+--------------------+
52
+ # | Iteration Count | 50 |
53
+ # +-----------------+--------+-------+---------------------+--------------------+
54
+ # | Sum Ratio | 0.02231601731601729 |
55
+ # +-----------------+--------+-------+---------------------+--------------------+
56
+ ```
57
+
58
+
24
59
 
25
60
  ## Development
26
61
 
@@ -0,0 +1,33 @@
1
+ require 'pikk'
2
+ require 'active_support/core_ext/hash/keys'
3
+ require 'active_support/core_ext/object/json'
4
+
5
+ class Fruit
6
+ attr_reader :name, :weight
7
+
8
+ def initialize(name, weight)
9
+ @name = name
10
+ @weight = weight
11
+ end
12
+ end
13
+
14
+ fruits = []
15
+
16
+ fruits << mango = Fruit.new("mango", 5).as_json.symbolize_keys
17
+ fruits << apple = Fruit.new("apple", 3).as_json.symbolize_keys
18
+ fruits << cherry = Fruit.new("cherry", 2).as_json.symbolize_keys
19
+ fruits << banana = Fruit.new("banana", 1).as_json.symbolize_keys
20
+ fruits << melon = Fruit.new("melon", 8).as_json.symbolize_keys
21
+ fruits << orange = Fruit.new("orange", 6).as_json.symbolize_keys
22
+
23
+ puts
24
+ puts 'single select'
25
+ puts Pikk.single_select(fruits)
26
+
27
+ puts
28
+ puts 'pool select'
29
+ puts Pikk.pool(fruits, iteration: 10_000)
30
+
31
+ puts
32
+ puts 'pool select, table print'
33
+ puts Pikk.pool(fruits, iteration: 10_000, pp: true)
data/lib/pikk/main.rb CHANGED
@@ -1,3 +1,5 @@
1
+ require 'terminal-table/import'
2
+
1
3
  module Pikk
2
4
  class << self
3
5
  def single_select(list = [{}])
@@ -11,11 +13,11 @@ module Pikk
11
13
 
12
14
  def pool(list = [{}], iteration: 50, pp: false)
13
15
  raise ArgumentError, 'Input is empty!' if list == [{}]
14
- @iteration = iteration
16
+ $iteration = iteration
15
17
 
16
18
  arr = calculate_prob(list)
17
19
 
18
- @iteration.times do
20
+ $iteration.times do
19
21
  selected_object = pick_from(arr)
20
22
  selected_object[:count] += 1
21
23
  end
@@ -51,18 +53,24 @@ module Pikk
51
53
  def to_table(list = [{}])
52
54
  list.sort_by { |h| h[:weight] }.reverse!
53
55
 
54
- puts "\nNAME\tWEIGHT\tCOUNT\tPROBABILITY\tQUOTIENT (C/(P*I))"
55
- puts "=" * 58
56
+ lsum = 0
57
+
58
+ ltable = table do
59
+ self.headings = "Name", "Weight", "Count", "Probability", "(C/(P*I))"
56
60
 
57
- fsum = 0
61
+ list.each do |f|
62
+ add_row [f[:name], f[:weight], f[:count], f[:probability], (f[:count].to_f/(f[:probability] * $iteration))]
58
63
 
59
- list.each do |f|
60
- puts "#{f[:name]}\t#{f[:weight]}\t#{f[:count]}\t#{f[:probability]}\t\t#{f[:count].to_f/(f[:probability] * @iteration)}"
61
- fsum += f[:count].to_f/(f[:probability] * @iteration)
64
+ lsum += f[:count].to_f/(f[:probability] * $iteration)
65
+ end
66
+ add_separator
67
+ add_row ['Iteration Count', { value: $iteration, colspan: 4, alignment: :right }]
68
+ add_separator
69
+ add_row ['Sum Ratio', { value: (1 - lsum / list.count).abs, colspan: 4, alignment: :right }]
70
+ align_column 1, :center
62
71
  end
63
72
 
64
- puts "\n"
65
- puts (1 - fsum / list.count).abs
73
+ puts ltable
66
74
  end
67
75
  end
68
76
  end
data/lib/pikk/version.rb CHANGED
@@ -3,7 +3,7 @@
3
3
  module Pikk
4
4
  MAJOR = 0
5
5
  MINOR = 1
6
- TINY = 0
6
+ TINY = 1
7
7
 
8
8
  VERSION = [MAJOR, MINOR, TINY].compact.join('.')
9
9
  end
data/pikk.gemspec CHANGED
@@ -33,4 +33,6 @@ Gem::Specification.new do |spec|
33
33
  spec.add_development_dependency "bundler", "~> 1.16"
34
34
  spec.add_development_dependency "rake", "~> 10.0"
35
35
  spec.add_development_dependency "rspec", "~> 3.0"
36
+
37
+ spec.add_runtime_dependency "terminal-table"
36
38
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: pikk
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.0
4
+ version: 0.1.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Oguzhan Ozdemir
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2018-04-12 00:00:00.000000000 Z
11
+ date: 2018-04-13 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -52,6 +52,20 @@ dependencies:
52
52
  - - "~>"
53
53
  - !ruby/object:Gem::Version
54
54
  version: '3.0'
55
+ - !ruby/object:Gem::Dependency
56
+ name: terminal-table
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - ">="
60
+ - !ruby/object:Gem::Version
61
+ version: '0'
62
+ type: :runtime
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - ">="
67
+ - !ruby/object:Gem::Version
68
+ version: '0'
55
69
  description: Generic Algorithm Pool Selection.
56
70
  email:
57
71
  - aoozdemir@live.com
@@ -64,11 +78,13 @@ files:
64
78
  - ".travis.yml"
65
79
  - CODE_OF_CONDUCT.md
66
80
  - Gemfile
81
+ - Gemfile.lock
67
82
  - LICENSE.txt
68
83
  - README.md
69
84
  - Rakefile
70
85
  - bin/console
71
86
  - bin/setup
87
+ - examples/object_example.rb
72
88
  - lib/pikk.rb
73
89
  - lib/pikk/main.rb
74
90
  - lib/pikk/version.rb