@@ -7115,19 +7115,18 @@ mod tests {
7115
7115
#[ test]
7116
7116
#[ cfg( feature = "std" ) ]
7117
7117
fn generate_routes ( ) {
7118
- use crate :: routing:: scoring:: { ProbabilisticScorer , ProbabilisticScoringFeeParameters } ;
7118
+ use crate :: routing:: scoring:: ProbabilisticScoringFeeParameters ;
7119
7119
7120
7120
let logger = ln_test_utils:: TestLogger :: new ( ) ;
7121
- let graph = match super :: bench_utils:: read_network_graph ( & logger) {
7122
- Ok ( f ) => f ,
7121
+ let ( graph, mut scorer ) = match super :: bench_utils:: read_graph_scorer ( & logger) {
7122
+ Ok ( res ) => res ,
7123
7123
Err ( e) => {
7124
7124
eprintln ! ( "{}" , e) ;
7125
7125
return ;
7126
7126
} ,
7127
7127
} ;
7128
7128
7129
7129
let params = ProbabilisticScoringFeeParameters :: default ( ) ;
7130
- let mut scorer = ProbabilisticScorer :: new ( ProbabilisticScoringDecayParameters :: default ( ) , & graph, & logger) ;
7131
7130
let features = super :: Bolt11InvoiceFeatures :: empty ( ) ;
7132
7131
7133
7132
super :: bench_utils:: generate_test_routes ( & graph, & mut scorer, & params, features, random_init_seed ( ) , 0 , 2 ) ;
@@ -7136,19 +7135,18 @@ mod tests {
7136
7135
#[ test]
7137
7136
#[ cfg( feature = "std" ) ]
7138
7137
fn generate_routes_mpp ( ) {
7139
- use crate :: routing:: scoring:: { ProbabilisticScorer , ProbabilisticScoringFeeParameters } ;
7138
+ use crate :: routing:: scoring:: ProbabilisticScoringFeeParameters ;
7140
7139
7141
7140
let logger = ln_test_utils:: TestLogger :: new ( ) ;
7142
- let graph = match super :: bench_utils:: read_network_graph ( & logger) {
7143
- Ok ( f ) => f ,
7141
+ let ( graph, mut scorer ) = match super :: bench_utils:: read_graph_scorer ( & logger) {
7142
+ Ok ( res ) => res ,
7144
7143
Err ( e) => {
7145
7144
eprintln ! ( "{}" , e) ;
7146
7145
return ;
7147
7146
} ,
7148
7147
} ;
7149
7148
7150
7149
let params = ProbabilisticScoringFeeParameters :: default ( ) ;
7151
- let mut scorer = ProbabilisticScorer :: new ( ProbabilisticScoringDecayParameters :: default ( ) , & graph, & logger) ;
7152
7150
let features = channelmanager:: provided_bolt11_invoice_features ( & UserConfig :: default ( ) ) ;
7153
7151
7154
7152
super :: bench_utils:: generate_test_routes ( & graph, & mut scorer, & params, features, random_init_seed ( ) , 0 , 2 ) ;
@@ -7157,19 +7155,18 @@ mod tests {
7157
7155
#[ test]
7158
7156
#[ cfg( feature = "std" ) ]
7159
7157
fn generate_large_mpp_routes ( ) {
7160
- use crate :: routing:: scoring:: { ProbabilisticScorer , ProbabilisticScoringFeeParameters } ;
7158
+ use crate :: routing:: scoring:: ProbabilisticScoringFeeParameters ;
7161
7159
7162
7160
let logger = ln_test_utils:: TestLogger :: new ( ) ;
7163
- let graph = match super :: bench_utils:: read_network_graph ( & logger) {
7164
- Ok ( f ) => f ,
7161
+ let ( graph, mut scorer ) = match super :: bench_utils:: read_graph_scorer ( & logger) {
7162
+ Ok ( res ) => res ,
7165
7163
Err ( e) => {
7166
7164
eprintln ! ( "{}" , e) ;
7167
7165
return ;
7168
7166
} ,
7169
7167
} ;
7170
7168
7171
7169
let params = ProbabilisticScoringFeeParameters :: default ( ) ;
7172
- let mut scorer = ProbabilisticScorer :: new ( ProbabilisticScoringDecayParameters :: default ( ) , & graph, & logger) ;
7173
7170
let features = channelmanager:: provided_bolt11_invoice_features ( & UserConfig :: default ( ) ) ;
7174
7171
7175
7172
super :: bench_utils:: generate_test_routes ( & graph, & mut scorer, & params, features, random_init_seed ( ) , 1_000_000 , 2 ) ;
@@ -8498,56 +8495,71 @@ mod tests {
8498
8495
pub ( crate ) mod bench_utils {
8499
8496
use super :: * ;
8500
8497
use std:: fs:: File ;
8501
- use std:: time:: Duration ;
8502
8498
8503
8499
use bitcoin:: hashes:: Hash ;
8504
8500
use bitcoin:: secp256k1:: SecretKey ;
8505
8501
8506
8502
use crate :: chain:: transaction:: OutPoint ;
8507
- use crate :: routing:: scoring:: ScoreUpdate ;
8503
+ use crate :: routing:: scoring:: { ProbabilisticScorer , ScoreUpdate } ;
8508
8504
use crate :: sign:: KeysManager ;
8509
8505
use crate :: ln:: channel_state:: { ChannelCounterparty , ChannelShutdownState } ;
8510
8506
use crate :: ln:: channelmanager;
8511
8507
use crate :: ln:: types:: ChannelId ;
8512
8508
use crate :: util:: config:: UserConfig ;
8513
8509
use crate :: util:: test_utils:: TestLogger ;
8510
+ use crate :: sync:: Arc ;
8514
8511
8515
8512
/// Tries to open a network graph file, or panics with a URL to fetch it.
8516
- pub ( crate ) fn get_route_file ( ) -> Result < std:: fs:: File , & ' static str > {
8517
- let res = File :: open ( "net_graph-2023-01-18.bin" ) // By default we're run in RL/lightning
8518
- . or_else ( |_| File :: open ( "lightning/net_graph-2023-01-18.bin" ) ) // We may be run manually in RL/
8519
- . or_else ( |_| { // Fall back to guessing based on the binary location
8520
- // path is likely something like .../rust-lightning/target/debug/deps/lightning-...
8521
- let mut path = std:: env:: current_exe ( ) . unwrap ( ) ;
8522
- path. pop ( ) ; // lightning-...
8523
- path. pop ( ) ; // deps
8524
- path. pop ( ) ; // debug
8525
- path. pop ( ) ; // target
8526
- path. push ( "lightning" ) ;
8527
- path. push ( "net_graph-2023-01-18.bin" ) ;
8528
- File :: open ( path)
8529
- } )
8530
- . or_else ( |_| { // Fall back to guessing based on the binary location for a subcrate
8531
- // path is likely something like .../rust-lightning/bench/target/debug/deps/bench..
8532
- let mut path = std:: env:: current_exe ( ) . unwrap ( ) ;
8533
- path. pop ( ) ; // bench...
8534
- path. pop ( ) ; // deps
8535
- path. pop ( ) ; // debug
8536
- path. pop ( ) ; // target
8537
- path. pop ( ) ; // bench
8538
- path. push ( "lightning" ) ;
8539
- path. push ( "net_graph-2023-01-18.bin" ) ;
8540
- File :: open ( path)
8541
- } )
8542
- . map_err ( |_| "Please fetch https://bitcoin.ninja/ldk-net_graph-v0.0.113-2023-01-18.bin and place it at lightning/net_graph-2023-01-18.bin" ) ;
8513
+ pub ( crate ) fn get_graph_scorer_file ( ) -> Result < ( std:: fs:: File , std:: fs:: File ) , & ' static str > {
8514
+ let load_file = |fname, err_str| {
8515
+ File :: open ( fname) // By default we're run in RL/lightning
8516
+ . or_else ( |_| File :: open ( & format ! ( "lightning/{}" , fname) ) ) // We may be run manually in RL/
8517
+ . or_else ( |_| { // Fall back to guessing based on the binary location
8518
+ // path is likely something like .../rust-lightning/target/debug/deps/lightning-...
8519
+ let mut path = std:: env:: current_exe ( ) . unwrap ( ) ;
8520
+ path. pop ( ) ; // lightning-...
8521
+ path. pop ( ) ; // deps
8522
+ path. pop ( ) ; // debug
8523
+ path. pop ( ) ; // target
8524
+ path. push ( "lightning" ) ;
8525
+ path. push ( fname) ;
8526
+ File :: open ( path)
8527
+ } )
8528
+ . or_else ( |_| { // Fall back to guessing based on the binary location for a subcrate
8529
+ // path is likely something like .../rust-lightning/bench/target/debug/deps/bench..
8530
+ let mut path = std:: env:: current_exe ( ) . unwrap ( ) ;
8531
+ path. pop ( ) ; // bench...
8532
+ path. pop ( ) ; // deps
8533
+ path. pop ( ) ; // debug
8534
+ path. pop ( ) ; // target
8535
+ path. pop ( ) ; // bench
8536
+ path. push ( "lightning" ) ;
8537
+ path. push ( fname) ;
8538
+ File :: open ( path)
8539
+ } )
8540
+ . map_err ( |_| err_str)
8541
+ } ;
8542
+ let graph_res = load_file (
8543
+ "net_graph-2023-12-10.bin" ,
8544
+ "Please fetch https://bitcoin.ninja/ldk-net_graph-v0.0.118-2023-12-10.bin and place it at lightning/net_graph-2023-12-10.bin"
8545
+ ) ;
8546
+ let scorer_res = load_file (
8547
+ "scorer-2023-12-10.bin" ,
8548
+ "Please fetch https://bitcoin.ninja/ldk-scorer-v0.0.118-2023-12-10.bin and place it at lightning/scorer-2023-12-10.bin"
8549
+ ) ;
8543
8550
#[ cfg( require_route_graph_test) ]
8544
- return Ok ( res . unwrap ( ) ) ;
8551
+ return Ok ( ( graph_res . unwrap ( ) , scorer_res . unwrap ( ) ) ) ;
8545
8552
#[ cfg( not( require_route_graph_test) ) ]
8546
- return res ;
8553
+ return Ok ( ( graph_res? , scorer_res? ) ) ;
8547
8554
}
8548
8555
8549
- pub ( crate ) fn read_network_graph ( logger : & TestLogger ) -> Result < NetworkGraph < & TestLogger > , & ' static str > {
8550
- get_route_file ( ) . map ( |mut f| NetworkGraph :: read ( & mut f, logger) . unwrap ( ) )
8556
+ pub ( crate ) fn read_graph_scorer ( logger : & TestLogger )
8557
+ -> Result < ( Arc < NetworkGraph < & TestLogger > > , ProbabilisticScorer < Arc < NetworkGraph < & TestLogger > > , & TestLogger > ) , & ' static str > {
8558
+ let ( mut graph_file, mut scorer_file) = get_graph_scorer_file ( ) ?;
8559
+ let graph = Arc :: new ( NetworkGraph :: read ( & mut graph_file, logger) . unwrap ( ) ) ;
8560
+ let scorer_args = ( Default :: default ( ) , Arc :: clone ( & graph) , logger) ;
8561
+ let scorer = ProbabilisticScorer :: read ( & mut scorer_file, scorer_args) . unwrap ( ) ;
8562
+ Ok ( ( graph, scorer) )
8551
8563
}
8552
8564
8553
8565
pub ( crate ) fn payer_pubkey ( ) -> PublicKey {
@@ -8609,9 +8621,7 @@ pub(crate) mod bench_utils {
8609
8621
8610
8622
let nodes = graph. read_only ( ) . nodes ( ) . clone ( ) ;
8611
8623
let mut route_endpoints = Vec :: new ( ) ;
8612
- // Fetch 1.5x more routes than we need as after we do some scorer updates we may end up
8613
- // with some routes we picked being un-routable.
8614
- for _ in 0 ..route_count * 3 / 2 {
8624
+ for _ in 0 ..route_count {
8615
8625
loop {
8616
8626
seed = seed. overflowing_mul ( 6364136223846793005 ) . 0 . overflowing_add ( 1 ) . 0 ;
8617
8627
let src = PublicKey :: from_slice ( nodes. unordered_keys ( )
@@ -8629,54 +8639,12 @@ pub(crate) mod bench_utils {
8629
8639
get_route ( & payer, & route_params, & graph. read_only ( ) , Some ( & [ & first_hop] ) ,
8630
8640
& TestLogger :: new ( ) , scorer, score_params, & random_seed_bytes) . is_ok ( ) ;
8631
8641
if path_exists {
8632
- // ...and seed the scorer with success and failure data...
8633
- seed = seed. overflowing_mul ( 6364136223846793005 ) . 0 . overflowing_add ( 1 ) . 0 ;
8634
- let mut score_amt = seed % 1_000_000_000 ;
8635
- loop {
8636
- // Generate fail/success paths for a wider range of potential amounts with
8637
- // MPP enabled to give us a chance to apply penalties for more potential
8638
- // routes.
8639
- let mpp_features = channelmanager:: provided_bolt11_invoice_features ( & UserConfig :: default ( ) ) ;
8640
- let params = PaymentParameters :: from_node_id ( dst, 42 )
8641
- . with_bolt11_features ( mpp_features) . unwrap ( ) ;
8642
- let route_params = RouteParameters :: from_payment_params_and_value (
8643
- params. clone ( ) , score_amt) ;
8644
- let route_res = get_route ( & payer, & route_params, & graph. read_only ( ) ,
8645
- Some ( & [ & first_hop] ) , & TestLogger :: new ( ) , scorer, score_params,
8646
- & random_seed_bytes) ;
8647
- if let Ok ( route) = route_res {
8648
- for path in route. paths {
8649
- if seed & 0x80 == 0 {
8650
- scorer. payment_path_successful ( & path, Duration :: ZERO ) ;
8651
- } else {
8652
- let short_channel_id = path. hops [ path. hops . len ( ) / 2 ] . short_channel_id ;
8653
- scorer. payment_path_failed ( & path, short_channel_id, Duration :: ZERO ) ;
8654
- }
8655
- seed = seed. overflowing_mul ( 6364136223846793005 ) . 0 . overflowing_add ( 1 ) . 0 ;
8656
- }
8657
- break ;
8658
- }
8659
- // If we couldn't find a path with a higher amount, reduce and try again.
8660
- score_amt /= 100 ;
8661
- }
8662
-
8663
8642
route_endpoints. push ( ( first_hop, params, amt_msat) ) ;
8664
8643
break ;
8665
8644
}
8666
8645
}
8667
8646
}
8668
8647
8669
- // Because we've changed channel scores, it's possible we'll take different routes to the
8670
- // selected destinations, possibly causing us to fail because, eg, the newly-selected path
8671
- // requires a too-high CLTV delta.
8672
- route_endpoints. retain ( |( first_hop, params, amt_msat) | {
8673
- let route_params = RouteParameters :: from_payment_params_and_value (
8674
- params. clone ( ) , * amt_msat) ;
8675
- get_route ( & payer, & route_params, & graph. read_only ( ) , Some ( & [ first_hop] ) ,
8676
- & TestLogger :: new ( ) , scorer, score_params, & random_seed_bytes) . is_ok ( )
8677
- } ) ;
8678
- route_endpoints. truncate ( route_count) ;
8679
- assert_eq ! ( route_endpoints. len( ) , route_count) ;
8680
8648
route_endpoints
8681
8649
}
8682
8650
}
@@ -8689,7 +8657,7 @@ pub mod benches {
8689
8657
use crate :: ln:: channelmanager;
8690
8658
use crate :: ln:: features:: Bolt11InvoiceFeatures ;
8691
8659
use crate :: routing:: gossip:: NetworkGraph ;
8692
- use crate :: routing:: scoring:: { FixedPenaltyScorer , ProbabilisticScorer , ProbabilisticScoringFeeParameters , ProbabilisticScoringDecayParameters } ;
8660
+ use crate :: routing:: scoring:: { FixedPenaltyScorer , ProbabilisticScoringFeeParameters } ;
8693
8661
use crate :: util:: config:: UserConfig ;
8694
8662
use crate :: util:: logger:: { Logger , Record } ;
8695
8663
use crate :: util:: test_utils:: TestLogger ;
@@ -8703,15 +8671,15 @@ pub mod benches {
8703
8671
8704
8672
pub fn generate_routes_with_zero_penalty_scorer ( bench : & mut Criterion ) {
8705
8673
let logger = TestLogger :: new ( ) ;
8706
- let network_graph = bench_utils:: read_network_graph ( & logger) . unwrap ( ) ;
8674
+ let ( network_graph, _ ) = bench_utils:: read_graph_scorer ( & logger) . unwrap ( ) ;
8707
8675
let scorer = FixedPenaltyScorer :: with_penalty ( 0 ) ;
8708
8676
generate_routes ( bench, & network_graph, scorer, & Default :: default ( ) ,
8709
8677
Bolt11InvoiceFeatures :: empty ( ) , 0 , "generate_routes_with_zero_penalty_scorer" ) ;
8710
8678
}
8711
8679
8712
8680
pub fn generate_mpp_routes_with_zero_penalty_scorer ( bench : & mut Criterion ) {
8713
8681
let logger = TestLogger :: new ( ) ;
8714
- let network_graph = bench_utils:: read_network_graph ( & logger) . unwrap ( ) ;
8682
+ let ( network_graph, _ ) = bench_utils:: read_graph_scorer ( & logger) . unwrap ( ) ;
8715
8683
let scorer = FixedPenaltyScorer :: with_penalty ( 0 ) ;
8716
8684
generate_routes ( bench, & network_graph, scorer, & Default :: default ( ) ,
8717
8685
channelmanager:: provided_bolt11_invoice_features ( & UserConfig :: default ( ) ) , 0 ,
@@ -8720,64 +8688,55 @@ pub mod benches {
8720
8688
8721
8689
pub fn generate_routes_with_probabilistic_scorer ( bench : & mut Criterion ) {
8722
8690
let logger = TestLogger :: new ( ) ;
8723
- let network_graph = bench_utils:: read_network_graph ( & logger) . unwrap ( ) ;
8691
+ let ( network_graph, scorer ) = bench_utils:: read_graph_scorer ( & logger) . unwrap ( ) ;
8724
8692
let params = ProbabilisticScoringFeeParameters :: default ( ) ;
8725
- let scorer = ProbabilisticScorer :: new ( ProbabilisticScoringDecayParameters :: default ( ) , & network_graph, & logger) ;
8726
8693
generate_routes ( bench, & network_graph, scorer, & params, Bolt11InvoiceFeatures :: empty ( ) , 0 ,
8727
8694
"generate_routes_with_probabilistic_scorer" ) ;
8728
8695
}
8729
8696
8730
8697
pub fn generate_mpp_routes_with_probabilistic_scorer ( bench : & mut Criterion ) {
8731
8698
let logger = TestLogger :: new ( ) ;
8732
- let network_graph = bench_utils:: read_network_graph ( & logger) . unwrap ( ) ;
8699
+ let ( network_graph, scorer ) = bench_utils:: read_graph_scorer ( & logger) . unwrap ( ) ;
8733
8700
let params = ProbabilisticScoringFeeParameters :: default ( ) ;
8734
- let scorer = ProbabilisticScorer :: new ( ProbabilisticScoringDecayParameters :: default ( ) , & network_graph, & logger) ;
8735
8701
generate_routes ( bench, & network_graph, scorer, & params,
8736
8702
channelmanager:: provided_bolt11_invoice_features ( & UserConfig :: default ( ) ) , 0 ,
8737
8703
"generate_mpp_routes_with_probabilistic_scorer" ) ;
8738
8704
}
8739
8705
8740
8706
pub fn generate_large_mpp_routes_with_probabilistic_scorer ( bench : & mut Criterion ) {
8741
8707
let logger = TestLogger :: new ( ) ;
8742
- let network_graph = bench_utils:: read_network_graph ( & logger) . unwrap ( ) ;
8708
+ let ( network_graph, scorer ) = bench_utils:: read_graph_scorer ( & logger) . unwrap ( ) ;
8743
8709
let params = ProbabilisticScoringFeeParameters :: default ( ) ;
8744
- let scorer = ProbabilisticScorer :: new ( ProbabilisticScoringDecayParameters :: default ( ) , & network_graph, & logger) ;
8745
8710
generate_routes ( bench, & network_graph, scorer, & params,
8746
8711
channelmanager:: provided_bolt11_invoice_features ( & UserConfig :: default ( ) ) , 100_000_000 ,
8747
8712
"generate_large_mpp_routes_with_probabilistic_scorer" ) ;
8748
8713
}
8749
8714
8750
8715
pub fn generate_routes_with_nonlinear_probabilistic_scorer ( bench : & mut Criterion ) {
8751
8716
let logger = TestLogger :: new ( ) ;
8752
- let network_graph = bench_utils:: read_network_graph ( & logger) . unwrap ( ) ;
8717
+ let ( network_graph, scorer ) = bench_utils:: read_graph_scorer ( & logger) . unwrap ( ) ;
8753
8718
let mut params = ProbabilisticScoringFeeParameters :: default ( ) ;
8754
8719
params. linear_success_probability = false ;
8755
- let scorer = ProbabilisticScorer :: new (
8756
- ProbabilisticScoringDecayParameters :: default ( ) , & network_graph, & logger) ;
8757
8720
generate_routes ( bench, & network_graph, scorer, & params,
8758
8721
channelmanager:: provided_bolt11_invoice_features ( & UserConfig :: default ( ) ) , 0 ,
8759
8722
"generate_routes_with_nonlinear_probabilistic_scorer" ) ;
8760
8723
}
8761
8724
8762
8725
pub fn generate_mpp_routes_with_nonlinear_probabilistic_scorer ( bench : & mut Criterion ) {
8763
8726
let logger = TestLogger :: new ( ) ;
8764
- let network_graph = bench_utils:: read_network_graph ( & logger) . unwrap ( ) ;
8727
+ let ( network_graph, scorer ) = bench_utils:: read_graph_scorer ( & logger) . unwrap ( ) ;
8765
8728
let mut params = ProbabilisticScoringFeeParameters :: default ( ) ;
8766
8729
params. linear_success_probability = false ;
8767
- let scorer = ProbabilisticScorer :: new (
8768
- ProbabilisticScoringDecayParameters :: default ( ) , & network_graph, & logger) ;
8769
8730
generate_routes ( bench, & network_graph, scorer, & params,
8770
8731
channelmanager:: provided_bolt11_invoice_features ( & UserConfig :: default ( ) ) , 0 ,
8771
8732
"generate_mpp_routes_with_nonlinear_probabilistic_scorer" ) ;
8772
8733
}
8773
8734
8774
8735
pub fn generate_large_mpp_routes_with_nonlinear_probabilistic_scorer ( bench : & mut Criterion ) {
8775
8736
let logger = TestLogger :: new ( ) ;
8776
- let network_graph = bench_utils:: read_network_graph ( & logger) . unwrap ( ) ;
8737
+ let ( network_graph, scorer ) = bench_utils:: read_graph_scorer ( & logger) . unwrap ( ) ;
8777
8738
let mut params = ProbabilisticScoringFeeParameters :: default ( ) ;
8778
8739
params. linear_success_probability = false ;
8779
- let scorer = ProbabilisticScorer :: new (
8780
- ProbabilisticScoringDecayParameters :: default ( ) , & network_graph, & logger) ;
8781
8740
generate_routes ( bench, & network_graph, scorer, & params,
8782
8741
channelmanager:: provided_bolt11_invoice_features ( & UserConfig :: default ( ) ) , 100_000_000 ,
8783
8742
"generate_large_mpp_routes_with_nonlinear_probabilistic_scorer" ) ;
0 commit comments