weighted_list_rank 0.1.3 → 0.3.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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: a649927ba7b5ed331d9721b6a9ba7aa044017956b0aec6484649ee7c9d8d55e1
4
- data.tar.gz: '01833e4d548f1df8c2428dcce387bf57652c91ea1bf53044420d8720e2137d10'
3
+ metadata.gz: 02c97cc567dfd099a6f65066c534b3780d1a8ca7f8b6a2148d6410c348ed6db9
4
+ data.tar.gz: 235f31a73f88b44485d5c5a0fae360d6f4fe2a417e380ddaccadfa214af4d5d6
5
5
  SHA512:
6
- metadata.gz: 4fec2c7d118e678ee0284e9db56e99125681f5d67268250a3e0db142ea76edf1e9dd58f9b0c53fdfdb3f560feb25e5a731fb33ad71164f0ab45e9ca601ec9be4
7
- data.tar.gz: d24a0349aeec1813215a3b842a22729de2f90c144a75944872bf000e46008567fee30d8fccfb1b209051cf34d54a616c1faa5411ac2f135d9cfc2bc5eef7371e
6
+ metadata.gz: e908050bff4073ce084cc6b20a30992a52a08d93dc2732ae4e891605d2dc3c761166a79e90093ddb5b345ebe9da344c4ebe430fd9d9e1b780bccced0d4ee97fb
7
+ data.tar.gz: 67fa8168ec949cbdcb3c1dc728d8461ae0a4bf51234cef9d251eaf10b63eb8ca617d55945a719ea297cfe24c42a1ab89c871f8f090af601c97ec21f22b0c2b6f
data/CHANGELOG.md CHANGED
@@ -1,8 +1,16 @@
1
1
  ## [Unreleased]
2
2
 
3
+ ## [0.3.0] - 2024-02-03
4
+
5
+ - added bonus_pool_percentage feature to expoential
6
+
7
+ ## [0.2.0] - 2024-02-03
8
+
9
+ - refactored the exponential algorithm to only add bonus points out of a pool of 50% of a list's weight
10
+
3
11
  ## [0.1.3] - 2024-02-03
4
12
 
5
- - sprt the score_details by the highest score from each list first
13
+ - sort the score_details by the highest score from each list first
6
14
 
7
15
  ## [0.1.2] - 2024-02-03
8
16
 
@@ -2,10 +2,13 @@ module WeightedListRank
2
2
  module Strategies
3
3
  # The Exponential strategy calculates the score of an item within a list using an exponential formula.
4
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.
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.
6
7
  #
7
8
  # The exponential nature of the calculation is controlled by the +exponent+ attribute, allowing for
8
- # flexible adjustment of how steeply the score decreases as rank increases.
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.
9
12
  class Exponential < WeightedListRank::Strategy
10
13
  # The exponent used in the score calculation formula. Higher values increase the rate at which
11
14
  # scores decrease as item rank increases.
@@ -13,32 +16,47 @@ module WeightedListRank
13
16
  # @return [Float] the exponent value
14
17
  attr_reader :exponent
15
18
 
16
- # 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.
17
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.
18
27
  # @param exponent [Float] the exponent to use in the score calculation formula, defaults to 1.5.
19
- 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)
20
31
  @exponent = exponent
32
+ @bonus_pool_percentage = bonus_pool_percentage
21
33
  end
22
34
 
23
35
  # Calculates the score of an item within a list based on its rank position, the total number of items,
24
- # and the list's weight, using an exponential formula.
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.
25
38
  #
26
39
  # @param list [WeightedListRank::List] the list containing the item being scored.
27
40
  # @param item [WeightedListRank::Item] the item for which to calculate the score.
28
41
  #
29
- # @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.
30
44
  def calculate_score(list, item)
31
- rank_position = item.position
32
-
33
- # if there are no positions, then just return the list weight
34
- return list.weight if rank_position.nil?
45
+ # Return the list weight if there are no positions
46
+ return list.weight if item.position.nil?
35
47
 
36
48
  num_items = list.items.count
49
+ total_bonus_pool = list.weight * bonus_pool_percentage
50
+
51
+ # Calculate the exponential factor for the item's rank position
52
+ exponential_factor = (num_items + 1 - item.position)**exponent
53
+ total_exponential_factor = (1..num_items).sum { |pos| (num_items + 1 - pos)**exponent }
54
+
55
+ # Allocate a portion of the total bonus pool based on the item's exponential factor
56
+ item_bonus = (exponential_factor / total_exponential_factor) * total_bonus_pool
37
57
 
38
- contribution = ((num_items + 1 - rank_position)**exponent) / num_items.to_f
39
- scaled_contribution = contribution / num_items
40
- bonus = scaled_contribution * list.weight
41
- list.weight + bonus
58
+ # The final score is the list's weight plus the item's allocated bonus
59
+ list.weight + item_bonus
42
60
  end
43
61
  end
44
62
  end
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module WeightedListRank
4
- VERSION = "0.1.3"
4
+ VERSION = "0.3.0"
5
5
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: weighted_list_rank
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.3
4
+ version: 0.3.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Shane Sherman