@@ -5684,7 +5684,7 @@ mod tests {
5684
5684
let mut scorer = ProbabilisticScorer :: new ( params, & graph, & logger) ;
5685
5685
let features = super :: InvoiceFeatures :: empty ( ) ;
5686
5686
5687
- super :: bench_utils:: generate_test_routes ( & graph, & mut scorer, features, random_init_seed ( ) as usize , 2 ) ;
5687
+ super :: bench_utils:: generate_test_routes ( & graph, & mut scorer, features, random_init_seed ( ) , 0 , 2 ) ;
5688
5688
}
5689
5689
5690
5690
#[ test]
@@ -5706,7 +5706,29 @@ mod tests {
5706
5706
let mut scorer = ProbabilisticScorer :: new ( params, & graph, & logger) ;
5707
5707
let features = channelmanager:: provided_invoice_features ( & UserConfig :: default ( ) ) ;
5708
5708
5709
- super :: bench_utils:: generate_test_routes ( & graph, & mut scorer, features, random_init_seed ( ) as usize , 2 ) ;
5709
+ super :: bench_utils:: generate_test_routes ( & graph, & mut scorer, features, random_init_seed ( ) , 0 , 2 ) ;
5710
+ }
5711
+
5712
+ #[ test]
5713
+ #[ cfg( not( feature = "no-std" ) ) ]
5714
+ fn generate_large_mpp_routes ( ) {
5715
+ use crate :: routing:: scoring:: { ProbabilisticScorer , ProbabilisticScoringParameters } ;
5716
+
5717
+ let mut d = match super :: bench_utils:: get_route_file ( ) {
5718
+ Ok ( f) => f,
5719
+ Err ( e) => {
5720
+ eprintln ! ( "{}" , e) ;
5721
+ return ;
5722
+ } ,
5723
+ } ;
5724
+ let logger = ln_test_utils:: TestLogger :: new ( ) ;
5725
+ let graph = NetworkGraph :: read ( & mut d, & logger) . unwrap ( ) ;
5726
+
5727
+ let params = ProbabilisticScoringParameters :: default ( ) ;
5728
+ let mut scorer = ProbabilisticScorer :: new ( params, & graph, & logger) ;
5729
+ let features = channelmanager:: provided_invoice_features ( & UserConfig :: default ( ) ) ;
5730
+
5731
+ super :: bench_utils:: generate_test_routes ( & graph, & mut scorer, features, random_init_seed ( ) , 1_000_000 , 2 ) ;
5710
5732
}
5711
5733
5712
5734
#[ test]
@@ -5960,11 +5982,11 @@ pub(crate) mod bench_utils {
5960
5982
short_channel_id : Some ( 1 ) ,
5961
5983
inbound_scid_alias : None ,
5962
5984
outbound_scid_alias : None ,
5963
- channel_value_satoshis : 10_000_000 ,
5985
+ channel_value_satoshis : 10_000_000_000 ,
5964
5986
user_channel_id : 0 ,
5965
- balance_msat : 10_000_000 ,
5966
- outbound_capacity_msat : 10_000_000 ,
5967
- next_outbound_htlc_limit_msat : 10_000_000 ,
5987
+ balance_msat : 10_000_000_000 ,
5988
+ outbound_capacity_msat : 10_000_000_000 ,
5989
+ next_outbound_htlc_limit_msat : 10_000_000_000 ,
5968
5990
inbound_capacity_msat : 0 ,
5969
5991
unspendable_punishment_reserve : None ,
5970
5992
confirmations_required : None ,
@@ -5982,44 +6004,60 @@ pub(crate) mod bench_utils {
5982
6004
}
5983
6005
5984
6006
pub ( crate ) fn generate_test_routes < S : Score > ( graph : & NetworkGraph < & TestLogger > , scorer : & mut S ,
5985
- features : InvoiceFeatures , mut seed : usize , route_count : usize ,
6007
+ features : InvoiceFeatures , mut seed : u64 , starting_amount : u64 , route_count : usize ,
5986
6008
) -> Vec < ( ChannelDetails , PaymentParameters , u64 ) > {
5987
6009
let payer = payer_pubkey ( ) ;
5988
6010
let keys_manager = KeysManager :: new ( & [ 0u8 ; 32 ] , 42 , 42 ) ;
5989
6011
let random_seed_bytes = keys_manager. get_secure_random_bytes ( ) ;
5990
6012
5991
6013
let nodes = graph. read_only ( ) . nodes ( ) . clone ( ) ;
5992
6014
let mut route_endpoints = Vec :: new ( ) ;
5993
- let mut routes = Vec :: new ( ) ;
5994
-
5995
- ' load_endpoints: for _ in 0 ..route_count * 3 /2 {
6015
+ for _ in 0 ..route_count * 3 / 2 {
5996
6016
loop {
5997
- seed = seed. overflowing_mul ( 0xdeadbeef ) . 0 ;
5998
- let src = PublicKey :: from_slice ( nodes. unordered_keys ( ) . skip ( seed % nodes. len ( ) ) . next ( ) . unwrap ( ) . as_slice ( ) ) . unwrap ( ) ;
5999
- seed = seed. overflowing_mul ( 0xdeadbeef ) . 0 ;
6000
- let dst = PublicKey :: from_slice ( nodes. unordered_keys ( ) . skip ( seed % nodes. len ( ) ) . next ( ) . unwrap ( ) . as_slice ( ) ) . unwrap ( ) ;
6017
+ seed = seed. overflowing_mul ( 6364136223846793005 ) . 0 . overflowing_add ( 1 ) . 0 ;
6018
+ let src = PublicKey :: from_slice ( nodes. unordered_keys ( )
6019
+ . skip ( ( seed as usize ) % nodes. len ( ) ) . next ( ) . unwrap ( ) . as_slice ( ) ) . unwrap ( ) ;
6020
+ seed = seed. overflowing_mul ( 6364136223846793005 ) . 0 . overflowing_add ( 1 ) . 0 ;
6021
+ let dst = PublicKey :: from_slice ( nodes. unordered_keys ( )
6022
+ . skip ( ( seed as usize ) % nodes. len ( ) ) . next ( ) . unwrap ( ) . as_slice ( ) ) . unwrap ( ) ;
6001
6023
let params = PaymentParameters :: from_node_id ( dst, 42 ) . with_features ( features. clone ( ) ) ;
6002
6024
let first_hop = first_hop ( src) ;
6003
- let amt = seed as u64 % 1_000_000 ;
6004
- if let Ok ( route) = get_route ( & payer, & params, & graph. read_only ( ) , Some ( & [ & first_hop] ) , amt, 42 , & TestLogger :: new ( ) , & scorer, & random_seed_bytes) {
6005
- routes. push ( route) ;
6006
- route_endpoints. push ( ( first_hop, params, amt) ) ;
6007
- continue ' load_endpoints;
6008
- }
6009
- }
6010
- }
6025
+ let amt = starting_amount + seed % 1_000_000 ;
6026
+ let path_exists =
6027
+ get_route ( & payer, & params, & graph. read_only ( ) , Some ( & [ & first_hop] ) ,
6028
+ amt, 42 , & TestLogger :: new ( ) , & scorer, & random_seed_bytes) . is_ok ( ) ;
6029
+ if path_exists {
6030
+ // ...and seed the scorer with success and failure data...
6031
+ seed = seed. overflowing_mul ( 6364136223846793005 ) . 0 . overflowing_add ( 1 ) . 0 ;
6032
+ let mut score_amt = seed % 1_000_000_000 ;
6033
+ loop {
6034
+ // Generate fail/success paths for a wider range of potential amounts with
6035
+ // MPP enabled to give us a chance to apply penalties for more potential
6036
+ // routes.
6037
+ let mpp_features = channelmanager:: provided_invoice_features ( & UserConfig :: default ( ) ) ;
6038
+ let params = PaymentParameters :: from_node_id ( dst, 42 ) . with_features ( mpp_features) ;
6039
+
6040
+ let route_res = get_route ( & payer, & params, & graph. read_only ( ) ,
6041
+ Some ( & [ & first_hop] ) , score_amt, 42 , & TestLogger :: new ( ) , & scorer,
6042
+ & random_seed_bytes) ;
6043
+ if let Ok ( route) = route_res {
6044
+ for path in route. paths {
6045
+ if seed & 0x80 == 0 {
6046
+ scorer. payment_path_successful ( & path) ;
6047
+ } else {
6048
+ let short_channel_id = path. hops [ path. hops . len ( ) / 2 ] . short_channel_id ;
6049
+ scorer. payment_path_failed ( & path, short_channel_id) ;
6050
+ }
6051
+ seed = seed. overflowing_mul ( 6364136223846793005 ) . 0 . overflowing_add ( 1 ) . 0 ;
6052
+ }
6053
+ break ;
6054
+ }
6055
+ // If we couldn't find a path with a higer amount, reduce and try again.
6056
+ score_amt /= 100 ;
6057
+ }
6011
6058
6012
- // ...and seed the scorer with success and failure data...
6013
- for route in routes {
6014
- let amount = route. get_total_amount ( ) ;
6015
- if amount < 250_000 {
6016
- for path in route. paths {
6017
- scorer. payment_path_successful ( & path) ;
6018
- }
6019
- } else if amount > 750_000 {
6020
- for path in route. paths {
6021
- let short_channel_id = path. hops [ path. hops . len ( ) / 2 ] . short_channel_id ;
6022
- scorer. payment_path_failed ( & path, short_channel_id) ;
6059
+ route_endpoints. push ( ( first_hop, params, amt) ) ;
6060
+ break ;
6023
6061
}
6024
6062
}
6025
6063
}
@@ -6061,15 +6099,15 @@ mod benches {
6061
6099
let logger = TestLogger :: new ( ) ;
6062
6100
let network_graph = bench_utils:: read_network_graph ( & logger) . unwrap ( ) ;
6063
6101
let scorer = FixedPenaltyScorer :: with_penalty ( 0 ) ;
6064
- generate_routes ( bench, & network_graph, scorer, InvoiceFeatures :: empty ( ) ) ;
6102
+ generate_routes ( bench, & network_graph, scorer, InvoiceFeatures :: empty ( ) , 0 ) ;
6065
6103
}
6066
6104
6067
6105
#[ bench]
6068
6106
fn generate_mpp_routes_with_zero_penalty_scorer ( bench : & mut Bencher ) {
6069
6107
let logger = TestLogger :: new ( ) ;
6070
6108
let network_graph = bench_utils:: read_network_graph ( & logger) . unwrap ( ) ;
6071
6109
let scorer = FixedPenaltyScorer :: with_penalty ( 0 ) ;
6072
- generate_routes ( bench, & network_graph, scorer, channelmanager:: provided_invoice_features ( & UserConfig :: default ( ) ) ) ;
6110
+ generate_routes ( bench, & network_graph, scorer, channelmanager:: provided_invoice_features ( & UserConfig :: default ( ) ) , 0 ) ;
6073
6111
}
6074
6112
6075
6113
#[ bench]
@@ -6078,7 +6116,7 @@ mod benches {
6078
6116
let network_graph = bench_utils:: read_network_graph ( & logger) . unwrap ( ) ;
6079
6117
let params = ProbabilisticScoringParameters :: default ( ) ;
6080
6118
let scorer = ProbabilisticScorer :: new ( params, & network_graph, & logger) ;
6081
- generate_routes ( bench, & network_graph, scorer, InvoiceFeatures :: empty ( ) ) ;
6119
+ generate_routes ( bench, & network_graph, scorer, InvoiceFeatures :: empty ( ) , 0 ) ;
6082
6120
}
6083
6121
6084
6122
#[ bench]
@@ -6087,20 +6125,28 @@ mod benches {
6087
6125
let network_graph = bench_utils:: read_network_graph ( & logger) . unwrap ( ) ;
6088
6126
let params = ProbabilisticScoringParameters :: default ( ) ;
6089
6127
let scorer = ProbabilisticScorer :: new ( params, & network_graph, & logger) ;
6090
- generate_routes ( bench, & network_graph, scorer, channelmanager:: provided_invoice_features ( & UserConfig :: default ( ) ) ) ;
6128
+ generate_routes ( bench, & network_graph, scorer, channelmanager:: provided_invoice_features ( & UserConfig :: default ( ) ) , 0 ) ;
6091
6129
}
6092
6130
6131
+ #[ bench]
6132
+ fn generate_large_mpp_routes_with_probabilistic_scorer ( bench : & mut Bencher ) {
6133
+ let logger = TestLogger :: new ( ) ;
6134
+ let network_graph = bench_utils:: read_network_graph ( & logger) . unwrap ( ) ;
6135
+ let params = ProbabilisticScoringParameters :: default ( ) ;
6136
+ let scorer = ProbabilisticScorer :: new ( params, & network_graph, & logger) ;
6137
+ generate_routes ( bench, & network_graph, scorer, channelmanager:: provided_invoice_features ( & UserConfig :: default ( ) ) , 100_000_000 ) ;
6138
+ }
6093
6139
6094
6140
fn generate_routes < S : Score > (
6095
6141
bench : & mut Bencher , graph : & NetworkGraph < & TestLogger > , mut scorer : S ,
6096
- features : InvoiceFeatures ,
6142
+ features : InvoiceFeatures , starting_amount : u64 ,
6097
6143
) {
6098
6144
let payer = bench_utils:: payer_pubkey ( ) ;
6099
6145
let keys_manager = KeysManager :: new ( & [ 0u8 ; 32 ] , 42 , 42 ) ;
6100
6146
let random_seed_bytes = keys_manager. get_secure_random_bytes ( ) ;
6101
6147
6102
6148
// First, get 100 (source, destination) pairs for which route-getting actually succeeds...
6103
- let route_endpoints = bench_utils:: generate_test_routes ( graph, & mut scorer, features, 0xdeadbeef , 100 ) ;
6149
+ let route_endpoints = bench_utils:: generate_test_routes ( graph, & mut scorer, features, 0xdeadbeef , starting_amount , 50 ) ;
6104
6150
6105
6151
// ...then benchmark finding paths between the nodes we learned.
6106
6152
let mut idx = 0 ;
0 commit comments