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 +4 -4
- data/CHANGELOG.md +9 -1
- data/lib/weighted_list_rank/strategies/exponential.rb +32 -14
- 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,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
|
-
-
|
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
|
-
#
|
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
|
-
|
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
|
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
|
-
|
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
|
-
|
39
|
-
|
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
|