-
Notifications
You must be signed in to change notification settings - Fork 404
Add a per-amount base penalty in the ProbabilisticScorer #1617
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
Conversation
2^20 is used for an amount penalty, not a liquidity penalty as stated here. Why have two different amount penalties? |
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
Outdated
/// 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, |
There was a problem hiding this comment.
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.
There was a problem hiding this comment.
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 Report
@@ 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
Continue to review full report at Codecov.
|
db0e626
to
e3e7ead
Compare
Rebased after dependency's dependency got merged. |
There was a problem hiding this 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?
471e92e
to
09e0ad5
Compare
Rebased after merge of dependent PR. |
lightning/src/routing/scoring.rs
Outdated
/// A fixed penalty in msats to apply to each channel, multiplied by the payment amount, in | ||
/// excess of the [`base_penalty_msat`]. |
There was a problem hiding this comment.
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.
There was a problem hiding this comment.
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
@@ -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. |
There was a problem hiding this comment.
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.
There was a problem hiding this comment.
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.
There was a problem hiding this comment.
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. 🤷♂️
There was a problem hiding this comment.
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.
There was a problem hiding this comment.
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?
There was a problem hiding this comment.
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
.
There was a problem hiding this comment.
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.
There was a problem hiding this comment.
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.
There was a problem hiding this 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.
lightning/src/routing/scoring.rs
Outdated
@@ -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. |
There was a problem hiding this comment.
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. 🤷♂️
14696cc
to
e9d0117
Compare
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.
e9d0117
to
7f80972
Compare
Squashed without further changes. Changes since a few days ago:
|
Hmm, looks like backtrace is causing us CI issues, will look into it after this. |
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 tolet 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