weighted_list_rank 0.1.3 → 0.2.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 +5 -1
- data/lib/weighted_list_rank/strategies/exponential.rb +13 -19
- 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: 801eb04183d7dec5f99bfbcb76a902a920dcfee105f83f0c0c9a98667b73e6e4
|
4
|
+
data.tar.gz: c5c5665b7205bc0fd52c4c7d23f34103ba2dfd764579e0a575897f8ce36e95af
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 210d7a10b0978195b26a0fd3cbdfd068b93e09066ac332984e165d011170abb544837fc4aafd6cb410055bd7b412199733ca2d37e1190630aa5bd650f8f5df9a
|
7
|
+
data.tar.gz: 65adb83584d5b1ec5d2282a0f8411edb147eb700f3030e9ab4c80def5ca8d2d7963166091cda87e8ea8a603a1c7f7168d28b661c2cbf0a4c6807b3617c47551c
|
data/CHANGELOG.md
CHANGED
@@ -1,8 +1,12 @@
|
|
1
1
|
## [Unreleased]
|
2
2
|
|
3
|
+
## [0.2.0] - 2024-02-03
|
4
|
+
|
5
|
+
- refactored the exponential algorithm to only add bonus points out of a pool of 50% of a list's weight
|
6
|
+
|
3
7
|
## [0.1.3] - 2024-02-03
|
4
8
|
|
5
|
-
-
|
9
|
+
- sort the score_details by the highest score from each list first
|
6
10
|
|
7
11
|
## [0.1.2] - 2024-02-03
|
8
12
|
|
@@ -1,20 +1,9 @@
|
|
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.
|
6
|
-
#
|
7
|
-
# 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
3
|
class Exponential < WeightedListRank::Strategy
|
10
|
-
# The exponent used in the score calculation formula. Higher values increase the rate at which
|
11
|
-
# scores decrease as item rank increases.
|
12
|
-
#
|
13
|
-
# @return [Float] the exponent value
|
14
4
|
attr_reader :exponent
|
15
5
|
|
16
6
|
# Initializes a new instance of the Exponential strategy with an optional exponent.
|
17
|
-
#
|
18
7
|
# @param exponent [Float] the exponent to use in the score calculation formula, defaults to 1.5.
|
19
8
|
def initialize(exponent: 1.5)
|
20
9
|
@exponent = exponent
|
@@ -22,23 +11,28 @@ module WeightedListRank
|
|
22
11
|
|
23
12
|
# Calculates the score of an item within a list based on its rank position, the total number of items,
|
24
13
|
# and the list's weight, using an exponential formula.
|
14
|
+
# The bonus pool is set to 50% of the list's weight.
|
25
15
|
#
|
26
16
|
# @param list [WeightedListRank::List] the list containing the item being scored.
|
27
17
|
# @param item [WeightedListRank::Item] the item for which to calculate the score.
|
28
18
|
#
|
29
19
|
# @return [Float] the calculated score for the item, adjusted by the list's weight and the specified exponent.
|
30
20
|
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?
|
21
|
+
# Return the list weight if there are no positions
|
22
|
+
return list.weight if item.position.nil?
|
35
23
|
|
36
24
|
num_items = list.items.count
|
25
|
+
total_bonus_pool = list.weight * 0.5 # Bonus pool is 50% of the list's weight
|
26
|
+
|
27
|
+
# Calculate the exponential factor for the item's rank position
|
28
|
+
exponential_factor = (num_items + 1 - item.position)**exponent
|
29
|
+
total_exponential_factor = (1..num_items).sum { |pos| (num_items + 1 - pos)**exponent }
|
30
|
+
|
31
|
+
# Allocate a portion of the total bonus pool based on the item's exponential factor
|
32
|
+
item_bonus = (exponential_factor / total_exponential_factor) * total_bonus_pool
|
37
33
|
|
38
|
-
|
39
|
-
|
40
|
-
bonus = scaled_contribution * list.weight
|
41
|
-
list.weight + bonus
|
34
|
+
# The final score is the list's weight plus the item's allocated bonus
|
35
|
+
list.weight + item_bonus
|
42
36
|
end
|
43
37
|
end
|
44
38
|
end
|