Stop decaying historical liquidity information during scoring
[rust-lightning] / lightning / src / routing / scoring.rs
1 // This file is Copyright its original authors, visible in version control
2 // history.
3 //
4 // This file is licensed under the Apache License, Version 2.0 <LICENSE-APACHE
5 // or http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
6 // <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your option.
7 // You may not use this file except in accordance with one or both of these
8 // licenses.
9
10 //! Utilities for scoring payment channels.
11 //!
12 //! [`ProbabilisticScorer`] may be given to [`find_route`] to score payment channels during path
13 //! finding when a custom [`ScoreLookUp`] implementation is not needed.
14 //!
15 //! # Example
16 //!
17 //! ```
18 //! # extern crate bitcoin;
19 //! #
20 //! # use lightning::routing::gossip::NetworkGraph;
21 //! # use lightning::routing::router::{RouteParameters, find_route};
22 //! # use lightning::routing::scoring::{ProbabilisticScorer, ProbabilisticScoringFeeParameters, ProbabilisticScoringDecayParameters};
23 //! # use lightning::sign::KeysManager;
24 //! # use lightning::util::logger::{Logger, Record};
25 //! # use bitcoin::secp256k1::PublicKey;
26 //! #
27 //! # struct FakeLogger {};
28 //! # impl Logger for FakeLogger {
29 //! #     fn log(&self, record: Record) { unimplemented!() }
30 //! # }
31 //! # fn find_scored_route(payer: PublicKey, route_params: RouteParameters, network_graph: NetworkGraph<&FakeLogger>) {
32 //! # let logger = FakeLogger {};
33 //! #
34 //! // Use the default channel penalties.
35 //! let params = ProbabilisticScoringFeeParameters::default();
36 //! let decay_params = ProbabilisticScoringDecayParameters::default();
37 //! let scorer = ProbabilisticScorer::new(decay_params, &network_graph, &logger);
38 //!
39 //! // Or use custom channel penalties.
40 //! let params = ProbabilisticScoringFeeParameters {
41 //!     liquidity_penalty_multiplier_msat: 2 * 1000,
42 //!     ..ProbabilisticScoringFeeParameters::default()
43 //! };
44 //! let decay_params = ProbabilisticScoringDecayParameters::default();
45 //! let scorer = ProbabilisticScorer::new(decay_params, &network_graph, &logger);
46 //! # let random_seed_bytes = [42u8; 32];
47 //!
48 //! let route = find_route(&payer, &route_params, &network_graph, None, &logger, &scorer, &params, &random_seed_bytes);
49 //! # }
50 //! ```
51 //!
52 //! # Note
53 //!
54 //! Persisting when built with feature `no-std` and restoring without it, or vice versa, uses
55 //! different types and thus is undefined.
56 //!
57 //! [`find_route`]: crate::routing::router::find_route
58
59 use crate::ln::msgs::DecodeError;
60 use crate::routing::gossip::{EffectiveCapacity, NetworkGraph, NodeId};
61 use crate::routing::router::{Path, CandidateRouteHop};
62 use crate::util::ser::{Readable, ReadableArgs, Writeable, Writer};
63 use crate::util::logger::Logger;
64 use crate::util::time::Time;
65
66 use crate::prelude::*;
67 use core::{cmp, fmt};
68 use core::cell::{RefCell, RefMut, Ref};
69 use core::convert::TryInto;
70 use core::ops::{Deref, DerefMut};
71 use core::time::Duration;
72 use crate::io::{self, Read};
73 use crate::sync::{Mutex, MutexGuard, RwLock, RwLockReadGuard, RwLockWriteGuard};
74
75 /// We define Score ever-so-slightly differently based on whether we are being built for C bindings
76 /// or not. For users, `LockableScore` must somehow be writeable to disk. For Rust users, this is
77 /// no problem - you move a `Score` that implements `Writeable` into a `Mutex`, lock it, and now
78 /// you have the original, concrete, `Score` type, which presumably implements `Writeable`.
79 ///
80 /// For C users, once you've moved the `Score` into a `LockableScore` all you have after locking it
81 /// is an opaque trait object with an opaque pointer with no type info. Users could take the unsafe
82 /// approach of blindly casting that opaque pointer to a concrete type and calling `Writeable` from
83 /// there, but other languages downstream of the C bindings (e.g. Java) can't even do that.
84 /// Instead, we really want `Score` and `LockableScore` to implement `Writeable` directly, which we
85 /// do here by defining `Score` differently for `cfg(c_bindings)`.
86 macro_rules! define_score { ($($supertrait: path)*) => {
87 /// An interface used to score payment channels for path finding.
88 ///
89 /// `ScoreLookUp` is used to determine the penalty for a given channel.
90 ///
91 /// Scoring is in terms of fees willing to be paid in order to avoid routing through a channel.
92 pub trait ScoreLookUp {
93         /// A configurable type which should contain various passed-in parameters for configuring the scorer,
94         /// on a per-routefinding-call basis through to the scorer methods,
95         /// which are used to determine the parameters for the suitability of channels for use.
96         type ScoreParams;
97         /// Returns the fee in msats willing to be paid to avoid routing `send_amt_msat` through the
98         /// given channel in the direction from `source` to `target`.
99         ///
100         /// The channel's capacity (less any other MPP parts that are also being considered for use in
101         /// the same payment) is given by `capacity_msat`. It may be determined from various sources
102         /// such as a chain data, network gossip, or invoice hints. For invoice hints, a capacity near
103         /// [`u64::max_value`] is given to indicate sufficient capacity for the invoice's full amount.
104         /// Thus, implementations should be overflow-safe.
105         fn channel_penalty_msat(
106                 &self, candidate: &CandidateRouteHop, usage: ChannelUsage, score_params: &Self::ScoreParams
107         ) -> u64;
108 }
109
110 /// `ScoreUpdate` is used to update the scorer's internal state after a payment attempt.
111 pub trait ScoreUpdate {
112         /// Handles updating channel penalties after failing to route through a channel.
113         fn payment_path_failed(&mut self, path: &Path, short_channel_id: u64, duration_since_epoch: Duration);
114
115         /// Handles updating channel penalties after successfully routing along a path.
116         fn payment_path_successful(&mut self, path: &Path, duration_since_epoch: Duration);
117
118         /// Handles updating channel penalties after a probe over the given path failed.
119         fn probe_failed(&mut self, path: &Path, short_channel_id: u64, duration_since_epoch: Duration);
120
121         /// Handles updating channel penalties after a probe over the given path succeeded.
122         fn probe_successful(&mut self, path: &Path, duration_since_epoch: Duration);
123
124         /// Scorers may wish to reduce their certainty of channel liquidity information over time.
125         /// Thus, this method is provided to allow scorers to observe the passage of time - the holder
126         /// of this object should call this method regularly (generally via the
127         /// `lightning-background-processor` crate).
128         fn time_passed(&mut self, duration_since_epoch: Duration);
129 }
130
131 /// A trait which can both lookup and update routing channel penalty scores.
132 ///
133 /// This is used in places where both bounds are required and implemented for all types which
134 /// implement [`ScoreLookUp`] and [`ScoreUpdate`].
135 ///
136 /// Bindings users may need to manually implement this for their custom scoring implementations.
137 pub trait Score : ScoreLookUp + ScoreUpdate $(+ $supertrait)* {}
138
139 #[cfg(not(c_bindings))]
140 impl<T: ScoreLookUp + ScoreUpdate $(+ $supertrait)*> Score for T {}
141
142 #[cfg(not(c_bindings))]
143 impl<S: ScoreLookUp, T: Deref<Target=S>> ScoreLookUp for T {
144         type ScoreParams = S::ScoreParams;
145         fn channel_penalty_msat(
146                 &self, candidate: &CandidateRouteHop, usage: ChannelUsage, score_params: &Self::ScoreParams
147         ) -> u64 {
148                 self.deref().channel_penalty_msat(candidate, usage, score_params)
149         }
150 }
151
152 #[cfg(not(c_bindings))]
153 impl<S: ScoreUpdate, T: DerefMut<Target=S>> ScoreUpdate for T {
154         fn payment_path_failed(&mut self, path: &Path, short_channel_id: u64, duration_since_epoch: Duration) {
155                 self.deref_mut().payment_path_failed(path, short_channel_id, duration_since_epoch)
156         }
157
158         fn payment_path_successful(&mut self, path: &Path, duration_since_epoch: Duration) {
159                 self.deref_mut().payment_path_successful(path, duration_since_epoch)
160         }
161
162         fn probe_failed(&mut self, path: &Path, short_channel_id: u64, duration_since_epoch: Duration) {
163                 self.deref_mut().probe_failed(path, short_channel_id, duration_since_epoch)
164         }
165
166         fn probe_successful(&mut self, path: &Path, duration_since_epoch: Duration) {
167                 self.deref_mut().probe_successful(path, duration_since_epoch)
168         }
169
170         fn time_passed(&mut self, duration_since_epoch: Duration) {
171                 self.deref_mut().time_passed(duration_since_epoch)
172         }
173 }
174 } }
175
176 #[cfg(c_bindings)]
177 define_score!(Writeable);
178
179 #[cfg(not(c_bindings))]
180 define_score!();
181
182 /// A scorer that is accessed under a lock.
183 ///
184 /// Needed so that calls to [`ScoreLookUp::channel_penalty_msat`] in [`find_route`] can be made while
185 /// having shared ownership of a scorer but without requiring internal locking in [`ScoreUpdate`]
186 /// implementations. Internal locking would be detrimental to route finding performance and could
187 /// result in [`ScoreLookUp::channel_penalty_msat`] returning a different value for the same channel.
188 ///
189 /// [`find_route`]: crate::routing::router::find_route
190 pub trait LockableScore<'a> {
191         /// The [`ScoreUpdate`] type.
192         type ScoreUpdate: 'a + ScoreUpdate;
193         /// The [`ScoreLookUp`] type.
194         type ScoreLookUp: 'a + ScoreLookUp;
195
196         /// The write locked [`ScoreUpdate`] type.
197         type WriteLocked: DerefMut<Target = Self::ScoreUpdate> + Sized;
198
199         /// The read locked [`ScoreLookUp`] type.
200         type ReadLocked: Deref<Target = Self::ScoreLookUp> + Sized;
201
202         /// Returns read locked scorer.
203         fn read_lock(&'a self) -> Self::ReadLocked;
204
205         /// Returns write locked scorer.
206         fn write_lock(&'a self) -> Self::WriteLocked;
207 }
208
209 /// Refers to a scorer that is accessible under lock and also writeable to disk
210 ///
211 /// We need this trait to be able to pass in a scorer to `lightning-background-processor` that will enable us to
212 /// use the Persister to persist it.
213 pub trait WriteableScore<'a>: LockableScore<'a> + Writeable {}
214
215 #[cfg(not(c_bindings))]
216 impl<'a, T> WriteableScore<'a> for T where T: LockableScore<'a> + Writeable {}
217 #[cfg(not(c_bindings))]
218 impl<'a, T: Score + 'a> LockableScore<'a> for Mutex<T> {
219         type ScoreUpdate = T;
220         type ScoreLookUp = T;
221
222         type WriteLocked = MutexGuard<'a, Self::ScoreUpdate>;
223         type ReadLocked = MutexGuard<'a, Self::ScoreLookUp>;
224
225         fn read_lock(&'a self) -> Self::ReadLocked {
226                 Mutex::lock(self).unwrap()
227         }
228
229         fn write_lock(&'a self) -> Self::WriteLocked {
230                 Mutex::lock(self).unwrap()
231         }
232 }
233
234 #[cfg(not(c_bindings))]
235 impl<'a, T: Score + 'a> LockableScore<'a> for RefCell<T> {
236         type ScoreUpdate = T;
237         type ScoreLookUp = T;
238
239         type WriteLocked = RefMut<'a, Self::ScoreUpdate>;
240         type ReadLocked = Ref<'a, Self::ScoreLookUp>;
241
242         fn write_lock(&'a self) -> Self::WriteLocked {
243                 self.borrow_mut()
244         }
245
246         fn read_lock(&'a self) -> Self::ReadLocked {
247                 self.borrow()
248         }
249 }
250
251 #[cfg(not(c_bindings))]
252 impl<'a, T: Score + 'a> LockableScore<'a> for RwLock<T> {
253         type ScoreUpdate = T;
254         type ScoreLookUp = T;
255
256         type WriteLocked = RwLockWriteGuard<'a, Self::ScoreLookUp>;
257         type ReadLocked = RwLockReadGuard<'a, Self::ScoreUpdate>;
258
259         fn read_lock(&'a self) -> Self::ReadLocked {
260                 RwLock::read(self).unwrap()
261         }
262
263         fn write_lock(&'a self) -> Self::WriteLocked {
264                 RwLock::write(self).unwrap()
265         }
266 }
267
268 #[cfg(c_bindings)]
269 /// A concrete implementation of [`LockableScore`] which supports multi-threading.
270 pub struct MultiThreadedLockableScore<T: Score> {
271         score: RwLock<T>,
272 }
273
274 #[cfg(c_bindings)]
275 impl<'a, T: Score + 'a> LockableScore<'a> for MultiThreadedLockableScore<T> {
276         type ScoreUpdate = T;
277         type ScoreLookUp = T;
278         type WriteLocked = MultiThreadedScoreLockWrite<'a, Self::ScoreUpdate>;
279         type ReadLocked = MultiThreadedScoreLockRead<'a, Self::ScoreLookUp>;
280
281         fn read_lock(&'a self) -> Self::ReadLocked {
282                 MultiThreadedScoreLockRead(self.score.read().unwrap())
283         }
284
285         fn write_lock(&'a self) -> Self::WriteLocked {
286                 MultiThreadedScoreLockWrite(self.score.write().unwrap())
287         }
288 }
289
290 #[cfg(c_bindings)]
291 impl<T: Score> Writeable for MultiThreadedLockableScore<T> {
292         fn write<W: Writer>(&self, writer: &mut W) -> Result<(), io::Error> {
293                 self.score.read().unwrap().write(writer)
294         }
295 }
296
297 #[cfg(c_bindings)]
298 impl<'a, T: Score + 'a> WriteableScore<'a> for MultiThreadedLockableScore<T> {}
299
300 #[cfg(c_bindings)]
301 impl<T: Score> MultiThreadedLockableScore<T> {
302         /// Creates a new [`MultiThreadedLockableScore`] given an underlying [`Score`].
303         pub fn new(score: T) -> Self {
304                 MultiThreadedLockableScore { score: RwLock::new(score) }
305         }
306 }
307
308 #[cfg(c_bindings)]
309 /// A locked `MultiThreadedLockableScore`.
310 pub struct MultiThreadedScoreLockRead<'a, T: Score>(RwLockReadGuard<'a, T>);
311
312 #[cfg(c_bindings)]
313 /// A locked `MultiThreadedLockableScore`.
314 pub struct MultiThreadedScoreLockWrite<'a, T: Score>(RwLockWriteGuard<'a, T>);
315
316 #[cfg(c_bindings)]
317 impl<'a, T: 'a + Score> Deref for MultiThreadedScoreLockRead<'a, T> {
318         type Target = T;
319
320         fn deref(&self) -> &Self::Target {
321                 self.0.deref()
322         }
323 }
324
325 #[cfg(c_bindings)]
326 impl<'a, T: Score> ScoreLookUp for MultiThreadedScoreLockRead<'a, T> {
327         type ScoreParams = T::ScoreParams;
328         fn channel_penalty_msat(&self, candidate:&CandidateRouteHop, usage: ChannelUsage, score_params: &Self::ScoreParams
329         ) -> u64 {
330                 self.0.channel_penalty_msat(candidate, usage, score_params)
331         }
332 }
333
334 #[cfg(c_bindings)]
335 impl<'a, T: Score> Writeable for MultiThreadedScoreLockWrite<'a, T> {
336         fn write<W: Writer>(&self, writer: &mut W) -> Result<(), io::Error> {
337                 self.0.write(writer)
338         }
339 }
340
341 #[cfg(c_bindings)]
342 impl<'a, T: 'a + Score> Deref for MultiThreadedScoreLockWrite<'a, T> {
343         type Target = T;
344
345         fn deref(&self) -> &Self::Target {
346                 self.0.deref()
347         }
348 }
349
350 #[cfg(c_bindings)]
351 impl<'a, T: 'a + Score> DerefMut for MultiThreadedScoreLockWrite<'a, T> {
352         fn deref_mut(&mut self) -> &mut Self::Target {
353                 self.0.deref_mut()
354         }
355 }
356
357 #[cfg(c_bindings)]
358 impl<'a, T: Score> ScoreUpdate for MultiThreadedScoreLockWrite<'a, T> {
359         fn payment_path_failed(&mut self, path: &Path, short_channel_id: u64, duration_since_epoch: Duration) {
360                 self.0.payment_path_failed(path, short_channel_id, duration_since_epoch)
361         }
362
363         fn payment_path_successful(&mut self, path: &Path, duration_since_epoch: Duration) {
364                 self.0.payment_path_successful(path, duration_since_epoch)
365         }
366
367         fn probe_failed(&mut self, path: &Path, short_channel_id: u64, duration_since_epoch: Duration) {
368                 self.0.probe_failed(path, short_channel_id, duration_since_epoch)
369         }
370
371         fn probe_successful(&mut self, path: &Path, duration_since_epoch: Duration) {
372                 self.0.probe_successful(path, duration_since_epoch)
373         }
374
375         fn time_passed(&mut self, duration_since_epoch: Duration) {
376                 self.0.time_passed(duration_since_epoch)
377         }
378 }
379
380
381 /// Proposed use of a channel passed as a parameter to [`ScoreLookUp::channel_penalty_msat`].
382 #[derive(Clone, Copy, Debug, PartialEq)]
383 pub struct ChannelUsage {
384         /// The amount to send through the channel, denominated in millisatoshis.
385         pub amount_msat: u64,
386
387         /// Total amount, denominated in millisatoshis, already allocated to send through the channel
388         /// as part of a multi-path payment.
389         pub inflight_htlc_msat: u64,
390
391         /// The effective capacity of the channel.
392         pub effective_capacity: EffectiveCapacity,
393 }
394
395 #[derive(Clone)]
396 /// [`ScoreLookUp`] implementation that uses a fixed penalty.
397 pub struct FixedPenaltyScorer {
398         penalty_msat: u64,
399 }
400
401 impl FixedPenaltyScorer {
402         /// Creates a new scorer using `penalty_msat`.
403         pub fn with_penalty(penalty_msat: u64) -> Self {
404                 Self { penalty_msat }
405         }
406 }
407
408 impl ScoreLookUp for FixedPenaltyScorer {
409         type ScoreParams = ();
410         fn channel_penalty_msat(&self, _: &CandidateRouteHop, _: ChannelUsage, _score_params: &Self::ScoreParams) -> u64 {
411                 self.penalty_msat
412         }
413 }
414
415 impl ScoreUpdate for FixedPenaltyScorer {
416         fn payment_path_failed(&mut self, _path: &Path, _short_channel_id: u64, _duration_since_epoch: Duration) {}
417
418         fn payment_path_successful(&mut self, _path: &Path, _duration_since_epoch: Duration) {}
419
420         fn probe_failed(&mut self, _path: &Path, _short_channel_id: u64, _duration_since_epoch: Duration) {}
421
422         fn probe_successful(&mut self, _path: &Path, _duration_since_epoch: Duration) {}
423
424         fn time_passed(&mut self, _duration_since_epoch: Duration) {}
425 }
426
427 impl Writeable for FixedPenaltyScorer {
428         #[inline]
429         fn write<W: Writer>(&self, w: &mut W) -> Result<(), io::Error> {
430                 write_tlv_fields!(w, {});
431                 Ok(())
432         }
433 }
434
435 impl ReadableArgs<u64> for FixedPenaltyScorer {
436         #[inline]
437         fn read<R: Read>(r: &mut R, penalty_msat: u64) -> Result<Self, DecodeError> {
438                 read_tlv_fields!(r, {});
439                 Ok(Self { penalty_msat })
440         }
441 }
442
443 #[cfg(not(feature = "no-std"))]
444 type ConfiguredTime = crate::util::time::MonotonicTime;
445 #[cfg(feature = "no-std")]
446 use crate::util::time::Eternity;
447 #[cfg(feature = "no-std")]
448 type ConfiguredTime = Eternity;
449
450 /// [`ScoreLookUp`] implementation using channel success probability distributions.
451 ///
452 /// Channels are tracked with upper and lower liquidity bounds - when an HTLC fails at a channel,
453 /// we learn that the upper-bound on the available liquidity is lower than the amount of the HTLC.
454 /// When a payment is forwarded through a channel (but fails later in the route), we learn the
455 /// lower-bound on the channel's available liquidity must be at least the value of the HTLC.
456 ///
457 /// These bounds are then used to determine a success probability using the formula from
458 /// *Optimally Reliable & Cheap Payment Flows on the Lightning Network* by Rene Pickhardt
459 /// and Stefan Richter [[1]] (i.e. `(upper_bound - payment_amount) / (upper_bound - lower_bound)`).
460 ///
461 /// This probability is combined with the [`liquidity_penalty_multiplier_msat`] and
462 /// [`liquidity_penalty_amount_multiplier_msat`] parameters to calculate a concrete penalty in
463 /// milli-satoshis. The penalties, when added across all hops, have the property of being linear in
464 /// terms of the entire path's success probability. This allows the router to directly compare
465 /// penalties for different paths. See the documentation of those parameters for the exact formulas.
466 ///
467 /// The liquidity bounds are decayed by halving them every [`liquidity_offset_half_life`].
468 ///
469 /// Further, we track the history of our upper and lower liquidity bounds for each channel,
470 /// allowing us to assign a second penalty (using [`historical_liquidity_penalty_multiplier_msat`]
471 /// and [`historical_liquidity_penalty_amount_multiplier_msat`]) based on the same probability
472 /// formula, but using the history of a channel rather than our latest estimates for the liquidity
473 /// bounds.
474 ///
475 /// # Note
476 ///
477 /// Mixing the `no-std` feature between serialization and deserialization results in undefined
478 /// behavior.
479 ///
480 /// [1]: https://arxiv.org/abs/2107.05322
481 /// [`liquidity_penalty_multiplier_msat`]: ProbabilisticScoringFeeParameters::liquidity_penalty_multiplier_msat
482 /// [`liquidity_penalty_amount_multiplier_msat`]: ProbabilisticScoringFeeParameters::liquidity_penalty_amount_multiplier_msat
483 /// [`liquidity_offset_half_life`]: ProbabilisticScoringDecayParameters::liquidity_offset_half_life
484 /// [`historical_liquidity_penalty_multiplier_msat`]: ProbabilisticScoringFeeParameters::historical_liquidity_penalty_multiplier_msat
485 /// [`historical_liquidity_penalty_amount_multiplier_msat`]: ProbabilisticScoringFeeParameters::historical_liquidity_penalty_amount_multiplier_msat
486 pub type ProbabilisticScorer<G, L> = ProbabilisticScorerUsingTime::<G, L, ConfiguredTime>;
487
488 /// Probabilistic [`ScoreLookUp`] implementation.
489 ///
490 /// This is not exported to bindings users generally all users should use the [`ProbabilisticScorer`] type alias.
491 pub struct ProbabilisticScorerUsingTime<G: Deref<Target = NetworkGraph<L>>, L: Deref, T: Time>
492 where L::Target: Logger {
493         decay_params: ProbabilisticScoringDecayParameters,
494         network_graph: G,
495         logger: L,
496         channel_liquidities: HashMap<u64, ChannelLiquidity<T>>,
497 }
498
499 /// Parameters for configuring [`ProbabilisticScorer`].
500 ///
501 /// Used to configure base, liquidity, and amount penalties, the sum of which comprises the channel
502 /// penalty (i.e., the amount in msats willing to be paid to avoid routing through the channel).
503 ///
504 /// The penalty applied to any channel by the [`ProbabilisticScorer`] is the sum of each of the
505 /// parameters here.
506 #[derive(Clone)]
507 pub struct ProbabilisticScoringFeeParameters {
508         /// A fixed penalty in msats to apply to each channel.
509         ///
510         /// Default value: 500 msat
511         pub base_penalty_msat: u64,
512
513         /// A multiplier used with the total amount flowing over a channel to calculate a fixed penalty
514         /// applied to each channel, in excess of the [`base_penalty_msat`].
515         ///
516         /// The purpose of the amount penalty is to avoid having fees dominate the channel cost (i.e.,
517         /// fees plus penalty) for large payments. The penalty is computed as the product of this
518         /// multiplier and `2^30`ths of the total amount flowing over a channel (i.e. the payment
519         /// amount plus the amount of any other HTLCs flowing we sent over the same channel).
520         ///
521         /// ie `base_penalty_amount_multiplier_msat * amount_msat / 2^30`
522         ///
523         /// Default value: 8,192 msat
524         ///
525         /// [`base_penalty_msat`]: Self::base_penalty_msat
526         pub base_penalty_amount_multiplier_msat: u64,
527
528         /// A multiplier used in conjunction with the negative `log10` of the channel's success
529         /// probability for a payment, as determined by our latest estimates of the channel's
530         /// liquidity, to determine the liquidity penalty.
531         ///
532         /// The penalty is based in part on the knowledge learned from prior successful and unsuccessful
533         /// payments. This knowledge is decayed over time based on [`liquidity_offset_half_life`]. The
534         /// penalty is effectively limited to `2 * liquidity_penalty_multiplier_msat` (corresponding to
535         /// lower bounding the success probability to `0.01`) when the amount falls within the
536         /// uncertainty bounds of the channel liquidity balance. Amounts above the upper bound will
537         /// result in a `u64::max_value` penalty, however.
538         ///
539         /// `-log10(success_probability) * liquidity_penalty_multiplier_msat`
540         ///
541         /// Default value: 30,000 msat
542         ///
543         /// [`liquidity_offset_half_life`]: ProbabilisticScoringDecayParameters::liquidity_offset_half_life
544         pub liquidity_penalty_multiplier_msat: u64,
545
546         /// A multiplier used in conjunction with the total amount flowing over a channel and the
547         /// negative `log10` of the channel's success probability for the payment, as determined by our
548         /// latest estimates of the channel's liquidity, to determine the amount penalty.
549         ///
550         /// The purpose of the amount penalty is to avoid having fees dominate the channel cost (i.e.,
551         /// fees plus penalty) for large payments. The penalty is computed as the product of this
552         /// multiplier and `2^20`ths of the amount flowing over this channel, weighted by the negative
553         /// `log10` of the success probability.
554         ///
555         /// `-log10(success_probability) * liquidity_penalty_amount_multiplier_msat * amount_msat / 2^20`
556         ///
557         /// In practice, this means for 0.1 success probability (`-log10(0.1) == 1`) each `2^20`th of
558         /// the amount will result in a penalty of the multiplier. And, as the success probability
559         /// decreases, the negative `log10` weighting will increase dramatically. For higher success
560         /// probabilities, the multiplier will have a decreasing effect as the negative `log10` will
561         /// fall below `1`.
562         ///
563         /// Default value: 192 msat
564         pub liquidity_penalty_amount_multiplier_msat: u64,
565
566         /// A multiplier used in conjunction with the negative `log10` of the channel's success
567         /// probability for the payment, as determined based on the history of our estimates of the
568         /// channel's available liquidity, to determine a penalty.
569         ///
570         /// This penalty is similar to [`liquidity_penalty_multiplier_msat`], however, instead of using
571         /// only our latest estimate for the current liquidity available in the channel, it estimates
572         /// success probability based on the estimated liquidity available in the channel through
573         /// history. Specifically, every time we update our liquidity bounds on a given channel, we
574         /// track which of several buckets those bounds fall into, exponentially decaying the
575         /// probability of each bucket as new samples are added.
576         ///
577         /// Default value: 10,000 msat
578         ///
579         /// [`liquidity_penalty_multiplier_msat`]: Self::liquidity_penalty_multiplier_msat
580         pub historical_liquidity_penalty_multiplier_msat: u64,
581
582         /// A multiplier used in conjunction with the total amount flowing over a channel and the
583         /// negative `log10` of the channel's success probability for the payment, as determined based
584         /// on the history of our estimates of the channel's available liquidity, to determine a
585         /// penalty.
586         ///
587         /// The purpose of the amount penalty is to avoid having fees dominate the channel cost for
588         /// large payments. The penalty is computed as the product of this multiplier and `2^20`ths
589         /// of the amount flowing over this channel, weighted by the negative `log10` of the success
590         /// probability.
591         ///
592         /// This penalty is similar to [`liquidity_penalty_amount_multiplier_msat`], however, instead
593         /// of using only our latest estimate for the current liquidity available in the channel, it
594         /// estimates success probability based on the estimated liquidity available in the channel
595         /// through history. Specifically, every time we update our liquidity bounds on a given
596         /// channel, we track which of several buckets those bounds fall into, exponentially decaying
597         /// the probability of each bucket as new samples are added.
598         ///
599         /// Default value: 64 msat
600         ///
601         /// [`liquidity_penalty_amount_multiplier_msat`]: Self::liquidity_penalty_amount_multiplier_msat
602         pub historical_liquidity_penalty_amount_multiplier_msat: u64,
603
604         /// Manual penalties used for the given nodes. Allows to set a particular penalty for a given
605         /// node. Note that a manual penalty of `u64::max_value()` means the node would not ever be
606         /// considered during path finding.
607         ///
608         /// This is not exported to bindings users
609         pub manual_node_penalties: HashMap<NodeId, u64>,
610
611         /// This penalty is applied when `htlc_maximum_msat` is equal to or larger than half of the
612         /// channel's capacity, (ie. htlc_maximum_msat >= 0.5 * channel_capacity) which makes us
613         /// prefer nodes with a smaller `htlc_maximum_msat`. We treat such nodes preferentially
614         /// as this makes balance discovery attacks harder to execute, thereby creating an incentive
615         /// to restrict `htlc_maximum_msat` and improve privacy.
616         ///
617         /// Default value: 250 msat
618         pub anti_probing_penalty_msat: u64,
619
620         /// This penalty is applied when the total amount flowing over a channel exceeds our current
621         /// estimate of the channel's available liquidity. The total amount is the amount of the
622         /// current HTLC plus any HTLCs which we've sent over the same channel.
623         ///
624         /// Note that in this case all other penalties, including the
625         /// [`liquidity_penalty_multiplier_msat`] and [`liquidity_penalty_amount_multiplier_msat`]-based
626         /// penalties, as well as the [`base_penalty_msat`] and the [`anti_probing_penalty_msat`], if
627         /// applicable, are still included in the overall penalty.
628         ///
629         /// If you wish to avoid creating paths with such channels entirely, setting this to a value of
630         /// `u64::max_value()` will guarantee that.
631         ///
632         /// Default value: 1_0000_0000_000 msat (1 Bitcoin)
633         ///
634         /// [`liquidity_penalty_multiplier_msat`]: Self::liquidity_penalty_multiplier_msat
635         /// [`liquidity_penalty_amount_multiplier_msat`]: Self::liquidity_penalty_amount_multiplier_msat
636         /// [`base_penalty_msat`]: Self::base_penalty_msat
637         /// [`anti_probing_penalty_msat`]: Self::anti_probing_penalty_msat
638         pub considered_impossible_penalty_msat: u64,
639
640         /// In order to calculate most of the scores above, we must first convert a lower and upper
641         /// bound on the available liquidity in a channel into the probability that we think a payment
642         /// will succeed. That probability is derived from a Probability Density Function for where we
643         /// think the liquidity in a channel likely lies, given such bounds.
644         ///
645         /// If this flag is set, that PDF is simply a constant - we assume that the actual available
646         /// liquidity in a channel is just as likely to be at any point between our lower and upper
647         /// bounds.
648         ///
649         /// If this flag is *not* set, that PDF is `(x - 0.5*capacity) ^ 2`. That is, we use an
650         /// exponential curve which expects the liquidity of a channel to lie "at the edges". This
651         /// matches experimental results - most routing nodes do not aggressively rebalance their
652         /// channels and flows in the network are often unbalanced, leaving liquidity usually
653         /// unavailable.
654         ///
655         /// Thus, for the "best" routes, leave this flag `false`. However, the flag does imply a number
656         /// of floating-point multiplications in the hottest routing code, which may lead to routing
657         /// performance degradation on some machines.
658         ///
659         /// Default value: false
660         pub linear_success_probability: bool,
661 }
662
663 impl Default for ProbabilisticScoringFeeParameters {
664         fn default() -> Self {
665                 Self {
666                         base_penalty_msat: 500,
667                         base_penalty_amount_multiplier_msat: 8192,
668                         liquidity_penalty_multiplier_msat: 30_000,
669                         liquidity_penalty_amount_multiplier_msat: 192,
670                         manual_node_penalties: HashMap::new(),
671                         anti_probing_penalty_msat: 250,
672                         considered_impossible_penalty_msat: 1_0000_0000_000,
673                         historical_liquidity_penalty_multiplier_msat: 10_000,
674                         historical_liquidity_penalty_amount_multiplier_msat: 64,
675                         linear_success_probability: false,
676                 }
677         }
678 }
679
680 impl ProbabilisticScoringFeeParameters {
681         /// Marks the node with the given `node_id` as banned,
682         /// i.e it will be avoided during path finding.
683         pub fn add_banned(&mut self, node_id: &NodeId) {
684                 self.manual_node_penalties.insert(*node_id, u64::max_value());
685         }
686
687         /// Marks all nodes in the given list as banned, i.e.,
688         /// they will be avoided during path finding.
689         pub fn add_banned_from_list(&mut self, node_ids: Vec<NodeId>) {
690                 for id in node_ids {
691                         self.manual_node_penalties.insert(id, u64::max_value());
692                 }
693         }
694
695         /// Removes the node with the given `node_id` from the list of nodes to avoid.
696         pub fn remove_banned(&mut self, node_id: &NodeId) {
697                 self.manual_node_penalties.remove(node_id);
698         }
699
700         /// Sets a manual penalty for the given node.
701         pub fn set_manual_penalty(&mut self, node_id: &NodeId, penalty: u64) {
702                 self.manual_node_penalties.insert(*node_id, penalty);
703         }
704
705         /// Removes the node with the given `node_id` from the list of manual penalties.
706         pub fn remove_manual_penalty(&mut self, node_id: &NodeId) {
707                 self.manual_node_penalties.remove(node_id);
708         }
709
710         /// Clears the list of manual penalties that are applied during path finding.
711         pub fn clear_manual_penalties(&mut self) {
712                 self.manual_node_penalties = HashMap::new();
713         }
714 }
715
716 #[cfg(test)]
717 impl ProbabilisticScoringFeeParameters {
718         fn zero_penalty() -> Self {
719                 Self {
720                         base_penalty_msat: 0,
721                         base_penalty_amount_multiplier_msat: 0,
722                         liquidity_penalty_multiplier_msat: 0,
723                         liquidity_penalty_amount_multiplier_msat: 0,
724                         historical_liquidity_penalty_multiplier_msat: 0,
725                         historical_liquidity_penalty_amount_multiplier_msat: 0,
726                         manual_node_penalties: HashMap::new(),
727                         anti_probing_penalty_msat: 0,
728                         considered_impossible_penalty_msat: 0,
729                         linear_success_probability: true,
730                 }
731         }
732 }
733
734 /// Parameters for configuring [`ProbabilisticScorer`].
735 ///
736 /// Used to configure decay parameters that are static throughout the lifetime of the scorer.
737 /// these decay parameters affect the score of the channel penalty and are not changed on a
738 /// per-route penalty cost call.
739 #[derive(Copy, Clone)]
740 pub struct ProbabilisticScoringDecayParameters {
741         /// If we aren't learning any new datapoints for a channel, the historical liquidity bounds
742         /// tracking can simply live on with increasingly stale data. Instead, when a channel has not
743         /// seen a liquidity estimate update for this amount of time, the historical datapoints are
744         /// decayed by half.
745         /// For an example of historical_no_updates_half_life being used see [`historical_estimated_channel_liquidity_probabilities`]
746         ///
747         /// Note that after 16 or more half lives all historical data will be completely gone.
748         ///
749         /// Default value: 14 days
750         ///
751         /// [`historical_estimated_channel_liquidity_probabilities`]: ProbabilisticScorerUsingTime::historical_estimated_channel_liquidity_probabilities
752         pub historical_no_updates_half_life: Duration,
753
754         /// Whenever this amount of time elapses since the last update to a channel's liquidity bounds,
755         /// the distance from the bounds to "zero" is cut in half. In other words, the lower-bound on
756         /// the available liquidity is halved and the upper-bound moves half-way to the channel's total
757         /// capacity.
758         ///
759         /// Because halving the liquidity bounds grows the uncertainty on the channel's liquidity,
760         /// the penalty for an amount within the new bounds may change. See the [`ProbabilisticScorer`]
761         /// struct documentation for more info on the way the liquidity bounds are used.
762         ///
763         /// For example, if the channel's capacity is 1 million sats, and the current upper and lower
764         /// liquidity bounds are 200,000 sats and 600,000 sats, after this amount of time the upper
765         /// and lower liquidity bounds will be decayed to 100,000 and 800,000 sats.
766         ///
767         /// Default value: 6 hours
768         ///
769         /// # Note
770         ///
771         /// When built with the `no-std` feature, time will never elapse. Therefore, the channel
772         /// liquidity knowledge will never decay except when the bounds cross.
773         pub liquidity_offset_half_life: Duration,
774 }
775
776 impl Default for ProbabilisticScoringDecayParameters {
777         fn default() -> Self {
778                 Self {
779                         liquidity_offset_half_life: Duration::from_secs(6 * 60 * 60),
780                         historical_no_updates_half_life: Duration::from_secs(60 * 60 * 24 * 14),
781                 }
782         }
783 }
784
785 #[cfg(test)]
786 impl ProbabilisticScoringDecayParameters {
787         fn zero_penalty() -> Self {
788                 Self {
789                         liquidity_offset_half_life: Duration::from_secs(6 * 60 * 60),
790                         historical_no_updates_half_life: Duration::from_secs(60 * 60 * 24 * 14),
791                 }
792         }
793 }
794
795 /// Accounting for channel liquidity balance uncertainty.
796 ///
797 /// Direction is defined in terms of [`NodeId`] partial ordering, where the source node is the
798 /// first node in the ordering of the channel's counterparties. Thus, swapping the two liquidity
799 /// offset fields gives the opposite direction.
800 struct ChannelLiquidity<T: Time> {
801         /// Lower channel liquidity bound in terms of an offset from zero.
802         min_liquidity_offset_msat: u64,
803
804         /// Upper channel liquidity bound in terms of an offset from the effective capacity.
805         max_liquidity_offset_msat: u64,
806
807         min_liquidity_offset_history: HistoricalBucketRangeTracker,
808         max_liquidity_offset_history: HistoricalBucketRangeTracker,
809
810         /// Time when the liquidity bounds were last modified.
811         last_updated: T,
812
813         /// Time when the historical liquidity bounds were last modified.
814         offset_history_last_updated: T,
815 }
816
817 /// A snapshot of [`ChannelLiquidity`] in one direction assuming a certain channel capacity and
818 /// decayed with a given half life.
819 struct DirectedChannelLiquidity<L: Deref<Target = u64>, BRT: Deref<Target = HistoricalBucketRangeTracker>, T: Time, U: Deref<Target = T>> {
820         min_liquidity_offset_msat: L,
821         max_liquidity_offset_msat: L,
822         liquidity_history: HistoricalMinMaxBuckets<BRT>,
823         capacity_msat: u64,
824         last_updated: U,
825         offset_history_last_updated: U,
826         now: T,
827         decay_params: ProbabilisticScoringDecayParameters,
828 }
829
830 impl<G: Deref<Target = NetworkGraph<L>>, L: Deref, T: Time> ProbabilisticScorerUsingTime<G, L, T> where L::Target: Logger {
831         /// Creates a new scorer using the given scoring parameters for sending payments from a node
832         /// through a network graph.
833         pub fn new(decay_params: ProbabilisticScoringDecayParameters, network_graph: G, logger: L) -> Self {
834                 Self {
835                         decay_params,
836                         network_graph,
837                         logger,
838                         channel_liquidities: HashMap::new(),
839                 }
840         }
841
842         #[cfg(test)]
843         fn with_channel(mut self, short_channel_id: u64, liquidity: ChannelLiquidity<T>) -> Self {
844                 assert!(self.channel_liquidities.insert(short_channel_id, liquidity).is_none());
845                 self
846         }
847
848         /// Dump the contents of this scorer into the configured logger.
849         ///
850         /// Note that this writes roughly one line per channel for which we have a liquidity estimate,
851         /// which may be a substantial amount of log output.
852         pub fn debug_log_liquidity_stats(&self) {
853                 let graph = self.network_graph.read_only();
854                 for (scid, liq) in self.channel_liquidities.iter() {
855                         if let Some(chan_debug) = graph.channels().get(scid) {
856                                 let log_direction = |source, target| {
857                                         if let Some((directed_info, _)) = chan_debug.as_directed_to(target) {
858                                                 let amt = directed_info.effective_capacity().as_msat();
859                                                 let dir_liq = liq.as_directed(source, target, amt, self.decay_params);
860
861                                                 let min_buckets = &dir_liq.liquidity_history.min_liquidity_offset_history.buckets;
862                                                 let max_buckets = &dir_liq.liquidity_history.max_liquidity_offset_history.buckets;
863
864                                                 log_debug!(self.logger, core::concat!(
865                                                         "Liquidity from {} to {} via {} is in the range ({}, {}).\n",
866                                                         "\tHistorical min liquidity bucket relative probabilities:\n",
867                                                         "\t\t{} {} {} {} {} {} {} {} {} {} {} {} {} {} {} {} {} {} {} {} {} {} {} {} {} {} {} {} {} {} {} {}\n",
868                                                         "\tHistorical max liquidity bucket relative probabilities:\n",
869                                                         "\t\t{} {} {} {} {} {} {} {} {} {} {} {} {} {} {} {} {} {} {} {} {} {} {} {} {} {} {} {} {} {} {} {}"),
870                                                         source, target, scid, dir_liq.min_liquidity_msat(), dir_liq.max_liquidity_msat(),
871                                                         min_buckets[ 0], min_buckets[ 1], min_buckets[ 2], min_buckets[ 3],
872                                                         min_buckets[ 4], min_buckets[ 5], min_buckets[ 6], min_buckets[ 7],
873                                                         min_buckets[ 8], min_buckets[ 9], min_buckets[10], min_buckets[11],
874                                                         min_buckets[12], min_buckets[13], min_buckets[14], min_buckets[15],
875                                                         min_buckets[16], min_buckets[17], min_buckets[18], min_buckets[19],
876                                                         min_buckets[20], min_buckets[21], min_buckets[22], min_buckets[23],
877                                                         min_buckets[24], min_buckets[25], min_buckets[26], min_buckets[27],
878                                                         min_buckets[28], min_buckets[29], min_buckets[30], min_buckets[31],
879                                                         // Note that the liquidity buckets are an offset from the edge, so we
880                                                         // inverse the max order to get the probabilities from zero.
881                                                         max_buckets[31], max_buckets[30], max_buckets[29], max_buckets[28],
882                                                         max_buckets[27], max_buckets[26], max_buckets[25], max_buckets[24],
883                                                         max_buckets[23], max_buckets[22], max_buckets[21], max_buckets[20],
884                                                         max_buckets[19], max_buckets[18], max_buckets[17], max_buckets[16],
885                                                         max_buckets[15], max_buckets[14], max_buckets[13], max_buckets[12],
886                                                         max_buckets[11], max_buckets[10], max_buckets[ 9], max_buckets[ 8],
887                                                         max_buckets[ 7], max_buckets[ 6], max_buckets[ 5], max_buckets[ 4],
888                                                         max_buckets[ 3], max_buckets[ 2], max_buckets[ 1], max_buckets[ 0]);
889                                         } else {
890                                                 log_debug!(self.logger, "No amount known for SCID {} from {:?} to {:?}", scid, source, target);
891                                         }
892                                 };
893
894                                 log_direction(&chan_debug.node_one, &chan_debug.node_two);
895                                 log_direction(&chan_debug.node_two, &chan_debug.node_one);
896                         } else {
897                                 log_debug!(self.logger, "No network graph entry for SCID {}", scid);
898                         }
899                 }
900         }
901
902         /// Query the estimated minimum and maximum liquidity available for sending a payment over the
903         /// channel with `scid` towards the given `target` node.
904         pub fn estimated_channel_liquidity_range(&self, scid: u64, target: &NodeId) -> Option<(u64, u64)> {
905                 let graph = self.network_graph.read_only();
906
907                 if let Some(chan) = graph.channels().get(&scid) {
908                         if let Some(liq) = self.channel_liquidities.get(&scid) {
909                                 if let Some((directed_info, source)) = chan.as_directed_to(target) {
910                                         let amt = directed_info.effective_capacity().as_msat();
911                                         let dir_liq = liq.as_directed(source, target, amt, self.decay_params);
912                                         return Some((dir_liq.min_liquidity_msat(), dir_liq.max_liquidity_msat()));
913                                 }
914                         }
915                 }
916                 None
917         }
918
919         /// Query the historical estimated minimum and maximum liquidity available for sending a
920         /// payment over the channel with `scid` towards the given `target` node.
921         ///
922         /// Returns two sets of 32 buckets. The first set describes the lower-bound liquidity history,
923         /// the second set describes the upper-bound liquidity history. Each bucket describes the
924         /// relative frequency at which we've seen a liquidity bound in the bucket's range relative to
925         /// the channel's total capacity, on an arbitrary scale. Because the values are slowly decayed,
926         /// more recent data points are weighted more heavily than older datapoints.
927         ///
928         /// Note that the range of each bucket varies by its location to provide more granular results
929         /// at the edges of a channel's capacity, where it is more likely to sit.
930         ///
931         /// When scoring, the estimated probability that an upper-/lower-bound lies in a given bucket
932         /// is calculated by dividing that bucket's value with the total value of all buckets.
933         ///
934         /// For example, using a lower bucket count for illustrative purposes, a value of
935         /// `[0, 0, 0, ..., 0, 32]` indicates that we believe the probability of a bound being very
936         /// close to the channel's capacity to be 100%, and have never (recently) seen it in any other
937         /// bucket. A value of `[31, 0, 0, ..., 0, 0, 32]` indicates we've seen the bound being both
938         /// in the top and bottom bucket, and roughly with similar (recent) frequency.
939         ///
940         /// Because the datapoints are decayed slowly over time, values will eventually return to
941         /// `Some(([0; 32], [0; 32]))` or `None` if no data remains for a channel.
942         ///
943         /// In order to fetch a single success probability from the buckets provided here, as used in
944         /// the scoring model, see [`Self::historical_estimated_payment_success_probability`].
945         pub fn historical_estimated_channel_liquidity_probabilities(&self, scid: u64, target: &NodeId)
946         -> Option<([u16; 32], [u16; 32])> {
947                 let graph = self.network_graph.read_only();
948
949                 if let Some(chan) = graph.channels().get(&scid) {
950                         if let Some(liq) = self.channel_liquidities.get(&scid) {
951                                 if let Some((directed_info, source)) = chan.as_directed_to(target) {
952                                         let amt = directed_info.effective_capacity().as_msat();
953                                         let dir_liq = liq.as_directed(source, target, amt, self.decay_params);
954
955                                         let min_buckets = dir_liq.liquidity_history.min_liquidity_offset_history.buckets;
956                                         let mut max_buckets = dir_liq.liquidity_history.max_liquidity_offset_history.buckets;
957
958                                         // Note that the liquidity buckets are an offset from the edge, so we inverse
959                                         // the max order to get the probabilities from zero.
960                                         max_buckets.reverse();
961                                         return Some((min_buckets, max_buckets));
962                                 }
963                         }
964                 }
965                 None
966         }
967
968         /// Query the probability of payment success sending the given `amount_msat` over the channel
969         /// with `scid` towards the given `target` node, based on the historical estimated liquidity
970         /// bounds.
971         ///
972         /// These are the same bounds as returned by
973         /// [`Self::historical_estimated_channel_liquidity_probabilities`] (but not those returned by
974         /// [`Self::estimated_channel_liquidity_range`]).
975         pub fn historical_estimated_payment_success_probability(
976                 &self, scid: u64, target: &NodeId, amount_msat: u64, params: &ProbabilisticScoringFeeParameters)
977         -> Option<f64> {
978                 let graph = self.network_graph.read_only();
979
980                 if let Some(chan) = graph.channels().get(&scid) {
981                         if let Some(liq) = self.channel_liquidities.get(&scid) {
982                                 if let Some((directed_info, source)) = chan.as_directed_to(target) {
983                                         let capacity_msat = directed_info.effective_capacity().as_msat();
984                                         let dir_liq = liq.as_directed(source, target, capacity_msat, self.decay_params);
985
986                                         return dir_liq.liquidity_history.calculate_success_probability_times_billion(
987                                                 &params, amount_msat, capacity_msat
988                                         ).map(|p| p as f64 / (1024 * 1024 * 1024) as f64);
989                                 }
990                         }
991                 }
992                 None
993         }
994 }
995
996 impl<T: Time> ChannelLiquidity<T> {
997         #[inline]
998         fn new() -> Self {
999                 Self {
1000                         min_liquidity_offset_msat: 0,
1001                         max_liquidity_offset_msat: 0,
1002                         min_liquidity_offset_history: HistoricalBucketRangeTracker::new(),
1003                         max_liquidity_offset_history: HistoricalBucketRangeTracker::new(),
1004                         last_updated: T::now(),
1005                         offset_history_last_updated: T::now(),
1006                 }
1007         }
1008
1009         /// Returns a view of the channel liquidity directed from `source` to `target` assuming
1010         /// `capacity_msat`.
1011         fn as_directed(
1012                 &self, source: &NodeId, target: &NodeId, capacity_msat: u64, decay_params: ProbabilisticScoringDecayParameters
1013         ) -> DirectedChannelLiquidity<&u64, &HistoricalBucketRangeTracker, T, &T> {
1014                 let (min_liquidity_offset_msat, max_liquidity_offset_msat, min_liquidity_offset_history, max_liquidity_offset_history) =
1015                         if source < target {
1016                                 (&self.min_liquidity_offset_msat, &self.max_liquidity_offset_msat,
1017                                         &self.min_liquidity_offset_history, &self.max_liquidity_offset_history)
1018                         } else {
1019                                 (&self.max_liquidity_offset_msat, &self.min_liquidity_offset_msat,
1020                                         &self.max_liquidity_offset_history, &self.min_liquidity_offset_history)
1021                         };
1022
1023                 DirectedChannelLiquidity {
1024                         min_liquidity_offset_msat,
1025                         max_liquidity_offset_msat,
1026                         liquidity_history: HistoricalMinMaxBuckets {
1027                                 min_liquidity_offset_history,
1028                                 max_liquidity_offset_history,
1029                         },
1030                         capacity_msat,
1031                         last_updated: &self.last_updated,
1032                         offset_history_last_updated: &self.offset_history_last_updated,
1033                         now: T::now(),
1034                         decay_params: decay_params,
1035                 }
1036         }
1037
1038         /// Returns a mutable view of the channel liquidity directed from `source` to `target` assuming
1039         /// `capacity_msat`.
1040         fn as_directed_mut(
1041                 &mut self, source: &NodeId, target: &NodeId, capacity_msat: u64, decay_params: ProbabilisticScoringDecayParameters
1042         ) -> DirectedChannelLiquidity<&mut u64, &mut HistoricalBucketRangeTracker, T, &mut T> {
1043                 let (min_liquidity_offset_msat, max_liquidity_offset_msat, min_liquidity_offset_history, max_liquidity_offset_history) =
1044                         if source < target {
1045                                 (&mut self.min_liquidity_offset_msat, &mut self.max_liquidity_offset_msat,
1046                                         &mut self.min_liquidity_offset_history, &mut self.max_liquidity_offset_history)
1047                         } else {
1048                                 (&mut self.max_liquidity_offset_msat, &mut self.min_liquidity_offset_msat,
1049                                         &mut self.max_liquidity_offset_history, &mut self.min_liquidity_offset_history)
1050                         };
1051
1052                 DirectedChannelLiquidity {
1053                         min_liquidity_offset_msat,
1054                         max_liquidity_offset_msat,
1055                         liquidity_history: HistoricalMinMaxBuckets {
1056                                 min_liquidity_offset_history,
1057                                 max_liquidity_offset_history,
1058                         },
1059                         capacity_msat,
1060                         last_updated: &mut self.last_updated,
1061                         offset_history_last_updated: &mut self.offset_history_last_updated,
1062                         now: T::now(),
1063                         decay_params: decay_params,
1064                 }
1065         }
1066
1067         fn decayed_offset(&self, offset: u64, decay_params: ProbabilisticScoringDecayParameters) -> u64 {
1068                 let half_life = decay_params.liquidity_offset_half_life.as_secs_f64();
1069                 if half_life != 0.0 {
1070                         let elapsed_time = T::now().duration_since(self.last_updated).as_secs_f64();
1071                         ((offset as f64) * powf64(0.5, elapsed_time / half_life)) as u64
1072                 } else {
1073                         0
1074                 }
1075         }
1076 }
1077
1078 /// Bounds `-log10` to avoid excessive liquidity penalties for payments with low success
1079 /// probabilities.
1080 const NEGATIVE_LOG10_UPPER_BOUND: u64 = 2;
1081
1082 /// The rough cutoff at which our precision falls off and we should stop bothering to try to log a
1083 /// ratio, as X in 1/X.
1084 const PRECISION_LOWER_BOUND_DENOMINATOR: u64 = approx::LOWER_BITS_BOUND;
1085
1086 /// The divisor used when computing the amount penalty.
1087 const AMOUNT_PENALTY_DIVISOR: u64 = 1 << 20;
1088 const BASE_AMOUNT_PENALTY_DIVISOR: u64 = 1 << 30;
1089
1090 /// Raises three `f64`s to the 3rd power, without `powi` because it requires `std` (dunno why).
1091 #[inline(always)]
1092 fn three_f64_pow_3(a: f64, b: f64, c: f64) -> (f64, f64, f64) {
1093         (a * a * a, b * b * b, c * c * c)
1094 }
1095
1096 /// Given liquidity bounds, calculates the success probability (in the form of a numerator and
1097 /// denominator) of an HTLC. This is a key assumption in our scoring models.
1098 ///
1099 /// Must not return a numerator or denominator greater than 2^31 for arguments less than 2^31.
1100 ///
1101 /// min_zero_implies_no_successes signals that a `min_liquidity_msat` of 0 means we've not
1102 /// (recently) seen an HTLC successfully complete over this channel.
1103 #[inline(always)]
1104 fn success_probability(
1105         amount_msat: u64, min_liquidity_msat: u64, max_liquidity_msat: u64, capacity_msat: u64,
1106         params: &ProbabilisticScoringFeeParameters, min_zero_implies_no_successes: bool,
1107 ) -> (u64, u64) {
1108         debug_assert!(min_liquidity_msat <= amount_msat);
1109         debug_assert!(amount_msat < max_liquidity_msat);
1110         debug_assert!(max_liquidity_msat <= capacity_msat);
1111
1112         let (numerator, mut denominator) =
1113                 if params.linear_success_probability {
1114                         (max_liquidity_msat - amount_msat,
1115                                 (max_liquidity_msat - min_liquidity_msat).saturating_add(1))
1116                 } else {
1117                         let capacity = capacity_msat as f64;
1118                         let min = (min_liquidity_msat as f64) / capacity;
1119                         let max = (max_liquidity_msat as f64) / capacity;
1120                         let amount = (amount_msat as f64) / capacity;
1121
1122                         // Assume the channel has a probability density function of (x - 0.5)^2 for values from
1123                         // 0 to 1 (where 1 is the channel's full capacity). The success probability given some
1124                         // liquidity bounds is thus the integral under the curve from the amount to maximum
1125                         // estimated liquidity, divided by the same integral from the minimum to the maximum
1126                         // estimated liquidity bounds.
1127                         //
1128                         // Because the integral from x to y is simply (y - 0.5)^3 - (x - 0.5)^3, we can
1129                         // calculate the cumulative density function between the min/max bounds trivially. Note
1130                         // that we don't bother to normalize the CDF to total to 1, as it will come out in the
1131                         // division of num / den.
1132                         let (max_pow, amt_pow, min_pow) = three_f64_pow_3(max - 0.5, amount - 0.5, min - 0.5);
1133                         let num = max_pow - amt_pow;
1134                         let den = max_pow - min_pow;
1135
1136                         // Because our numerator and denominator max out at 0.5^3 we need to multiply them by
1137                         // quite a large factor to get something useful (ideally in the 2^30 range).
1138                         const BILLIONISH: f64 = 1024.0 * 1024.0 * 1024.0;
1139                         let numerator = (num * BILLIONISH) as u64 + 1;
1140                         let denominator = (den * BILLIONISH) as u64 + 1;
1141                         debug_assert!(numerator <= 1 << 30, "Got large numerator ({}) from float {}.", numerator, num);
1142                         debug_assert!(denominator <= 1 << 30, "Got large denominator ({}) from float {}.", denominator, den);
1143                         (numerator, denominator)
1144                 };
1145
1146         if min_zero_implies_no_successes && min_liquidity_msat == 0 &&
1147                 denominator < u64::max_value() / 21
1148         {
1149                 // If we have no knowledge of the channel, scale probability down by ~75%
1150                 // Note that we prefer to increase the denominator rather than decrease the numerator as
1151                 // the denominator is more likely to be larger and thus provide greater precision. This is
1152                 // mostly an overoptimization but makes a large difference in tests.
1153                 denominator = denominator * 21 / 16
1154         }
1155
1156         (numerator, denominator)
1157 }
1158
1159 impl<L: Deref<Target = u64>, BRT: Deref<Target = HistoricalBucketRangeTracker>, T: Time, U: Deref<Target = T>> DirectedChannelLiquidity< L, BRT, T, U> {
1160         /// Returns a liquidity penalty for routing the given HTLC `amount_msat` through the channel in
1161         /// this direction.
1162         fn penalty_msat(&self, amount_msat: u64, score_params: &ProbabilisticScoringFeeParameters) -> u64 {
1163                 let available_capacity = self.capacity_msat;
1164                 let max_liquidity_msat = self.max_liquidity_msat();
1165                 let min_liquidity_msat = core::cmp::min(self.min_liquidity_msat(), max_liquidity_msat);
1166
1167                 let mut res = if amount_msat <= min_liquidity_msat {
1168                         0
1169                 } else if amount_msat >= max_liquidity_msat {
1170                         // Equivalent to hitting the else clause below with the amount equal to the effective
1171                         // capacity and without any certainty on the liquidity upper bound, plus the
1172                         // impossibility penalty.
1173                         let negative_log10_times_2048 = NEGATIVE_LOG10_UPPER_BOUND * 2048;
1174                         Self::combined_penalty_msat(amount_msat, negative_log10_times_2048,
1175                                         score_params.liquidity_penalty_multiplier_msat,
1176                                         score_params.liquidity_penalty_amount_multiplier_msat)
1177                                 .saturating_add(score_params.considered_impossible_penalty_msat)
1178                 } else {
1179                         let (numerator, denominator) = success_probability(amount_msat,
1180                                 min_liquidity_msat, max_liquidity_msat, available_capacity, score_params, false);
1181                         if denominator - numerator < denominator / PRECISION_LOWER_BOUND_DENOMINATOR {
1182                                 // If the failure probability is < 1.5625% (as 1 - numerator/denominator < 1/64),
1183                                 // don't bother trying to use the log approximation as it gets too noisy to be
1184                                 // particularly helpful, instead just round down to 0.
1185                                 0
1186                         } else {
1187                                 let negative_log10_times_2048 =
1188                                         approx::negative_log10_times_2048(numerator, denominator);
1189                                 Self::combined_penalty_msat(amount_msat, negative_log10_times_2048,
1190                                         score_params.liquidity_penalty_multiplier_msat,
1191                                         score_params.liquidity_penalty_amount_multiplier_msat)
1192                         }
1193                 };
1194
1195                 if amount_msat >= available_capacity {
1196                         // We're trying to send more than the capacity, use a max penalty.
1197                         res = res.saturating_add(Self::combined_penalty_msat(amount_msat,
1198                                 NEGATIVE_LOG10_UPPER_BOUND * 2048,
1199                                 score_params.historical_liquidity_penalty_multiplier_msat,
1200                                 score_params.historical_liquidity_penalty_amount_multiplier_msat));
1201                         return res;
1202                 }
1203
1204                 if score_params.historical_liquidity_penalty_multiplier_msat != 0 ||
1205                    score_params.historical_liquidity_penalty_amount_multiplier_msat != 0 {
1206                         if let Some(cumulative_success_prob_times_billion) = self.liquidity_history
1207                                 .calculate_success_probability_times_billion(
1208                                         score_params, amount_msat, self.capacity_msat)
1209                         {
1210                                 let historical_negative_log10_times_2048 = approx::negative_log10_times_2048(cumulative_success_prob_times_billion + 1, 1024 * 1024 * 1024);
1211                                 res = res.saturating_add(Self::combined_penalty_msat(amount_msat,
1212                                         historical_negative_log10_times_2048, score_params.historical_liquidity_penalty_multiplier_msat,
1213                                         score_params.historical_liquidity_penalty_amount_multiplier_msat));
1214                         } else {
1215                                 // If we don't have any valid points (or, once decayed, we have less than a full
1216                                 // point), redo the non-historical calculation with no liquidity bounds tracked and
1217                                 // the historical penalty multipliers.
1218                                 let (numerator, denominator) = success_probability(amount_msat, 0,
1219                                         available_capacity, available_capacity, score_params, true);
1220                                 let negative_log10_times_2048 =
1221                                         approx::negative_log10_times_2048(numerator, denominator);
1222                                 res = res.saturating_add(Self::combined_penalty_msat(amount_msat, negative_log10_times_2048,
1223                                         score_params.historical_liquidity_penalty_multiplier_msat,
1224                                         score_params.historical_liquidity_penalty_amount_multiplier_msat));
1225                         }
1226                 }
1227
1228                 res
1229         }
1230
1231         /// Computes the liquidity penalty from the penalty multipliers.
1232         #[inline(always)]
1233         fn combined_penalty_msat(amount_msat: u64, mut negative_log10_times_2048: u64,
1234                 liquidity_penalty_multiplier_msat: u64, liquidity_penalty_amount_multiplier_msat: u64,
1235         ) -> u64 {
1236                 negative_log10_times_2048 =
1237                         negative_log10_times_2048.min(NEGATIVE_LOG10_UPPER_BOUND * 2048);
1238
1239                 // Upper bound the liquidity penalty to ensure some channel is selected.
1240                 let liquidity_penalty_msat = negative_log10_times_2048
1241                         .saturating_mul(liquidity_penalty_multiplier_msat) / 2048;
1242                 let amount_penalty_msat = negative_log10_times_2048
1243                         .saturating_mul(liquidity_penalty_amount_multiplier_msat)
1244                         .saturating_mul(amount_msat) / 2048 / AMOUNT_PENALTY_DIVISOR;
1245
1246                 liquidity_penalty_msat.saturating_add(amount_penalty_msat)
1247         }
1248
1249         /// Returns the lower bound of the channel liquidity balance in this direction.
1250         #[inline(always)]
1251         fn min_liquidity_msat(&self) -> u64 {
1252                 self.decayed_offset_msat(*self.min_liquidity_offset_msat)
1253         }
1254
1255         /// Returns the upper bound of the channel liquidity balance in this direction.
1256         #[inline(always)]
1257         fn max_liquidity_msat(&self) -> u64 {
1258                 self.capacity_msat
1259                         .saturating_sub(self.decayed_offset_msat(*self.max_liquidity_offset_msat))
1260         }
1261
1262         fn decayed_offset_msat(&self, offset_msat: u64) -> u64 {
1263                 let half_life = self.decay_params.liquidity_offset_half_life.as_secs();
1264                 if half_life != 0 {
1265                         // Decay the offset by the appropriate number of half lives. If half of the next half
1266                         // life has passed, approximate an additional three-quarter life to help smooth out the
1267                         // decay.
1268                         let elapsed_time = self.now.duration_since(*self.last_updated).as_secs();
1269                         let half_decays = elapsed_time / (half_life / 2);
1270                         let decays = half_decays / 2;
1271                         let decayed_offset_msat = offset_msat.checked_shr(decays as u32).unwrap_or(0);
1272                         if half_decays % 2 == 0 {
1273                                 decayed_offset_msat
1274                         } else {
1275                                 // 11_585 / 16_384 ~= core::f64::consts::FRAC_1_SQRT_2
1276                                 // 16_384 == 2^14
1277                                 (decayed_offset_msat as u128 * 11_585 / 16_384) as u64
1278                         }
1279                 } else {
1280                         0
1281                 }
1282         }
1283 }
1284
1285 impl<L: DerefMut<Target = u64>, BRT: DerefMut<Target = HistoricalBucketRangeTracker>, T: Time, U: DerefMut<Target = T>> DirectedChannelLiquidity<L, BRT, T, U> {
1286         /// Adjusts the channel liquidity balance bounds when failing to route `amount_msat`.
1287         fn failed_at_channel<Log: Deref>(&mut self, amount_msat: u64, chan_descr: fmt::Arguments, logger: &Log) where Log::Target: Logger {
1288                 let existing_max_msat = self.max_liquidity_msat();
1289                 if amount_msat < existing_max_msat {
1290                         log_debug!(logger, "Setting max liquidity of {} from {} to {}", chan_descr, existing_max_msat, amount_msat);
1291                         self.set_max_liquidity_msat(amount_msat);
1292                 } else {
1293                         log_trace!(logger, "Max liquidity of {} is {} (already less than or equal to {})",
1294                                 chan_descr, existing_max_msat, amount_msat);
1295                 }
1296                 self.update_history_buckets(0);
1297         }
1298
1299         /// Adjusts the channel liquidity balance bounds when failing to route `amount_msat` downstream.
1300         fn failed_downstream<Log: Deref>(&mut self, amount_msat: u64, chan_descr: fmt::Arguments, logger: &Log) where Log::Target: Logger {
1301                 let existing_min_msat = self.min_liquidity_msat();
1302                 if amount_msat > existing_min_msat {
1303                         log_debug!(logger, "Setting min liquidity of {} from {} to {}", existing_min_msat, chan_descr, amount_msat);
1304                         self.set_min_liquidity_msat(amount_msat);
1305                 } else {
1306                         log_trace!(logger, "Min liquidity of {} is {} (already greater than or equal to {})",
1307                                 chan_descr, existing_min_msat, amount_msat);
1308                 }
1309                 self.update_history_buckets(0);
1310         }
1311
1312         /// Adjusts the channel liquidity balance bounds when successfully routing `amount_msat`.
1313         fn successful<Log: Deref>(&mut self, amount_msat: u64, chan_descr: fmt::Arguments, logger: &Log) where Log::Target: Logger {
1314                 let max_liquidity_msat = self.max_liquidity_msat().checked_sub(amount_msat).unwrap_or(0);
1315                 log_debug!(logger, "Subtracting {} from max liquidity of {} (setting it to {})", amount_msat, chan_descr, max_liquidity_msat);
1316                 self.set_max_liquidity_msat(max_liquidity_msat);
1317                 self.update_history_buckets(amount_msat);
1318         }
1319
1320         /// Updates the history buckets for this channel. Because the history buckets track what we now
1321         /// know about the channel's state *prior to our payment* (i.e. what we assume is "steady
1322         /// state"), we allow the caller to set an offset applied to our liquidity bounds which
1323         /// represents the amount of the successful payment we just made.
1324         fn update_history_buckets(&mut self, bucket_offset_msat: u64) {
1325                 let half_lives = self.now.duration_since(*self.offset_history_last_updated).as_secs()
1326                         .checked_div(self.decay_params.historical_no_updates_half_life.as_secs())
1327                         .map(|v| v.try_into().unwrap_or(u32::max_value())).unwrap_or(u32::max_value());
1328                 self.liquidity_history.min_liquidity_offset_history.time_decay_data(half_lives);
1329                 self.liquidity_history.max_liquidity_offset_history.time_decay_data(half_lives);
1330
1331                 let min_liquidity_offset_msat = self.decayed_offset_msat(*self.min_liquidity_offset_msat);
1332                 self.liquidity_history.min_liquidity_offset_history.track_datapoint(
1333                         min_liquidity_offset_msat + bucket_offset_msat, self.capacity_msat
1334                 );
1335                 let max_liquidity_offset_msat = self.decayed_offset_msat(*self.max_liquidity_offset_msat);
1336                 self.liquidity_history.max_liquidity_offset_history.track_datapoint(
1337                         max_liquidity_offset_msat.saturating_sub(bucket_offset_msat), self.capacity_msat
1338                 );
1339         }
1340
1341         /// Adjusts the lower bound of the channel liquidity balance in this direction.
1342         fn set_min_liquidity_msat(&mut self, amount_msat: u64) {
1343                 *self.min_liquidity_offset_msat = amount_msat;
1344                 *self.max_liquidity_offset_msat = if amount_msat > self.max_liquidity_msat() {
1345                         0
1346                 } else {
1347                         self.decayed_offset_msat(*self.max_liquidity_offset_msat)
1348                 };
1349                 *self.last_updated = self.now;
1350                 *self.offset_history_last_updated = self.now;
1351         }
1352
1353         /// Adjusts the upper bound of the channel liquidity balance in this direction.
1354         fn set_max_liquidity_msat(&mut self, amount_msat: u64) {
1355                 *self.max_liquidity_offset_msat = self.capacity_msat.checked_sub(amount_msat).unwrap_or(0);
1356                 *self.min_liquidity_offset_msat = if amount_msat < self.min_liquidity_msat() {
1357                         0
1358                 } else {
1359                         self.decayed_offset_msat(*self.min_liquidity_offset_msat)
1360                 };
1361                 *self.last_updated = self.now;
1362                 *self.offset_history_last_updated = self.now;
1363         }
1364 }
1365
1366 impl<G: Deref<Target = NetworkGraph<L>>, L: Deref, T: Time> ScoreLookUp for ProbabilisticScorerUsingTime<G, L, T> where L::Target: Logger {
1367         type ScoreParams = ProbabilisticScoringFeeParameters;
1368         fn channel_penalty_msat(
1369                 &self, candidate: &CandidateRouteHop, usage: ChannelUsage, score_params: &ProbabilisticScoringFeeParameters
1370         ) -> u64 {
1371                 let (scid, target) = match candidate {
1372                         CandidateRouteHop::PublicHop { info, short_channel_id } => {
1373                                 (short_channel_id, info.target())
1374                         },
1375                         _ => return 0,
1376                 };
1377                 let source = candidate.source();
1378                 if let Some(penalty) = score_params.manual_node_penalties.get(&target) {
1379                         return *penalty;
1380                 }
1381
1382                 let base_penalty_msat = score_params.base_penalty_msat.saturating_add(
1383                         score_params.base_penalty_amount_multiplier_msat
1384                                 .saturating_mul(usage.amount_msat) / BASE_AMOUNT_PENALTY_DIVISOR);
1385
1386                 let mut anti_probing_penalty_msat = 0;
1387                 match usage.effective_capacity {
1388                         EffectiveCapacity::ExactLiquidity { liquidity_msat: amount_msat } |
1389                                 EffectiveCapacity::HintMaxHTLC { amount_msat } =>
1390                         {
1391                                 if usage.amount_msat > amount_msat {
1392                                         return u64::max_value();
1393                                 } else {
1394                                         return base_penalty_msat;
1395                                 }
1396                         },
1397                         EffectiveCapacity::Total { capacity_msat, htlc_maximum_msat } => {
1398                                 if htlc_maximum_msat >= capacity_msat/2 {
1399                                         anti_probing_penalty_msat = score_params.anti_probing_penalty_msat;
1400                                 }
1401                         },
1402                         _ => {},
1403                 }
1404
1405                 let amount_msat = usage.amount_msat.saturating_add(usage.inflight_htlc_msat);
1406                 let capacity_msat = usage.effective_capacity.as_msat();
1407                 self.channel_liquidities
1408                         .get(&scid)
1409                         .unwrap_or(&ChannelLiquidity::new())
1410                         .as_directed(&source, &target, capacity_msat, self.decay_params)
1411                         .penalty_msat(amount_msat, score_params)
1412                         .saturating_add(anti_probing_penalty_msat)
1413                         .saturating_add(base_penalty_msat)
1414         }
1415 }
1416
1417 impl<G: Deref<Target = NetworkGraph<L>>, L: Deref, T: Time> ScoreUpdate for ProbabilisticScorerUsingTime<G, L, T> where L::Target: Logger {
1418         fn payment_path_failed(&mut self, path: &Path, short_channel_id: u64, _duration_since_epoch: Duration) {
1419                 let amount_msat = path.final_value_msat();
1420                 log_trace!(self.logger, "Scoring path through to SCID {} as having failed at {} msat", short_channel_id, amount_msat);
1421                 let network_graph = self.network_graph.read_only();
1422                 for (hop_idx, hop) in path.hops.iter().enumerate() {
1423                         let target = NodeId::from_pubkey(&hop.pubkey);
1424                         let channel_directed_from_source = network_graph.channels()
1425                                 .get(&hop.short_channel_id)
1426                                 .and_then(|channel| channel.as_directed_to(&target));
1427
1428                         let at_failed_channel = hop.short_channel_id == short_channel_id;
1429                         if at_failed_channel && hop_idx == 0 {
1430                                 log_warn!(self.logger, "Payment failed at the first hop - we do not attempt to learn channel info in such cases as we can directly observe local state.\n\tBecause we know the local state, we should generally not see failures here - this may be an indication that your channel peer on channel {} is broken and you may wish to close the channel.", hop.short_channel_id);
1431                         }
1432
1433                         // Only score announced channels.
1434                         if let Some((channel, source)) = channel_directed_from_source {
1435                                 let capacity_msat = channel.effective_capacity().as_msat();
1436                                 if at_failed_channel {
1437                                         self.channel_liquidities
1438                                                 .entry(hop.short_channel_id)
1439                                                 .or_insert_with(ChannelLiquidity::new)
1440                                                 .as_directed_mut(source, &target, capacity_msat, self.decay_params)
1441                                                 .failed_at_channel(amount_msat, format_args!("SCID {}, towards {:?}", hop.short_channel_id, target), &self.logger);
1442                                 } else {
1443                                         self.channel_liquidities
1444                                                 .entry(hop.short_channel_id)
1445                                                 .or_insert_with(ChannelLiquidity::new)
1446                                                 .as_directed_mut(source, &target, capacity_msat, self.decay_params)
1447                                                 .failed_downstream(amount_msat, format_args!("SCID {}, towards {:?}", hop.short_channel_id, target), &self.logger);
1448                                 }
1449                         } else {
1450                                 log_debug!(self.logger, "Not able to penalize channel with SCID {} as we do not have graph info for it (likely a route-hint last-hop).",
1451                                         hop.short_channel_id);
1452                         }
1453                         if at_failed_channel { break; }
1454                 }
1455         }
1456
1457         fn payment_path_successful(&mut self, path: &Path, _duration_since_epoch: Duration) {
1458                 let amount_msat = path.final_value_msat();
1459                 log_trace!(self.logger, "Scoring path through SCID {} as having succeeded at {} msat.",
1460                         path.hops.split_last().map(|(hop, _)| hop.short_channel_id).unwrap_or(0), amount_msat);
1461                 let network_graph = self.network_graph.read_only();
1462                 for hop in &path.hops {
1463                         let target = NodeId::from_pubkey(&hop.pubkey);
1464                         let channel_directed_from_source = network_graph.channels()
1465                                 .get(&hop.short_channel_id)
1466                                 .and_then(|channel| channel.as_directed_to(&target));
1467
1468                         // Only score announced channels.
1469                         if let Some((channel, source)) = channel_directed_from_source {
1470                                 let capacity_msat = channel.effective_capacity().as_msat();
1471                                 self.channel_liquidities
1472                                         .entry(hop.short_channel_id)
1473                                         .or_insert_with(ChannelLiquidity::new)
1474                                         .as_directed_mut(source, &target, capacity_msat, self.decay_params)
1475                                         .successful(amount_msat, format_args!("SCID {}, towards {:?}", hop.short_channel_id, target), &self.logger);
1476                         } else {
1477                                 log_debug!(self.logger, "Not able to learn for channel with SCID {} as we do not have graph info for it (likely a route-hint last-hop).",
1478                                         hop.short_channel_id);
1479                         }
1480                 }
1481         }
1482
1483         fn probe_failed(&mut self, path: &Path, short_channel_id: u64, duration_since_epoch: Duration) {
1484                 self.payment_path_failed(path, short_channel_id, duration_since_epoch)
1485         }
1486
1487         fn probe_successful(&mut self, path: &Path, duration_since_epoch: Duration) {
1488                 self.payment_path_failed(path, u64::max_value(), duration_since_epoch)
1489         }
1490
1491         fn time_passed(&mut self, _duration_since_epoch: Duration) {
1492                 let decay_params = self.decay_params;
1493                 self.channel_liquidities.retain(|_scid, liquidity| {
1494                         liquidity.min_liquidity_offset_msat = liquidity.decayed_offset(liquidity.min_liquidity_offset_msat, decay_params);
1495                         liquidity.max_liquidity_offset_msat = liquidity.decayed_offset(liquidity.max_liquidity_offset_msat, decay_params);
1496                         liquidity.last_updated = T::now();
1497                         let elapsed_time =
1498                                 T::now().duration_since(liquidity.offset_history_last_updated);
1499                         if elapsed_time > decay_params.historical_no_updates_half_life {
1500                                 let half_life = decay_params.historical_no_updates_half_life.as_secs_f64();
1501                                 if half_life != 0.0 {
1502                                         let divisor = powf64(2048.0, elapsed_time.as_secs_f64() / half_life) as u64;
1503                                         for bucket in liquidity.min_liquidity_offset_history.buckets.iter_mut() {
1504                                                 *bucket = ((*bucket as u64) * 1024 / divisor) as u16;
1505                                         }
1506                                         for bucket in liquidity.max_liquidity_offset_history.buckets.iter_mut() {
1507                                                 *bucket = ((*bucket as u64) * 1024 / divisor) as u16;
1508                                         }
1509                                         liquidity.offset_history_last_updated = T::now();
1510                                 }
1511                         }
1512                         liquidity.min_liquidity_offset_msat != 0 || liquidity.max_liquidity_offset_msat != 0 ||
1513                                 liquidity.min_liquidity_offset_history.buckets != [0; 32] ||
1514                                 liquidity.max_liquidity_offset_history.buckets != [0; 32]
1515                 });
1516         }
1517 }
1518
1519 #[cfg(c_bindings)]
1520 impl<G: Deref<Target = NetworkGraph<L>>, L: Deref, T: Time> Score for ProbabilisticScorerUsingTime<G, L, T>
1521 where L::Target: Logger {}
1522
1523 #[cfg(feature = "std")]
1524 #[inline]
1525 fn powf64(n: f64, exp: f64) -> f64 {
1526         n.powf(exp)
1527 }
1528 #[cfg(not(feature = "std"))]
1529 fn powf64(n: f64, exp: f64) -> f64 {
1530         libm::powf(n as f32, exp as f32) as f64
1531 }
1532
1533 mod approx {
1534         const BITS: u32 = 64;
1535         const HIGHEST_BIT: u32 = BITS - 1;
1536         const LOWER_BITS: u32 = 6;
1537         pub(super) const LOWER_BITS_BOUND: u64 = 1 << LOWER_BITS;
1538         const LOWER_BITMASK: u64 = (1 << LOWER_BITS) - 1;
1539
1540         /// Look-up table for `log10(x) * 2048` where row `i` is used for each `x` having `i` as the
1541         /// most significant bit. The next 4 bits of `x`, if applicable, are used for the second index.
1542         const LOG10_TIMES_2048: [[u16; (LOWER_BITS_BOUND) as usize]; BITS as usize] = [
1543                 [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1544                         0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1545                         0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1546                         0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
1547                 [617, 617, 617, 617, 617, 617, 617, 617, 617, 617, 617, 617, 617, 617, 617, 617,
1548                         617, 617, 617, 617, 617, 617, 617, 617, 617, 617, 617, 617, 617, 617, 617, 617,
1549                         977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977,
1550                         977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977, 977],
1551                 [1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233, 1233,
1552                         1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431, 1431,
1553                         1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594, 1594,
1554                         1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731, 1731],
1555                 [1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1954, 1954, 1954, 1954, 1954, 1954, 1954, 1954,
1556                         2048, 2048, 2048, 2048, 2048, 2048, 2048, 2048, 2133, 2133, 2133, 2133, 2133, 2133, 2133, 2133,
1557                         2210, 2210, 2210, 2210, 2210, 2210, 2210, 2210, 2281, 2281, 2281, 2281, 2281, 2281, 2281, 2281,
1558                         2347, 2347, 2347, 2347, 2347, 2347, 2347, 2347, 2409, 2409, 2409, 2409, 2409, 2409, 2409, 2409],
1559                 [2466, 2466, 2466, 2466, 2520, 2520, 2520, 2520, 2571, 2571, 2571, 2571, 2619, 2619, 2619, 2619,
1560                         2665, 2665, 2665, 2665, 2708, 2708, 2708, 2708, 2749, 2749, 2749, 2749, 2789, 2789, 2789, 2789,
1561                         2827, 2827, 2827, 2827, 2863, 2863, 2863, 2863, 2898, 2898, 2898, 2898, 2931, 2931, 2931, 2931,
1562                         2964, 2964, 2964, 2964, 2995, 2995, 2995, 2995, 3025, 3025, 3025, 3025, 3054, 3054, 3054, 3054],
1563                 [3083, 3083, 3110, 3110, 3136, 3136, 3162, 3162, 3187, 3187, 3212, 3212, 3235, 3235, 3259, 3259,
1564                         3281, 3281, 3303, 3303, 3324, 3324, 3345, 3345, 3366, 3366, 3386, 3386, 3405, 3405, 3424, 3424,
1565                         3443, 3443, 3462, 3462, 3479, 3479, 3497, 3497, 3514, 3514, 3531, 3531, 3548, 3548, 3564, 3564,
1566                         3580, 3580, 3596, 3596, 3612, 3612, 3627, 3627, 3642, 3642, 3656, 3656, 3671, 3671, 3685, 3685],
1567                 [3699, 3713, 3726, 3740, 3753, 3766, 3779, 3791, 3804, 3816, 3828, 3840, 3852, 3864, 3875, 3886,
1568                         3898, 3909, 3919, 3930, 3941, 3951, 3962, 3972, 3982, 3992, 4002, 4012, 4022, 4031, 4041, 4050,
1569                         4060, 4069, 4078, 4087, 4096, 4105, 4114, 4122, 4131, 4139, 4148, 4156, 4164, 4173, 4181, 4189,
1570                         4197, 4205, 4213, 4220, 4228, 4236, 4243, 4251, 4258, 4266, 4273, 4280, 4287, 4294, 4302, 4309],
1571                 [4316, 4329, 4343, 4356, 4369, 4382, 4395, 4408, 4420, 4433, 4445, 4457, 4468, 4480, 4492, 4503,
1572                         4514, 4525, 4536, 4547, 4557, 4568, 4578, 4589, 4599, 4609, 4619, 4629, 4638, 4648, 4657, 4667,
1573                         4676, 4685, 4695, 4704, 4713, 4721, 4730, 4739, 4747, 4756, 4764, 4773, 4781, 4789, 4797, 4805,
1574                         4813, 4821, 4829, 4837, 4845, 4852, 4860, 4867, 4875, 4882, 4889, 4897, 4904, 4911, 4918, 4925],
1575                 [4932, 4946, 4959, 4973, 4986, 4999, 5012, 5024, 5037, 5049, 5061, 5073, 5085, 5097, 5108, 5119,
1576                         5131, 5142, 5153, 5163, 5174, 5184, 5195, 5205, 5215, 5225, 5235, 5245, 5255, 5264, 5274, 5283,
1577                         5293, 5302, 5311, 5320, 5329, 5338, 5347, 5355, 5364, 5372, 5381, 5389, 5397, 5406, 5414, 5422,
1578                         5430, 5438, 5446, 5453, 5461, 5469, 5476, 5484, 5491, 5499, 5506, 5513, 5520, 5527, 5535, 5542],
1579                 [5549, 5562, 5576, 5589, 5603, 5615, 5628, 5641, 5653, 5666, 5678, 5690, 5701, 5713, 5725, 5736,
1580                         5747, 5758, 5769, 5780, 5790, 5801, 5811, 5822, 5832, 5842, 5852, 5862, 5871, 5881, 5890, 5900,
1581                         5909, 5918, 5928, 5937, 5946, 5954, 5963, 5972, 5980, 5989, 5997, 6006, 6014, 6022, 6030, 6038,
1582                         6046, 6054, 6062, 6070, 6078, 6085, 6093, 6100, 6108, 6115, 6122, 6130, 6137, 6144, 6151, 6158],
1583                 [6165, 6179, 6192, 6206, 6219, 6232, 6245, 6257, 6270, 6282, 6294, 6306, 6318, 6330, 6341, 6352,
1584                         6364, 6375, 6386, 6396, 6407, 6417, 6428, 6438, 6448, 6458, 6468, 6478, 6488, 6497, 6507, 6516,
1585                         6526, 6535, 6544, 6553, 6562, 6571, 6580, 6588, 6597, 6605, 6614, 6622, 6630, 6639, 6647, 6655,
1586                         6663, 6671, 6679, 6686, 6694, 6702, 6709, 6717, 6724, 6732, 6739, 6746, 6753, 6761, 6768, 6775],
1587                 [6782, 6795, 6809, 6822, 6836, 6849, 6861, 6874, 6886, 6899, 6911, 6923, 6934, 6946, 6958, 6969,
1588                         6980, 6991, 7002, 7013, 7023, 7034, 7044, 7055, 7065, 7075, 7085, 7095, 7104, 7114, 7124, 7133,
1589                         7142, 7151, 7161, 7170, 7179, 7187, 7196, 7205, 7213, 7222, 7230, 7239, 7247, 7255, 7263, 7271,
1590                         7279, 7287, 7295, 7303, 7311, 7318, 7326, 7333, 7341, 7348, 7355, 7363, 7370, 7377, 7384, 7391],
1591                 [7398, 7412, 7425, 7439, 7452, 7465, 7478, 7490, 7503, 7515, 7527, 7539, 7551, 7563, 7574, 7585,
1592                         7597, 7608, 7619, 7629, 7640, 7651, 7661, 7671, 7681, 7691, 7701, 7711, 7721, 7731, 7740, 7749,
1593                         7759, 7768, 7777, 7786, 7795, 7804, 7813, 7821, 7830, 7838, 7847, 7855, 7864, 7872, 7880, 7888,
1594                         7896, 7904, 7912, 7919, 7927, 7935, 7942, 7950, 7957, 7965, 7972, 7979, 7986, 7994, 8001, 8008],
1595                 [8015, 8028, 8042, 8055, 8069, 8082, 8094, 8107, 8119, 8132, 8144, 8156, 8167, 8179, 8191, 8202,
1596                         8213, 8224, 8235, 8246, 8256, 8267, 8277, 8288, 8298, 8308, 8318, 8328, 8337, 8347, 8357, 8366,
1597                         8375, 8384, 8394, 8403, 8412, 8420, 8429, 8438, 8446, 8455, 8463, 8472, 8480, 8488, 8496, 8504,
1598                         8512, 8520, 8528, 8536, 8544, 8551, 8559, 8566, 8574, 8581, 8588, 8596, 8603, 8610, 8617, 8624],
1599                 [8631, 8645, 8659, 8672, 8685, 8698, 8711, 8723, 8736, 8748, 8760, 8772, 8784, 8796, 8807, 8818,
1600                         8830, 8841, 8852, 8862, 8873, 8884, 8894, 8904, 8914, 8924, 8934, 8944, 8954, 8964, 8973, 8982,
1601                         8992, 9001, 9010, 9019, 9028, 9037, 9046, 9054, 9063, 9071, 9080, 9088, 9097, 9105, 9113, 9121,
1602                         9129, 9137, 9145, 9152, 9160, 9168, 9175, 9183, 9190, 9198, 9205, 9212, 9219, 9227, 9234, 9241],
1603                 [9248, 9261, 9275, 9288, 9302, 9315, 9327, 9340, 9352, 9365, 9377, 9389, 9400, 9412, 9424, 9435,
1604                         9446, 9457, 9468, 9479, 9490, 9500, 9510, 9521, 9531, 9541, 9551, 9561, 9570, 9580, 9590, 9599,
1605                         9608, 9617, 9627, 9636, 9645, 9653, 9662, 9671, 9679, 9688, 9696, 9705, 9713, 9721, 9729, 9737,
1606                         9745, 9753, 9761, 9769, 9777, 9784, 9792, 9799, 9807, 9814, 9821, 9829, 9836, 9843, 9850, 9857],
1607                 [9864, 9878, 9892, 9905, 9918, 9931, 9944, 9956, 9969, 9981, 9993, 10005, 10017, 10029, 10040, 10051,
1608                         10063, 10074, 10085, 10095, 10106, 10117, 10127, 10137, 10147, 10157, 10167, 10177, 10187, 10197, 10206, 10215,
1609                         10225, 10234, 10243, 10252, 10261, 10270, 10279, 10287, 10296, 10304, 10313, 10321, 10330, 10338, 10346, 10354,
1610                         10362, 10370, 10378, 10385, 10393, 10401, 10408, 10416, 10423, 10431, 10438, 10445, 10452, 10460, 10467, 10474],
1611                 [10481, 10494, 10508, 10521, 10535, 10548, 10560, 10573, 10585, 10598, 10610, 10622, 10634, 10645, 10657, 10668,
1612                         10679, 10690, 10701, 10712, 10723, 10733, 10743, 10754, 10764, 10774, 10784, 10794, 10803, 10813, 10823, 10832,
1613                         10841, 10851, 10860, 10869, 10878, 10886, 10895, 10904, 10912, 10921, 10929, 10938, 10946, 10954, 10962, 10970,
1614                         10978, 10986, 10994, 11002, 11010, 11017, 11025, 11032, 11040, 11047, 11054, 11062, 11069, 11076, 11083, 11090],
1615                 [11097, 11111, 11125, 11138, 11151, 11164, 11177, 11189, 11202, 11214, 11226, 11238, 11250, 11262, 11273, 11284,
1616                         11296, 11307, 11318, 11328, 11339, 11350, 11360, 11370, 11380, 11390, 11400, 11410, 11420, 11430, 11439, 11448,
1617                         11458, 11467, 11476, 11485, 11494, 11503, 11512, 11520, 11529, 11538, 11546, 11554, 11563, 11571, 11579, 11587,
1618                         11595, 11603, 11611, 11618, 11626, 11634, 11641, 11649, 11656, 11664, 11671, 11678, 11685, 11693, 11700, 11707],
1619                 [11714, 11727, 11741, 11754, 11768, 11781, 11793, 11806, 11818, 11831, 11843, 11855, 11867, 11878, 11890, 11901,
1620                         11912, 11923, 11934, 11945, 11956, 11966, 11976, 11987, 11997, 12007, 12017, 12027, 12036, 12046, 12056, 12065,
1621                         12074, 12084, 12093, 12102, 12111, 12119, 12128, 12137, 12146, 12154, 12162, 12171, 12179, 12187, 12195, 12203,
1622                         12211, 12219, 12227, 12235, 12243, 12250, 12258, 12265, 12273, 12280, 12287, 12295, 12302, 12309, 12316, 12323],
1623                 [12330, 12344, 12358, 12371, 12384, 12397, 12410, 12423, 12435, 12447, 12459, 12471, 12483, 12495, 12506, 12517,
1624                         12529, 12540, 12551, 12561, 12572, 12583, 12593, 12603, 12613, 12623, 12633, 12643, 12653, 12663, 12672, 12682,
1625                         12691, 12700, 12709, 12718, 12727, 12736, 12745, 12753, 12762, 12771, 12779, 12787, 12796, 12804, 12812, 12820,
1626                         12828, 12836, 12844, 12851, 12859, 12867, 12874, 12882, 12889, 12897, 12904, 12911, 12918, 12926, 12933, 12940],
1627                 [12947, 12960, 12974, 12987, 13001, 13014, 13026, 13039, 13051, 13064, 13076, 13088, 13100, 13111, 13123, 13134,
1628                         13145, 13156, 13167, 13178, 13189, 13199, 13209, 13220, 13230, 13240, 13250, 13260, 13269, 13279, 13289, 13298,
1629                         13307, 13317, 13326, 13335, 13344, 13352, 13361, 13370, 13379, 13387, 13395, 13404, 13412, 13420, 13428, 13436,
1630                         13444, 13452, 13460, 13468, 13476, 13483, 13491, 13498, 13506, 13513, 13521, 13528, 13535, 13542, 13549, 13556],
1631                 [13563, 13577, 13591, 13604, 13617, 13630, 13643, 13656, 13668, 13680, 13692, 13704, 13716, 13728, 13739, 13750,
1632                         13762, 13773, 13784, 13794, 13805, 13816, 13826, 13836, 13846, 13857, 13866, 13876, 13886, 13896, 13905, 13915,
1633                         13924, 13933, 13942, 13951, 13960, 13969, 13978, 13986, 13995, 14004, 14012, 14020, 14029, 14037, 14045, 14053,
1634                         14061, 14069, 14077, 14084, 14092, 14100, 14107, 14115, 14122, 14130, 14137, 14144, 14151, 14159, 14166, 14173],
1635                 [14180, 14194, 14207, 14220, 14234, 14247, 14259, 14272, 14284, 14297, 14309, 14321, 14333, 14344, 14356, 14367,
1636                         14378, 14389, 14400, 14411, 14422, 14432, 14443, 14453, 14463, 14473, 14483, 14493, 14502, 14512, 14522, 14531,
1637                         14540, 14550, 14559, 14568, 14577, 14586, 14594, 14603, 14612, 14620, 14628, 14637, 14645, 14653, 14661, 14669,
1638                         14677, 14685, 14693, 14701, 14709, 14716, 14724, 14731, 14739, 14746, 14754, 14761, 14768, 14775, 14782, 14789],
1639                 [14796, 14810, 14824, 14837, 14850, 14863, 14876, 14889, 14901, 14913, 14925, 14937, 14949, 14961, 14972, 14984,
1640                         14995, 15006, 15017, 15027, 15038, 15049, 15059, 15069, 15079, 15090, 15099, 15109, 15119, 15129, 15138, 15148,
1641                         15157, 15166, 15175, 15184, 15193, 15202, 15211, 15219, 15228, 15237, 15245, 15253, 15262, 15270, 15278, 15286,
1642                         15294, 15302, 15310, 15317, 15325, 15333, 15340, 15348, 15355, 15363, 15370, 15377, 15384, 15392, 15399, 15406],
1643                 [15413, 15427, 15440, 15453, 15467, 15480, 15492, 15505, 15517, 15530, 15542, 15554, 15566, 15577, 15589, 15600,
1644                         15611, 15622, 15633, 15644, 15655, 15665, 15676, 15686, 15696, 15706, 15716, 15726, 15736, 15745, 15755, 15764,
1645                         15773, 15783, 15792, 15801, 15810, 15819, 15827, 15836, 15845, 15853, 15862, 15870, 15878, 15886, 15894, 15903,
1646                         15910, 15918, 15926, 15934, 15942, 15949, 15957, 15964, 15972, 15979, 15987, 15994, 16001, 16008, 16015, 16022],
1647                 [16029, 16043, 16057, 16070, 16083, 16096, 16109, 16122, 16134, 16146, 16158, 16170, 16182, 16194, 16205, 16217,
1648                         16228, 16239, 16250, 16260, 16271, 16282, 16292, 16302, 16312, 16323, 16332, 16342, 16352, 16362, 16371, 16381,
1649                         16390, 16399, 16408, 16417, 16426, 16435, 16444, 16452, 16461, 16470, 16478, 16486, 16495, 16503, 16511, 16519,
1650                         16527, 16535, 16543, 16550, 16558, 16566, 16573, 16581, 16588, 16596, 16603, 16610, 16618, 16625, 16632, 16639],
1651                 [16646, 16660, 16673, 16686, 16700, 16713, 16725, 16738, 16751, 16763, 16775, 16787, 16799, 16810, 16822, 16833,
1652                         16844, 16855, 16866, 16877, 16888, 16898, 16909, 16919, 16929, 16939, 16949, 16959, 16969, 16978, 16988, 16997,
1653                         17006, 17016, 17025, 17034, 17043, 17052, 17060, 17069, 17078, 17086, 17095, 17103, 17111, 17119, 17127, 17136,
1654                         17143, 17151, 17159, 17167, 17175, 17182, 17190, 17197, 17205, 17212, 17220, 17227, 17234, 17241, 17248, 17255],
1655                 [17262, 17276, 17290, 17303, 17316, 17329, 17342, 17355, 17367, 17379, 17391, 17403, 17415, 17427, 17438, 17450,
1656                         17461, 17472, 17483, 17493, 17504, 17515, 17525, 17535, 17546, 17556, 17565, 17575, 17585, 17595, 17604, 17614,
1657                         17623, 17632, 17641, 17650, 17659, 17668, 17677, 17685, 17694, 17703, 17711, 17719, 17728, 17736, 17744, 17752,
1658                         17760, 17768, 17776, 17784, 17791, 17799, 17806, 17814, 17821, 17829, 17836, 17843, 17851, 17858, 17865, 17872],
1659                 [17879, 17893, 17906, 17920, 17933, 17946, 17958, 17971, 17984, 17996, 18008, 18020, 18032, 18043, 18055, 18066,
1660                         18077, 18088, 18099, 18110, 18121, 18131, 18142, 18152, 18162, 18172, 18182, 18192, 18202, 18211, 18221, 18230,
1661                         18239, 18249, 18258, 18267, 18276, 18285, 18293, 18302, 18311, 18319, 18328, 18336, 18344, 18352, 18360, 18369,
1662                         18377, 18384, 18392, 18400, 18408, 18415, 18423, 18430, 18438, 18445, 18453, 18460, 18467, 18474, 18481, 18488],
1663                 [18495, 18509, 18523, 18536, 18549, 18562, 18575, 18588, 18600, 18612, 18624, 18636, 18648, 18660, 18671, 18683,
1664                         18694, 18705, 18716, 18726, 18737, 18748, 18758, 18768, 18779, 18789, 18799, 18808, 18818, 18828, 18837, 18847,
1665                         18856, 18865, 18874, 18883, 18892, 18901, 18910, 18919, 18927, 18936, 18944, 18952, 18961, 18969, 18977, 18985,
1666                         18993, 19001, 19009, 19017, 19024, 19032, 19039, 19047, 19054, 19062, 19069, 19076, 19084, 19091, 19098, 19105],
1667                 [19112, 19126, 19139, 19153, 19166, 19179, 19191, 19204, 19217, 19229, 19241, 19253, 19265, 19276, 19288, 19299,
1668                         19310, 19321, 19332, 19343, 19354, 19364, 19375, 19385, 19395, 19405, 19415, 19425, 19435, 19444, 19454, 19463,
1669                         19472, 19482, 19491, 19500, 19509, 19518, 19526, 19535, 19544, 19552, 19561, 19569, 19577, 19585, 19594, 19602,
1670                         19610, 19617, 19625, 19633, 19641, 19648, 19656, 19663, 19671, 19678, 19686, 19693, 19700, 19707, 19714, 19721],
1671                 [19728, 19742, 19756, 19769, 19782, 19795, 19808, 19821, 19833, 19845, 19857, 19869, 19881, 19893, 19904, 19916,
1672                         19927, 19938, 19949, 19960, 19970, 19981, 19991, 20001, 20012, 20022, 20032, 20041, 20051, 20061, 20070, 20080,
1673                         20089, 20098, 20107, 20116, 20125, 20134, 20143, 20152, 20160, 20169, 20177, 20185, 20194, 20202, 20210, 20218,
1674                         20226, 20234, 20242, 20250, 20257, 20265, 20272, 20280, 20287, 20295, 20302, 20309, 20317, 20324, 20331, 20338],
1675                 [20345, 20359, 20372, 20386, 20399, 20412, 20425, 20437, 20450, 20462, 20474, 20486, 20498, 20509, 20521, 20532,
1676                         20543, 20554, 20565, 20576, 20587, 20597, 20608, 20618, 20628, 20638, 20648, 20658, 20668, 20677, 20687, 20696,
1677                         20705, 20715, 20724, 20733, 20742, 20751, 20759, 20768, 20777, 20785, 20794, 20802, 20810, 20818, 20827, 20835,
1678                         20843, 20850, 20858, 20866, 20874, 20881, 20889, 20896, 20904, 20911, 20919, 20926, 20933, 20940, 20947, 20954],
1679                 [20961, 20975, 20989, 21002, 21015, 21028, 21041, 21054, 21066, 21078, 21090, 21102, 21114, 21126, 21137, 21149,
1680                         21160, 21171, 21182, 21193, 21203, 21214, 21224, 21234, 21245, 21255, 21265, 21274, 21284, 21294, 21303, 21313,
1681                         21322, 21331, 21340, 21349, 21358, 21367, 21376, 21385, 21393, 21402, 21410, 21418, 21427, 21435, 21443, 21451,
1682                         21459, 21467, 21475, 21483, 21490, 21498, 21505, 21513, 21520, 21528, 21535, 21542, 21550, 21557, 21564, 21571],
1683                 [21578, 21592, 21605, 21619, 21632, 21645, 21658, 21670, 21683, 21695, 21707, 21719, 21731, 21742, 21754, 21765,
1684                         21776, 21787, 21798, 21809, 21820, 21830, 21841, 21851, 21861, 21871, 21881, 21891, 21901, 21910, 21920, 21929,
1685                         21938, 21948, 21957, 21966, 21975, 21984, 21992, 22001, 22010, 22018, 22027, 22035, 22043, 22051, 22060, 22068,
1686                         22076, 22083, 22091, 22099, 22107, 22114, 22122, 22129, 22137, 22144, 22152, 22159, 22166, 22173, 22180, 22187],
1687                 [22194, 22208, 22222, 22235, 22248, 22261, 22274, 22287, 22299, 22311, 22323, 22335, 22347, 22359, 22370, 22382,
1688                         22393, 22404, 22415, 22426, 22436, 22447, 22457, 22467, 22478, 22488, 22498, 22507, 22517, 22527, 22536, 22546,
1689                         22555, 22564, 22573, 22582, 22591, 22600, 22609, 22618, 22626, 22635, 22643, 22651, 22660, 22668, 22676, 22684,
1690                         22692, 22700, 22708, 22716, 22723, 22731, 22738, 22746, 22753, 22761, 22768, 22775, 22783, 22790, 22797, 22804],
1691                 [22811, 22825, 22838, 22852, 22865, 22878, 22891, 22903, 22916, 22928, 22940, 22952, 22964, 22975, 22987, 22998,
1692                         23009, 23020, 23031, 23042, 23053, 23063, 23074, 23084, 23094, 23104, 23114, 23124, 23134, 23143, 23153, 23162,
1693                         23171, 23181, 23190, 23199, 23208, 23217, 23225, 23234, 23243, 23251, 23260, 23268, 23276, 23284, 23293, 23301,
1694                         23309, 23316, 23324, 23332, 23340, 23347, 23355, 23363, 23370, 23377, 23385, 23392, 23399, 23406, 23413, 23420],
1695                 [23427, 23441, 23455, 23468, 23481, 23494, 23507, 23520, 23532, 23544, 23556, 23568, 23580, 23592, 23603, 23615,
1696                         23626, 23637, 23648, 23659, 23669, 23680, 23690, 23700, 23711, 23721, 23731, 23740, 23750, 23760, 23769, 23779,
1697                         23788, 23797, 23806, 23815, 23824, 23833, 23842, 23851, 23859, 23868, 23876, 23884, 23893, 23901, 23909, 23917,
1698                         23925, 23933, 23941, 23949, 23956, 23964, 23972, 23979, 23986, 23994, 24001, 24008, 24016, 24023, 24030, 24037],
1699                 [24044, 24058, 24071, 24085, 24098, 24111, 24124, 24136, 24149, 24161, 24173, 24185, 24197, 24208, 24220, 24231,
1700                         24242, 24253, 24264, 24275, 24286, 24296, 24307, 24317, 24327, 24337, 24347, 24357, 24367, 24376, 24386, 24395,
1701                         24405, 24414, 24423, 24432, 24441, 24450, 24458, 24467, 24476, 24484, 24493, 24501, 24509, 24517, 24526, 24534,
1702                         24542, 24550, 24557, 24565, 24573, 24580, 24588, 24596, 24603, 24610, 24618, 24625, 24632, 24639, 24646, 24653],
1703                 [24660, 24674, 24688, 24701, 24714, 24727, 24740, 24753, 24765, 24777, 24790, 24801, 24813, 24825, 24836, 24848,
1704                         24859, 24870, 24881, 24892, 24902, 24913, 24923, 24933, 24944, 24954, 24964, 24973, 24983, 24993, 25002, 25012,
1705                         25021, 25030, 25039, 25048, 25057, 25066, 25075, 25084, 25092, 25101, 25109, 25117, 25126, 25134, 25142, 25150,
1706                         25158, 25166, 25174, 25182, 25189, 25197, 25205, 25212, 25219, 25227, 25234, 25241, 25249, 25256, 25263, 25270],
1707                 [25277, 25291, 25304, 25318, 25331, 25344, 25357, 25369, 25382, 25394, 25406, 25418, 25430, 25441, 25453, 25464,
1708                         25475, 25486, 25497, 25508, 25519, 25529, 25540, 25550, 25560, 25570, 25580, 25590, 25600, 25609, 25619, 25628,
1709                         25638, 25647, 25656, 25665, 25674, 25683, 25691, 25700, 25709, 25717, 25726, 25734, 25742, 25750, 25759, 25767,
1710                         25775, 25783, 25790, 25798, 25806, 25813, 25821, 25829, 25836, 25843, 25851, 25858, 25865, 25872, 25879, 25886],
1711                 [25893, 25907, 25921, 25934, 25947, 25960, 25973, 25986, 25998, 26010, 26023, 26034, 26046, 26058, 26069, 26081,
1712                         26092, 26103, 26114, 26125, 26135, 26146, 26156, 26166, 26177, 26187, 26197, 26206, 26216, 26226, 26235, 26245,
1713                         26254, 26263, 26272, 26281, 26290, 26299, 26308, 26317, 26325, 26334, 26342, 26351, 26359, 26367, 26375, 26383,
1714                         26391, 26399, 26407, 26415, 26422, 26430, 26438, 26445, 26453, 26460, 26467, 26474, 26482, 26489, 26496, 26503],
1715                 [26510, 26524, 26537, 26551, 26564, 26577, 26590, 26602, 26615, 26627, 26639, 26651, 26663, 26674, 26686, 26697,
1716                         26708, 26719, 26730, 26741, 26752, 26762, 26773, 26783, 26793, 26803, 26813, 26823, 26833, 26842, 26852, 26861,
1717                         26871, 26880, 26889, 26898, 26907, 26916, 26924, 26933, 26942, 26950, 26959, 26967, 26975, 26983, 26992, 27000,
1718                         27008, 27016, 27023, 27031, 27039, 27046, 27054, 27062, 27069, 27076, 27084, 27091, 27098, 27105, 27112, 27119],
1719                 [27126, 27140, 27154, 27167, 27180, 27193, 27206, 27219, 27231, 27243, 27256, 27267, 27279, 27291, 27302, 27314,
1720                         27325, 27336, 27347, 27358, 27368, 27379, 27389, 27399, 27410, 27420, 27430, 27439, 27449, 27459, 27468, 27478,
1721                         27487, 27496, 27505, 27514, 27523, 27532, 27541, 27550, 27558, 27567, 27575, 27584, 27592, 27600, 27608, 27616,
1722                         27624, 27632, 27640, 27648, 27655, 27663, 27671, 27678, 27686, 27693, 27700, 27707, 27715, 27722, 27729, 27736],
1723                 [27743, 27757, 27770, 27784, 27797, 27810, 27823, 27835, 27848, 27860, 27872, 27884, 27896, 27907, 27919, 27930,
1724                         27941, 27952, 27963, 27974, 27985, 27995, 28006, 28016, 28026, 28036, 28046, 28056, 28066, 28075, 28085, 28094,
1725                         28104, 28113, 28122, 28131, 28140, 28149, 28157, 28166, 28175, 28183, 28192, 28200, 28208, 28217, 28225, 28233,
1726                         28241, 28249, 28256, 28264, 28272, 28280, 28287, 28295, 28302, 28309, 28317, 28324, 28331, 28338, 28345, 28352],
1727                 [28359, 28373, 28387, 28400, 28413, 28426, 28439, 28452, 28464, 28476, 28489, 28501, 28512, 28524, 28535, 28547,
1728                         28558, 28569, 28580, 28591, 28601, 28612, 28622, 28633, 28643, 28653, 28663, 28672, 28682, 28692, 28701, 28711,
1729                         28720, 28729, 28738, 28747, 28756, 28765, 28774, 28783, 28791, 28800, 28808, 28817, 28825, 28833, 28841, 28849,
1730                         28857, 28865, 28873, 28881, 28888, 28896, 28904, 28911, 28919, 28926, 28933, 28941, 28948, 28955, 28962, 28969],
1731                 [28976, 28990, 29003, 29017, 29030, 29043, 29056, 29068, 29081, 29093, 29105, 29117, 29129, 29140, 29152, 29163,
1732                         29174, 29185, 29196, 29207, 29218, 29228, 29239, 29249, 29259, 29269, 29279, 29289, 29299, 29308, 29318, 29327,
1733                         29337, 29346, 29355, 29364, 29373, 29382, 29390, 29399, 29408, 29416, 29425, 29433, 29441, 29450, 29458, 29466,
1734                         29474, 29482, 29489, 29497, 29505, 29513, 29520, 29528, 29535, 29542, 29550, 29557, 29564, 29571, 29578, 29585],
1735                 [29592, 29606, 29620, 29633, 29646, 29659, 29672, 29685, 29697, 29709, 29722, 29734, 29745, 29757, 29768, 29780,
1736                         29791, 29802, 29813, 29824, 29834, 29845, 29855, 29866, 29876, 29886, 29896, 29906, 29915, 29925, 29934, 29944,
1737                         29953, 29962, 29971, 29980, 29989, 29998, 30007, 30016, 30024, 30033, 30041, 30050, 30058, 30066, 30074, 30082,
1738                         30090, 30098, 30106, 30114, 30121, 30129, 30137, 30144, 30152, 30159, 30166, 30174, 30181, 30188, 30195, 30202],
1739                 [30209, 30223, 30236, 30250, 30263, 30276, 30289, 30301, 30314, 30326, 30338, 30350, 30362, 30373, 30385, 30396,
1740                         30407, 30418, 30429, 30440, 30451, 30461, 30472, 30482, 30492, 30502, 30512, 30522, 30532, 30541, 30551, 30560,
1741                         30570, 30579, 30588, 30597, 30606, 30615, 30624, 30632, 30641, 30649, 30658, 30666, 30674, 30683, 30691, 30699,
1742                         30707, 30715, 30722, 30730, 30738, 30746, 30753, 30761, 30768, 30775, 30783, 30790, 30797, 30804, 30811, 30818],
1743                 [30825, 30839, 30853, 30866, 30879, 30892, 30905, 30918, 30930, 30943, 30955, 30967, 30978, 30990, 31001, 31013,
1744                         31024, 31035, 31046, 31057, 31067, 31078, 31088, 31099, 31109, 31119, 31129, 31139, 31148, 31158, 31167, 31177,
1745                         31186, 31195, 31204, 31213, 31222, 31231, 31240, 31249, 31257, 31266, 31274, 31283, 31291, 31299, 31307, 31315,
1746                         31323, 31331, 31339, 31347, 31354, 31362, 31370, 31377, 31385, 31392, 31399, 31407, 31414, 31421, 31428, 31435],
1747                 [31442, 31456, 31469, 31483, 31496, 31509, 31522, 31534, 31547, 31559, 31571, 31583, 31595, 31606, 31618, 31629,
1748                         31640, 31652, 31662, 31673, 31684, 31694, 31705, 31715, 31725, 31735, 31745, 31755, 31765, 31774, 31784, 31793,
1749                         31803, 31812, 31821, 31830, 31839, 31848, 31857, 31865, 31874, 31882, 31891, 31899, 31907, 31916, 31924, 31932,
1750                         31940, 31948, 31955, 31963, 31971, 31979, 31986, 31994, 32001, 32008, 32016, 32023, 32030, 32037, 32044, 32052],
1751                 [32058, 32072, 32086, 32099, 32112, 32125, 32138, 32151, 32163, 32176, 32188, 32200, 32211, 32223, 32234, 32246,
1752                         32257, 32268, 32279, 32290, 32300, 32311, 32321, 32332, 32342, 32352, 32362, 32372, 32381, 32391, 32400, 32410,
1753                         32419, 32428, 32437, 32446, 32455, 32464, 32473, 32482, 32490, 32499, 32507, 32516, 32524, 32532, 32540, 32548,
1754                         32556, 32564, 32572, 32580, 32587, 32595, 32603, 32610, 32618, 32625, 32632, 32640, 32647, 32654, 32661, 32668],
1755                 [32675, 32689, 32702, 32716, 32729, 32742, 32755, 32767, 32780, 32792, 32804, 32816, 32828, 32839, 32851, 32862,
1756                         32873, 32885, 32895, 32906, 32917, 32927, 32938, 32948, 32958, 32968, 32978, 32988, 32998, 33007, 33017, 33026,
1757                         33036, 33045, 33054, 33063, 33072, 33081, 33090, 33098, 33107, 33115, 33124, 33132, 33140, 33149, 33157, 33165,
1758                         33173, 33181, 33188, 33196, 33204, 33212, 33219, 33227, 33234, 33241, 33249, 33256, 33263, 33270, 33278, 33285],
1759                 [33292, 33305, 33319, 33332, 33345, 33358, 33371, 33384, 33396, 33409, 33421, 33433, 33444, 33456, 33467, 33479,
1760                         33490, 33501, 33512, 33523, 33533, 33544, 33554, 33565, 33575, 33585, 33595, 33605, 33614, 33624, 33633, 33643,
1761                         33652, 33661, 33670, 33680, 33688, 33697, 33706, 33715, 33723, 33732, 33740, 33749, 33757, 33765, 33773, 33781,
1762                         33789, 33797, 33805, 33813, 33820, 33828, 33836, 33843, 33851, 33858, 33865, 33873, 33880, 33887, 33894, 33901],
1763                 [33908, 33922, 33935, 33949, 33962, 33975, 33988, 34000, 34013, 34025, 34037, 34049, 34061, 34072, 34084, 34095,
1764                         34106, 34118, 34128, 34139, 34150, 34160, 34171, 34181, 34191, 34201, 34211, 34221, 34231, 34240, 34250, 34259,
1765                         34269, 34278, 34287, 34296, 34305, 34314, 34323, 34331, 34340, 34348, 34357, 34365, 34373, 34382, 34390, 34398,
1766                         34406, 34414, 34422, 34429, 34437, 34445, 34452, 34460, 34467, 34475, 34482, 34489, 34496, 34503, 34511, 34518],
1767                 [34525, 34538, 34552, 34565, 34578, 34591, 34604, 34617, 34629, 34642, 34654, 34666, 34677, 34689, 34700, 34712,
1768                         34723, 34734, 34745, 34756, 34766, 34777, 34787, 34798, 34808, 34818, 34828, 34838, 34847, 34857, 34866, 34876,
1769                         34885, 34894, 34904, 34913, 34921, 34930, 34939, 34948, 34956, 34965, 34973, 34982, 34990, 34998, 35006, 35014,
1770                         35022, 35030, 35038, 35046, 35053, 35061, 35069, 35076, 35084, 35091, 35098, 35106, 35113, 35120, 35127, 35134],
1771                 [35141, 35155, 35168, 35182, 35195, 35208, 35221, 35233, 35246, 35258, 35270, 35282, 35294, 35306, 35317, 35328,
1772                         35340, 35351, 35361, 35372, 35383, 35393, 35404, 35414, 35424, 35434, 35444, 35454, 35464, 35473, 35483, 35492,
1773                         35502, 35511, 35520, 35529, 35538, 35547, 35556, 35564, 35573, 35581, 35590, 35598, 35606, 35615, 35623, 35631,
1774                         35639, 35647, 35655, 35662, 35670, 35678, 35685, 35693, 35700, 35708, 35715, 35722, 35729, 35736, 35744, 35751],
1775                 [35758, 35771, 35785, 35798, 35811, 35824, 35837, 35850, 35862, 35875, 35887, 35899, 35910, 35922, 35934, 35945,
1776                         35956, 35967, 35978, 35989, 35999, 36010, 36020, 36031, 36041, 36051, 36061, 36071, 36080, 36090, 36099, 36109,
1777                         36118, 36127, 36137, 36146, 36154, 36163, 36172, 36181, 36189, 36198, 36206, 36215, 36223, 36231, 36239, 36247,
1778                         36255, 36263, 36271, 36279, 36287, 36294, 36302, 36309, 36317, 36324, 36331, 36339, 36346, 36353, 36360, 36367],
1779                 [36374, 36388, 36401, 36415, 36428, 36441, 36454, 36466, 36479, 36491, 36503, 36515, 36527, 36539, 36550, 36561,
1780                         36573, 36584, 36594, 36605, 36616, 36626, 36637, 36647, 36657, 36667, 36677, 36687, 36697, 36706, 36716, 36725,
1781                         36735, 36744, 36753, 36762, 36771, 36780, 36789, 36797, 36806, 36814, 36823, 36831, 36839, 36848, 36856, 36864,
1782                         36872, 36880, 36888, 36895, 36903, 36911, 36918, 36926, 36933, 36941, 36948, 36955, 36962, 36969, 36977, 36984],
1783                 [36991, 37004, 37018, 37031, 37044, 37057, 37070, 37083, 37095, 37108, 37120, 37132, 37143, 37155, 37167, 37178,
1784                         37189, 37200, 37211, 37222, 37232, 37243, 37253, 37264, 37274, 37284, 37294, 37304, 37313, 37323, 37332, 37342,
1785                         37351, 37360, 37370, 37379, 37388, 37396, 37405, 37414, 37422, 37431, 37439, 37448, 37456, 37464, 37472, 37480,
1786                         37488, 37496, 37504, 37512, 37520, 37527, 37535, 37542, 37550, 37557, 37564, 37572, 37579, 37586, 37593, 37600],
1787                 [37607, 37621, 37634, 37648, 37661, 37674, 37687, 37699, 37712, 37724, 37736, 37748, 37760, 37772, 37783, 37794,
1788                         37806, 37817, 37828, 37838, 37849, 37859, 37870, 37880, 37890, 37900, 37910, 37920, 37930, 37939, 37949, 37958,
1789                         37968, 37977, 37986, 37995, 38004, 38013, 38022, 38030, 38039, 38047, 38056, 38064, 38072, 38081, 38089, 38097,
1790                         38105, 38113, 38121, 38128, 38136, 38144, 38151, 38159, 38166, 38174, 38181, 38188, 38195, 38202, 38210, 38217],
1791                 [38224, 38237, 38251, 38264, 38278, 38290, 38303, 38316, 38328, 38341, 38353, 38365, 38376, 38388, 38400, 38411,
1792                         38422, 38433, 38444, 38455, 38465, 38476, 38486, 38497, 38507, 38517, 38527, 38537, 38546, 38556, 38565, 38575,
1793                         38584, 38593, 38603, 38612, 38621, 38629, 38638, 38647, 38655, 38664, 38672, 38681, 38689, 38697, 38705, 38713,
1794                         38721, 38729, 38737, 38745, 38753, 38760, 38768, 38775, 38783, 38790, 38797, 38805, 38812, 38819, 38826, 38833],
1795                 [38840, 38854, 38867, 38881, 38894, 38907, 38920, 38932, 38945, 38957, 38969, 38981, 38993, 39005, 39016, 39027,
1796                         39039, 39050, 39061, 39071, 39082, 39092, 39103, 39113, 39123, 39133, 39143, 39153, 39163, 39172, 39182, 39191,
1797                         39201, 39210, 39219, 39228, 39237, 39246, 39255, 39263, 39272, 39280, 39289, 39297, 39305, 39314, 39322, 39330,
1798                         39338, 39346, 39354, 39361, 39369, 39377, 39384, 39392, 39399, 39407, 39414, 39421, 39428, 39436, 39443, 39450],
1799         ];
1800
1801         /// Approximate `log10(numerator / denominator) * 2048` using a look-up table.
1802         #[inline]
1803         pub fn negative_log10_times_2048(numerator: u64, denominator: u64) -> u64 {
1804                 // Multiply the -1 through to avoid needing to use signed numbers.
1805                 (log10_times_2048(denominator) - log10_times_2048(numerator)) as u64
1806         }
1807
1808         #[inline]
1809         fn log10_times_2048(x: u64) -> u16 {
1810                 debug_assert_ne!(x, 0);
1811                 let most_significant_bit = HIGHEST_BIT - x.leading_zeros();
1812                 let lower_bits = (x >> most_significant_bit.saturating_sub(LOWER_BITS)) & LOWER_BITMASK;
1813                 LOG10_TIMES_2048[most_significant_bit as usize][lower_bits as usize]
1814         }
1815
1816         #[cfg(test)]
1817         mod tests {
1818                 use super::*;
1819
1820                 #[test]
1821                 fn prints_negative_log10_times_2048_lookup_table() {
1822                         for msb in 0..BITS {
1823                                 for i in 0..LOWER_BITS_BOUND {
1824                                         let x = ((LOWER_BITS_BOUND + i) << (HIGHEST_BIT - LOWER_BITS)) >> (HIGHEST_BIT - msb);
1825                                         let log10_times_2048 = ((x as f64).log10() * 2048.0).round() as u16;
1826                                         assert_eq!(log10_times_2048, LOG10_TIMES_2048[msb as usize][i as usize]);
1827
1828                                         if i % LOWER_BITS_BOUND == 0 {
1829                                                 print!("\t\t[{}, ", log10_times_2048);
1830                                         } else if i % LOWER_BITS_BOUND == LOWER_BITS_BOUND - 1 {
1831                                                 println!("{}],", log10_times_2048);
1832                                         } else if i % (LOWER_BITS_BOUND/4) == LOWER_BITS_BOUND/4 - 1 {
1833                                                 print!("{},\n\t\t\t", log10_times_2048);
1834                                         } else {
1835                                                 print!("{}, ", log10_times_2048);
1836                                         }
1837                                 }
1838                         }
1839                 }
1840         }
1841 }
1842
1843 mod bucketed_history {
1844         use super::*;
1845
1846         // Because liquidity is often skewed heavily in one direction, we store historical state
1847         // distribution in buckets of different size. For backwards compatibility, buckets of size 1/8th
1848         // must fit evenly into the buckets here.
1849         //
1850         // The smallest bucket is 2^-14th of the channel, for each of our 32 buckets here we define the
1851         // width of the bucket in 2^14'ths of the channel. This increases exponentially until we reach
1852         // a full 16th of the channel's capacity, which is reapeated a few times for backwards
1853         // compatibility. The four middle buckets represent full octiles of the channel's capacity.
1854         //
1855         // For a 1 BTC channel, this let's us differentiate between failures in the bottom 6k sats, or
1856         // between the 12,000th sat and 24,000th sat, while only needing to store and operate on 32
1857         // buckets in total.
1858
1859         const BUCKET_START_POS: [u16; 33] = [
1860                 0, 1, 2, 4, 8, 16, 32, 64, 128, 256, 512, 1024, 2048, 3072, 4096, 6144, 8192, 10240, 12288,
1861                 13312, 14336, 15360, 15872, 16128, 16256, 16320, 16352, 16368, 16376, 16380, 16382, 16383, 16384,
1862         ];
1863
1864         const LEGACY_TO_BUCKET_RANGE: [(u8, u8); 8] = [
1865                 (0, 12), (12, 14), (14, 15), (15, 16), (16, 17), (17, 18), (18, 20), (20, 32)
1866         ];
1867
1868         const POSITION_TICKS: u16 = 1 << 14;
1869
1870         fn pos_to_bucket(pos: u16) -> usize {
1871                 for bucket in 0..32 {
1872                         if pos < BUCKET_START_POS[bucket + 1] {
1873                                 return bucket;
1874                         }
1875                 }
1876                 debug_assert!(false);
1877                 return 32;
1878         }
1879
1880         #[cfg(test)]
1881         #[test]
1882         fn check_bucket_maps() {
1883                 const BUCKET_WIDTH_IN_16384S: [u16; 32] = [
1884                         1, 1, 2, 4, 8, 16, 32, 64, 128, 256, 512, 1024, 1024, 1024, 2048, 2048,
1885                         2048, 2048, 1024, 1024, 1024, 512, 256, 128, 64, 32, 16, 8, 4, 2, 1, 1];
1886
1887                 let mut min_size_iter = 0;
1888                 let mut legacy_bucket_iter = 0;
1889                 for (bucket, width) in BUCKET_WIDTH_IN_16384S.iter().enumerate() {
1890                         assert_eq!(BUCKET_START_POS[bucket], min_size_iter);
1891                         for i in 0..*width {
1892                                 assert_eq!(pos_to_bucket(min_size_iter + i) as usize, bucket);
1893                         }
1894                         min_size_iter += *width;
1895                         if min_size_iter % (POSITION_TICKS / 8) == 0 {
1896                                 assert_eq!(LEGACY_TO_BUCKET_RANGE[legacy_bucket_iter].1 as usize, bucket + 1);
1897                                 if legacy_bucket_iter + 1 < 8 {
1898                                         assert_eq!(LEGACY_TO_BUCKET_RANGE[legacy_bucket_iter + 1].0 as usize, bucket + 1);
1899                                 }
1900                                 legacy_bucket_iter += 1;
1901                         }
1902                 }
1903                 assert_eq!(BUCKET_START_POS[32], POSITION_TICKS);
1904                 assert_eq!(min_size_iter, POSITION_TICKS);
1905         }
1906
1907         #[inline]
1908         fn amount_to_pos(amount_msat: u64, capacity_msat: u64) -> u16 {
1909                 let pos = if amount_msat < u64::max_value() / (POSITION_TICKS as u64) {
1910                         (amount_msat * (POSITION_TICKS as u64) / capacity_msat.saturating_add(1))
1911                                 .try_into().unwrap_or(POSITION_TICKS)
1912                 } else {
1913                         // Only use 128-bit arithmetic when multiplication will overflow to avoid 128-bit
1914                         // division. This branch should only be hit in fuzz testing since the amount would
1915                         // need to be over 2.88 million BTC in practice.
1916                         ((amount_msat as u128) * (POSITION_TICKS as u128)
1917                                         / (capacity_msat as u128).saturating_add(1))
1918                                 .try_into().unwrap_or(POSITION_TICKS)
1919                 };
1920                 // If we are running in a client that doesn't validate gossip, its possible for a channel's
1921                 // capacity to change due to a `channel_update` message which, if received while a payment
1922                 // is in-flight, could cause this to fail. Thus, we only assert in test.
1923                 #[cfg(test)]
1924                 debug_assert!(pos < POSITION_TICKS);
1925                 pos
1926         }
1927
1928         /// Prior to LDK 0.0.117 we used eight buckets which were split evenly across the either
1929         /// octiles. This was changed to use 32 buckets for accuracy reasons in 0.0.117, however we
1930         /// support reading the legacy values here for backwards compatibility.
1931         pub(super) struct LegacyHistoricalBucketRangeTracker {
1932                 buckets: [u16; 8],
1933         }
1934
1935         impl LegacyHistoricalBucketRangeTracker {
1936                 pub(crate) fn into_current(&self) -> HistoricalBucketRangeTracker {
1937                         let mut buckets = [0; 32];
1938                         for (idx, legacy_bucket) in self.buckets.iter().enumerate() {
1939                                 let mut new_val = *legacy_bucket;
1940                                 let (start, end) = LEGACY_TO_BUCKET_RANGE[idx];
1941                                 new_val /= (end - start) as u16;
1942                                 for i in start..end {
1943                                         buckets[i as usize] = new_val;
1944                                 }
1945                         }
1946                         HistoricalBucketRangeTracker { buckets }
1947                 }
1948         }
1949
1950         /// Tracks the historical state of a distribution as a weighted average of how much time was spent
1951         /// in each of 32 buckets.
1952         #[derive(Clone, Copy)]
1953         pub(super) struct HistoricalBucketRangeTracker {
1954                 pub(super) buckets: [u16; 32],
1955         }
1956
1957         /// Buckets are stored in fixed point numbers with a 5 bit fractional part. Thus, the value
1958         /// "one" is 32, or this constant.
1959         pub const BUCKET_FIXED_POINT_ONE: u16 = 32;
1960
1961         impl HistoricalBucketRangeTracker {
1962                 pub(super) fn new() -> Self { Self { buckets: [0; 32] } }
1963                 pub(super) fn track_datapoint(&mut self, liquidity_offset_msat: u64, capacity_msat: u64) {
1964                         // We have 32 leaky buckets for min and max liquidity. Each bucket tracks the amount of time
1965                         // we spend in each bucket as a 16-bit fixed-point number with a 5 bit fractional part.
1966                         //
1967                         // Each time we update our liquidity estimate, we add 32 (1.0 in our fixed-point system) to
1968                         // the buckets for the current min and max liquidity offset positions.
1969                         //
1970                         // We then decay each bucket by multiplying by 2047/2048 (avoiding dividing by a
1971                         // non-power-of-two). This ensures we can't actually overflow the u16 - when we get to
1972                         // 63,457 adding 32 and decaying by 2047/2048 leaves us back at 63,457.
1973                         //
1974                         // In total, this allows us to track data for the last 8,000 or so payments across a given
1975                         // channel.
1976                         //
1977                         // These constants are a balance - we try to fit in 2 bytes per bucket to reduce overhead,
1978                         // and need to balance having more bits in the decimal part (to ensure decay isn't too
1979                         // non-linear) with having too few bits in the mantissa, causing us to not store very many
1980                         // datapoints.
1981                         //
1982                         // The constants were picked experimentally, selecting a decay amount that restricts us
1983                         // from overflowing buckets without having to cap them manually.
1984
1985                         let pos: u16 = amount_to_pos(liquidity_offset_msat, capacity_msat);
1986                         if pos < POSITION_TICKS {
1987                                 for e in self.buckets.iter_mut() {
1988                                         *e = ((*e as u32) * 2047 / 2048) as u16;
1989                                 }
1990                                 let bucket = pos_to_bucket(pos);
1991                                 self.buckets[bucket] = self.buckets[bucket].saturating_add(BUCKET_FIXED_POINT_ONE);
1992                         }
1993                 }
1994                 /// Decay all buckets by the given number of half-lives. Used to more aggressively remove old
1995                 /// datapoints as we receive newer information.
1996                 #[inline]
1997                 pub(super) fn time_decay_data(&mut self, half_lives: u32) {
1998                         for e in self.buckets.iter_mut() {
1999                                 *e = e.checked_shr(half_lives).unwrap_or(0);
2000                         }
2001                 }
2002         }
2003
2004         impl_writeable_tlv_based!(HistoricalBucketRangeTracker, { (0, buckets, required) });
2005         impl_writeable_tlv_based!(LegacyHistoricalBucketRangeTracker, { (0, buckets, required) });
2006
2007         /// A set of buckets representing the history of where we've seen the minimum- and maximum-
2008         /// liquidity bounds for a given channel.
2009         pub(super) struct HistoricalMinMaxBuckets<D: Deref<Target = HistoricalBucketRangeTracker>> {
2010                 /// Buckets tracking where and how often we've seen the minimum liquidity bound for a
2011                 /// channel.
2012                 pub(super) min_liquidity_offset_history: D,
2013                 /// Buckets tracking where and how often we've seen the maximum liquidity bound for a
2014                 /// channel.
2015                 pub(super) max_liquidity_offset_history: D,
2016         }
2017
2018         impl<D: Deref<Target = HistoricalBucketRangeTracker>> HistoricalMinMaxBuckets<D> {
2019                 #[inline]
2020                 pub(super) fn calculate_success_probability_times_billion(
2021                         &self, params: &ProbabilisticScoringFeeParameters, amount_msat: u64,
2022                         capacity_msat: u64
2023                 ) -> Option<u64> {
2024                         // If historical penalties are enabled, we try to calculate a probability of success
2025                         // given our historical distribution of min- and max-liquidity bounds in a channel.
2026                         // To do so, we walk the set of historical liquidity bucket (min, max) combinations
2027                         // (where min_idx < max_idx, as having a minimum above our maximum is an invalid
2028                         // state). For each pair, we calculate the probability as if the bucket's corresponding
2029                         // min- and max- liquidity bounds were our current liquidity bounds and then multiply
2030                         // that probability by the weight of the selected buckets.
2031                         let payment_pos = amount_to_pos(amount_msat, capacity_msat);
2032                         if payment_pos >= POSITION_TICKS { return None; }
2033
2034                         let mut total_valid_points_tracked = 0;
2035                         for (min_idx, min_bucket) in self.min_liquidity_offset_history.buckets.iter().enumerate() {
2036                                 for max_bucket in self.max_liquidity_offset_history.buckets.iter().take(32 - min_idx) {
2037                                         total_valid_points_tracked += (*min_bucket as u64) * (*max_bucket as u64);
2038                                 }
2039                         }
2040
2041                         // If the total valid points is smaller than 1.0 (i.e. 32 in our fixed-point scheme),
2042                         // treat it as if we were fully decayed.
2043                         const FULLY_DECAYED: u16 = BUCKET_FIXED_POINT_ONE * BUCKET_FIXED_POINT_ONE;
2044                         if total_valid_points_tracked < FULLY_DECAYED.into() {
2045                                 return None;
2046                         }
2047
2048                         let mut cumulative_success_prob_times_billion = 0;
2049                         // Special-case the 0th min bucket - it generally means we failed a payment, so only
2050                         // consider the highest (i.e. largest-offset-from-max-capacity) max bucket for all
2051                         // points against the 0th min bucket. This avoids the case where we fail to route
2052                         // increasingly lower values over a channel, but treat each failure as a separate
2053                         // datapoint, many of which may have relatively high maximum-available-liquidity
2054                         // values, which will result in us thinking we have some nontrivial probability of
2055                         // routing up to that amount.
2056                         if self.min_liquidity_offset_history.buckets[0] != 0 {
2057                                 let mut highest_max_bucket_with_points = 0; // The highest max-bucket with any data
2058                                 let mut total_max_points = 0; // Total points in max-buckets to consider
2059                                 for (max_idx, max_bucket) in self.max_liquidity_offset_history.buckets.iter().enumerate() {
2060                                         if *max_bucket >= BUCKET_FIXED_POINT_ONE {
2061                                                 highest_max_bucket_with_points = cmp::max(highest_max_bucket_with_points, max_idx);
2062                                         }
2063                                         total_max_points += *max_bucket as u64;
2064                                 }
2065                                 let max_bucket_end_pos = BUCKET_START_POS[32 - highest_max_bucket_with_points] - 1;
2066                                 if payment_pos < max_bucket_end_pos {
2067                                         let (numerator, denominator) = success_probability(payment_pos as u64, 0,
2068                                                 max_bucket_end_pos as u64, POSITION_TICKS as u64 - 1, params, true);
2069                                         let bucket_prob_times_billion =
2070                                                 (self.min_liquidity_offset_history.buckets[0] as u64) * total_max_points
2071                                                         * 1024 * 1024 * 1024 / total_valid_points_tracked;
2072                                         cumulative_success_prob_times_billion += bucket_prob_times_billion *
2073                                                 numerator / denominator;
2074                                 }
2075                         }
2076
2077                         for (min_idx, min_bucket) in self.min_liquidity_offset_history.buckets.iter().enumerate().skip(1) {
2078                                 let min_bucket_start_pos = BUCKET_START_POS[min_idx];
2079                                 for (max_idx, max_bucket) in self.max_liquidity_offset_history.buckets.iter().enumerate().take(32 - min_idx) {
2080                                         let max_bucket_end_pos = BUCKET_START_POS[32 - max_idx] - 1;
2081                                         // Note that this multiply can only barely not overflow - two 16 bit ints plus
2082                                         // 30 bits is 62 bits.
2083                                         let bucket_prob_times_billion = (*min_bucket as u64) * (*max_bucket as u64)
2084                                                 * 1024 * 1024 * 1024 / total_valid_points_tracked;
2085                                         if payment_pos >= max_bucket_end_pos {
2086                                                 // Success probability 0, the payment amount may be above the max liquidity
2087                                                 break;
2088                                         } else if payment_pos < min_bucket_start_pos {
2089                                                 cumulative_success_prob_times_billion += bucket_prob_times_billion;
2090                                         } else {
2091                                                 let (numerator, denominator) = success_probability(payment_pos as u64,
2092                                                         min_bucket_start_pos as u64, max_bucket_end_pos as u64,
2093                                                         POSITION_TICKS as u64 - 1, params, true);
2094                                                 cumulative_success_prob_times_billion += bucket_prob_times_billion *
2095                                                         numerator / denominator;
2096                                         }
2097                                 }
2098                         }
2099
2100                         Some(cumulative_success_prob_times_billion)
2101                 }
2102         }
2103 }
2104 use bucketed_history::{LegacyHistoricalBucketRangeTracker, HistoricalBucketRangeTracker, HistoricalMinMaxBuckets};
2105
2106 impl<G: Deref<Target = NetworkGraph<L>>, L: Deref, T: Time> Writeable for ProbabilisticScorerUsingTime<G, L, T> where L::Target: Logger {
2107         #[inline]
2108         fn write<W: Writer>(&self, w: &mut W) -> Result<(), io::Error> {
2109                 write_tlv_fields!(w, {
2110                         (0, self.channel_liquidities, required),
2111                 });
2112                 Ok(())
2113         }
2114 }
2115
2116 impl<G: Deref<Target = NetworkGraph<L>>, L: Deref, T: Time>
2117 ReadableArgs<(ProbabilisticScoringDecayParameters, G, L)> for ProbabilisticScorerUsingTime<G, L, T> where L::Target: Logger {
2118         #[inline]
2119         fn read<R: Read>(
2120                 r: &mut R, args: (ProbabilisticScoringDecayParameters, G, L)
2121         ) -> Result<Self, DecodeError> {
2122                 let (decay_params, network_graph, logger) = args;
2123                 let mut channel_liquidities = HashMap::new();
2124                 read_tlv_fields!(r, {
2125                         (0, channel_liquidities, required),
2126                 });
2127                 Ok(Self {
2128                         decay_params,
2129                         network_graph,
2130                         logger,
2131                         channel_liquidities,
2132                 })
2133         }
2134 }
2135
2136 impl<T: Time> Writeable for ChannelLiquidity<T> {
2137         #[inline]
2138         fn write<W: Writer>(&self, w: &mut W) -> Result<(), io::Error> {
2139                 let offset_history_duration_since_epoch =
2140                         T::duration_since_epoch() - self.offset_history_last_updated.elapsed();
2141                 let duration_since_epoch = T::duration_since_epoch() - self.last_updated.elapsed();
2142                 write_tlv_fields!(w, {
2143                         (0, self.min_liquidity_offset_msat, required),
2144                         // 1 was the min_liquidity_offset_history in octile form
2145                         (2, self.max_liquidity_offset_msat, required),
2146                         // 3 was the max_liquidity_offset_history in octile form
2147                         (4, duration_since_epoch, required),
2148                         (5, Some(self.min_liquidity_offset_history), option),
2149                         (7, Some(self.max_liquidity_offset_history), option),
2150                         (9, offset_history_duration_since_epoch, required),
2151                 });
2152                 Ok(())
2153         }
2154 }
2155
2156 impl<T: Time> Readable for ChannelLiquidity<T> {
2157         #[inline]
2158         fn read<R: Read>(r: &mut R) -> Result<Self, DecodeError> {
2159                 let mut min_liquidity_offset_msat = 0;
2160                 let mut max_liquidity_offset_msat = 0;
2161                 let mut legacy_min_liq_offset_history: Option<LegacyHistoricalBucketRangeTracker> = None;
2162                 let mut legacy_max_liq_offset_history: Option<LegacyHistoricalBucketRangeTracker> = None;
2163                 let mut min_liquidity_offset_history: Option<HistoricalBucketRangeTracker> = None;
2164                 let mut max_liquidity_offset_history: Option<HistoricalBucketRangeTracker> = None;
2165                 let mut duration_since_epoch = Duration::from_secs(0);
2166                 let mut offset_history_duration_since_epoch = None;
2167                 read_tlv_fields!(r, {
2168                         (0, min_liquidity_offset_msat, required),
2169                         (1, legacy_min_liq_offset_history, option),
2170                         (2, max_liquidity_offset_msat, required),
2171                         (3, legacy_max_liq_offset_history, option),
2172                         (4, duration_since_epoch, required),
2173                         (5, min_liquidity_offset_history, option),
2174                         (7, max_liquidity_offset_history, option),
2175                         (9, offset_history_duration_since_epoch, option),
2176                 });
2177                 // On rust prior to 1.60 `Instant::duration_since` will panic if time goes backwards.
2178                 // We write `last_updated` as wallclock time even though its ultimately an `Instant` (which
2179                 // is a time from a monotonic clock usually represented as an offset against boot time).
2180                 // Thus, we have to construct an `Instant` by subtracting the difference in wallclock time
2181                 // from the one that was written. However, because `Instant` can panic if we construct one
2182                 // in the future, we must handle wallclock time jumping backwards, which we do by simply
2183                 // using `Instant::now()` in that case.
2184                 let wall_clock_now = T::duration_since_epoch();
2185                 let now = T::now();
2186                 let last_updated = if wall_clock_now > duration_since_epoch {
2187                         now - (wall_clock_now - duration_since_epoch)
2188                 } else { now };
2189
2190                 let offset_history_duration_since_epoch =
2191                         offset_history_duration_since_epoch.unwrap_or(duration_since_epoch);
2192                 let offset_history_last_updated = if wall_clock_now > offset_history_duration_since_epoch {
2193                         now - (wall_clock_now - offset_history_duration_since_epoch)
2194                 } else { now };
2195
2196                 if min_liquidity_offset_history.is_none() {
2197                         if let Some(legacy_buckets) = legacy_min_liq_offset_history {
2198                                 min_liquidity_offset_history = Some(legacy_buckets.into_current());
2199                         } else {
2200                                 min_liquidity_offset_history = Some(HistoricalBucketRangeTracker::new());
2201                         }
2202                 }
2203                 if max_liquidity_offset_history.is_none() {
2204                         if let Some(legacy_buckets) = legacy_max_liq_offset_history {
2205                                 max_liquidity_offset_history = Some(legacy_buckets.into_current());
2206                         } else {
2207                                 max_liquidity_offset_history = Some(HistoricalBucketRangeTracker::new());
2208                         }
2209                 }
2210                 Ok(Self {
2211                         min_liquidity_offset_msat,
2212                         max_liquidity_offset_msat,
2213                         min_liquidity_offset_history: min_liquidity_offset_history.unwrap(),
2214                         max_liquidity_offset_history: max_liquidity_offset_history.unwrap(),
2215                         last_updated,
2216                         offset_history_last_updated,
2217                 })
2218         }
2219 }
2220
2221 #[cfg(test)]
2222 mod tests {
2223         use super::{ChannelLiquidity, HistoricalBucketRangeTracker, ProbabilisticScoringFeeParameters, ProbabilisticScoringDecayParameters, ProbabilisticScorerUsingTime};
2224         use crate::blinded_path::{BlindedHop, BlindedPath};
2225         use crate::util::config::UserConfig;
2226         use crate::util::time::Time;
2227         use crate::util::time::tests::SinceEpoch;
2228
2229         use crate::ln::channelmanager;
2230         use crate::ln::msgs::{ChannelAnnouncement, ChannelUpdate, UnsignedChannelAnnouncement, UnsignedChannelUpdate};
2231         use crate::routing::gossip::{EffectiveCapacity, NetworkGraph, NodeId};
2232         use crate::routing::router::{BlindedTail, Path, RouteHop, CandidateRouteHop};
2233         use crate::routing::scoring::{ChannelUsage, ScoreLookUp, ScoreUpdate};
2234         use crate::util::ser::{ReadableArgs, Writeable};
2235         use crate::util::test_utils::{self, TestLogger};
2236
2237         use bitcoin::blockdata::constants::ChainHash;
2238         use bitcoin::hashes::Hash;
2239         use bitcoin::hashes::sha256d::Hash as Sha256dHash;
2240         use bitcoin::network::constants::Network;
2241         use bitcoin::secp256k1::{PublicKey, Secp256k1, SecretKey};
2242         use core::time::Duration;
2243         use crate::io;
2244
2245         fn source_privkey() -> SecretKey {
2246                 SecretKey::from_slice(&[42; 32]).unwrap()
2247         }
2248
2249         fn target_privkey() -> SecretKey {
2250                 SecretKey::from_slice(&[43; 32]).unwrap()
2251         }
2252
2253         fn source_pubkey() -> PublicKey {
2254                 let secp_ctx = Secp256k1::new();
2255                 PublicKey::from_secret_key(&secp_ctx, &source_privkey())
2256         }
2257
2258         fn target_pubkey() -> PublicKey {
2259                 let secp_ctx = Secp256k1::new();
2260                 PublicKey::from_secret_key(&secp_ctx, &target_privkey())
2261         }
2262
2263         fn source_node_id() -> NodeId {
2264                 NodeId::from_pubkey(&source_pubkey())
2265         }
2266
2267         fn target_node_id() -> NodeId {
2268                 NodeId::from_pubkey(&target_pubkey())
2269         }
2270
2271         // `ProbabilisticScorer` tests
2272
2273         /// A probabilistic scorer for testing with time that can be manually advanced.
2274         type ProbabilisticScorer<'a> = ProbabilisticScorerUsingTime::<&'a NetworkGraph<&'a TestLogger>, &'a TestLogger, SinceEpoch>;
2275
2276         fn sender_privkey() -> SecretKey {
2277                 SecretKey::from_slice(&[41; 32]).unwrap()
2278         }
2279
2280         fn recipient_privkey() -> SecretKey {
2281                 SecretKey::from_slice(&[45; 32]).unwrap()
2282         }
2283
2284         fn sender_pubkey() -> PublicKey {
2285                 let secp_ctx = Secp256k1::new();
2286                 PublicKey::from_secret_key(&secp_ctx, &sender_privkey())
2287         }
2288
2289         fn recipient_pubkey() -> PublicKey {
2290                 let secp_ctx = Secp256k1::new();
2291                 PublicKey::from_secret_key(&secp_ctx, &recipient_privkey())
2292         }
2293
2294         fn recipient_node_id() -> NodeId {
2295                 NodeId::from_pubkey(&recipient_pubkey())
2296         }
2297
2298         fn network_graph(logger: &TestLogger) -> NetworkGraph<&TestLogger> {
2299                 let mut network_graph = NetworkGraph::new(Network::Testnet, logger);
2300                 add_channel(&mut network_graph, 42, source_privkey(), target_privkey());
2301                 add_channel(&mut network_graph, 43, target_privkey(), recipient_privkey());
2302
2303                 network_graph
2304         }
2305
2306         fn add_channel(
2307                 network_graph: &mut NetworkGraph<&TestLogger>, short_channel_id: u64, node_1_key: SecretKey,
2308                 node_2_key: SecretKey
2309         ) {
2310                 let genesis_hash = ChainHash::using_genesis_block(Network::Testnet);
2311                 let node_1_secret = &SecretKey::from_slice(&[39; 32]).unwrap();
2312                 let node_2_secret = &SecretKey::from_slice(&[40; 32]).unwrap();
2313                 let secp_ctx = Secp256k1::new();
2314                 let unsigned_announcement = UnsignedChannelAnnouncement {
2315                         features: channelmanager::provided_channel_features(&UserConfig::default()),
2316                         chain_hash: genesis_hash,
2317                         short_channel_id,
2318                         node_id_1: NodeId::from_pubkey(&PublicKey::from_secret_key(&secp_ctx, &node_1_key)),
2319                         node_id_2: NodeId::from_pubkey(&PublicKey::from_secret_key(&secp_ctx, &node_2_key)),
2320                         bitcoin_key_1: NodeId::from_pubkey(&PublicKey::from_secret_key(&secp_ctx, &node_1_secret)),
2321                         bitcoin_key_2: NodeId::from_pubkey(&PublicKey::from_secret_key(&secp_ctx, &node_2_secret)),
2322                         excess_data: Vec::new(),
2323                 };
2324                 let msghash = hash_to_message!(&Sha256dHash::hash(&unsigned_announcement.encode()[..])[..]);
2325                 let signed_announcement = ChannelAnnouncement {
2326                         node_signature_1: secp_ctx.sign_ecdsa(&msghash, &node_1_key),
2327                         node_signature_2: secp_ctx.sign_ecdsa(&msghash, &node_2_key),
2328                         bitcoin_signature_1: secp_ctx.sign_ecdsa(&msghash, &node_1_secret),
2329                         bitcoin_signature_2: secp_ctx.sign_ecdsa(&msghash, &node_2_secret),
2330                         contents: unsigned_announcement,
2331                 };
2332                 let chain_source: Option<&crate::util::test_utils::TestChainSource> = None;
2333                 network_graph.update_channel_from_announcement(
2334                         &signed_announcement, &chain_source).unwrap();
2335                 update_channel(network_graph, short_channel_id, node_1_key, 0, 1_000, 100);
2336                 update_channel(network_graph, short_channel_id, node_2_key, 1, 0, 100);
2337         }
2338
2339         fn update_channel(
2340                 network_graph: &mut NetworkGraph<&TestLogger>, short_channel_id: u64, node_key: SecretKey,
2341                 flags: u8, htlc_maximum_msat: u64, timestamp: u32,
2342         ) {
2343                 let genesis_hash = ChainHash::using_genesis_block(Network::Testnet);
2344                 let secp_ctx = Secp256k1::new();
2345                 let unsigned_update = UnsignedChannelUpdate {
2346                         chain_hash: genesis_hash,
2347                         short_channel_id,
2348                         timestamp,
2349                         flags,
2350                         cltv_expiry_delta: 18,
2351                         htlc_minimum_msat: 0,
2352                         htlc_maximum_msat,
2353                         fee_base_msat: 1,
2354                         fee_proportional_millionths: 0,
2355                         excess_data: Vec::new(),
2356                 };
2357                 let msghash = hash_to_message!(&Sha256dHash::hash(&unsigned_update.encode()[..])[..]);
2358                 let signed_update = ChannelUpdate {
2359                         signature: secp_ctx.sign_ecdsa(&msghash, &node_key),
2360                         contents: unsigned_update,
2361                 };
2362                 network_graph.update_channel(&signed_update).unwrap();
2363         }
2364
2365         fn path_hop(pubkey: PublicKey, short_channel_id: u64, fee_msat: u64) -> RouteHop {
2366                 let config = UserConfig::default();
2367                 RouteHop {
2368                         pubkey,
2369                         node_features: channelmanager::provided_node_features(&config),
2370                         short_channel_id,
2371                         channel_features: channelmanager::provided_channel_features(&config),
2372                         fee_msat,
2373                         cltv_expiry_delta: 18,
2374                         maybe_announced_channel: true,
2375                 }
2376         }
2377
2378         fn payment_path_for_amount(amount_msat: u64) -> Path {
2379                 Path {
2380                         hops: vec![
2381                                 path_hop(source_pubkey(), 41, 1),
2382                                 path_hop(target_pubkey(), 42, 2),
2383                                 path_hop(recipient_pubkey(), 43, amount_msat),
2384                         ], blinded_tail: None,
2385                 }
2386         }
2387
2388         #[test]
2389         fn liquidity_bounds_directed_from_lowest_node_id() {
2390                 let logger = TestLogger::new();
2391                 let last_updated = SinceEpoch::now();
2392                 let offset_history_last_updated = SinceEpoch::now();
2393                 let network_graph = network_graph(&logger);
2394                 let decay_params = ProbabilisticScoringDecayParameters::default();
2395                 let mut scorer = ProbabilisticScorer::new(decay_params, &network_graph, &logger)
2396                         .with_channel(42,
2397                                 ChannelLiquidity {
2398                                         min_liquidity_offset_msat: 700, max_liquidity_offset_msat: 100,
2399                                         last_updated, offset_history_last_updated,
2400                                         min_liquidity_offset_history: HistoricalBucketRangeTracker::new(),
2401                                         max_liquidity_offset_history: HistoricalBucketRangeTracker::new(),
2402                                 })
2403                         .with_channel(43,
2404                                 ChannelLiquidity {
2405                                         min_liquidity_offset_msat: 700, max_liquidity_offset_msat: 100,
2406                                         last_updated, offset_history_last_updated,
2407                                         min_liquidity_offset_history: HistoricalBucketRangeTracker::new(),
2408                                         max_liquidity_offset_history: HistoricalBucketRangeTracker::new(),
2409                                 });
2410                 let source = source_node_id();
2411                 let target = target_node_id();
2412                 let recipient = recipient_node_id();
2413                 assert!(source > target);
2414                 assert!(target < recipient);
2415
2416                 // Update minimum liquidity.
2417
2418                 let liquidity = scorer.channel_liquidities.get(&42).unwrap()
2419                         .as_directed(&source, &target, 1_000, decay_params);
2420                 assert_eq!(liquidity.min_liquidity_msat(), 100);
2421                 assert_eq!(liquidity.max_liquidity_msat(), 300);
2422
2423                 let liquidity = scorer.channel_liquidities.get(&42).unwrap()
2424                         .as_directed(&target, &source, 1_000, decay_params);
2425                 assert_eq!(liquidity.min_liquidity_msat(), 700);
2426                 assert_eq!(liquidity.max_liquidity_msat(), 900);
2427
2428                 scorer.channel_liquidities.get_mut(&42).unwrap()
2429                         .as_directed_mut(&source, &target, 1_000, decay_params)
2430                         .set_min_liquidity_msat(200);
2431
2432                 let liquidity = scorer.channel_liquidities.get(&42).unwrap()
2433                         .as_directed(&source, &target, 1_000, decay_params);
2434                 assert_eq!(liquidity.min_liquidity_msat(), 200);
2435                 assert_eq!(liquidity.max_liquidity_msat(), 300);
2436
2437                 let liquidity = scorer.channel_liquidities.get(&42).unwrap()
2438                         .as_directed(&target, &source, 1_000, decay_params);
2439                 assert_eq!(liquidity.min_liquidity_msat(), 700);
2440                 assert_eq!(liquidity.max_liquidity_msat(), 800);
2441
2442                 // Update maximum liquidity.
2443
2444                 let liquidity = scorer.channel_liquidities.get(&43).unwrap()
2445                         .as_directed(&target, &recipient, 1_000, decay_params);
2446                 assert_eq!(liquidity.min_liquidity_msat(), 700);
2447                 assert_eq!(liquidity.max_liquidity_msat(), 900);
2448
2449                 let liquidity = scorer.channel_liquidities.get(&43).unwrap()
2450                         .as_directed(&recipient, &target, 1_000, decay_params);
2451                 assert_eq!(liquidity.min_liquidity_msat(), 100);
2452                 assert_eq!(liquidity.max_liquidity_msat(), 300);
2453
2454                 scorer.channel_liquidities.get_mut(&43).unwrap()
2455                         .as_directed_mut(&target, &recipient, 1_000, decay_params)
2456                         .set_max_liquidity_msat(200);
2457
2458                 let liquidity = scorer.channel_liquidities.get(&43).unwrap()
2459                         .as_directed(&target, &recipient, 1_000, decay_params);
2460                 assert_eq!(liquidity.min_liquidity_msat(), 0);
2461                 assert_eq!(liquidity.max_liquidity_msat(), 200);
2462
2463                 let liquidity = scorer.channel_liquidities.get(&43).unwrap()
2464                         .as_directed(&recipient, &target, 1_000, decay_params);
2465                 assert_eq!(liquidity.min_liquidity_msat(), 800);
2466                 assert_eq!(liquidity.max_liquidity_msat(), 1000);
2467         }
2468
2469         #[test]
2470         fn resets_liquidity_upper_bound_when_crossed_by_lower_bound() {
2471                 let logger = TestLogger::new();
2472                 let last_updated = SinceEpoch::now();
2473                 let offset_history_last_updated = SinceEpoch::now();
2474                 let network_graph = network_graph(&logger);
2475                 let decay_params = ProbabilisticScoringDecayParameters::default();
2476                 let mut scorer = ProbabilisticScorer::new(decay_params, &network_graph, &logger)
2477                         .with_channel(42,
2478                                 ChannelLiquidity {
2479                                         min_liquidity_offset_msat: 200, max_liquidity_offset_msat: 400,
2480                                         last_updated, offset_history_last_updated,
2481                                         min_liquidity_offset_history: HistoricalBucketRangeTracker::new(),
2482                                         max_liquidity_offset_history: HistoricalBucketRangeTracker::new(),
2483                                 });
2484                 let source = source_node_id();
2485                 let target = target_node_id();
2486                 assert!(source > target);
2487
2488                 // Check initial bounds.
2489                 let liquidity = scorer.channel_liquidities.get(&42).unwrap()
2490                         .as_directed(&source, &target, 1_000, decay_params);
2491                 assert_eq!(liquidity.min_liquidity_msat(), 400);
2492                 assert_eq!(liquidity.max_liquidity_msat(), 800);
2493
2494                 let liquidity = scorer.channel_liquidities.get(&42).unwrap()
2495                         .as_directed(&target, &source, 1_000, decay_params);
2496                 assert_eq!(liquidity.min_liquidity_msat(), 200);
2497                 assert_eq!(liquidity.max_liquidity_msat(), 600);
2498
2499                 // Reset from source to target.
2500                 scorer.channel_liquidities.get_mut(&42).unwrap()
2501                         .as_directed_mut(&source, &target, 1_000, decay_params)
2502                         .set_min_liquidity_msat(900);
2503
2504                 let liquidity = scorer.channel_liquidities.get(&42).unwrap()
2505                         .as_directed(&source, &target, 1_000, decay_params);
2506                 assert_eq!(liquidity.min_liquidity_msat(), 900);
2507                 assert_eq!(liquidity.max_liquidity_msat(), 1_000);
2508
2509                 let liquidity = scorer.channel_liquidities.get(&42).unwrap()
2510                         .as_directed(&target, &source, 1_000, decay_params);
2511                 assert_eq!(liquidity.min_liquidity_msat(), 0);
2512                 assert_eq!(liquidity.max_liquidity_msat(), 100);
2513
2514                 // Reset from target to source.
2515                 scorer.channel_liquidities.get_mut(&42).unwrap()
2516                         .as_directed_mut(&target, &source, 1_000, decay_params)
2517                         .set_min_liquidity_msat(400);
2518
2519                 let liquidity = scorer.channel_liquidities.get(&42).unwrap()
2520                         .as_directed(&source, &target, 1_000, decay_params);
2521                 assert_eq!(liquidity.min_liquidity_msat(), 0);
2522                 assert_eq!(liquidity.max_liquidity_msat(), 600);
2523
2524                 let liquidity = scorer.channel_liquidities.get(&42).unwrap()
2525                         .as_directed(&target, &source, 1_000, decay_params);
2526                 assert_eq!(liquidity.min_liquidity_msat(), 400);
2527                 assert_eq!(liquidity.max_liquidity_msat(), 1_000);
2528         }
2529
2530         #[test]
2531         fn resets_liquidity_lower_bound_when_crossed_by_upper_bound() {
2532                 let logger = TestLogger::new();
2533                 let last_updated = SinceEpoch::now();
2534                 let offset_history_last_updated = SinceEpoch::now();
2535                 let network_graph = network_graph(&logger);
2536                 let decay_params = ProbabilisticScoringDecayParameters::default();
2537                 let mut scorer = ProbabilisticScorer::new(decay_params, &network_graph, &logger)
2538                         .with_channel(42,
2539                                 ChannelLiquidity {
2540                                         min_liquidity_offset_msat: 200, max_liquidity_offset_msat: 400,
2541                                         last_updated, offset_history_last_updated,
2542                                         min_liquidity_offset_history: HistoricalBucketRangeTracker::new(),
2543                                         max_liquidity_offset_history: HistoricalBucketRangeTracker::new(),
2544                                 });
2545                 let source = source_node_id();
2546                 let target = target_node_id();
2547                 assert!(source > target);
2548
2549                 // Check initial bounds.
2550                 let liquidity = scorer.channel_liquidities.get(&42).unwrap()
2551                         .as_directed(&source, &target, 1_000, decay_params);
2552                 assert_eq!(liquidity.min_liquidity_msat(), 400);
2553                 assert_eq!(liquidity.max_liquidity_msat(), 800);
2554
2555                 let liquidity = scorer.channel_liquidities.get(&42).unwrap()
2556                         .as_directed(&target, &source, 1_000, decay_params);
2557                 assert_eq!(liquidity.min_liquidity_msat(), 200);
2558                 assert_eq!(liquidity.max_liquidity_msat(), 600);
2559
2560                 // Reset from source to target.
2561                 scorer.channel_liquidities.get_mut(&42).unwrap()
2562                         .as_directed_mut(&source, &target, 1_000, decay_params)
2563                         .set_max_liquidity_msat(300);
2564
2565                 let liquidity = scorer.channel_liquidities.get(&42).unwrap()
2566                         .as_directed(&source, &target, 1_000, decay_params);
2567                 assert_eq!(liquidity.min_liquidity_msat(), 0);
2568                 assert_eq!(liquidity.max_liquidity_msat(), 300);
2569
2570                 let liquidity = scorer.channel_liquidities.get(&42).unwrap()
2571                         .as_directed(&target, &source, 1_000, decay_params);
2572                 assert_eq!(liquidity.min_liquidity_msat(), 700);
2573                 assert_eq!(liquidity.max_liquidity_msat(), 1_000);
2574
2575                 // Reset from target to source.
2576                 scorer.channel_liquidities.get_mut(&42).unwrap()
2577                         .as_directed_mut(&target, &source, 1_000, decay_params)
2578                         .set_max_liquidity_msat(600);
2579
2580                 let liquidity = scorer.channel_liquidities.get(&42).unwrap()
2581                         .as_directed(&source, &target, 1_000, decay_params);
2582                 assert_eq!(liquidity.min_liquidity_msat(), 400);
2583                 assert_eq!(liquidity.max_liquidity_msat(), 1_000);
2584
2585                 let liquidity = scorer.channel_liquidities.get(&42).unwrap()
2586                         .as_directed(&target, &source, 1_000, decay_params);
2587                 assert_eq!(liquidity.min_liquidity_msat(), 0);
2588                 assert_eq!(liquidity.max_liquidity_msat(), 600);
2589         }
2590
2591         #[test]
2592         fn increased_penalty_nearing_liquidity_upper_bound() {
2593                 let logger = TestLogger::new();
2594                 let network_graph = network_graph(&logger);
2595                 let params = ProbabilisticScoringFeeParameters {
2596                         liquidity_penalty_multiplier_msat: 1_000,
2597                         ..ProbabilisticScoringFeeParameters::zero_penalty()
2598                 };
2599                 let decay_params = ProbabilisticScoringDecayParameters::default();
2600                 let scorer = ProbabilisticScorer::new(decay_params, &network_graph, &logger);
2601                 let source = source_node_id();
2602
2603                 let usage = ChannelUsage {
2604                         amount_msat: 1_024,
2605                         inflight_htlc_msat: 0,
2606                         effective_capacity: EffectiveCapacity::Total { capacity_msat: 1_024_000, htlc_maximum_msat: 1_000 },
2607                 };
2608                 let network_graph = network_graph.read_only();
2609                 let channel = network_graph.channel(42).unwrap();
2610                 let (info, _) = channel.as_directed_from(&source).unwrap();
2611                 let candidate = CandidateRouteHop::PublicHop {
2612                         info,
2613                         short_channel_id: 42,
2614                 };
2615                 assert_eq!(scorer.channel_penalty_msat(&candidate, usage, &params), 0);
2616                 let usage = ChannelUsage { amount_msat: 10_240, ..usage };
2617                 assert_eq!(scorer.channel_penalty_msat(&candidate, usage, &params), 0);
2618                 let usage = ChannelUsage { amount_msat: 102_400, ..usage };
2619                 assert_eq!(scorer.channel_penalty_msat(&candidate, usage, &params), 47);
2620                 let usage = ChannelUsage { amount_msat: 1_023_999, ..usage };
2621                 assert_eq!(scorer.channel_penalty_msat(&candidate, usage, &params), 2_000);
2622
2623                 let usage = ChannelUsage {
2624                         amount_msat: 128,
2625                         inflight_htlc_msat: 0,
2626                         effective_capacity: EffectiveCapacity::Total { capacity_msat: 1_024, htlc_maximum_msat: 1_000 },
2627                 };
2628                 assert_eq!(scorer.channel_penalty_msat(&candidate, usage, &params), 58);
2629                 let usage = ChannelUsage { amount_msat: 256, ..usage };
2630                 assert_eq!(scorer.channel_penalty_msat(&candidate, usage, &params), 125);
2631                 let usage = ChannelUsage { amount_msat: 374, ..usage };
2632                 assert_eq!(scorer.channel_penalty_msat(&candidate, usage, &params), 198);
2633                 let usage = ChannelUsage { amount_msat: 512, ..usage };
2634                 assert_eq!(scorer.channel_penalty_msat(&candidate, usage, &params), 300);
2635                 let usage = ChannelUsage { amount_msat: 640, ..usage };
2636                 assert_eq!(scorer.channel_penalty_msat(&candidate, usage, &params), 425);
2637                 let usage = ChannelUsage { amount_msat: 768, ..usage };
2638                 assert_eq!(scorer.channel_penalty_msat(&candidate, usage, &params), 602);
2639                 let usage = ChannelUsage { amount_msat: 896, ..usage };
2640                 assert_eq!(scorer.channel_penalty_msat(&candidate, usage, &params), 902);
2641         }
2642
2643         #[test]
2644         fn constant_penalty_outside_liquidity_bounds() {
2645                 let logger = TestLogger::new();
2646                 let last_updated = SinceEpoch::now();
2647                 let offset_history_last_updated = SinceEpoch::now();
2648                 let network_graph = network_graph(&logger);
2649                 let params = ProbabilisticScoringFeeParameters {
2650                         liquidity_penalty_multiplier_msat: 1_000,
2651                         considered_impossible_penalty_msat: u64::max_value(),
2652                         ..ProbabilisticScoringFeeParameters::zero_penalty()
2653                 };
2654                 let decay_params = ProbabilisticScoringDecayParameters {
2655                         ..ProbabilisticScoringDecayParameters::zero_penalty()
2656                 };
2657                 let scorer = ProbabilisticScorer::new(decay_params, &network_graph, &logger)
2658                         .with_channel(42,
2659                                 ChannelLiquidity {
2660                                         min_liquidity_offset_msat: 40, max_liquidity_offset_msat: 40,
2661                                         last_updated, offset_history_last_updated,
2662                                         min_liquidity_offset_history: HistoricalBucketRangeTracker::new(),
2663                                         max_liquidity_offset_history: HistoricalBucketRangeTracker::new(),
2664                                 });
2665                 let source = source_node_id();
2666
2667                 let usage = ChannelUsage {
2668                         amount_msat: 39,
2669                         inflight_htlc_msat: 0,
2670                         effective_capacity: EffectiveCapacity::Total { capacity_msat: 100, htlc_maximum_msat: 1_000 },
2671                 };
2672                 let channel = network_graph.read_only().channel(42).unwrap().to_owned();
2673                 let (info, _) = channel.as_directed_from(&source).unwrap();
2674                 let candidate = CandidateRouteHop::PublicHop {
2675                         info,
2676                         short_channel_id: 42,
2677                 };
2678                 assert_eq!(scorer.channel_penalty_msat(&candidate, usage, &params), 0);
2679                 let usage = ChannelUsage { amount_msat: 50, ..usage };
2680                 assert_ne!(scorer.channel_penalty_msat(&candidate, usage, &params), 0);
2681                 assert_ne!(scorer.channel_penalty_msat(&candidate, usage, &params), u64::max_value());
2682                 let usage = ChannelUsage { amount_msat: 61, ..usage };
2683                 assert_eq!(scorer.channel_penalty_msat(&candidate, usage, &params), u64::max_value());
2684         }
2685
2686         #[test]
2687         fn does_not_further_penalize_own_channel() {
2688                 let logger = TestLogger::new();
2689                 let network_graph = network_graph(&logger);
2690                 let params = ProbabilisticScoringFeeParameters {
2691                         liquidity_penalty_multiplier_msat: 1_000,
2692                         ..ProbabilisticScoringFeeParameters::zero_penalty()
2693                 };
2694                 let mut scorer = ProbabilisticScorer::new(ProbabilisticScoringDecayParameters::default(), &network_graph, &logger);
2695                 let source = source_node_id();
2696                 let usage = ChannelUsage {
2697                         amount_msat: 500,
2698                         inflight_htlc_msat: 0,
2699                         effective_capacity: EffectiveCapacity::Total { capacity_msat: 1_000, htlc_maximum_msat: 1_000 },
2700                 };
2701                 let failed_path = payment_path_for_amount(500);
2702                 let successful_path = payment_path_for_amount(200);
2703                 let channel = &network_graph.read_only().channel(42).unwrap().to_owned();
2704                 let (info, _) = channel.as_directed_from(&source).unwrap();
2705                 let candidate = CandidateRouteHop::PublicHop {
2706                         info,
2707                         short_channel_id: 41,
2708                 };
2709
2710                 assert_eq!(scorer.channel_penalty_msat(&candidate, usage, &params), 301);
2711
2712                 scorer.payment_path_failed(&failed_path, 41, Duration::ZERO);
2713                 assert_eq!(scorer.channel_penalty_msat(&candidate, usage, &params), 301);
2714
2715                 scorer.payment_path_successful(&successful_path, Duration::ZERO);
2716                 assert_eq!(scorer.channel_penalty_msat(&candidate, usage, &params), 301);
2717         }
2718
2719         #[test]
2720         fn sets_liquidity_lower_bound_on_downstream_failure() {
2721                 let logger = TestLogger::new();
2722                 let network_graph = network_graph(&logger);
2723                 let params = ProbabilisticScoringFeeParameters {
2724                         liquidity_penalty_multiplier_msat: 1_000,
2725                         ..ProbabilisticScoringFeeParameters::zero_penalty()
2726                 };
2727                 let mut scorer = ProbabilisticScorer::new(ProbabilisticScoringDecayParameters::default(), &network_graph, &logger);
2728                 let source = source_node_id();
2729                 let path = payment_path_for_amount(500);
2730
2731                 let usage = ChannelUsage {
2732                         amount_msat: 250,
2733                         inflight_htlc_msat: 0,
2734                         effective_capacity: EffectiveCapacity::Total { capacity_msat: 1_000, htlc_maximum_msat: 1_000 },
2735                 };
2736                 let channel = network_graph.read_only().channel(42).unwrap().to_owned();
2737                 let (info, _) = channel.as_directed_from(&source).unwrap();
2738                 let candidate = CandidateRouteHop::PublicHop {
2739                         info,
2740                         short_channel_id: 42,
2741                 };
2742                 assert_eq!(scorer.channel_penalty_msat(&candidate, usage, &params), 128);
2743                 let usage = ChannelUsage { amount_msat: 500, ..usage };
2744                 assert_eq!(scorer.channel_penalty_msat(&candidate, usage, &params), 301);
2745                 let usage = ChannelUsage { amount_msat: 750, ..usage };
2746                 assert_eq!(scorer.channel_penalty_msat(&candidate, usage, &params), 602);
2747
2748                 scorer.payment_path_failed(&path, 43, Duration::ZERO);
2749
2750                 let usage = ChannelUsage { amount_msat: 250, ..usage };
2751                 assert_eq!(scorer.channel_penalty_msat(&candidate, usage, &params), 0);
2752                 let usage = ChannelUsage { amount_msat: 500, ..usage };
2753                 assert_eq!(scorer.channel_penalty_msat(&candidate, usage, &params), 0);
2754                 let usage = ChannelUsage { amount_msat: 750, ..usage };
2755                 assert_eq!(scorer.channel_penalty_msat(&candidate, usage, &params), 300);
2756         }
2757
2758         #[test]
2759         fn sets_liquidity_upper_bound_on_failure() {
2760                 let logger = TestLogger::new();
2761                 let network_graph = network_graph(&logger);
2762                 let params = ProbabilisticScoringFeeParameters {
2763                         liquidity_penalty_multiplier_msat: 1_000,
2764                         considered_impossible_penalty_msat: u64::max_value(),
2765                         ..ProbabilisticScoringFeeParameters::zero_penalty()
2766                 };
2767                 let mut scorer = ProbabilisticScorer::new(ProbabilisticScoringDecayParameters::default(), &network_graph, &logger);
2768                 let source = source_node_id();
2769                 let path = payment_path_for_amount(500);
2770
2771                 let usage = ChannelUsage {
2772                         amount_msat: 250,
2773                         inflight_htlc_msat: 0,
2774                         effective_capacity: EffectiveCapacity::Total { capacity_msat: 1_000, htlc_maximum_msat: 1_000 },
2775                 };
2776                 let channel = network_graph.read_only().channel(42).unwrap().to_owned();
2777                 let (info, _) = channel.as_directed_from(&source).unwrap();
2778                 let candidate = CandidateRouteHop::PublicHop {
2779                         info,
2780                         short_channel_id: 42,
2781                 };
2782                 assert_eq!(scorer.channel_penalty_msat(&candidate, usage, &params), 128);
2783                 let usage = ChannelUsage { amount_msat: 500, ..usage };
2784                 assert_eq!(scorer.channel_penalty_msat(&candidate, usage, &params), 301);
2785                 let usage = ChannelUsage { amount_msat: 750, ..usage };
2786                 assert_eq!(scorer.channel_penalty_msat(&candidate, usage, &params), 602);
2787
2788                 scorer.payment_path_failed(&path, 42, Duration::ZERO);
2789
2790                 let usage = ChannelUsage { amount_msat: 250, ..usage };
2791                 assert_eq!(scorer.channel_penalty_msat(&candidate, usage, &params), 300);
2792                 let usage = ChannelUsage { amount_msat: 500, ..usage };
2793                 assert_eq!(scorer.channel_penalty_msat(&candidate, usage, &params), u64::max_value());
2794                 let usage = ChannelUsage { amount_msat: 750, ..usage };
2795                 assert_eq!(scorer.channel_penalty_msat(&candidate, usage, &params), u64::max_value());
2796         }
2797
2798         #[test]
2799         fn ignores_channels_after_removed_failed_channel() {
2800                 // Previously, if we'd tried to send over a channel which was removed from the network
2801                 // graph before we call `payment_path_failed` (which is the default if the we get a "no
2802                 // such channel" error in the `InvoicePayer`), we would call `failed_downstream` on all
2803                 // channels in the route, even ones which they payment never reached. This tests to ensure
2804                 // we do not score such channels.
2805                 let secp_ctx = Secp256k1::new();
2806                 let logger = TestLogger::new();
2807                 let mut network_graph = NetworkGraph::new(Network::Testnet, &logger);
2808                 let secret_a = SecretKey::from_slice(&[42; 32]).unwrap();
2809                 let secret_b = SecretKey::from_slice(&[43; 32]).unwrap();
2810                 let secret_c = SecretKey::from_slice(&[44; 32]).unwrap();
2811                 let secret_d = SecretKey::from_slice(&[45; 32]).unwrap();
2812                 add_channel(&mut network_graph, 42, secret_a, secret_b);
2813                 // Don't add the channel from B -> C.
2814                 add_channel(&mut network_graph, 44, secret_c, secret_d);
2815
2816                 let pub_a = PublicKey::from_secret_key(&secp_ctx, &secret_a);
2817                 let pub_b = PublicKey::from_secret_key(&secp_ctx, &secret_b);
2818                 let pub_c = PublicKey::from_secret_key(&secp_ctx, &secret_c);
2819                 let pub_d = PublicKey::from_secret_key(&secp_ctx, &secret_d);
2820
2821                 let path = vec![
2822                         path_hop(pub_b, 42, 1),
2823                         path_hop(pub_c, 43, 2),
2824                         path_hop(pub_d, 44, 100),
2825                 ];
2826
2827                 let node_a = NodeId::from_pubkey(&pub_a);
2828                 let node_b = NodeId::from_pubkey(&pub_b);
2829                 let node_c = NodeId::from_pubkey(&pub_c);
2830
2831                 let params = ProbabilisticScoringFeeParameters {
2832                         liquidity_penalty_multiplier_msat: 1_000,
2833                         ..ProbabilisticScoringFeeParameters::zero_penalty()
2834                 };
2835                 let mut scorer = ProbabilisticScorer::new(ProbabilisticScoringDecayParameters::default(), &network_graph, &logger);
2836
2837                 let usage = ChannelUsage {
2838                         amount_msat: 250,
2839                         inflight_htlc_msat: 0,
2840                         effective_capacity: EffectiveCapacity::Total { capacity_msat: 1_000, htlc_maximum_msat: 1_000 },
2841                 };
2842                 let channel = network_graph.read_only().channel(42).unwrap().to_owned();
2843                 let (info, _) = channel.as_directed_from(&node_a).unwrap();
2844                 let candidate = CandidateRouteHop::PublicHop {
2845                         info,
2846                         short_channel_id: 42,
2847                 };
2848                 assert_eq!(scorer.channel_penalty_msat(&candidate, usage, &params), 128);
2849                 // Note that a default liquidity bound is used for B -> C as no channel exists
2850                 let channel = network_graph.read_only().channel(42).unwrap().to_owned();
2851                 let (info, _) = channel.as_directed_from(&node_b).unwrap();
2852                 let candidate = CandidateRouteHop::PublicHop {
2853                         info,
2854                         short_channel_id: 43,
2855                 };
2856                 assert_eq!(scorer.channel_penalty_msat(&candidate, usage, &params), 128);
2857                 let channel = network_graph.read_only().channel(44).unwrap().to_owned();
2858                 let (info, _) = channel.as_directed_from(&node_c).unwrap();
2859                 let candidate = CandidateRouteHop::PublicHop {
2860                         info,
2861                         short_channel_id: 44,
2862                 };
2863                 assert_eq!(scorer.channel_penalty_msat(&candidate, usage, &params), 128);
2864
2865                 scorer.payment_path_failed(&Path { hops: path, blinded_tail: None }, 43, Duration::ZERO);
2866
2867                 let channel = network_graph.read_only().channel(42).unwrap().to_owned();
2868                 let (info, _) = channel.as_directed_from(&node_a).unwrap();
2869                 let candidate = CandidateRouteHop::PublicHop {
2870                         info,
2871                         short_channel_id: 42,
2872                 };
2873                 assert_eq!(scorer.channel_penalty_msat(&candidate, usage, &params), 80);
2874                 // Note that a default liquidity bound is used for B -> C as no channel exists
2875                 let channel = network_graph.read_only().channel(42).unwrap().to_owned();
2876                 let (info, _) = channel.as_directed_from(&node_b).unwrap();
2877                 let candidate = CandidateRouteHop::PublicHop {
2878                         info,
2879                         short_channel_id: 43,
2880                 };
2881                 assert_eq!(scorer.channel_penalty_msat(&candidate, usage, &params), 128);
2882                 let channel = network_graph.read_only().channel(44).unwrap().to_owned();
2883                 let (info, _) = channel.as_directed_from(&node_c).unwrap();
2884                 let candidate = CandidateRouteHop::PublicHop {
2885                         info,
2886                         short_channel_id: 44,
2887                 };
2888                 assert_eq!(scorer.channel_penalty_msat(&candidate, usage, &params), 128);
2889         }
2890
2891         #[test]
2892         fn reduces_liquidity_upper_bound_along_path_on_success() {
2893                 let logger = TestLogger::new();
2894                 let network_graph = network_graph(&logger);
2895                 let params = ProbabilisticScoringFeeParameters {
2896                         liquidity_penalty_multiplier_msat: 1_000,
2897                         ..ProbabilisticScoringFeeParameters::zero_penalty()
2898                 };
2899                 let mut scorer = ProbabilisticScorer::new(ProbabilisticScoringDecayParameters::default(), &network_graph, &logger);
2900                 let source = source_node_id();
2901                 let usage = ChannelUsage {
2902                         amount_msat: 250,
2903                         inflight_htlc_msat: 0,
2904                         effective_capacity: EffectiveCapacity::Total { capacity_msat: 1_000, htlc_maximum_msat: 1_000 },
2905                 };
2906                 let network_graph = network_graph.read_only().channels().clone();
2907                 let channel_42 = network_graph.get(&42).unwrap();
2908                 let channel_43 = network_graph.get(&43).unwrap();
2909                 let (info, _) = channel_42.as_directed_from(&source).unwrap();
2910                 let candidate_41 = CandidateRouteHop::PublicHop {
2911                         info,
2912                         short_channel_id: 41,
2913                 };
2914                 let (info, target) = channel_42.as_directed_from(&source).unwrap();
2915                 let candidate_42 = CandidateRouteHop::PublicHop {
2916                         info,
2917                         short_channel_id: 42,
2918                 };
2919                 let (info, _) = channel_43.as_directed_from(&target).unwrap();
2920                 let candidate_43 = CandidateRouteHop::PublicHop {
2921                         info,
2922                         short_channel_id: 43,
2923                 };
2924                 assert_eq!(scorer.channel_penalty_msat(&candidate_41, usage, &params), 128);
2925                 assert_eq!(scorer.channel_penalty_msat(&candidate_42, usage, &params), 128);
2926                 assert_eq!(scorer.channel_penalty_msat(&candidate_43, usage, &params), 128);
2927
2928                 scorer.payment_path_successful(&payment_path_for_amount(500), Duration::ZERO);
2929
2930                 assert_eq!(scorer.channel_penalty_msat(&candidate_41, usage, &params), 128);
2931                 assert_eq!(scorer.channel_penalty_msat(&candidate_42, usage, &params), 300);
2932                 assert_eq!(scorer.channel_penalty_msat(&candidate_43, usage, &params), 300);
2933         }
2934
2935         #[test]
2936         fn decays_liquidity_bounds_over_time() {
2937                 let logger = TestLogger::new();
2938                 let network_graph = network_graph(&logger);
2939                 let params = ProbabilisticScoringFeeParameters {
2940                         liquidity_penalty_multiplier_msat: 1_000,
2941                         considered_impossible_penalty_msat: u64::max_value(),
2942                         ..ProbabilisticScoringFeeParameters::zero_penalty()
2943                 };
2944                 let decay_params = ProbabilisticScoringDecayParameters {
2945                         liquidity_offset_half_life: Duration::from_secs(10),
2946                         ..ProbabilisticScoringDecayParameters::zero_penalty()
2947                 };
2948                 let mut scorer = ProbabilisticScorer::new(decay_params, &network_graph, &logger);
2949                 let source = source_node_id();
2950
2951                 let usage = ChannelUsage {
2952                         amount_msat: 0,
2953                         inflight_htlc_msat: 0,
2954                         effective_capacity: EffectiveCapacity::Total { capacity_msat: 1_024, htlc_maximum_msat: 1_024 },
2955                 };
2956                 let channel = network_graph.read_only().channel(42).unwrap().to_owned();
2957                 let (info, _) = channel.as_directed_from(&source).unwrap();
2958                 let candidate = CandidateRouteHop::PublicHop {
2959                         info,
2960                         short_channel_id: 42,
2961                 };
2962                 assert_eq!(scorer.channel_penalty_msat(&candidate, usage, &params), 0);
2963                 let usage = ChannelUsage { amount_msat: 1_023, ..usage };
2964                 assert_eq!(scorer.channel_penalty_msat(&candidate, usage, &params), 2_000);
2965
2966                 scorer.payment_path_failed(&payment_path_for_amount(768), 42, Duration::ZERO);
2967                 scorer.payment_path_failed(&payment_path_for_amount(128), 43, Duration::ZERO);
2968
2969                 // Initial penalties
2970                 let usage = ChannelUsage { amount_msat: 128, ..usage };
2971                 assert_eq!(scorer.channel_penalty_msat(&candidate, usage, &params), 0);
2972                 let usage = ChannelUsage { amount_msat: 256, ..usage };
2973                 assert_eq!(scorer.channel_penalty_msat(&candidate, usage, &params), 93);
2974                 let usage = ChannelUsage { amount_msat: 768, ..usage };
2975                 assert_eq!(scorer.channel_penalty_msat(&candidate, usage, &params), 1_479);
2976                 let usage = ChannelUsage { amount_msat: 896, ..usage };
2977                 assert_eq!(scorer.channel_penalty_msat(&candidate, usage, &params), u64::max_value());
2978
2979                 // Half decay (i.e., three-quarter life)
2980                 SinceEpoch::advance(Duration::from_secs(5));
2981                 scorer.time_passed(Duration::from_secs(5));
2982                 let usage = ChannelUsage { amount_msat: 128, ..usage };
2983                 assert_eq!(scorer.channel_penalty_msat(&candidate, usage, &params), 22);
2984                 let usage = ChannelUsage { amount_msat: 256, ..usage };
2985                 assert_eq!(scorer.channel_penalty_msat(&candidate, usage, &params), 106);
2986                 let usage = ChannelUsage { amount_msat: 768, ..usage };
2987                 assert_eq!(scorer.channel_penalty_msat(&candidate, usage, &params), 921);
2988                 let usage = ChannelUsage { amount_msat: 896, ..usage };
2989                 assert_eq!(scorer.channel_penalty_msat(&candidate, usage, &params), u64::max_value());
2990
2991                 // One decay (i.e., half life)
2992                 SinceEpoch::advance(Duration::from_secs(5));
2993                 scorer.time_passed(Duration::from_secs(10));
2994                 let usage = ChannelUsage { amount_msat: 64, ..usage };
2995                 assert_eq!(scorer.channel_penalty_msat(&candidate, usage, &params), 0);
2996                 let usage = ChannelUsage { amount_msat: 128, ..usage };
2997                 assert_eq!(scorer.channel_penalty_msat(&candidate, usage, &params), 34);
2998                 let usage = ChannelUsage { amount_msat: 896, ..usage };
2999                 assert_eq!(scorer.channel_penalty_msat(&candidate, usage, &params), 1_970);
3000                 let usage = ChannelUsage { amount_msat: 960, ..usage };
3001                 assert_eq!(scorer.channel_penalty_msat(&candidate, usage, &params), u64::max_value());
3002
3003                 // Fully decay liquidity lower bound.
3004                 SinceEpoch::advance(Duration::from_secs(10 * 7));
3005                 scorer.time_passed(Duration::from_secs(10 * 8));
3006                 let usage = ChannelUsage { amount_msat: 0, ..usage };
3007                 assert_eq!(scorer.channel_penalty_msat(&candidate, usage, &params), 0);
3008                 let usage = ChannelUsage { amount_msat: 1, ..usage };
3009                 assert_eq!(scorer.channel_penalty_msat(&candidate, usage, &params), 0);
3010                 let usage = ChannelUsage { amount_msat: 1_023, ..usage };
3011                 assert_eq!(scorer.channel_penalty_msat(&candidate, usage, &params), 2_000);
3012                 let usage = ChannelUsage { amount_msat: 1_024, ..usage };
3013                 assert_eq!(scorer.channel_penalty_msat(&candidate, usage, &params), u64::max_value());
3014
3015                 // Fully decay liquidity upper bound.
3016                 SinceEpoch::advance(Duration::from_secs(10));
3017                 scorer.time_passed(Duration::from_secs(10 * 9));
3018                 let usage = ChannelUsage { amount_msat: 0, ..usage };
3019                 assert_eq!(scorer.channel_penalty_msat(&candidate, usage, &params), 0);
3020                 let usage = ChannelUsage { amount_msat: 1_024, ..usage };
3021                 assert_eq!(scorer.channel_penalty_msat(&candidate, usage, &params), u64::max_value());
3022
3023                 SinceEpoch::advance(Duration::from_secs(10));
3024                 scorer.time_passed(Duration::from_secs(10 * 10));
3025                 let usage = ChannelUsage { amount_msat: 0, ..usage };
3026                 assert_eq!(scorer.channel_penalty_msat(&candidate, usage, &params), 0);
3027                 let usage = ChannelUsage { amount_msat: 1_024, ..usage };
3028                 assert_eq!(scorer.channel_penalty_msat(&candidate, usage, &params), u64::max_value());
3029         }
3030
3031         #[test]
3032         fn decays_liquidity_bounds_without_shift_overflow() {
3033                 let logger = TestLogger::new();
3034                 let network_graph = network_graph(&logger);
3035                 let params = ProbabilisticScoringFeeParameters {
3036                         liquidity_penalty_multiplier_msat: 1_000,
3037                         ..ProbabilisticScoringFeeParameters::zero_penalty()
3038                 };
3039                 let decay_params = ProbabilisticScoringDecayParameters {
3040                         liquidity_offset_half_life: Duration::from_secs(10),
3041                         ..ProbabilisticScoringDecayParameters::default()
3042                 };
3043                 let mut scorer = ProbabilisticScorer::new(decay_params, &network_graph, &logger);
3044                 let source = source_node_id();
3045                 let usage = ChannelUsage {
3046                         amount_msat: 256,
3047                         inflight_htlc_msat: 0,
3048                         effective_capacity: EffectiveCapacity::Total { capacity_msat: 1_024, htlc_maximum_msat: 1_000 },
3049                 };
3050                 let channel = network_graph.read_only().channel(42).unwrap().to_owned();
3051                 let (info, _) = channel.as_directed_from(&source).unwrap();
3052                 let candidate = CandidateRouteHop::PublicHop {
3053                         info,
3054                         short_channel_id: 42,
3055                 };
3056                 assert_eq!(scorer.channel_penalty_msat(&candidate, usage, &params), 125);
3057
3058                 scorer.payment_path_failed(&payment_path_for_amount(512), 42, Duration::ZERO);
3059                 assert_eq!(scorer.channel_penalty_msat(&candidate, usage, &params), 281);
3060
3061                 // An unchecked right shift 64 bits or more in DirectedChannelLiquidity::decayed_offset_msat
3062                 // would cause an overflow.
3063                 SinceEpoch::advance(Duration::from_secs(10 * 64));
3064                 scorer.time_passed(Duration::from_secs(10 * 64));
3065                 assert_eq!(scorer.channel_penalty_msat(&candidate, usage, &params), 125);
3066
3067                 SinceEpoch::advance(Duration::from_secs(10));
3068                 scorer.time_passed(Duration::from_secs(10 * 65));
3069                 assert_eq!(scorer.channel_penalty_msat(&candidate, usage, &params), 125);
3070         }
3071
3072         #[test]
3073         fn restricts_liquidity_bounds_after_decay() {
3074                 let logger = TestLogger::new();
3075                 let network_graph = network_graph(&logger);
3076                 let params = ProbabilisticScoringFeeParameters {
3077                         liquidity_penalty_multiplier_msat: 1_000,
3078                         ..ProbabilisticScoringFeeParameters::zero_penalty()
3079                 };
3080                 let decay_params = ProbabilisticScoringDecayParameters {
3081                         liquidity_offset_half_life: Duration::from_secs(10),
3082                         ..ProbabilisticScoringDecayParameters::default()
3083                 };
3084                 let mut scorer = ProbabilisticScorer::new(decay_params, &network_graph, &logger);
3085                 let source = source_node_id();
3086                 let usage = ChannelUsage {
3087                         amount_msat: 512,
3088                         inflight_htlc_msat: 0,
3089                         effective_capacity: EffectiveCapacity::Total { capacity_msat: 1_024, htlc_maximum_msat: 1_000 },
3090                 };
3091                 let channel = network_graph.read_only().channel(42).unwrap().to_owned();
3092                 let (info, _) = channel.as_directed_from(&source).unwrap();
3093                 let candidate = CandidateRouteHop::PublicHop {
3094                         info,
3095                         short_channel_id: 42,
3096                 };
3097
3098                 assert_eq!(scorer.channel_penalty_msat(&candidate, usage, &params), 300);
3099
3100                 // More knowledge gives higher confidence (256, 768), meaning a lower penalty.
3101                 scorer.payment_path_failed(&payment_path_for_amount(768), 42, Duration::ZERO);
3102                 scorer.payment_path_failed(&payment_path_for_amount(256), 43, Duration::ZERO);
3103                 assert_eq!(scorer.channel_penalty_msat(&candidate, usage, &params), 281);
3104
3105                 // Decaying knowledge gives less confidence (128, 896), meaning a higher penalty.
3106                 SinceEpoch::advance(Duration::from_secs(10));
3107                 scorer.time_passed(Duration::from_secs(10));
3108                 assert_eq!(scorer.channel_penalty_msat(&candidate, usage, &params), 291);
3109
3110                 // Reducing the upper bound gives more confidence (128, 832) that the payment amount (512)
3111                 // is closer to the upper bound, meaning a higher penalty.
3112                 scorer.payment_path_successful(&payment_path_for_amount(64), Duration::from_secs(10));
3113                 assert_eq!(scorer.channel_penalty_msat(&candidate, usage, &params), 331);
3114
3115                 // Increasing the lower bound gives more confidence (256, 832) that the payment amount (512)
3116                 // is closer to the lower bound, meaning a lower penalty.
3117                 scorer.payment_path_failed(&payment_path_for_amount(256), 43, Duration::from_secs(10));
3118                 assert_eq!(scorer.channel_penalty_msat(&candidate, usage, &params), 245);
3119
3120                 // Further decaying affects the lower bound more than the upper bound (128, 928).
3121                 SinceEpoch::advance(Duration::from_secs(10));
3122                 scorer.time_passed(Duration::from_secs(20));
3123                 assert_eq!(scorer.channel_penalty_msat(&candidate, usage, &params), 280);
3124         }
3125
3126         #[test]
3127         fn restores_persisted_liquidity_bounds() {
3128                 let logger = TestLogger::new();
3129                 let network_graph = network_graph(&logger);
3130                 let params = ProbabilisticScoringFeeParameters {
3131                         liquidity_penalty_multiplier_msat: 1_000,
3132                         considered_impossible_penalty_msat: u64::max_value(),
3133                         ..ProbabilisticScoringFeeParameters::zero_penalty()
3134                 };
3135                 let decay_params = ProbabilisticScoringDecayParameters {
3136                         liquidity_offset_half_life: Duration::from_secs(10),
3137                         ..ProbabilisticScoringDecayParameters::default()
3138                 };
3139                 let mut scorer = ProbabilisticScorer::new(decay_params, &network_graph, &logger);
3140                 let source = source_node_id();
3141                 let usage = ChannelUsage {
3142                         amount_msat: 500,
3143                         inflight_htlc_msat: 0,
3144                         effective_capacity: EffectiveCapacity::Total { capacity_msat: 1_000, htlc_maximum_msat: 1_000 },
3145                 };
3146
3147                 scorer.payment_path_failed(&payment_path_for_amount(500), 42, Duration::ZERO);
3148                 let channel = network_graph.read_only().channel(42).unwrap().to_owned();
3149                 let (info, _) = channel.as_directed_from(&source).unwrap();
3150                 let candidate = CandidateRouteHop::PublicHop {
3151                         info,
3152                         short_channel_id: 42,
3153                 };
3154                 assert_eq!(scorer.channel_penalty_msat(&candidate, usage, &params), u64::max_value());
3155
3156                 SinceEpoch::advance(Duration::from_secs(10));
3157                 scorer.time_passed(Duration::from_secs(10));
3158                 assert_eq!(scorer.channel_penalty_msat(&candidate, usage, &params), 473);
3159
3160                 scorer.payment_path_failed(&payment_path_for_amount(250), 43, Duration::from_secs(10));
3161                 assert_eq!(scorer.channel_penalty_msat(&candidate, usage, &params), 300);
3162
3163                 let mut serialized_scorer = Vec::new();
3164                 scorer.write(&mut serialized_scorer).unwrap();
3165
3166                 let mut serialized_scorer = io::Cursor::new(&serialized_scorer);
3167                 let deserialized_scorer =
3168                         <ProbabilisticScorer>::read(&mut serialized_scorer, (decay_params, &network_graph, &logger)).unwrap();
3169                 assert_eq!(deserialized_scorer.channel_penalty_msat(&candidate, usage, &params), 300);
3170         }
3171
3172         fn do_decays_persisted_liquidity_bounds(decay_before_reload: bool) {
3173                 let logger = TestLogger::new();
3174                 let network_graph = network_graph(&logger);
3175                 let params = ProbabilisticScoringFeeParameters {
3176                         liquidity_penalty_multiplier_msat: 1_000,
3177                         considered_impossible_penalty_msat: u64::max_value(),
3178                         ..ProbabilisticScoringFeeParameters::zero_penalty()
3179                 };
3180                 let decay_params = ProbabilisticScoringDecayParameters {
3181                         liquidity_offset_half_life: Duration::from_secs(10),
3182                         ..ProbabilisticScoringDecayParameters::zero_penalty()
3183                 };
3184                 let mut scorer = ProbabilisticScorer::new(decay_params, &network_graph, &logger);
3185                 let source = source_node_id();
3186                 let usage = ChannelUsage {
3187                         amount_msat: 500,
3188                         inflight_htlc_msat: 0,
3189                         effective_capacity: EffectiveCapacity::Total { capacity_msat: 1_000, htlc_maximum_msat: 1_000 },
3190                 };
3191
3192                 scorer.payment_path_failed(&payment_path_for_amount(500), 42, Duration::ZERO);
3193                 let channel = network_graph.read_only().channel(42).unwrap().to_owned();
3194                 let (info, _) = channel.as_directed_from(&source).unwrap();
3195                 let candidate = CandidateRouteHop::PublicHop {
3196                         info,
3197                         short_channel_id: 42,
3198                 };
3199                 assert_eq!(scorer.channel_penalty_msat(&candidate, usage, &params), u64::max_value());
3200
3201                 if decay_before_reload {
3202                         SinceEpoch::advance(Duration::from_secs(10));
3203                         scorer.time_passed(Duration::from_secs(10));
3204                 }
3205
3206                 let mut serialized_scorer = Vec::new();
3207                 scorer.write(&mut serialized_scorer).unwrap();
3208
3209                 let mut serialized_scorer = io::Cursor::new(&serialized_scorer);
3210                 let mut deserialized_scorer =
3211                         <ProbabilisticScorer>::read(&mut serialized_scorer, (decay_params, &network_graph, &logger)).unwrap();
3212                 if !decay_before_reload {
3213                         SinceEpoch::advance(Duration::from_secs(10));
3214                         scorer.time_passed(Duration::from_secs(10));
3215                         deserialized_scorer.time_passed(Duration::from_secs(10));
3216                 }
3217                 assert_eq!(deserialized_scorer.channel_penalty_msat(&candidate, usage, &params), 473);
3218
3219                 scorer.payment_path_failed(&payment_path_for_amount(250), 43, Duration::from_secs(10));
3220                 assert_eq!(scorer.channel_penalty_msat(&candidate, usage, &params), 300);
3221
3222                 SinceEpoch::advance(Duration::from_secs(10));
3223                 deserialized_scorer.time_passed(Duration::from_secs(20));
3224                 assert_eq!(deserialized_scorer.channel_penalty_msat(&candidate, usage, &params), 370);
3225         }
3226
3227         #[test]
3228         fn decays_persisted_liquidity_bounds() {
3229                 do_decays_persisted_liquidity_bounds(false);
3230                 do_decays_persisted_liquidity_bounds(true);
3231         }
3232
3233         #[test]
3234         fn scores_realistic_payments() {
3235                 // Shows the scores of "realistic" sends of 100k sats over channels of 1-10m sats (with a
3236                 // 50k sat reserve).
3237                 let logger = TestLogger::new();
3238                 let network_graph = network_graph(&logger);
3239                 let params = ProbabilisticScoringFeeParameters::default();
3240                 let scorer = ProbabilisticScorer::new(ProbabilisticScoringDecayParameters::default(), &network_graph, &logger);
3241                 let source = source_node_id();
3242
3243                 let usage = ChannelUsage {
3244                         amount_msat: 100_000_000,
3245                         inflight_htlc_msat: 0,
3246                         effective_capacity: EffectiveCapacity::Total { capacity_msat: 950_000_000, htlc_maximum_msat: 1_000 },
3247                 };
3248                 let channel = network_graph.read_only().channel(42).unwrap().to_owned();
3249                 let (info, _) = channel.as_directed_from(&source).unwrap();
3250                 let candidate = CandidateRouteHop::PublicHop {
3251                         info,
3252                         short_channel_id: 42,
3253                 };
3254                 assert_eq!(scorer.channel_penalty_msat(&candidate, usage, &params), 11497);
3255                 let usage = ChannelUsage {
3256                         effective_capacity: EffectiveCapacity::Total { capacity_msat: 1_950_000_000, htlc_maximum_msat: 1_000 }, ..usage
3257                 };
3258                 assert_eq!(scorer.channel_penalty_msat(&candidate, usage, &params), 7408);
3259                 let usage = ChannelUsage {
3260                         effective_capacity: EffectiveCapacity::Total { capacity_msat: 2_950_000_000, htlc_maximum_msat: 1_000 }, ..usage
3261                 };
3262                 assert_eq!(scorer.channel_penalty_msat(&candidate, usage, &params), 6151);
3263                 let usage = ChannelUsage {
3264                         effective_capacity: EffectiveCapacity::Total { capacity_msat: 3_950_000_000, htlc_maximum_msat: 1_000 }, ..usage
3265                 };
3266                 assert_eq!(scorer.channel_penalty_msat(&candidate, usage, &params), 5427);
3267                 let usage = ChannelUsage {
3268                         effective_capacity: EffectiveCapacity::Total { capacity_msat: 4_950_000_000, htlc_maximum_msat: 1_000 }, ..usage
3269                 };
3270                 assert_eq!(scorer.channel_penalty_msat(&candidate, usage, &params), 4955);
3271                 let usage = ChannelUsage {
3272                         effective_capacity: EffectiveCapacity::Total { capacity_msat: 5_950_000_000, htlc_maximum_msat: 1_000 }, ..usage
3273                 };
3274                 assert_eq!(scorer.channel_penalty_msat(&candidate, usage, &params), 4736);
3275                 let usage = ChannelUsage {
3276                         effective_capacity: EffectiveCapacity::Total { capacity_msat: 6_950_000_000, htlc_maximum_msat: 1_000 }, ..usage
3277                 };
3278                 assert_eq!(scorer.channel_penalty_msat(&candidate, usage, &params), 4484);
3279                 let usage = ChannelUsage {
3280                         effective_capacity: EffectiveCapacity::Total { capacity_msat: 7_450_000_000, htlc_maximum_msat: 1_000 }, ..usage
3281                 };
3282                 assert_eq!(scorer.channel_penalty_msat(&candidate, usage, &params), 4484);
3283                 let usage = ChannelUsage {
3284                         effective_capacity: EffectiveCapacity::Total { capacity_msat: 7_950_000_000, htlc_maximum_msat: 1_000 }, ..usage
3285                 };
3286                 assert_eq!(scorer.channel_penalty_msat(&candidate, usage, &params), 4263);
3287                 let usage = ChannelUsage {
3288                         effective_capacity: EffectiveCapacity::Total { capacity_msat: 8_950_000_000, htlc_maximum_msat: 1_000 }, ..usage
3289                 };
3290                 assert_eq!(scorer.channel_penalty_msat(&candidate, usage, &params), 4263);
3291                 let usage = ChannelUsage {
3292                         effective_capacity: EffectiveCapacity::Total { capacity_msat: 9_950_000_000, htlc_maximum_msat: 1_000 }, ..usage
3293                 };
3294                 assert_eq!(scorer.channel_penalty_msat(&candidate, usage, &params), 4044);
3295         }
3296
3297         #[test]
3298         fn adds_base_penalty_to_liquidity_penalty() {
3299                 let logger = TestLogger::new();
3300                 let network_graph = network_graph(&logger);
3301                 let source = source_node_id();
3302                 let usage = ChannelUsage {
3303                         amount_msat: 128,
3304                         inflight_htlc_msat: 0,
3305                         effective_capacity: EffectiveCapacity::Total { capacity_msat: 1_024, htlc_maximum_msat: 1_000 },
3306                 };
3307
3308                 let params = ProbabilisticScoringFeeParameters {
3309                         liquidity_penalty_multiplier_msat: 1_000,
3310                         ..ProbabilisticScoringFeeParameters::zero_penalty()
3311                 };
3312                 let scorer = ProbabilisticScorer::new(ProbabilisticScoringDecayParameters::default(), &network_graph, &logger);
3313                 let channel = network_graph.read_only().channel(42).unwrap().to_owned();
3314                 let (info, _) = channel.as_directed_from(&source).unwrap();
3315                 let candidate = CandidateRouteHop::PublicHop {
3316                         info,
3317                         short_channel_id: 42,
3318                 };
3319                 assert_eq!(scorer.channel_penalty_msat(&candidate, usage, &params), 58);
3320
3321                 let params = ProbabilisticScoringFeeParameters {
3322                         base_penalty_msat: 500, liquidity_penalty_multiplier_msat: 1_000,
3323                         anti_probing_penalty_msat: 0, ..ProbabilisticScoringFeeParameters::zero_penalty()
3324                 };
3325                 let scorer = ProbabilisticScorer::new(ProbabilisticScoringDecayParameters::default(), &network_graph, &logger);
3326                 assert_eq!(scorer.channel_penalty_msat(&candidate, usage, &params), 558);
3327
3328                 let params = ProbabilisticScoringFeeParameters {
3329                         base_penalty_msat: 500, liquidity_penalty_multiplier_msat: 1_000,
3330                         base_penalty_amount_multiplier_msat: (1 << 30),
3331                         anti_probing_penalty_msat: 0, ..ProbabilisticScoringFeeParameters::zero_penalty()
3332                 };
3333
3334                 let scorer = ProbabilisticScorer::new(ProbabilisticScoringDecayParameters::default(), &network_graph, &logger);
3335                 assert_eq!(scorer.channel_penalty_msat(&candidate, usage, &params), 558 + 128);
3336         }
3337
3338         #[test]
3339         fn adds_amount_penalty_to_liquidity_penalty() {
3340                 let logger = TestLogger::new();
3341                 let network_graph = network_graph(&logger);
3342                 let source = source_node_id();
3343                 let usage = ChannelUsage {
3344                         amount_msat: 512_000,
3345                         inflight_htlc_msat: 0,
3346                         effective_capacity: EffectiveCapacity::Total { capacity_msat: 1_024_000, htlc_maximum_msat: 1_000 },
3347                 };
3348
3349                 let params = ProbabilisticScoringFeeParameters {
3350                         liquidity_penalty_multiplier_msat: 1_000,
3351                         liquidity_penalty_amount_multiplier_msat: 0,
3352                         ..ProbabilisticScoringFeeParameters::zero_penalty()
3353                 };
3354                 let scorer = ProbabilisticScorer::new(ProbabilisticScoringDecayParameters::default(), &network_graph, &logger);
3355                 let channel = network_graph.read_only().channel(42).unwrap().to_owned();
3356                 let (info, _) = channel.as_directed_from(&source).unwrap();
3357                 let candidate = CandidateRouteHop::PublicHop {
3358                         info,
3359                         short_channel_id: 42,
3360                 };
3361                 assert_eq!(scorer.channel_penalty_msat(&candidate, usage, &params), 300);
3362
3363                 let params = ProbabilisticScoringFeeParameters {
3364                         liquidity_penalty_multiplier_msat: 1_000,
3365                         liquidity_penalty_amount_multiplier_msat: 256,
3366                         ..ProbabilisticScoringFeeParameters::zero_penalty()
3367                 };
3368                 let scorer = ProbabilisticScorer::new(ProbabilisticScoringDecayParameters::default(), &network_graph, &logger);
3369                 assert_eq!(scorer.channel_penalty_msat(&candidate, usage, &params), 337);
3370         }
3371
3372         #[test]
3373         fn calculates_log10_without_overflowing_u64_max_value() {
3374                 let logger = TestLogger::new();
3375                 let network_graph = network_graph(&logger);
3376                 let source = source_node_id();
3377                 let usage = ChannelUsage {
3378                         amount_msat: u64::max_value(),
3379                         inflight_htlc_msat: 0,
3380                         effective_capacity: EffectiveCapacity::Infinite,
3381                 };
3382                 let params = ProbabilisticScoringFeeParameters {
3383                         liquidity_penalty_multiplier_msat: 40_000,
3384                         ..ProbabilisticScoringFeeParameters::zero_penalty()
3385                 };
3386                 let decay_params = ProbabilisticScoringDecayParameters::zero_penalty();
3387                 let channel = network_graph.read_only().channel(42).unwrap().to_owned();
3388                 let (info, _) = channel.as_directed_from(&source).unwrap();
3389                 let candidate = CandidateRouteHop::PublicHop {
3390                         info,
3391                         short_channel_id: 42,
3392                 };
3393                 let scorer = ProbabilisticScorer::new(decay_params, &network_graph, &logger);
3394                 assert_eq!(scorer.channel_penalty_msat(&candidate, usage, &params), 80_000);
3395         }
3396
3397         #[test]
3398         fn accounts_for_inflight_htlc_usage() {
3399                 let logger = TestLogger::new();
3400                 let network_graph = network_graph(&logger);
3401                 let params = ProbabilisticScoringFeeParameters {
3402                         considered_impossible_penalty_msat: u64::max_value(),
3403                         ..ProbabilisticScoringFeeParameters::zero_penalty()
3404                 };
3405                 let scorer = ProbabilisticScorer::new(ProbabilisticScoringDecayParameters::default(), &network_graph, &logger);
3406                 let source = source_node_id();
3407
3408                 let usage = ChannelUsage {
3409                         amount_msat: 750,
3410                         inflight_htlc_msat: 0,
3411                         effective_capacity: EffectiveCapacity::Total { capacity_msat: 1_000, htlc_maximum_msat: 1_000 },
3412                 };
3413                 let network_graph = network_graph.read_only();
3414                 let channel = network_graph.channel(42).unwrap();
3415                 let (info, _) = channel.as_directed_from(&source).unwrap();
3416                 let candidate = CandidateRouteHop::PublicHop {
3417                         info,
3418                         short_channel_id: 42,
3419                 };
3420                 assert_ne!(scorer.channel_penalty_msat(&candidate, usage, &params), u64::max_value());
3421
3422                 let usage = ChannelUsage { inflight_htlc_msat: 251, ..usage };
3423                 assert_eq!(scorer.channel_penalty_msat(&candidate, usage, &params), u64::max_value());
3424         }
3425
3426         #[test]
3427         fn removes_uncertainity_when_exact_liquidity_known() {
3428                 let logger = TestLogger::new();
3429                 let network_graph = network_graph(&logger);
3430                 let params = ProbabilisticScoringFeeParameters::default();
3431                 let scorer = ProbabilisticScorer::new(ProbabilisticScoringDecayParameters::default(), &network_graph, &logger);
3432                 let source = source_node_id();
3433
3434                 let base_penalty_msat = params.base_penalty_msat;
3435                 let usage = ChannelUsage {
3436                         amount_msat: 750,
3437                         inflight_htlc_msat: 0,
3438                         effective_capacity: EffectiveCapacity::ExactLiquidity { liquidity_msat: 1_000 },
3439                 };
3440                 let network_graph = network_graph.read_only();
3441                 let channel = network_graph.channel(42).unwrap();
3442                 let (info, _) = channel.as_directed_from(&source).unwrap();
3443                 let candidate = CandidateRouteHop::PublicHop {
3444                         info,
3445                         short_channel_id: 42,
3446                 };
3447                 assert_eq!(scorer.channel_penalty_msat(&candidate, usage, &params), base_penalty_msat);
3448
3449                 let usage = ChannelUsage { amount_msat: 1_000, ..usage };
3450                 assert_eq!(scorer.channel_penalty_msat(&candidate, usage, &params), base_penalty_msat);
3451
3452                 let usage = ChannelUsage { amount_msat: 1_001, ..usage };
3453                 assert_eq!(scorer.channel_penalty_msat(&candidate, usage, &params), u64::max_value());
3454         }
3455
3456         #[test]
3457         fn remembers_historical_failures() {
3458                 let logger = TestLogger::new();
3459                 let network_graph = network_graph(&logger);
3460                 let params = ProbabilisticScoringFeeParameters {
3461                         historical_liquidity_penalty_multiplier_msat: 1024,
3462                         historical_liquidity_penalty_amount_multiplier_msat: 1024,
3463                         ..ProbabilisticScoringFeeParameters::zero_penalty()
3464                 };
3465                 let decay_params = ProbabilisticScoringDecayParameters {
3466                         liquidity_offset_half_life: Duration::from_secs(60 * 60),
3467                         historical_no_updates_half_life: Duration::from_secs(10),
3468                 };
3469                 let mut scorer = ProbabilisticScorer::new(decay_params, &network_graph, &logger);
3470                 let source = source_node_id();
3471                 let target = target_node_id();
3472
3473                 let usage = ChannelUsage {
3474                         amount_msat: 100,
3475                         inflight_htlc_msat: 0,
3476                         effective_capacity: EffectiveCapacity::Total { capacity_msat: 1_024, htlc_maximum_msat: 1_024 },
3477                 };
3478                 let usage_1 = ChannelUsage {
3479                         amount_msat: 1,
3480                         inflight_htlc_msat: 0,
3481                         effective_capacity: EffectiveCapacity::Total { capacity_msat: 1_024, htlc_maximum_msat: 1_024 },
3482                 };
3483
3484                 {
3485                         let network_graph = network_graph.read_only();
3486                         let channel = network_graph.channel(42).unwrap();
3487                         let (info, _) = channel.as_directed_from(&source).unwrap();
3488                         let candidate = CandidateRouteHop::PublicHop {
3489                                 info,
3490                                 short_channel_id: 42,
3491                         };
3492
3493                         // With no historical data the normal liquidity penalty calculation is used.
3494                         assert_eq!(scorer.channel_penalty_msat(&candidate, usage, &params), 168);
3495                 }
3496                 assert_eq!(scorer.historical_estimated_channel_liquidity_probabilities(42, &target),
3497                 None);
3498                 assert_eq!(scorer.historical_estimated_payment_success_probability(42, &target, 42, &params),
3499                 None);
3500
3501                 scorer.payment_path_failed(&payment_path_for_amount(1), 42, Duration::ZERO);
3502                 {
3503                         let network_graph = network_graph.read_only();
3504                         let channel = network_graph.channel(42).unwrap();
3505                         let (info, _) = channel.as_directed_from(&source).unwrap();
3506                         let candidate = CandidateRouteHop::PublicHop {
3507                                 info,
3508                                 short_channel_id: 42,
3509                         };
3510
3511                         assert_eq!(scorer.channel_penalty_msat(&candidate, usage, &params), 2048);
3512                         assert_eq!(scorer.channel_penalty_msat(&candidate, usage_1, &params), 249);
3513                 }
3514                 // The "it failed" increment is 32, where the probability should lie several buckets into
3515                 // the first octile.
3516                 assert_eq!(scorer.historical_estimated_channel_liquidity_probabilities(42, &target),
3517                         Some(([32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
3518                                 [0, 0, 0, 0, 0, 0, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0])));
3519                 assert!(scorer.historical_estimated_payment_success_probability(42, &target, 1, &params)
3520                         .unwrap() > 0.35);
3521                 assert_eq!(scorer.historical_estimated_payment_success_probability(42, &target, 500, &params),
3522                         Some(0.0));
3523
3524                 // Even after we tell the scorer we definitely have enough available liquidity, it will
3525                 // still remember that there was some failure in the past, and assign a non-0 penalty.
3526                 scorer.payment_path_failed(&payment_path_for_amount(1000), 43, Duration::ZERO);
3527                 {
3528                         let network_graph = network_graph.read_only();
3529                         let channel = network_graph.channel(42).unwrap();
3530                         let (info, _) = channel.as_directed_from(&source).unwrap();
3531                         let candidate = CandidateRouteHop::PublicHop {
3532                                 info,
3533                                 short_channel_id: 42,
3534                         };
3535
3536                         assert_eq!(scorer.channel_penalty_msat(&candidate, usage, &params), 105);
3537                 }
3538                 // The first points should be decayed just slightly and the last bucket has a new point.
3539                 assert_eq!(scorer.historical_estimated_channel_liquidity_probabilities(42, &target),
3540                         Some(([31, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 32, 0, 0, 0, 0, 0],
3541                                 [0, 0, 0, 0, 0, 0, 31, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 32])));
3542
3543                 // The exact success probability is a bit complicated and involves integer rounding, so we
3544                 // simply check bounds here.
3545                 let five_hundred_prob =
3546                         scorer.historical_estimated_payment_success_probability(42, &target, 500, &params).unwrap();
3547                 assert!(five_hundred_prob > 0.59);
3548                 assert!(five_hundred_prob < 0.60);
3549                 let one_prob =
3550                         scorer.historical_estimated_payment_success_probability(42, &target, 1, &params).unwrap();
3551                 assert!(one_prob < 0.85);
3552                 assert!(one_prob > 0.84);
3553
3554                 // Advance the time forward 16 half-lives (which the docs claim will ensure all data is
3555                 // gone), and check that we're back to where we started.
3556                 SinceEpoch::advance(Duration::from_secs(10 * 16));
3557                 scorer.time_passed(Duration::from_secs(10 * 16));
3558                 {
3559                         let network_graph = network_graph.read_only();
3560                         let channel = network_graph.channel(42).unwrap();
3561                         let (info, _) = channel.as_directed_from(&source).unwrap();
3562                         let candidate = CandidateRouteHop::PublicHop {
3563                                 info,
3564                                 short_channel_id: 42,
3565                         };
3566
3567                         assert_eq!(scorer.channel_penalty_msat(&candidate, usage, &params), 168);
3568                 }
3569                 // Once fully decayed we still have data, but its all-0s. In the future we may remove the
3570                 // data entirely instead.
3571                 assert_eq!(scorer.historical_estimated_channel_liquidity_probabilities(42, &target),
3572                         Some(([0; 32], [0; 32])));
3573                 assert_eq!(scorer.historical_estimated_payment_success_probability(42, &target, 1, &params), None);
3574
3575                 let mut usage = ChannelUsage {
3576                         amount_msat: 100,
3577                         inflight_htlc_msat: 1024,
3578                         effective_capacity: EffectiveCapacity::Total { capacity_msat: 1_024, htlc_maximum_msat: 1_024 },
3579                 };
3580                 scorer.payment_path_failed(&payment_path_for_amount(1), 42, Duration::from_secs(10 * 16));
3581                 {
3582                         let network_graph = network_graph.read_only();
3583                         let channel = network_graph.channel(42).unwrap();
3584                         let (info, _) = channel.as_directed_from(&source).unwrap();
3585                         let candidate = CandidateRouteHop::PublicHop {
3586                                 info,
3587                                 short_channel_id: 42,
3588                         };
3589
3590                         assert_eq!(scorer.channel_penalty_msat(&candidate, usage, &params), 2050);
3591
3592                         let usage = ChannelUsage {
3593                                 amount_msat: 1,
3594                                 inflight_htlc_msat: 0,
3595                                 effective_capacity: EffectiveCapacity::AdvertisedMaxHTLC { amount_msat: 0 },
3596                         };
3597                         assert_eq!(scorer.channel_penalty_msat(&candidate, usage, &params), 2048);
3598                 }
3599
3600                 // Advance to decay all liquidity offsets to zero.
3601                 SinceEpoch::advance(Duration::from_secs(60 * 60 * 10));
3602                 scorer.time_passed(Duration::from_secs(10 * (16 + 60 * 60)));
3603
3604                 // Once even the bounds have decayed information about the channel should be removed
3605                 // entirely.
3606                 assert_eq!(scorer.historical_estimated_channel_liquidity_probabilities(42, &target),
3607                         None);
3608
3609                 // Use a path in the opposite direction, which have zero for htlc_maximum_msat. This will
3610                 // ensure that the effective capacity is zero to test division-by-zero edge cases.
3611                 let path = vec![
3612                         path_hop(target_pubkey(), 43, 2),
3613                         path_hop(source_pubkey(), 42, 1),
3614                         path_hop(sender_pubkey(), 41, 0),
3615                 ];
3616                 scorer.payment_path_failed(&Path { hops: path, blinded_tail: None }, 42, Duration::from_secs(10 * (16 + 60 * 60)));
3617         }
3618
3619         #[test]
3620         fn adds_anti_probing_penalty() {
3621                 let logger = TestLogger::new();
3622                 let network_graph = network_graph(&logger);
3623                 let source = source_node_id();
3624                 let params = ProbabilisticScoringFeeParameters {
3625                         anti_probing_penalty_msat: 500,
3626                         ..ProbabilisticScoringFeeParameters::zero_penalty()
3627                 };
3628                 let scorer = ProbabilisticScorer::new(ProbabilisticScoringDecayParameters::default(), &network_graph, &logger);
3629
3630                 // Check we receive no penalty for a low htlc_maximum_msat.
3631                 let usage = ChannelUsage {
3632                         amount_msat: 512_000,
3633                         inflight_htlc_msat: 0,
3634                         effective_capacity: EffectiveCapacity::Total { capacity_msat: 1_024_000, htlc_maximum_msat: 1_000 },
3635                 };
3636                 let network_graph = network_graph.read_only();
3637                 let channel = network_graph.channel(42).unwrap();
3638                 let (info, _) = channel.as_directed_from(&source).unwrap();
3639                 let candidate = CandidateRouteHop::PublicHop {
3640                         info,
3641                         short_channel_id: 42,
3642                 };
3643                 assert_eq!(scorer.channel_penalty_msat(&candidate, usage, &params), 0);
3644
3645                 // Check we receive anti-probing penalty for htlc_maximum_msat == channel_capacity.
3646                 let usage = ChannelUsage {
3647                         amount_msat: 512_000,
3648                         inflight_htlc_msat: 0,
3649                         effective_capacity: EffectiveCapacity::Total { capacity_msat: 1_024_000, htlc_maximum_msat: 1_024_000 },
3650                 };
3651                 assert_eq!(scorer.channel_penalty_msat(&candidate, usage, &params), 500);
3652
3653                 // Check we receive anti-probing penalty for htlc_maximum_msat == channel_capacity/2.
3654                 let usage = ChannelUsage {
3655                         amount_msat: 512_000,
3656                         inflight_htlc_msat: 0,
3657                         effective_capacity: EffectiveCapacity::Total { capacity_msat: 1_024_000, htlc_maximum_msat: 512_000 },
3658                 };
3659                 assert_eq!(scorer.channel_penalty_msat(&candidate, usage, &params), 500);
3660
3661                 // Check we receive no anti-probing penalty for htlc_maximum_msat == channel_capacity/2 - 1.
3662                 let usage = ChannelUsage {
3663                         amount_msat: 512_000,
3664                         inflight_htlc_msat: 0,
3665                         effective_capacity: EffectiveCapacity::Total { capacity_msat: 1_024_000, htlc_maximum_msat: 511_999 },
3666                 };
3667                 assert_eq!(scorer.channel_penalty_msat(&candidate, usage, &params), 0);
3668         }
3669
3670         #[test]
3671         fn scores_with_blinded_path() {
3672                 // Make sure we'll account for a blinded path's final_value_msat in scoring
3673                 let logger = TestLogger::new();
3674                 let network_graph = network_graph(&logger);
3675                 let params = ProbabilisticScoringFeeParameters {
3676                         liquidity_penalty_multiplier_msat: 1_000,
3677                         ..ProbabilisticScoringFeeParameters::zero_penalty()
3678                 };
3679                 let decay_params = ProbabilisticScoringDecayParameters::default();
3680                 let mut scorer = ProbabilisticScorer::new(decay_params, &network_graph, &logger);
3681                 let source = source_node_id();
3682                 let usage = ChannelUsage {
3683                         amount_msat: 512,
3684                         inflight_htlc_msat: 0,
3685                         effective_capacity: EffectiveCapacity::Total { capacity_msat: 1_024, htlc_maximum_msat: 1_000 },
3686                 };
3687                 let channel = network_graph.read_only().channel(42).unwrap().to_owned();
3688                 let (info, target) = channel.as_directed_from(&source).unwrap();
3689                 let candidate = CandidateRouteHop::PublicHop {
3690                         info,
3691                         short_channel_id: 42,
3692                 };
3693                 assert_eq!(scorer.channel_penalty_msat(&candidate, usage, &params), 300);
3694
3695                 let mut path = payment_path_for_amount(768);
3696                 let recipient_hop = path.hops.pop().unwrap();
3697                 let blinded_path = BlindedPath {
3698                         introduction_node_id: path.hops.last().as_ref().unwrap().pubkey,
3699                         blinding_point: test_utils::pubkey(42),
3700                         blinded_hops: vec![
3701                                 BlindedHop { blinded_node_id: test_utils::pubkey(44), encrypted_payload: Vec::new() }
3702                         ],
3703                 };
3704                 path.blinded_tail = Some(BlindedTail {
3705                         hops: blinded_path.blinded_hops,
3706                         blinding_point: blinded_path.blinding_point,
3707                         excess_final_cltv_expiry_delta: recipient_hop.cltv_expiry_delta,
3708                         final_value_msat: recipient_hop.fee_msat,
3709                 });
3710
3711                 // Check the liquidity before and after scoring payment failures to ensure the blinded path's
3712                 // final value is taken into account.
3713                 assert!(scorer.channel_liquidities.get(&42).is_none());
3714
3715                 scorer.payment_path_failed(&path, 42, Duration::ZERO);
3716                 path.blinded_tail.as_mut().unwrap().final_value_msat = 256;
3717                 scorer.payment_path_failed(&path, 43, Duration::ZERO);
3718
3719                 let liquidity = scorer.channel_liquidities.get(&42).unwrap()
3720                         .as_directed(&source, &target, 1_000, decay_params);
3721                 assert_eq!(liquidity.min_liquidity_msat(), 256);
3722                 assert_eq!(liquidity.max_liquidity_msat(), 768);
3723         }
3724
3725         #[test]
3726         fn realistic_historical_failures() {
3727                 // The motivation for the unequal sized buckets came largely from attempting to pay 10k
3728                 // sats over a one bitcoin channel. This tests that case explicitly, ensuring that we score
3729                 // properly.
3730                 let logger = TestLogger::new();
3731                 let mut network_graph = network_graph(&logger);
3732                 let params = ProbabilisticScoringFeeParameters {
3733                         historical_liquidity_penalty_multiplier_msat: 1024,
3734                         historical_liquidity_penalty_amount_multiplier_msat: 1024,
3735                         ..ProbabilisticScoringFeeParameters::zero_penalty()
3736                 };
3737                 let decay_params = ProbabilisticScoringDecayParameters {
3738                         liquidity_offset_half_life: Duration::from_secs(60 * 60),
3739                         historical_no_updates_half_life: Duration::from_secs(10),
3740                         ..ProbabilisticScoringDecayParameters::default()
3741                 };
3742
3743                 let capacity_msat = 100_000_000_000;
3744                 update_channel(&mut network_graph, 42, source_privkey(), 0, capacity_msat, 200);
3745                 update_channel(&mut network_graph, 42, target_privkey(), 1, capacity_msat, 200);
3746
3747                 let mut scorer = ProbabilisticScorer::new(decay_params, &network_graph, &logger);
3748                 let source = source_node_id();
3749
3750                 let mut amount_msat = 10_000_000;
3751                 let usage = ChannelUsage {
3752                         amount_msat,
3753                         inflight_htlc_msat: 0,
3754                         effective_capacity: EffectiveCapacity::Total { capacity_msat, htlc_maximum_msat: capacity_msat },
3755                 };
3756                 let channel = network_graph.read_only().channel(42).unwrap().to_owned();
3757                 let (info, target) = channel.as_directed_from(&source).unwrap();
3758                 let candidate = CandidateRouteHop::PublicHop {
3759                         info,
3760                         short_channel_id: 42,
3761                 };
3762                 // With no historical data the normal liquidity penalty calculation is used, which results
3763                 // in a success probability of ~75%.
3764                 assert_eq!(scorer.channel_penalty_msat(&candidate, usage, &params), 1269);
3765                 assert_eq!(scorer.historical_estimated_channel_liquidity_probabilities(42, &target),
3766                         None);
3767                 assert_eq!(scorer.historical_estimated_payment_success_probability(42, &target, 42, &params),
3768                         None);
3769
3770                 // Fail to pay once, and then check the buckets and penalty.
3771                 scorer.payment_path_failed(&payment_path_for_amount(amount_msat), 42, Duration::ZERO);
3772                 // The penalty should be the maximum penalty, as the payment we're scoring is now in the
3773                 // same bucket which is the only maximum datapoint.
3774                 assert_eq!(scorer.channel_penalty_msat(&candidate, usage, &params),
3775                         2048 + 2048 * amount_msat / super::AMOUNT_PENALTY_DIVISOR);
3776                 // The "it failed" increment is 32, which we should apply to the first upper-bound (between
3777                 // 6k sats and 12k sats).
3778                 assert_eq!(scorer.historical_estimated_channel_liquidity_probabilities(42, &target),
3779                         Some(([32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
3780                                 [0, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0])));
3781                 // The success probability estimate itself should be zero.
3782                 assert_eq!(scorer.historical_estimated_payment_success_probability(42, &target, amount_msat, &params),
3783                         Some(0.0));
3784
3785                 // Now test again with the amount in the bottom bucket.
3786                 amount_msat /= 2;
3787                 // The new amount is entirely within the only minimum bucket with score, so the probability
3788                 // we assign is 1/2.
3789                 assert_eq!(scorer.historical_estimated_payment_success_probability(42, &target, amount_msat, &params),
3790                         Some(0.5));
3791
3792                 // ...but once we see a failure, we consider the payment to be substantially less likely,
3793                 // even though not a probability of zero as we still look at the second max bucket which
3794                 // now shows 31.
3795                 scorer.payment_path_failed(&payment_path_for_amount(amount_msat), 42, Duration::ZERO);
3796                 assert_eq!(scorer.historical_estimated_channel_liquidity_probabilities(42, &target),
3797                         Some(([63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
3798                                 [32, 31, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0])));
3799                 assert_eq!(scorer.historical_estimated_payment_success_probability(42, &target, amount_msat, &params),
3800                         Some(0.0));
3801         }
3802 }