@@ -518,6 +518,11 @@ pub struct ProbabilisticScorerUsingTime<G: Deref<Target = NetworkGraph>, T: Time
518518/// Parameters for configuring [`ProbabilisticScorer`].
519519#[ derive( Clone , Copy ) ]
520520pub struct ProbabilisticScoringParameters {
521+ /// A fixed penalty in msats to apply to each channel.
522+ ///
523+ /// Default value: 500 msat
524+ pub base_penalty_msat : u64 ,
525+
521526 /// The function calculating the cost of routing an amount through a channel.
522527 ///
523528 /// The cost is multiplied by [`liquidity_penalty_multiplier_msat`] to determine the channel
@@ -627,6 +632,7 @@ impl Default for ProbabilisticScoringParameters {
627632 cost_function : ProbabilisticScoringCostFunction :: NegativeLogSuccessProbability ,
628633 liquidity_penalty_multiplier_msat : 10_000 ,
629634 liquidity_offset_half_life : Duration :: from_secs ( 3600 ) ,
635+ base_penalty_msat : 500 ,
630636 }
631637 }
632638}
@@ -789,6 +795,7 @@ impl<G: Deref<Target = NetworkGraph>, T: Time> Score for ProbabilisticScorerUsin
789795 . unwrap_or ( & ChannelLiquidity :: new ( ) )
790796 . as_directed ( source, target, capacity_msat, self . params . liquidity_offset_half_life )
791797 . penalty_msat ( amount_msat, & self . params )
798+ . saturating_add ( self . params . base_penalty_msat )
792799 }
793800
794801 fn payment_path_failed ( & mut self , path : & [ & RouteHop ] , short_channel_id : u64 ) {
@@ -1769,7 +1776,7 @@ mod tests {
17691776 fn increased_penalty_nearing_liquidity_upper_bound ( ) {
17701777 let network_graph = network_graph ( ) ;
17711778 let params = ProbabilisticScoringParameters {
1772- liquidity_penalty_multiplier_msat : 1_000 , ..Default :: default ( )
1779+ base_penalty_msat : 0 , liquidity_penalty_multiplier_msat : 1_000 , ..Default :: default ( )
17731780 } ;
17741781 let scorer = ProbabilisticScorer :: new ( params, & network_graph) ;
17751782 let source = source_node_id ( ) ;
@@ -1793,6 +1800,7 @@ mod tests {
17931800 fn increased_penalty_linearly_nearing_liquidity_upper_bound ( ) {
17941801 let network_graph = network_graph ( ) ;
17951802 let params = ProbabilisticScoringParameters {
1803+ base_penalty_msat : 0 ,
17961804 cost_function : ProbabilisticScoringCostFunction :: TwiceFailureProbability ,
17971805 liquidity_penalty_multiplier_msat : 1_000 ,
17981806 ..Default :: default ( )
@@ -1820,7 +1828,7 @@ mod tests {
18201828 let last_updated = SinceEpoch :: now ( ) ;
18211829 let network_graph = network_graph ( ) ;
18221830 let params = ProbabilisticScoringParameters {
1823- liquidity_penalty_multiplier_msat : 1_000 , ..Default :: default ( )
1831+ base_penalty_msat : 0 , liquidity_penalty_multiplier_msat : 1_000 , ..Default :: default ( )
18241832 } ;
18251833 let scorer = ProbabilisticScorer :: new ( params, & network_graph)
18261834 . with_channel ( 42 ,
@@ -1840,7 +1848,7 @@ mod tests {
18401848 fn does_not_further_penalize_own_channel ( ) {
18411849 let network_graph = network_graph ( ) ;
18421850 let params = ProbabilisticScoringParameters {
1843- liquidity_penalty_multiplier_msat : 1_000 , ..Default :: default ( )
1851+ base_penalty_msat : 0 , liquidity_penalty_multiplier_msat : 1_000 , ..Default :: default ( )
18441852 } ;
18451853 let mut scorer = ProbabilisticScorer :: new ( params, & network_graph) ;
18461854 let sender = sender_node_id ( ) ;
@@ -1861,7 +1869,7 @@ mod tests {
18611869 fn sets_liquidity_lower_bound_on_downstream_failure ( ) {
18621870 let network_graph = network_graph ( ) ;
18631871 let params = ProbabilisticScoringParameters {
1864- liquidity_penalty_multiplier_msat : 1_000 , ..Default :: default ( )
1872+ base_penalty_msat : 0 , liquidity_penalty_multiplier_msat : 1_000 , ..Default :: default ( )
18651873 } ;
18661874 let mut scorer = ProbabilisticScorer :: new ( params, & network_graph) ;
18671875 let source = source_node_id ( ) ;
@@ -1883,7 +1891,7 @@ mod tests {
18831891 fn sets_liquidity_upper_bound_on_failure ( ) {
18841892 let network_graph = network_graph ( ) ;
18851893 let params = ProbabilisticScoringParameters {
1886- liquidity_penalty_multiplier_msat : 1_000 , ..Default :: default ( )
1894+ base_penalty_msat : 0 , liquidity_penalty_multiplier_msat : 1_000 , ..Default :: default ( )
18871895 } ;
18881896 let mut scorer = ProbabilisticScorer :: new ( params, & network_graph) ;
18891897 let source = source_node_id ( ) ;
@@ -1905,7 +1913,7 @@ mod tests {
19051913 fn reduces_liquidity_upper_bound_along_path_on_success ( ) {
19061914 let network_graph = network_graph ( ) ;
19071915 let params = ProbabilisticScoringParameters {
1908- liquidity_penalty_multiplier_msat : 1_000 , ..Default :: default ( )
1916+ base_penalty_msat : 0 , liquidity_penalty_multiplier_msat : 1_000 , ..Default :: default ( )
19091917 } ;
19101918 let mut scorer = ProbabilisticScorer :: new ( params, & network_graph) ;
19111919 let sender = sender_node_id ( ) ;
@@ -1929,6 +1937,7 @@ mod tests {
19291937 fn decays_liquidity_bounds_over_time ( ) {
19301938 let network_graph = network_graph ( ) ;
19311939 let params = ProbabilisticScoringParameters {
1940+ base_penalty_msat : 0 ,
19321941 liquidity_penalty_multiplier_msat : 1_000 ,
19331942 liquidity_offset_half_life : Duration :: from_secs ( 10 ) ,
19341943 ..Default :: default ( )
@@ -1981,6 +1990,7 @@ mod tests {
19811990 fn decays_liquidity_bounds_without_shift_overflow ( ) {
19821991 let network_graph = network_graph ( ) ;
19831992 let params = ProbabilisticScoringParameters {
1993+ base_penalty_msat : 0 ,
19841994 liquidity_penalty_multiplier_msat : 1_000 ,
19851995 liquidity_offset_half_life : Duration :: from_secs ( 10 ) ,
19861996 ..Default :: default ( )
@@ -2006,6 +2016,7 @@ mod tests {
20062016 fn restricts_liquidity_bounds_after_decay ( ) {
20072017 let network_graph = network_graph ( ) ;
20082018 let params = ProbabilisticScoringParameters {
2019+ base_penalty_msat : 0 ,
20092020 liquidity_penalty_multiplier_msat : 1_000 ,
20102021 liquidity_offset_half_life : Duration :: from_secs ( 10 ) ,
20112022 ..Default :: default ( )
@@ -2044,6 +2055,7 @@ mod tests {
20442055 fn restores_persisted_liquidity_bounds ( ) {
20452056 let network_graph = network_graph ( ) ;
20462057 let params = ProbabilisticScoringParameters {
2058+ base_penalty_msat : 0 ,
20472059 liquidity_penalty_multiplier_msat : 1_000 ,
20482060 liquidity_offset_half_life : Duration :: from_secs ( 10 ) ,
20492061 ..Default :: default ( )
@@ -2074,6 +2086,7 @@ mod tests {
20742086 fn decays_persisted_liquidity_bounds ( ) {
20752087 let network_graph = network_graph ( ) ;
20762088 let params = ProbabilisticScoringParameters {
2089+ base_penalty_msat : 0 ,
20772090 liquidity_penalty_multiplier_msat : 1_000 ,
20782091 liquidity_offset_half_life : Duration :: from_secs ( 10 ) ,
20792092 ..Default :: default ( )
@@ -2101,4 +2114,23 @@ mod tests {
21012114 SinceEpoch :: advance ( Duration :: from_secs ( 10 ) ) ;
21022115 assert_eq ! ( deserialized_scorer. channel_penalty_msat( 42 , 500 , 1_000 , & source, & target) , 371 ) ;
21032116 }
2117+
2118+ #[ test]
2119+ fn adds_base_penalty_to_liquidity_penalty ( ) {
2120+ let network_graph = network_graph ( ) ;
2121+ let source = source_node_id ( ) ;
2122+ let target = target_node_id ( ) ;
2123+
2124+ let params = ProbabilisticScoringParameters {
2125+ base_penalty_msat : 0 , ..Default :: default ( )
2126+ } ;
2127+ let scorer = ProbabilisticScorer :: new ( params, & network_graph) ;
2128+ assert_eq ! ( scorer. channel_penalty_msat( 42 , 128 , 1_024 , & source, & target) , 585 ) ;
2129+
2130+ let params = ProbabilisticScoringParameters {
2131+ base_penalty_msat : 500 , ..Default :: default ( )
2132+ } ;
2133+ let scorer = ProbabilisticScorer :: new ( params, & network_graph) ;
2134+ assert_eq ! ( scorer. channel_penalty_msat( 42 , 128 , 1_024 , & source, & target) , 1085 ) ;
2135+ }
21042136}
0 commit comments