weighted_list_rank 0.2.0 → 0.3.0
Sign up to get free protection for your applications and to get access to all the features.
- 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
|