@@ -1007,11 +1007,25 @@ const BASE_AMOUNT_PENALTY_DIVISOR: u64 = 1 << 30;
10071007/// min_zero_implies_no_successes signals that an `amount_msat` of 0 means we've not (recently) 
10081008/// seen an HTLC successfully complete over this channel. 
10091009fn  success_probability ( 
1010- 	min_liquidity_msat :  u64 ,  amount_msat :  u64 ,  max_liquidity_msat :  u64 ,  _capacity_msat :  u64 , 
1011- 	_params :  & ProbabilisticScoringFeeParameters ,  _min_zero_implies_no_successes :  bool , 
1010+ 	min_liquidity_msat :  u64 ,  amount_msat :  u64 ,  max_liquidity_msat :  u64 ,  capacity_msat :  u64 , 
1011+ 	_params :  & ProbabilisticScoringFeeParameters ,  min_zero_implies_no_successes :  bool , 
10121012)  -> ( u64 ,  u64 )  { 
1013+ 	debug_assert ! ( min_liquidity_msat <= amount_msat) ; 
1014+ 	debug_assert ! ( amount_msat < max_liquidity_msat) ; 
1015+ 	debug_assert ! ( max_liquidity_msat <= capacity_msat) ; 
1016+ 
10131017	let  numerator = max_liquidity_msat - amount_msat; 
1014- 	let  denominator = ( max_liquidity_msat - min_liquidity_msat) . saturating_add ( 1 ) ; 
1018+ 	let  mut  denominator = ( max_liquidity_msat - min_liquidity_msat) . saturating_add ( 1 ) ; 
1019+ 	if  min_zero_implies_no_successes && min_liquidity_msat == 0  &&
1020+ 		denominator < u64:: max_value ( )  / 21 
1021+ 	{ 
1022+ 		// If we have no knowledge of the channel, scale probability down by ~75% 
1023+ 		// Note that we prefer to increase the denominator rather than decrease the numerator as 
1024+ 		// the denominator is more likely to be larger and thus provide greater precision. This is 
1025+ 		// mostly an overoptimization but makes a large difference in tests. 
1026+ 		denominator = denominator *  21  / 16 
1027+ 	} 
1028+ 
10151029	( numerator,  denominator) 
10161030} 
10171031
@@ -2956,47 +2970,47 @@ mod tests {
29562970			inflight_htlc_msat :  0 , 
29572971			effective_capacity :  EffectiveCapacity :: Total  {  capacity_msat :  950_000_000 ,  htlc_maximum_msat :  1_000  } , 
29582972		} ; 
2959- 		assert_eq ! ( scorer. channel_penalty_msat( 42 ,  & source,  & target,  usage,  & params) ,  4375 ) ; 
2973+ 		assert_eq ! ( scorer. channel_penalty_msat( 42 ,  & source,  & target,  usage,  & params) ,  6262 ) ; 
29602974		let  usage = ChannelUsage  { 
29612975			effective_capacity :  EffectiveCapacity :: Total  {  capacity_msat :  1_950_000_000 ,  htlc_maximum_msat :  1_000  } ,  ..usage
29622976		} ; 
2963- 		assert_eq ! ( scorer. channel_penalty_msat( 42 ,  & source,  & target,  usage,  & params) ,  2739 ) ; 
2977+ 		assert_eq ! ( scorer. channel_penalty_msat( 42 ,  & source,  & target,  usage,  & params) ,  4634 ) ; 
29642978		let  usage = ChannelUsage  { 
29652979			effective_capacity :  EffectiveCapacity :: Total  {  capacity_msat :  2_950_000_000 ,  htlc_maximum_msat :  1_000  } ,  ..usage
29662980		} ; 
2967- 		assert_eq ! ( scorer. channel_penalty_msat( 42 ,  & source,  & target,  usage,  & params) ,  2236 ) ; 
2981+ 		assert_eq ! ( scorer. channel_penalty_msat( 42 ,  & source,  & target,  usage,  & params) ,  4186 ) ; 
29682982		let  usage = ChannelUsage  { 
29692983			effective_capacity :  EffectiveCapacity :: Total  {  capacity_msat :  3_950_000_000 ,  htlc_maximum_msat :  1_000  } ,  ..usage
29702984		} ; 
2971- 		assert_eq ! ( scorer. channel_penalty_msat( 42 ,  & source,  & target,  usage,  & params) ,  1983 ) ; 
2985+ 		assert_eq ! ( scorer. channel_penalty_msat( 42 ,  & source,  & target,  usage,  & params) ,  3909 ) ; 
29722986		let  usage = ChannelUsage  { 
29732987			effective_capacity :  EffectiveCapacity :: Total  {  capacity_msat :  4_950_000_000 ,  htlc_maximum_msat :  1_000  } ,  ..usage
29742988		} ; 
2975- 		assert_eq ! ( scorer. channel_penalty_msat( 42 ,  & source,  & target,  usage,  & params) ,  1637 ) ; 
2989+ 		assert_eq ! ( scorer. channel_penalty_msat( 42 ,  & source,  & target,  usage,  & params) ,  3556 ) ; 
29762990		let  usage = ChannelUsage  { 
29772991			effective_capacity :  EffectiveCapacity :: Total  {  capacity_msat :  5_950_000_000 ,  htlc_maximum_msat :  1_000  } ,  ..usage
29782992		} ; 
2979- 		assert_eq ! ( scorer. channel_penalty_msat( 42 ,  & source,  & target,  usage,  & params) ,  1606 ) ; 
2993+ 		assert_eq ! ( scorer. channel_penalty_msat( 42 ,  & source,  & target,  usage,  & params) ,  3533 ) ; 
29802994		let  usage = ChannelUsage  { 
29812995			effective_capacity :  EffectiveCapacity :: Total  {  capacity_msat :  6_950_000_000 ,  htlc_maximum_msat :  1_000  } ,  ..usage
29822996		} ; 
2983- 		assert_eq ! ( scorer. channel_penalty_msat( 42 ,  & source,  & target,  usage,  & params) ,  1331 ) ; 
2997+ 		assert_eq ! ( scorer. channel_penalty_msat( 42 ,  & source,  & target,  usage,  & params) ,  3172 ) ; 
29842998		let  usage = ChannelUsage  { 
29852999			effective_capacity :  EffectiveCapacity :: Total  {  capacity_msat :  7_450_000_000 ,  htlc_maximum_msat :  1_000  } ,  ..usage
29863000		} ; 
2987- 		assert_eq ! ( scorer. channel_penalty_msat( 42 ,  & source,  & target,  usage,  & params) ,  1387 ) ; 
3001+ 		assert_eq ! ( scorer. channel_penalty_msat( 42 ,  & source,  & target,  usage,  & params) ,  3211 ) ; 
29883002		let  usage = ChannelUsage  { 
29893003			effective_capacity :  EffectiveCapacity :: Total  {  capacity_msat :  7_950_000_000 ,  htlc_maximum_msat :  1_000  } ,  ..usage
29903004		} ; 
2991- 		assert_eq ! ( scorer. channel_penalty_msat( 42 ,  & source,  & target,  usage,  & params) ,  1379 ) ; 
3005+ 		assert_eq ! ( scorer. channel_penalty_msat( 42 ,  & source,  & target,  usage,  & params) ,  3243 ) ; 
29923006		let  usage = ChannelUsage  { 
29933007			effective_capacity :  EffectiveCapacity :: Total  {  capacity_msat :  8_950_000_000 ,  htlc_maximum_msat :  1_000  } ,  ..usage
29943008		} ; 
2995- 		assert_eq ! ( scorer. channel_penalty_msat( 42 ,  & source,  & target,  usage,  & params) ,  1363 ) ; 
3009+ 		assert_eq ! ( scorer. channel_penalty_msat( 42 ,  & source,  & target,  usage,  & params) ,  3297 ) ; 
29963010		let  usage = ChannelUsage  { 
29973011			effective_capacity :  EffectiveCapacity :: Total  {  capacity_msat :  9_950_000_000 ,  htlc_maximum_msat :  1_000  } ,  ..usage
29983012		} ; 
2999- 		assert_eq ! ( scorer. channel_penalty_msat( 42 ,  & source,  & target,  usage,  & params) ,  1355 ) ; 
3013+ 		assert_eq ! ( scorer. channel_penalty_msat( 42 ,  & source,  & target,  usage,  & params) ,  3250 ) ; 
30003014	} 
30013015
30023016	#[ test]  
@@ -3161,15 +3175,15 @@ mod tests {
31613175		} ; 
31623176
31633177		// With no historical data the normal liquidity penalty calculation is used. 
3164- 		assert_eq ! ( scorer. channel_penalty_msat( 42 ,  & source,  & target,  usage,  & params) ,  47 ) ; 
3178+ 		assert_eq ! ( scorer. channel_penalty_msat( 42 ,  & source,  & target,  usage,  & params) ,  168 ) ; 
31653179		assert_eq ! ( scorer. historical_estimated_channel_liquidity_probabilities( 42 ,  & target) , 
31663180			None ) ; 
31673181		assert_eq ! ( scorer. historical_estimated_payment_success_probability( 42 ,  & target,  42 ,  & params) , 
31683182			None ) ; 
31693183
31703184		scorer. payment_path_failed ( & payment_path_for_amount ( 1 ) ,  42 ) ; 
31713185		assert_eq ! ( scorer. channel_penalty_msat( 42 ,  & source,  & target,  usage,  & params) ,  2048 ) ; 
3172- 		assert_eq ! ( scorer. channel_penalty_msat( 42 ,  & source,  & target,  usage_1,  & params) ,  128 ) ; 
3186+ 		assert_eq ! ( scorer. channel_penalty_msat( 42 ,  & source,  & target,  usage_1,  & params) ,  249 ) ; 
31733187		// The "it failed" increment is 32, where the probability should lie several buckets into 
31743188		// the first octile. 
31753189		assert_eq ! ( scorer. historical_estimated_channel_liquidity_probabilities( 42 ,  & target) , 
@@ -3183,7 +3197,7 @@ mod tests {
31833197		// Even after we tell the scorer we definitely have enough available liquidity, it will 
31843198		// still remember that there was some failure in the past, and assign a non-0 penalty. 
31853199		scorer. payment_path_failed ( & payment_path_for_amount ( 1000 ) ,  43 ) ; 
3186- 		assert_eq ! ( scorer. channel_penalty_msat( 42 ,  & source,  & target,  usage,  & params) ,  32 ) ; 
3200+ 		assert_eq ! ( scorer. channel_penalty_msat( 42 ,  & source,  & target,  usage,  & params) ,  105 ) ; 
31873201		// The first points should be decayed just slightly and the last bucket has a new point. 
31883202		assert_eq ! ( scorer. historical_estimated_channel_liquidity_probabilities( 42 ,  & target) , 
31893203			Some ( ( [ 31 ,  0 ,  0 ,  0 ,  0 ,  0 ,  0 ,  0 ,  0 ,  0 ,  0 ,  0 ,  0 ,  0 ,  0 ,  0 ,  0 ,  0 ,  0 ,  0 ,  0 ,  0 ,  0 ,  0 ,  0 ,  0 ,  32 ,  0 ,  0 ,  0 ,  0 ,  0 ] , 
@@ -3193,17 +3207,17 @@ mod tests {
31933207		// simply check bounds here. 
31943208		let  five_hundred_prob =
31953209			scorer. historical_estimated_payment_success_probability ( 42 ,  & target,  500 ,  & params) . unwrap ( ) ; 
3196- 		assert ! ( five_hundred_prob > 0.66  ) ; 
3197- 		assert ! ( five_hundred_prob < 0.68  ) ; 
3210+ 		assert ! ( five_hundred_prob > 0.59  ) ; 
3211+ 		assert ! ( five_hundred_prob < 0.60  ) ; 
31983212		let  one_prob =
31993213			scorer. historical_estimated_payment_success_probability ( 42 ,  & target,  1 ,  & params) . unwrap ( ) ; 
3200- 		assert ! ( one_prob < 1.0 ) ; 
3201- 		assert ! ( one_prob > 0.95  ) ; 
3214+ 		assert ! ( one_prob < 0.85 ) ; 
3215+ 		assert ! ( one_prob > 0.84  ) ; 
32023216
32033217		// Advance the time forward 16 half-lives (which the docs claim will ensure all data is 
32043218		// gone), and check that we're back to where we started. 
32053219		SinceEpoch :: advance ( Duration :: from_secs ( 10  *  16 ) ) ; 
3206- 		assert_eq ! ( scorer. channel_penalty_msat( 42 ,  & source,  & target,  usage,  & params) ,  47 ) ; 
3220+ 		assert_eq ! ( scorer. channel_penalty_msat( 42 ,  & source,  & target,  usage,  & params) ,  168 ) ; 
32073221		// Once fully decayed we still have data, but its all-0s. In the future we may remove the 
32083222		// data entirely instead. 
32093223		assert_eq ! ( scorer. historical_estimated_channel_liquidity_probabilities( 42 ,  & target) , 
@@ -3367,9 +3381,9 @@ mod tests {
33673381			inflight_htlc_msat :  0 , 
33683382			effective_capacity :  EffectiveCapacity :: Total  {  capacity_msat,  htlc_maximum_msat :  capacity_msat } , 
33693383		} ; 
3370- 		// With no historical data the normal liquidity penalty calculation is used, which in this  
3371- 		// case is diminuitively low . 
3372- 		assert_eq ! ( scorer. channel_penalty_msat( 42 ,  & source,  & target,  usage,  & params) ,  0 ) ; 
3384+ 		// With no historical data the normal liquidity penalty calculation is used, which results  
3385+ 		// in a success probability of ~75% . 
3386+ 		assert_eq ! ( scorer. channel_penalty_msat( 42 ,  & source,  & target,  usage,  & params) ,  1269 ) ; 
33733387		assert_eq ! ( scorer. historical_estimated_channel_liquidity_probabilities( 42 ,  & target) , 
33743388			None ) ; 
33753389		assert_eq ! ( scorer. historical_estimated_payment_success_probability( 42 ,  & target,  42 ,  & params) , 
0 commit comments