From f726a8e79c220874a47571a054b466b3c8035c82 Mon Sep 17 00:00:00 2001 From: Joost Jager Date: Fri, 24 Jan 2025 16:50:15 +0100 Subject: [PATCH] avg live bounds wip --- lightning/src/routing/scoring.rs | 61 +++++++++++++++++++------------- 1 file changed, 36 insertions(+), 25 deletions(-) diff --git a/lightning/src/routing/scoring.rs b/lightning/src/routing/scoring.rs index 726098210cf..26ffeccea23 100644 --- a/lightning/src/routing/scoring.rs +++ b/lightning/src/routing/scoring.rs @@ -484,7 +484,34 @@ impl ChannelLiquidities { Self(new_hash_map()) } - fn merge(&mut self, other: Self) { + fn time_passed(&mut self, duration_since_epoch: Duration, decay_params: ProbabilisticScoringDecayParameters) { + self.0.retain(|_scid, liquidity| { + liquidity.min_liquidity_offset_msat = + liquidity.decayed_offset(liquidity.min_liquidity_offset_msat, duration_since_epoch, decay_params); + liquidity.max_liquidity_offset_msat = + liquidity.decayed_offset(liquidity.max_liquidity_offset_msat, duration_since_epoch, decay_params); + liquidity.last_updated = duration_since_epoch; + + // TODO: Call decay multiple times. + let elapsed_time = + duration_since_epoch.saturating_sub(liquidity.offset_history_last_updated); + if elapsed_time > decay_params.historical_no_updates_half_life { + let half_life = decay_params.historical_no_updates_half_life.as_secs_f64(); + if half_life != 0.0 { + liquidity.liquidity_history.decay_buckets(elapsed_time.as_secs_f64() / half_life); + liquidity.offset_history_last_updated = duration_since_epoch; + } + } + liquidity.min_liquidity_offset_msat != 0 || liquidity.max_liquidity_offset_msat != 0 || + liquidity.liquidity_history.has_datapoints() + }); + } + + fn merge(&mut self, mut other: Self, duration_since_epoch: Duration, decay_params: ProbabilisticScoringDecayParameters) { + // Decay both set of scores to make them comparable. + self.time_passed(duration_since_epoch, decay_params); + other.time_passed(duration_since_epoch, decay_params); + for (id, item) in other.0 { match self.0.get_mut(&id) { None => { self.0.insert(id, item); }, @@ -899,8 +926,8 @@ impl>, L: Deref> ProbabilisticScorer whe } /// Merge external channel liquidity data into the internal state. - pub fn merge(&mut self, other: ChannelLiquidities) { - self.channel_liquidities.merge(other); + pub fn merge(&mut self, other: ChannelLiquidities, duration_since_epoch: Duration) { + self.channel_liquidities.merge(other, duration_since_epoch, self.decay_params); } #[cfg(test)] @@ -1125,9 +1152,12 @@ impl ChannelLiquidity { } fn merge(&mut self, other: &Self) { - self.liquidity_history.merge(&other.liquidity_history); + // Take average for min/max liquidity offsets. + self.min_liquidity_offset_msat = (self.min_liquidity_offset_msat + other.min_liquidity_offset_msat) / 2; + self.max_liquidity_offset_msat = (self.max_liquidity_offset_msat + other.max_liquidity_offset_msat) / 2; - // TODO: Merge other fields. + // Merge historical liquidity data. + self.liquidity_history.merge(&other.liquidity_history); } /// Returns a view of the channel liquidity directed from `source` to `target` assuming @@ -1659,26 +1689,7 @@ impl>, L: Deref> ScoreUpdate for Probabilistic } fn time_passed(&mut self, duration_since_epoch: Duration) { - let decay_params = self.decay_params; - self.channel_liquidities.retain(|_scid, liquidity| { - liquidity.min_liquidity_offset_msat = - liquidity.decayed_offset(liquidity.min_liquidity_offset_msat, duration_since_epoch, decay_params); - liquidity.max_liquidity_offset_msat = - liquidity.decayed_offset(liquidity.max_liquidity_offset_msat, duration_since_epoch, decay_params); - liquidity.last_updated = duration_since_epoch; - - let elapsed_time = - duration_since_epoch.saturating_sub(liquidity.offset_history_last_updated); - if elapsed_time > decay_params.historical_no_updates_half_life { - let half_life = decay_params.historical_no_updates_half_life.as_secs_f64(); - if half_life != 0.0 { - liquidity.liquidity_history.decay_buckets(elapsed_time.as_secs_f64() / half_life); - liquidity.offset_history_last_updated = duration_since_epoch; - } - } - liquidity.min_liquidity_offset_msat != 0 || liquidity.max_liquidity_offset_msat != 0 || - liquidity.liquidity_history.has_datapoints() - }); + self.channel_liquidities.time_passed(duration_since_epoch, self.decay_params); } }