weighted_list_rank 0.2.0 → 0.3.1

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 801eb04183d7dec5f99bfbcb76a902a920dcfee105f83f0c0c9a98667b73e6e4
4
- data.tar.gz: c5c5665b7205bc0fd52c4c7d23f34103ba2dfd764579e0a575897f8ce36e95af
3
+ metadata.gz: bf34a6c62fda7d3038b31da0d7c8d9ec0b9a86a1b0204308e44d950e599f95b7
4
+ data.tar.gz: 3ed6316fa225185f79afa58899f2b0d29c0abb072c7835492be8dc14b1151b39
5
5
  SHA512:
6
- metadata.gz: 210d7a10b0978195b26a0fd3cbdfd068b93e09066ac332984e165d011170abb544837fc4aafd6cb410055bd7b412199733ca2d37e1190630aa5bd650f8f5df9a
7
- data.tar.gz: 65adb83584d5b1ec5d2282a0f8411edb147eb700f3030e9ab4c80def5ca8d2d7963166091cda87e8ea8a603a1c7f7168d28b661c2cbf0a4c6807b3617c47551c
6
+ metadata.gz: ff08f7f218c00bd592e6c54a8862df527fb8c75cbfdf28ec4ccad44221c73b3fb699f590b0e8cb82c7b9e023e42f0fd285dab907a766864b88360cfb622dcdc2
7
+ data.tar.gz: 760b3d89d47fce1c4fa48899bdd9f58ee925bbe90937988028b1162f19b6afb4f157b37a7ff68b4964d6581f288834e9a065c372f68ca22bf0d31f572cda9806
data/.rubocop.yml CHANGED
File without changes
data/CHANGELOG.md CHANGED
@@ -1,5 +1,13 @@
1
1
  ## [Unreleased]
2
2
 
3
+ ## [0.3.1] - 2024-05-026
4
+
5
+ - Fixed issue with lists with only a single item getting bonus points
6
+
7
+ ## [0.3.0] - 2024-02-03
8
+
9
+ - added bonus_pool_percentage feature to expoential
10
+
3
11
  ## [0.2.0] - 2024-02-03
4
12
 
5
13
  - refactored the exponential algorithm to only add bonus points out of a pool of 50% of a list's weight
data/CODE_OF_CONDUCT.md CHANGED
File without changes
data/Gemfile CHANGED
File without changes
data/Gemfile.lock CHANGED
@@ -1,59 +1,61 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- weighted_list_rank (0.1.1)
4
+ weighted_list_rank (0.3.1)
5
5
 
6
6
  GEM
7
7
  remote: https://rubygems.org/
8
8
  specs:
9
9
  ast (2.4.2)
10
- json (2.7.1)
10
+ json (2.7.2)
11
11
  language_server-protocol (3.17.0.3)
12
12
  lint_roller (1.1.0)
13
- minitest (5.21.2)
13
+ minitest (5.23.1)
14
14
  parallel (1.24.0)
15
- parser (3.3.0.5)
15
+ parser (3.3.1.0)
16
16
  ast (~> 2.4.1)
17
17
  racc
18
- racc (1.7.3)
18
+ racc (1.8.0)
19
19
  rainbow (3.1.1)
20
- rake (13.1.0)
21
- regexp_parser (2.9.0)
22
- rexml (3.2.6)
23
- rubocop (1.59.0)
20
+ rake (13.2.1)
21
+ regexp_parser (2.9.2)
22
+ rexml (3.2.8)
23
+ strscan (>= 3.0.9)
24
+ rubocop (1.63.5)
24
25
  json (~> 2.3)
25
26
  language_server-protocol (>= 3.17.0)
26
27
  parallel (~> 1.10)
27
- parser (>= 3.2.2.4)
28
+ parser (>= 3.3.0.2)
28
29
  rainbow (>= 2.2.2, < 4.0)
29
30
  regexp_parser (>= 1.8, < 3.0)
30
31
  rexml (>= 3.2.5, < 4.0)
31
- rubocop-ast (>= 1.30.0, < 2.0)
32
+ rubocop-ast (>= 1.31.1, < 2.0)
32
33
  ruby-progressbar (~> 1.7)
33
34
  unicode-display_width (>= 2.4.0, < 3.0)
34
- rubocop-ast (1.30.0)
35
- parser (>= 3.2.1.0)
36
- rubocop-minitest (0.34.5)
37
- rubocop (>= 1.39, < 2.0)
38
- rubocop-ast (>= 1.30.0, < 2.0)
39
- rubocop-performance (1.20.2)
35
+ rubocop-ast (1.31.3)
36
+ parser (>= 3.3.1.0)
37
+ rubocop-minitest (0.35.0)
38
+ rubocop (>= 1.61, < 2.0)
39
+ rubocop-ast (>= 1.31.1, < 2.0)
40
+ rubocop-performance (1.21.0)
40
41
  rubocop (>= 1.48.1, < 2.0)
41
- rubocop-ast (>= 1.30.0, < 2.0)
42
+ rubocop-ast (>= 1.31.1, < 2.0)
42
43
  rubocop-rake (0.6.0)
43
44
  rubocop (~> 1.0)
44
45
  ruby-progressbar (1.13.0)
45
- standard (1.33.0)
46
+ standard (1.36.0)
46
47
  language_server-protocol (~> 3.17.0.2)
47
48
  lint_roller (~> 1.0)
48
- rubocop (~> 1.59.0)
49
+ rubocop (~> 1.63.0)
49
50
  standard-custom (~> 1.0.0)
50
- standard-performance (~> 1.3)
51
+ standard-performance (~> 1.4)
51
52
  standard-custom (1.0.2)
52
53
  lint_roller (~> 1.0)
53
54
  rubocop (~> 1.50)
54
- standard-performance (1.3.1)
55
+ standard-performance (1.4.0)
55
56
  lint_roller (~> 1.1)
56
- rubocop-performance (~> 1.20.2)
57
+ rubocop-performance (~> 1.21.0)
58
+ strscan (3.1.0)
57
59
  unicode-display_width (2.5.0)
58
60
 
59
61
  PLATFORMS
data/LICENSE.txt CHANGED
File without changes
data/README.md CHANGED
File without changes
data/Rakefile CHANGED
File without changes
File without changes
File without changes
File without changes
@@ -1,28 +1,52 @@
1
1
  module WeightedListRank
2
2
  module Strategies
3
+ # The Exponential strategy calculates the score of an item within a list using an exponential formula.
4
+ # This strategy emphasizes the significance of an item's rank within the list, where items with higher
5
+ # ranks (closer to 1) are exponentially more valuable than those with lower ranks. The magnitude of the bonus
6
+ # applied to each item's score is determined by the bonus pool percentage of the list's total weight.
7
+ #
8
+ # The exponential nature of the calculation is controlled by the +exponent+ attribute, allowing for
9
+ # flexible adjustment of how steeply the score decreases as rank increases. The +bonus_pool_percentage+
10
+ # attribute determines the size of the bonus pool as a percentage of the list's total weight, allowing
11
+ # customization of the bonus impact on the final scores.
3
12
  class Exponential < WeightedListRank::Strategy
13
+ # The exponent used in the score calculation formula. Higher values increase the rate at which
14
+ # scores decrease as item rank increases.
15
+ #
16
+ # @return [Float] the exponent value
4
17
  attr_reader :exponent
5
18
 
6
- # Initializes a new instance of the Exponential strategy with an optional exponent.
19
+ # The percentage of the list's total weight that constitutes the bonus pool. This value determines
20
+ # how the total bonus pool is calculated as a percentage of the list's weight.
21
+ #
22
+ # @return [Float] the bonus pool percentage, defaulting to 1.0 (100% of the list's weight).
23
+ attr_reader :bonus_pool_percentage
24
+
25
+ # Initializes a new instance of the Exponential strategy with optional parameters for exponent and
26
+ # bonus pool percentage.
7
27
  # @param exponent [Float] the exponent to use in the score calculation formula, defaults to 1.5.
8
- def initialize(exponent: 1.5)
28
+ # @param bonus_pool_percentage [Float] the percentage of the list's weight to be used as the bonus pool,
29
+ # defaults to 1.0 (100%).
30
+ def initialize(exponent: 1.5, bonus_pool_percentage: 1.0)
9
31
  @exponent = exponent
32
+ @bonus_pool_percentage = bonus_pool_percentage
10
33
  end
11
34
 
12
35
  # Calculates the score of an item within a list based on its rank position, the total number of items,
13
- # and the list's weight, using an exponential formula.
14
- # The bonus pool is set to 50% of the list's weight.
36
+ # and the list's weight, using an exponential formula. The bonus pool for score adjustments is determined
37
+ # by the specified bonus pool percentage of the list's total weight.
15
38
  #
16
39
  # @param list [WeightedListRank::List] the list containing the item being scored.
17
40
  # @param item [WeightedListRank::Item] the item for which to calculate the score.
18
41
  #
19
- # @return [Float] the calculated score for the item, adjusted by the list's weight and the specified exponent.
42
+ # @return [Float] the calculated score for the item, adjusted by the list's weight, the specified exponent,
43
+ # and the bonus pool percentage.
20
44
  def calculate_score(list, item)
21
45
  # Return the list weight if there are no positions
22
- return list.weight if item.position.nil?
46
+ return list.weight if item.position.nil? || list.items.count == 1
23
47
 
24
48
  num_items = list.items.count
25
- total_bonus_pool = list.weight * 0.5 # Bonus pool is 50% of the list's weight
49
+ total_bonus_pool = list.weight * bonus_pool_percentage
26
50
 
27
51
  # Calculate the exponential factor for the item's rank position
28
52
  exponential_factor = (num_items + 1 - item.position)**exponent
File without changes
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module WeightedListRank
4
- VERSION = "0.2.0"
4
+ VERSION = "0.3.1"
5
5
  end
File without changes
File without changes
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: weighted_list_rank
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.0
4
+ version: 0.3.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Shane Sherman
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2024-02-04 00:00:00.000000000 Z
11
+ date: 2024-05-26 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rubocop
@@ -89,7 +89,6 @@ files:
89
89
  - lib/weighted_list_rank/strategy.rb
90
90
  - lib/weighted_list_rank/version.rb
91
91
  - sig/weighted_list_rank.rbs
92
- - weighted_list_rank.gemspec
93
92
  homepage: https://github.com/ssherman/weighted_list_rank
94
93
  licenses:
95
94
  - MIT
@@ -1,42 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require_relative "lib/weighted_list_rank/version"
4
-
5
- Gem::Specification.new do |spec|
6
- spec.name = "weighted_list_rank"
7
- spec.version = WeightedListRank::VERSION
8
- spec.authors = ["Shane Sherman"]
9
- spec.email = ["shane.sherman@gmail.com"]
10
-
11
- spec.summary = "generate ranks of items from weighted lists"
12
- spec.description = "generate ranks of items from weighted lists"
13
- spec.homepage = "https://github.com/ssherman/weighted_list_rank"
14
- spec.license = "MIT"
15
- spec.required_ruby_version = ">= 2.6.0"
16
-
17
- # spec.metadata["allowed_push_host"] = "TODO: Set to your gem server 'https://example.com'"
18
-
19
- spec.metadata["homepage_uri"] = spec.homepage
20
- spec.metadata["source_code_uri"] = "https://github.com/ssherman/weighted_list_rank"
21
- spec.metadata["changelog_uri"] = "https://github.com/ssherman/weighted_list_rank/CHANGELOG.md"
22
-
23
- # Specify which files should be added to the gem when it is released.
24
- # The `git ls-files -z` loads the files in the RubyGem that have been added into git.
25
- spec.files = Dir.chdir(__dir__) do
26
- `git ls-files -z`.split("\x0").reject do |f|
27
- (f == __FILE__) || f.match(%r{\A(?:(?:bin|test|spec|features)/|\.(?:git|travis|circleci)|appveyor)})
28
- end
29
- end
30
- spec.bindir = "exe"
31
- spec.executables = spec.files.grep(%r{\Aexe/}) { |f| File.basename(f) }
32
- spec.require_paths = ["lib"]
33
-
34
- # Uncomment to register a new dependency of your gem
35
- # spec.add_dependency "example-gem", "~> 1.0"
36
- spec.add_development_dependency "rubocop", "~> 1.0"
37
- spec.add_development_dependency "standard", "~> 1.0"
38
- spec.add_development_dependency "rubocop-minitest", "~> 0.3"
39
- spec.add_development_dependency "rubocop-rake", "~> 0.6"
40
- # For more information and examples about making a new gem, check out our
41
- # guide at: https://bundler.io/guides/creating_gem.html
42
- end