weighted_list_rank 0.2.0 → 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 +4 -4
- data/CHANGELOG.md +4 -0
- data/lib/weighted_list_rank/strategies/exponential.rb +30 -6
- data/lib/weighted_list_rank/version.rb +1 -1
- metadata +1 -1
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 02c97cc567dfd099a6f65066c534b3780d1a8ca7f8b6a2148d6410c348ed6db9
|
4
|
+
data.tar.gz: 235f31a73f88b44485d5c5a0fae360d6f4fe2a417e380ddaccadfa214af4d5d6
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: e908050bff4073ce084cc6b20a30992a52a08d93dc2732ae4e891605d2dc3c761166a79e90093ddb5b345ebe9da344c4ebe430fd9d9e1b780bccced0d4ee97fb
|
7
|
+
data.tar.gz: 67fa8168ec949cbdcb3c1dc728d8461ae0a4bf51234cef9d251eaf10b63eb8ca617d55945a719ea297cfe24c42a1ab89c871f8f090af601c97ec21f22b0c2b6f
|
data/CHANGELOG.md
CHANGED
@@ -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
|
-
#
|
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
|
-
|
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
|
-
#
|
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
|
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
46
|
return list.weight if item.position.nil?
|
23
47
|
|
24
48
|
num_items = list.items.count
|
25
|
-
total_bonus_pool = list.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
|