Skip to content

Commit b459831

Browse files
committed
fix historical liquidity bucket decay
The formula for applying half lives was incorrect. Test coverage added.
1 parent 6ad185f commit b459831

File tree

1 file changed

+33
-8
lines changed

1 file changed

+33
-8
lines changed

lightning/src/routing/scoring.rs

+33-8
Original file line numberDiff line numberDiff line change
@@ -1963,13 +1963,21 @@ mod bucketed_history {
19631963
*bucket = (*bucket + other.buckets[index]) / 2;
19641964
}
19651965
}
1966+
1967+
/// Applies decay at the given half-life to all buckets.
1968+
fn decay(&mut self, half_lives: f64) {
1969+
let factor = (1024.0 * powf64(0.5, half_lives)) as u64;
1970+
for bucket in self.buckets.iter_mut() {
1971+
*bucket = ((*bucket as u64) * factor / 1024) as u16;
1972+
}
1973+
}
19661974
}
19671975

19681976
impl_writeable_tlv_based!(HistoricalBucketRangeTracker, { (0, buckets, required) });
19691977
impl_writeable_tlv_based!(LegacyHistoricalBucketRangeTracker, { (0, buckets, required) });
19701978

19711979
#[derive(Clone, Copy)]
1972-
#[repr(C)] // Force the fields in memory to be in the order we specify.
1980+
#[repr(C)]// Force the fields in memory to be in the order we specify.
19731981
pub(super) struct HistoricalLiquidityTracker {
19741982
// This struct sits inside a `(u64, ChannelLiquidity)` in memory, and we first read the
19751983
// liquidity offsets in `ChannelLiquidity` when calculating the non-historical score. This
@@ -2017,13 +2025,8 @@ mod bucketed_history {
20172025
}
20182026

20192027
pub(super) fn decay_buckets(&mut self, half_lives: f64) {
2020-
let divisor = powf64(2048.0, half_lives) as u64;
2021-
for bucket in self.min_liquidity_offset_history.buckets.iter_mut() {
2022-
*bucket = ((*bucket as u64) * 1024 / divisor) as u16;
2023-
}
2024-
for bucket in self.max_liquidity_offset_history.buckets.iter_mut() {
2025-
*bucket = ((*bucket as u64) * 1024 / divisor) as u16;
2026-
}
2028+
self.min_liquidity_offset_history.decay(half_lives);
2029+
self.max_liquidity_offset_history.decay(half_lives);
20272030
self.recalculate_valid_point_count();
20282031
}
20292032

@@ -2262,6 +2265,28 @@ mod bucketed_history {
22622265
);
22632266
}
22642267

2268+
#[test]
2269+
fn historical_liquidity_bucket_decay() {
2270+
let mut bucket = HistoricalBucketRangeTracker::new();
2271+
bucket.track_datapoint(100, 1000);
2272+
assert_eq!(
2273+
bucket.buckets,
2274+
[
2275+
0u16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
2276+
0, 0, 0, 0, 0, 0, 0
2277+
]
2278+
);
2279+
2280+
bucket.decay(2.0);
2281+
assert_eq!(
2282+
bucket.buckets,
2283+
[
2284+
0u16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
2285+
0, 0, 0, 0, 0, 0, 0
2286+
]
2287+
);
2288+
}
2289+
22652290
#[test]
22662291
fn historical_liquidity_tracker_merge() {
22672292
let params = ProbabilisticScoringFeeParameters::default();

0 commit comments

Comments
 (0)