@@ -7115,19 +7115,18 @@ mod tests {
71157115 #[ test]
71167116 #[ cfg( feature = "std" ) ]
71177117 fn generate_routes ( ) {
7118- use crate :: routing:: scoring:: { ProbabilisticScorer , ProbabilisticScoringFeeParameters } ;
7118+ use crate :: routing:: scoring:: ProbabilisticScoringFeeParameters ;
71197119
71207120 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 ,
71237123 Err ( e) => {
71247124 eprintln ! ( "{}" , e) ;
71257125 return ;
71267126 } ,
71277127 } ;
71287128
71297129 let params = ProbabilisticScoringFeeParameters :: default ( ) ;
7130- let mut scorer = ProbabilisticScorer :: new ( ProbabilisticScoringDecayParameters :: default ( ) , & graph, & logger) ;
71317130 let features = super :: Bolt11InvoiceFeatures :: empty ( ) ;
71327131
71337132 super :: bench_utils:: generate_test_routes ( & graph, & mut scorer, & params, features, random_init_seed ( ) , 0 , 2 ) ;
@@ -7136,19 +7135,18 @@ mod tests {
71367135 #[ test]
71377136 #[ cfg( feature = "std" ) ]
71387137 fn generate_routes_mpp ( ) {
7139- use crate :: routing:: scoring:: { ProbabilisticScorer , ProbabilisticScoringFeeParameters } ;
7138+ use crate :: routing:: scoring:: ProbabilisticScoringFeeParameters ;
71407139
71417140 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 ,
71447143 Err ( e) => {
71457144 eprintln ! ( "{}" , e) ;
71467145 return ;
71477146 } ,
71487147 } ;
71497148
71507149 let params = ProbabilisticScoringFeeParameters :: default ( ) ;
7151- let mut scorer = ProbabilisticScorer :: new ( ProbabilisticScoringDecayParameters :: default ( ) , & graph, & logger) ;
71527150 let features = channelmanager:: provided_bolt11_invoice_features ( & UserConfig :: default ( ) ) ;
71537151
71547152 super :: bench_utils:: generate_test_routes ( & graph, & mut scorer, & params, features, random_init_seed ( ) , 0 , 2 ) ;
@@ -7157,19 +7155,18 @@ mod tests {
71577155 #[ test]
71587156 #[ cfg( feature = "std" ) ]
71597157 fn generate_large_mpp_routes ( ) {
7160- use crate :: routing:: scoring:: { ProbabilisticScorer , ProbabilisticScoringFeeParameters } ;
7158+ use crate :: routing:: scoring:: ProbabilisticScoringFeeParameters ;
71617159
71627160 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 ,
71657163 Err ( e) => {
71667164 eprintln ! ( "{}" , e) ;
71677165 return ;
71687166 } ,
71697167 } ;
71707168
71717169 let params = ProbabilisticScoringFeeParameters :: default ( ) ;
7172- let mut scorer = ProbabilisticScorer :: new ( ProbabilisticScoringDecayParameters :: default ( ) , & graph, & logger) ;
71737170 let features = channelmanager:: provided_bolt11_invoice_features ( & UserConfig :: default ( ) ) ;
71747171
71757172 super :: bench_utils:: generate_test_routes ( & graph, & mut scorer, & params, features, random_init_seed ( ) , 1_000_000 , 2 ) ;
@@ -8498,56 +8495,71 @@ mod tests {
84988495pub ( crate ) mod bench_utils {
84998496 use super :: * ;
85008497 use std:: fs:: File ;
8501- use std:: time:: Duration ;
85028498
85038499 use bitcoin:: hashes:: Hash ;
85048500 use bitcoin:: secp256k1:: SecretKey ;
85058501
85068502 use crate :: chain:: transaction:: OutPoint ;
8507- use crate :: routing:: scoring:: ScoreUpdate ;
8503+ use crate :: routing:: scoring:: { ProbabilisticScorer , ScoreUpdate } ;
85088504 use crate :: sign:: KeysManager ;
85098505 use crate :: ln:: channel_state:: { ChannelCounterparty , ChannelShutdownState } ;
85108506 use crate :: ln:: channelmanager;
85118507 use crate :: ln:: types:: ChannelId ;
85128508 use crate :: util:: config:: UserConfig ;
85138509 use crate :: util:: test_utils:: TestLogger ;
8510+ use crate :: sync:: Arc ;
85148511
85158512 /// 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+ ) ;
85438550 #[ cfg( require_route_graph_test) ]
8544- return Ok ( res . unwrap ( ) ) ;
8551+ return Ok ( ( graph_res . unwrap ( ) , scorer_res . unwrap ( ) ) ) ;
85458552 #[ cfg( not( require_route_graph_test) ) ]
8546- return res ;
8553+ return Ok ( ( graph_res? , scorer_res? ) ) ;
85478554 }
85488555
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) )
85518563 }
85528564
85538565 pub ( crate ) fn payer_pubkey ( ) -> PublicKey {
@@ -8609,9 +8621,7 @@ pub(crate) mod bench_utils {
86098621
86108622 let nodes = graph. read_only ( ) . nodes ( ) . clone ( ) ;
86118623 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 {
86158625 loop {
86168626 seed = seed. overflowing_mul ( 6364136223846793005 ) . 0 . overflowing_add ( 1 ) . 0 ;
86178627 let src = PublicKey :: from_slice ( nodes. unordered_keys ( )
@@ -8629,54 +8639,12 @@ pub(crate) mod bench_utils {
86298639 get_route ( & payer, & route_params, & graph. read_only ( ) , Some ( & [ & first_hop] ) ,
86308640 & TestLogger :: new ( ) , scorer, score_params, & random_seed_bytes) . is_ok ( ) ;
86318641 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-
86638642 route_endpoints. push ( ( first_hop, params, amt_msat) ) ;
86648643 break ;
86658644 }
86668645 }
86678646 }
86688647
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) ;
86808648 route_endpoints
86818649 }
86828650}
@@ -8689,7 +8657,7 @@ pub mod benches {
86898657 use crate :: ln:: channelmanager;
86908658 use crate :: ln:: features:: Bolt11InvoiceFeatures ;
86918659 use crate :: routing:: gossip:: NetworkGraph ;
8692- use crate :: routing:: scoring:: { FixedPenaltyScorer , ProbabilisticScorer , ProbabilisticScoringFeeParameters , ProbabilisticScoringDecayParameters } ;
8660+ use crate :: routing:: scoring:: { FixedPenaltyScorer , ProbabilisticScoringFeeParameters } ;
86938661 use crate :: util:: config:: UserConfig ;
86948662 use crate :: util:: logger:: { Logger , Record } ;
86958663 use crate :: util:: test_utils:: TestLogger ;
@@ -8703,15 +8671,15 @@ pub mod benches {
87038671
87048672 pub fn generate_routes_with_zero_penalty_scorer ( bench : & mut Criterion ) {
87058673 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 ( ) ;
87078675 let scorer = FixedPenaltyScorer :: with_penalty ( 0 ) ;
87088676 generate_routes ( bench, & network_graph, scorer, & Default :: default ( ) ,
87098677 Bolt11InvoiceFeatures :: empty ( ) , 0 , "generate_routes_with_zero_penalty_scorer" ) ;
87108678 }
87118679
87128680 pub fn generate_mpp_routes_with_zero_penalty_scorer ( bench : & mut Criterion ) {
87138681 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 ( ) ;
87158683 let scorer = FixedPenaltyScorer :: with_penalty ( 0 ) ;
87168684 generate_routes ( bench, & network_graph, scorer, & Default :: default ( ) ,
87178685 channelmanager:: provided_bolt11_invoice_features ( & UserConfig :: default ( ) ) , 0 ,
@@ -8720,64 +8688,55 @@ pub mod benches {
87208688
87218689 pub fn generate_routes_with_probabilistic_scorer ( bench : & mut Criterion ) {
87228690 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 ( ) ;
87248692 let params = ProbabilisticScoringFeeParameters :: default ( ) ;
8725- let scorer = ProbabilisticScorer :: new ( ProbabilisticScoringDecayParameters :: default ( ) , & network_graph, & logger) ;
87268693 generate_routes ( bench, & network_graph, scorer, & params, Bolt11InvoiceFeatures :: empty ( ) , 0 ,
87278694 "generate_routes_with_probabilistic_scorer" ) ;
87288695 }
87298696
87308697 pub fn generate_mpp_routes_with_probabilistic_scorer ( bench : & mut Criterion ) {
87318698 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 ( ) ;
87338700 let params = ProbabilisticScoringFeeParameters :: default ( ) ;
8734- let scorer = ProbabilisticScorer :: new ( ProbabilisticScoringDecayParameters :: default ( ) , & network_graph, & logger) ;
87358701 generate_routes ( bench, & network_graph, scorer, & params,
87368702 channelmanager:: provided_bolt11_invoice_features ( & UserConfig :: default ( ) ) , 0 ,
87378703 "generate_mpp_routes_with_probabilistic_scorer" ) ;
87388704 }
87398705
87408706 pub fn generate_large_mpp_routes_with_probabilistic_scorer ( bench : & mut Criterion ) {
87418707 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 ( ) ;
87438709 let params = ProbabilisticScoringFeeParameters :: default ( ) ;
8744- let scorer = ProbabilisticScorer :: new ( ProbabilisticScoringDecayParameters :: default ( ) , & network_graph, & logger) ;
87458710 generate_routes ( bench, & network_graph, scorer, & params,
87468711 channelmanager:: provided_bolt11_invoice_features ( & UserConfig :: default ( ) ) , 100_000_000 ,
87478712 "generate_large_mpp_routes_with_probabilistic_scorer" ) ;
87488713 }
87498714
87508715 pub fn generate_routes_with_nonlinear_probabilistic_scorer ( bench : & mut Criterion ) {
87518716 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 ( ) ;
87538718 let mut params = ProbabilisticScoringFeeParameters :: default ( ) ;
87548719 params. linear_success_probability = false ;
8755- let scorer = ProbabilisticScorer :: new (
8756- ProbabilisticScoringDecayParameters :: default ( ) , & network_graph, & logger) ;
87578720 generate_routes ( bench, & network_graph, scorer, & params,
87588721 channelmanager:: provided_bolt11_invoice_features ( & UserConfig :: default ( ) ) , 0 ,
87598722 "generate_routes_with_nonlinear_probabilistic_scorer" ) ;
87608723 }
87618724
87628725 pub fn generate_mpp_routes_with_nonlinear_probabilistic_scorer ( bench : & mut Criterion ) {
87638726 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 ( ) ;
87658728 let mut params = ProbabilisticScoringFeeParameters :: default ( ) ;
87668729 params. linear_success_probability = false ;
8767- let scorer = ProbabilisticScorer :: new (
8768- ProbabilisticScoringDecayParameters :: default ( ) , & network_graph, & logger) ;
87698730 generate_routes ( bench, & network_graph, scorer, & params,
87708731 channelmanager:: provided_bolt11_invoice_features ( & UserConfig :: default ( ) ) , 0 ,
87718732 "generate_mpp_routes_with_nonlinear_probabilistic_scorer" ) ;
87728733 }
87738734
87748735 pub fn generate_large_mpp_routes_with_nonlinear_probabilistic_scorer ( bench : & mut Criterion ) {
87758736 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 ( ) ;
87778738 let mut params = ProbabilisticScoringFeeParameters :: default ( ) ;
87788739 params. linear_success_probability = false ;
8779- let scorer = ProbabilisticScorer :: new (
8780- ProbabilisticScoringDecayParameters :: default ( ) , & network_graph, & logger) ;
87818740 generate_routes ( bench, & network_graph, scorer, & params,
87828741 channelmanager:: provided_bolt11_invoice_features ( & UserConfig :: default ( ) ) , 100_000_000 ,
87838742 "generate_large_mpp_routes_with_nonlinear_probabilistic_scorer" ) ;
0 commit comments