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