weighted_list_rank 0.1.3 → 0.3.0

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: 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