weighted_list_rank 0.1.2 → 0.2.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 +8 -0
- data/lib/weighted_list_rank/context.rb +2 -1
- data/lib/weighted_list_rank/strategies/exponential.rb +13 -19
- data/lib/weighted_list_rank/version.rb +1 -1
- metadata +2 -2
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,5 +1,13 @@
|
|
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
|
+
|
7
|
+
## [0.1.3] - 2024-02-03
|
8
|
+
|
9
|
+
- sort the score_details by the highest score from each list first
|
10
|
+
|
3
11
|
## [0.1.2] - 2024-02-03
|
4
12
|
|
5
13
|
- Added list weight to rank result
|
@@ -34,7 +34,8 @@ module WeightedListRank
|
|
34
34
|
sorted_items = items.map do |id, details|
|
35
35
|
{
|
36
36
|
id: id,
|
37
|
-
score_details
|
37
|
+
# Sort the score_details array by score in descending order before including it
|
38
|
+
score_details: details[:list_details].sort_by { |detail| -detail[:score] },
|
38
39
|
total_score: details[:total_score]
|
39
40
|
}
|
40
41
|
end
|
@@ -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
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: weighted_list_rank
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.2.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Shane Sherman
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2024-02-
|
11
|
+
date: 2024-02-04 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rubocop
|