Skip to content

Commit e895c25

Browse files
committed
Add a base penalty to ProbabilisticScorer
ProbabilisticScorer tends to prefer longer routes to shorter ones. Make the default scoring behavior include a customizable base penalty to avoid longer routes.
1 parent 6aa613d commit e895c25

File tree

1 file changed

+38
-6
lines changed

1 file changed

+38
-6
lines changed

lightning/src/routing/scoring.rs

Lines changed: 38 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -518,6 +518,11 @@ pub struct ProbabilisticScorerUsingTime<G: Deref<Target = NetworkGraph>, T: Time
518518
/// Parameters for configuring [`ProbabilisticScorer`].
519519
#[derive(Clone, Copy)]
520520
pub 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

Comments
 (0)