Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add a per-amount base penalty in the ProbabilisticScorer #1617

Merged
merged 2 commits into from Jul 25, 2022

Conversation

TheBlueMatt
Copy link
Collaborator

Based on #1610 so I don't have to rebase aggressively, tagging 110 as its a user feature request and this is trivial.

There's not much reason to not have a per-hop-per-amount penalty in
the ProbabilisticScorer to go along with the per-hop penalty to
let it scale up to larger amounts, so we add one here.

Notably, we use a divisor of 2^30 instead of 2^20 (like the
equivalent liquidity penalty) as it allows for more flexibility,
and there's not really any reason to worry about us not being able
to create high enough penalties.

Closes #1616

@TheBlueMatt TheBlueMatt added this to the 0.0.110 milestone Jul 14, 2022
@jkczyz
Copy link
Contributor

jkczyz commented Jul 14, 2022

Notably, we use a divisor of 2^30 instead of 2^20 (like the equivalent liquidity penalty) as it allows for more flexibility, and there's not really any reason to worry about us not being able to create high enough penalties.

2^20 is used for an amount penalty, not a liquidity penalty as stated here. Why have two different amount penalties?

@TheBlueMatt
Copy link
Collaborator Author

Sorry, that's unclear, we now have too many penalties - I meant the liquidity-amount penalty. Indeed, we could keep it consistent, I'm okay with that, but if you want the number to kick in only very gradually for very large payments 2^20 is just shy of a large enough divisor, I think. Honestly I regret not making the liquidity-amount penalty 2^30 as well, but I figured why not just do 2^30 here.

lightning/src/routing/scoring.rs Show resolved Hide resolved
Comment on lines 334 to 349
/// A fixed penalty in msats to apply to each channel, multiplied by the payment amount.
///
/// The purpose of the amount penalty is to avoid having fees dominate the channel cost (i.e.,
/// fees plus penalty) for large payments. The penalty is computed as the product of this
/// multiplier and `2^30`ths of the payment amount.
///
/// ie `amount_penalty_multiplier_msat * amount_msat / 2^30`
///
/// Default value: 8,192 msat
pub base_penalty_amount_multiplier_msat: u64,
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

We should note that this is added to base_penalty_msat as it might surprising that these aren't mutually exclusive. But maybe we should make them so? Workaround is to set either to zero, of course.

Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Eh, its really obvious and trivial to set it to zero, so I figure let's just leave it as-is.

@codecov-commenter
Copy link

codecov-commenter commented Jul 14, 2022

Codecov Report

Merging #1617 (e9d0117) into main (5023ff0) will increase coverage by 0.29%.
The diff coverage is 100.00%.

❗ Current head e9d0117 differs from pull request most recent head 7f80972. Consider uploading reports for the commit 7f80972 to get more accurate results

@@            Coverage Diff             @@
##             main    #1617      +/-   ##
==========================================
+ Coverage   90.82%   91.11%   +0.29%     
==========================================
  Files          80       80              
  Lines       44643    46373    +1730     
  Branches    44643    46373    +1730     
==========================================
+ Hits        40547    42253    +1706     
- Misses       4096     4120      +24     
Impacted Files Coverage Δ
lightning/src/routing/scoring.rs 96.13% <100.00%> (+0.03%) ⬆️
lightning/src/chain/onchaintx.rs 93.98% <0.00%> (-0.93%) ⬇️
lightning/src/ln/functional_tests.rs 97.26% <0.00%> (+0.15%) ⬆️
lightning/src/debug_sync.rs 96.04% <0.00%> (+1.24%) ⬆️
lightning/src/chain/channelmonitor.rs 92.47% <0.00%> (+1.50%) ⬆️
lightning/src/ln/peer_handler.rs 59.04% <0.00%> (+1.97%) ⬆️
lightning/src/ln/functional_test_utils.rs 95.92% <0.00%> (+2.41%) ⬆️
lightning-net-tokio/src/lib.rs 82.88% <0.00%> (+5.72%) ⬆️

Continue to review full report at Codecov.

Legend - Click here to learn more
Δ = absolute <relative> (impact), ø = not affected, ? = missing data
Powered by Codecov. Last update 5023ff0...7f80972. Read the comment docs.

@TheBlueMatt
Copy link
Collaborator Author

Rebased after dependency's dependency got merged.

Copy link
Contributor

@tnull tnull left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Generally the concept is pretty straight forward I think.

I however see the danger that it is slowly getting harder to keep a good understanding of what goes into a score and how much influence the different factors (should) have. Maybe we could add a bit longer dedicated 'design' comment at the start of scorer.rs that provides a higher level overview and rationale on how the score is comprised and how the user should/could adjust the different penalties?

lightning/src/routing/scoring.rs Outdated Show resolved Hide resolved
lightning/src/routing/scoring.rs Outdated Show resolved Hide resolved
lightning/src/routing/scoring.rs Outdated Show resolved Hide resolved
@TheBlueMatt
Copy link
Collaborator Author

Rebased after merge of dependent PR.

Comment on lines 337 to 338
/// A fixed penalty in msats to apply to each channel, multiplied by the payment amount, in
/// excess of the [`base_penalty_msat`].
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Given this field is a multiplier, I'd consider formulating this sentence like the docs for liquidity_penalty_multiplier_msat and amount_penalty_multiplier_msat. The penalty is also variable, not fixed.

Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Hmm, I'd considered it a "fixed" penalty per-channel, fixed for a given payment/amount, vs variable based on some details about the channel. How about A multiplier used with the payment amount to calculate a fixed penalty applied to each channel, in excess of the base_penalty_msat.

lightning/src/routing/scoring.rs Outdated Show resolved Hide resolved
lightning/src/routing/scoring.rs Show resolved Hide resolved
@@ -683,7 +683,7 @@ impl<L: Deref<Target = u64>, T: Time, U: Deref<Target = T>> DirectedChannelLiqui
}
}

/// Computes and combines the liquidity and amount penalties.
/// Computes the liquidity penalty from the core and amount penalty multipliers.
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Let's rename the function liquidity_penalty_msat and just say "from the parameterized multipliers" here.

Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Hmm, can we table this until https://github.com/lightningdevkit/rust-lightning/pull/1625/files#diff-b00a115e9303b98772e06346a86a0312aa9790d78a73904eb6a20f938cd6da0fR779 ? There it gets used for both the liquidity and historical penalties, so making the function name say liquidity explicitly makes less sense in that context.

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I also find the 'core' terminology a bit confusing here, but fine by me if it will be changed soon anyways. 🤷‍♂️

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Sure, I'd see at least drop the "core" terminology as I also find that not obvious.

Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Sure, I was trying to come up with something that meant "the non-amount-penalty" - any suggestions?

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Could use "base" and "proportional" if we're trying to mirror fee_base_msat and fee_proportional_millionths.

Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Right, then we'd be overloading "base" - I was trying to avoid the term "base" because the params are "base, liquidity, and soon historical", and I wanted to capture the "base" part of the liquidity. I just dropped the list in the comment, maybe that's simplest.

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Ah, right. Yeah, just updating the comment should be fine. Could change "base" to "fixed" to avoid overloading "base", but I'm somewhat indifferent on that currently.

lightning/src/routing/scoring.rs Show resolved Hide resolved
Copy link
Contributor

@tnull tnull left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Just did another pass and LGTM.

@@ -683,7 +683,7 @@ impl<L: Deref<Target = u64>, T: Time, U: Deref<Target = T>> DirectedChannelLiqui
}
}

/// Computes and combines the liquidity and amount penalties.
/// Computes the liquidity penalty from the core and amount penalty multipliers.
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I also find the 'core' terminology a bit confusing here, but fine by me if it will be changed soon anyways. 🤷‍♂️

jkczyz
jkczyz previously approved these changes Jul 22, 2022
jkczyz
jkczyz previously approved these changes Jul 25, 2022
There's not much reason to not have a per-hop-per-amount penalty in
the `ProbabilisticScorer` to go along with the per-hop penalty to
let it scale up to larger amounts, so we add one here.

Notably, we use a divisor of 2^30 instead of 2^20 (like the
equivalent liquidity penalty) as it allows for more flexibility,
and there's not really any reason to worry about us not being able
to create high enough penalties.

Closes lightningdevkit#1616
This makes our `ProbabilisticScorer` field names more consistent,
as we add more types of penalties, referring to a penalty as only
the "amount penalty" no longer makes sense - we not have several
amount multiplier penalties.
@TheBlueMatt
Copy link
Collaborator Author

Squashed without further changes. Changes since a few days ago:

$ git diff-tree -U1 14696cc 7f80972e1
diff --git a/lightning/src/routing/scoring.rs b/lightning/src/routing/scoring.rs
index 005df8cd6..a587f53c5 100644
--- a/lightning/src/routing/scoring.rs
+++ b/lightning/src/routing/scoring.rs
@@ -685,3 +685,3 @@ impl<L: Deref<Target = u64>, T: Time, U: Deref<Target = T>> DirectedChannelLiqui
 
-	/// Computes the liquidity penalty from the core and amount penalty multipliers.
+	/// Computes the liquidity penalty from the penalty multipliers.
 	#[inline(always)]

@TheBlueMatt
Copy link
Collaborator Author

Hmm, looks like backtrace is causing us CI issues, will look into it after this.

@TheBlueMatt TheBlueMatt merged commit 61b0a90 into lightningdevkit:main Jul 25, 2022
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

Feature request: basePenaltyPpm
4 participants