Skip to content

Commit 6acce79

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

File tree

1 file changed

+33
-8
lines changed

1 file changed

+33
-8
lines changed

Diff for: lightning/src/routing/scoring.rs

+33-8
Original file line numberDiff line numberDiff line change
@@ -1967,13 +1967,21 @@ mod bucketed_history {
19671967
*bucket = (*bucket + other.buckets[index]) / 2;
19681968
}
19691969
}
1970+
1971+
/// Applies decay at the given half-life to all buckets.
1972+
fn decay(&mut self, half_lives: f64) {
1973+
let factor = (1024.0 * powf64(0.5, half_lives)) as u64;
1974+
for bucket in self.buckets.iter_mut() {
1975+
*bucket = ((*bucket as u64) * factor / 1024) as u16;
1976+
}
1977+
}
19701978
}
19711979

19721980
impl_writeable_tlv_based!(HistoricalBucketRangeTracker, { (0, buckets, required) });
19731981
impl_writeable_tlv_based!(LegacyHistoricalBucketRangeTracker, { (0, buckets, required) });
19741982

19751983
#[derive(Clone, Copy)]
1976-
#[repr(C)] // Force the fields in memory to be in the order we specify.
1984+
#[repr(C)]// Force the fields in memory to be in the order we specify.
19771985
pub(super) struct HistoricalLiquidityTracker {
19781986
// This struct sits inside a `(u64, ChannelLiquidity)` in memory, and we first read the
19791987
// liquidity offsets in `ChannelLiquidity` when calculating the non-historical score. This
@@ -2021,13 +2029,8 @@ mod bucketed_history {
20212029
}
20222030

20232031
pub(super) fn decay_buckets(&mut self, half_lives: f64) {
2024-
let divisor = powf64(2048.0, half_lives) as u64;
2025-
for bucket in self.min_liquidity_offset_history.buckets.iter_mut() {
2026-
*bucket = ((*bucket as u64) * 1024 / divisor) as u16;
2027-
}
2028-
for bucket in self.max_liquidity_offset_history.buckets.iter_mut() {
2029-
*bucket = ((*bucket as u64) * 1024 / divisor) as u16;
2030-
}
2032+
self.min_liquidity_offset_history.decay(half_lives);
2033+
self.max_liquidity_offset_history.decay(half_lives);
20312034
self.recalculate_valid_point_count();
20322035
}
20332036

@@ -2266,6 +2269,28 @@ mod bucketed_history {
22662269
);
22672270
}
22682271

2272+
#[test]
2273+
fn historical_liquidity_bucket_decay() {
2274+
let mut bucket = HistoricalBucketRangeTracker::new();
2275+
bucket.track_datapoint(100, 1000);
2276+
assert_eq!(
2277+
bucket.buckets,
2278+
[
2279+
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,
2280+
0, 0, 0, 0, 0, 0, 0
2281+
]
2282+
);
2283+
2284+
bucket.decay(2.0);
2285+
assert_eq!(
2286+
bucket.buckets,
2287+
[
2288+
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,
2289+
0, 0, 0, 0, 0, 0, 0
2290+
]
2291+
);
2292+
}
2293+
22692294
#[test]
22702295
fn historical_liquidity_tracker_merge() {
22712296
let params = ProbabilisticScoringFeeParameters::default();

0 commit comments

Comments
 (0)