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

Merged
TheBlueMatt merged 2 commits into
lightningdevkit:mainfrom
TheBlueMatt:2022-07-base-ppm
Jul 25, 2022
Merged

Add a per-amount base penalty in the ProbabilisticScorer#1617
TheBlueMatt merged 2 commits into
lightningdevkit:mainfrom
TheBlueMatt:2022-07-base-ppm

Conversation

@TheBlueMatt

Copy link
Copy Markdown
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

@TheBlueMattTheBlueMatt added this to the 0.0.110 milestone Jul 14, 2022
@jkczyz

Copy link
Copy Markdown
Contributor

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
Copy Markdown
CollaboratorAuthor

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.

Comment threadlightning/src/routing/scoring.rs
Comment threadlightning/src/routing/scoring.rs Outdated
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
Copy Markdown
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
Copy Markdown
CollaboratorAuthor

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

codecov-commenter commented Jul 14, 2022

Copy link
Copy Markdown

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 FilesCoverage Δ
lightning/src/routing/scoring.rs96.13% <100.00%> (+0.03%)⬆️
lightning/src/chain/onchaintx.rs93.98% <0.00%> (-0.93%)⬇️
lightning/src/ln/functional_tests.rs97.26% <0.00%> (+0.15%)⬆️
lightning/src/debug_sync.rs96.04% <0.00%> (+1.24%)⬆️
lightning/src/chain/channelmonitor.rs92.47% <0.00%> (+1.50%)⬆️
lightning/src/ln/peer_handler.rs59.04% <0.00%> (+1.97%)⬆️
lightning/src/ln/functional_test_utils.rs95.92% <0.00%> (+2.41%)⬆️
lightning-net-tokio/src/lib.rs82.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.

@tnull
tnull self-requested a review July 14, 2022 09:29
@TheBlueMatt

Copy link
Copy Markdown
CollaboratorAuthor

Rebased after dependency's dependency got merged.

@tnulltnull left a comment

Copy link
Copy Markdown
Contributor

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?

Comment threadlightning/src/routing/scoring.rs Outdated
Comment threadlightning/src/routing/scoring.rs Outdated
Comment threadlightning/src/routing/scoring.rs Outdated
@TheBlueMatt

Copy link
Copy Markdown
CollaboratorAuthor

Rebased after merge of dependent PR.

Comment threadlightning/src/routing/scoring.rs
Comment threadlightning/src/routing/scoring.rs Outdated
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
Copy Markdown
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
Copy Markdown
CollaboratorAuthor

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.

Comment threadlightning/src/routing/scoring.rs Outdated
Comment threadlightning/src/routing/scoring.rs
Comment threadlightning/src/routing/scoring.rs Outdated
}

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

Copy link
Copy Markdown
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
Copy Markdown
CollaboratorAuthor

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
Copy Markdown
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
Copy Markdown
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
Copy Markdown
CollaboratorAuthor

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
Copy Markdown
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
Copy Markdown
CollaboratorAuthor

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
Copy Markdown
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.

Comment threadlightning/src/routing/scoring.rs

@tnulltnull left a comment

Copy link
Copy Markdown
Contributor

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.

Comment threadlightning/src/routing/scoring.rs Outdated
}

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

Copy link
Copy Markdown
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.
Closeslightningdevkit#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
Copy Markdown
CollaboratorAuthor

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
Copy Markdown
CollaboratorAuthor

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

@TheBlueMatt
TheBlueMatt merged commit 61b0a90 into lightningdevkit:mainJul 25, 2022
Sign up for freeto 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

@TheBlueMatt@jkczyz@codecov-commenter@tnull
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
 blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content

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

Merged
TheBlueMatt merged 2 commits into
lightningdevkit:mainfrom
TheBlueMatt:2022-07-base-ppm
Jul 25, 2022
Merged

Add a per-amount base penalty in the ProbabilisticScorer#1617
TheBlueMatt merged 2 commits into
lightningdevkit:mainfrom
TheBlueMatt:2022-07-base-ppm

Conversation

@TheBlueMatt

Copy link
Copy Markdown
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

@TheBlueMattTheBlueMatt added this to the 0.0.110 milestone Jul 14, 2022
@jkczyz

Copy link
Copy Markdown
Contributor

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
Copy Markdown
CollaboratorAuthor

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.

Comment threadlightning/src/routing/scoring.rs
Comment threadlightning/src/routing/scoring.rs Outdated
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
Copy Markdown
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
Copy Markdown
CollaboratorAuthor

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

codecov-commenter commented Jul 14, 2022

Copy link
Copy Markdown

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 FilesCoverage Δ
lightning/src/routing/scoring.rs96.13% <100.00%> (+0.03%)⬆️
lightning/src/chain/onchaintx.rs93.98% <0.00%> (-0.93%)⬇️
lightning/src/ln/functional_tests.rs97.26% <0.00%> (+0.15%)⬆️
lightning/src/debug_sync.rs96.04% <0.00%> (+1.24%)⬆️
lightning/src/chain/channelmonitor.rs92.47% <0.00%> (+1.50%)⬆️
lightning/src/ln/peer_handler.rs59.04% <0.00%> (+1.97%)⬆️
lightning/src/ln/functional_test_utils.rs95.92% <0.00%> (+2.41%)⬆️
lightning-net-tokio/src/lib.rs82.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.

@tnull
tnull self-requested a review July 14, 2022 09:29
@TheBlueMatt

Copy link
Copy Markdown
CollaboratorAuthor

Rebased after dependency's dependency got merged.

@tnulltnull left a comment

Copy link
Copy Markdown
Contributor

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?

Comment threadlightning/src/routing/scoring.rs Outdated
Comment threadlightning/src/routing/scoring.rs Outdated
Comment threadlightning/src/routing/scoring.rs Outdated
@TheBlueMatt

Copy link
Copy Markdown
CollaboratorAuthor

Rebased after merge of dependent PR.

Comment threadlightning/src/routing/scoring.rs
Comment threadlightning/src/routing/scoring.rs Outdated
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
Copy Markdown
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
Copy Markdown
CollaboratorAuthor

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.

Comment threadlightning/src/routing/scoring.rs Outdated
Comment threadlightning/src/routing/scoring.rs
Comment threadlightning/src/routing/scoring.rs Outdated
}

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

Copy link
Copy Markdown
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
Copy Markdown
CollaboratorAuthor

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
Copy Markdown
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
Copy Markdown
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
Copy Markdown
CollaboratorAuthor

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
Copy Markdown
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
Copy Markdown
CollaboratorAuthor

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
Copy Markdown
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.

Comment threadlightning/src/routing/scoring.rs

@tnulltnull left a comment

Copy link
Copy Markdown
Contributor

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.

Comment threadlightning/src/routing/scoring.rs Outdated
}

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

Copy link
Copy Markdown
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.
Closeslightningdevkit#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
Copy Markdown
CollaboratorAuthor

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
Copy Markdown
CollaboratorAuthor

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

@TheBlueMatt
TheBlueMatt merged commit 61b0a90 into lightningdevkit:mainJul 25, 2022
Sign up for freeto 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

@TheBlueMatt@jkczyz@codecov-commenter@tnull
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

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

Merged
TheBlueMatt merged 2 commits into
lightningdevkit:mainfrom
TheBlueMatt:2022-07-base-ppm
Jul 25, 2022
Merged

Add a per-amount base penalty in the ProbabilisticScorer#1617
TheBlueMatt merged 2 commits into
lightningdevkit:mainfrom
TheBlueMatt:2022-07-base-ppm

Conversation

@TheBlueMatt

Copy link
Copy Markdown
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

@TheBlueMattTheBlueMatt added this to the 0.0.110 milestone Jul 14, 2022
@jkczyz

Copy link
Copy Markdown
Contributor

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
Copy Markdown
CollaboratorAuthor

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.

Comment threadlightning/src/routing/scoring.rs
Comment threadlightning/src/routing/scoring.rs Outdated
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
Copy Markdown
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
Copy Markdown
CollaboratorAuthor

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

codecov-commenter commented Jul 14, 2022

Copy link
Copy Markdown

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 FilesCoverage Δ
lightning/src/routing/scoring.rs96.13% <100.00%> (+0.03%)⬆️
lightning/src/chain/onchaintx.rs93.98% <0.00%> (-0.93%)⬇️
lightning/src/ln/functional_tests.rs97.26% <0.00%> (+0.15%)⬆️
lightning/src/debug_sync.rs96.04% <0.00%> (+1.24%)⬆️
lightning/src/chain/channelmonitor.rs92.47% <0.00%> (+1.50%)⬆️
lightning/src/ln/peer_handler.rs59.04% <0.00%> (+1.97%)⬆️
lightning/src/ln/functional_test_utils.rs95.92% <0.00%> (+2.41%)⬆️
lightning-net-tokio/src/lib.rs82.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.

@tnull
tnull self-requested a review July 14, 2022 09:29
@TheBlueMatt

Copy link
Copy Markdown
CollaboratorAuthor

Rebased after dependency's dependency got merged.

@tnulltnull left a comment

Copy link
Copy Markdown
Contributor

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?

Comment threadlightning/src/routing/scoring.rs Outdated
Comment threadlightning/src/routing/scoring.rs Outdated
Comment threadlightning/src/routing/scoring.rs Outdated
@TheBlueMatt

Copy link
Copy Markdown
CollaboratorAuthor

Rebased after merge of dependent PR.

Comment threadlightning/src/routing/scoring.rs
Comment threadlightning/src/routing/scoring.rs Outdated
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
Copy Markdown
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
Copy Markdown
CollaboratorAuthor

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.

Comment threadlightning/src/routing/scoring.rs Outdated
Comment threadlightning/src/routing/scoring.rs
Comment threadlightning/src/routing/scoring.rs Outdated
}

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

Copy link
Copy Markdown
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
Copy Markdown
CollaboratorAuthor

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
Copy Markdown
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
Copy Markdown
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
Copy Markdown
CollaboratorAuthor

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
Copy Markdown
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
Copy Markdown
CollaboratorAuthor

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
Copy Markdown
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.

Comment threadlightning/src/routing/scoring.rs

@tnulltnull left a comment

Copy link
Copy Markdown
Contributor

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.

Comment threadlightning/src/routing/scoring.rs Outdated
}

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

Copy link
Copy Markdown
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.
Closeslightningdevkit#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
Copy Markdown
CollaboratorAuthor

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
Copy Markdown
CollaboratorAuthor

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

@TheBlueMatt
TheBlueMatt merged commit 61b0a90 into lightningdevkit:mainJul 25, 2022
Sign up for freeto 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

@TheBlueMatt@jkczyz@codecov-commenter@tnull
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length > 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

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

Merged
TheBlueMatt merged 2 commits into
lightningdevkit:mainfrom
TheBlueMatt:2022-07-base-ppm
Jul 25, 2022
Merged

Add a per-amount base penalty in the ProbabilisticScorer#1617
TheBlueMatt merged 2 commits into
lightningdevkit:mainfrom
TheBlueMatt:2022-07-base-ppm

Conversation

@TheBlueMatt

Copy link
Copy Markdown
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

@TheBlueMattTheBlueMatt added this to the 0.0.110 milestone Jul 14, 2022
@jkczyz

Copy link
Copy Markdown
Contributor

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
Copy Markdown
CollaboratorAuthor

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.

Comment threadlightning/src/routing/scoring.rs
Comment threadlightning/src/routing/scoring.rs Outdated
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
Copy Markdown
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
Copy Markdown
CollaboratorAuthor

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

codecov-commenter commented Jul 14, 2022

Copy link
Copy Markdown

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 FilesCoverage Δ
lightning/src/routing/scoring.rs96.13% <100.00%> (+0.03%)⬆️
lightning/src/chain/onchaintx.rs93.98% <0.00%> (-0.93%)⬇️
lightning/src/ln/functional_tests.rs97.26% <0.00%> (+0.15%)⬆️
lightning/src/debug_sync.rs96.04% <0.00%> (+1.24%)⬆️
lightning/src/chain/channelmonitor.rs92.47% <0.00%> (+1.50%)⬆️
lightning/src/ln/peer_handler.rs59.04% <0.00%> (+1.97%)⬆️
lightning/src/ln/functional_test_utils.rs95.92% <0.00%> (+2.41%)⬆️
lightning-net-tokio/src/lib.rs82.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.

@tnull
tnull self-requested a review July 14, 2022 09:29
@TheBlueMatt

Copy link
Copy Markdown
CollaboratorAuthor

Rebased after dependency's dependency got merged.

@tnulltnull left a comment

Copy link
Copy Markdown
Contributor

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?

Comment threadlightning/src/routing/scoring.rs Outdated
Comment threadlightning/src/routing/scoring.rs Outdated
Comment threadlightning/src/routing/scoring.rs Outdated
@TheBlueMatt

Copy link
Copy Markdown
CollaboratorAuthor

Rebased after merge of dependent PR.

Comment threadlightning/src/routing/scoring.rs
Comment threadlightning/src/routing/scoring.rs Outdated
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
Copy Markdown
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
Copy Markdown
CollaboratorAuthor

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.

Comment threadlightning/src/routing/scoring.rs Outdated
Comment threadlightning/src/routing/scoring.rs
Comment threadlightning/src/routing/scoring.rs Outdated
}

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

Copy link
Copy Markdown
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
Copy Markdown
CollaboratorAuthor

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
Copy Markdown
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
Copy Markdown
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
Copy Markdown
CollaboratorAuthor

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
Copy Markdown
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
Copy Markdown
CollaboratorAuthor

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
Copy Markdown
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.

Comment threadlightning/src/routing/scoring.rs

@tnulltnull left a comment

Copy link
Copy Markdown
Contributor

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.

Comment threadlightning/src/routing/scoring.rs Outdated
}

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

Copy link
Copy Markdown
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.
Closeslightningdevkit#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
Copy Markdown
CollaboratorAuthor

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
Copy Markdown
CollaboratorAuthor

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

@TheBlueMatt
TheBlueMatt merged commit 61b0a90 into lightningdevkit:mainJul 25, 2022
Sign up for freeto 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

@TheBlueMatt@jkczyz@codecov-commenter@tnull
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content

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

Merged
TheBlueMatt merged 2 commits into
lightningdevkit:mainfrom
TheBlueMatt:2022-07-base-ppm
Jul 25, 2022
Merged

Add a per-amount base penalty in the ProbabilisticScorer#1617
TheBlueMatt merged 2 commits into
lightningdevkit:mainfrom
TheBlueMatt:2022-07-base-ppm

Conversation

@TheBlueMatt

Copy link
Copy Markdown
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

@TheBlueMattTheBlueMatt added this to the 0.0.110 milestone Jul 14, 2022
@jkczyz

Copy link
Copy Markdown
Contributor

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
Copy Markdown
CollaboratorAuthor

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.

Comment threadlightning/src/routing/scoring.rs
Comment threadlightning/src/routing/scoring.rs Outdated
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
Copy Markdown
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
Copy Markdown
CollaboratorAuthor

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

codecov-commenter commented Jul 14, 2022

Copy link
Copy Markdown

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 FilesCoverage Δ
lightning/src/routing/scoring.rs96.13% <100.00%> (+0.03%)⬆️
lightning/src/chain/onchaintx.rs93.98% <0.00%> (-0.93%)⬇️
lightning/src/ln/functional_tests.rs97.26% <0.00%> (+0.15%)⬆️
lightning/src/debug_sync.rs96.04% <0.00%> (+1.24%)⬆️
lightning/src/chain/channelmonitor.rs92.47% <0.00%> (+1.50%)⬆️
lightning/src/ln/peer_handler.rs59.04% <0.00%> (+1.97%)⬆️
lightning/src/ln/functional_test_utils.rs95.92% <0.00%> (+2.41%)⬆️
lightning-net-tokio/src/lib.rs82.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.

@tnull
tnull self-requested a review July 14, 2022 09:29
@TheBlueMatt

Copy link
Copy Markdown
CollaboratorAuthor

Rebased after dependency's dependency got merged.

@tnulltnull left a comment

Copy link
Copy Markdown
Contributor

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?

Comment threadlightning/src/routing/scoring.rs Outdated
Comment threadlightning/src/routing/scoring.rs Outdated
Comment threadlightning/src/routing/scoring.rs Outdated
@TheBlueMatt

Copy link
Copy Markdown
CollaboratorAuthor

Rebased after merge of dependent PR.

Comment threadlightning/src/routing/scoring.rs
Comment threadlightning/src/routing/scoring.rs Outdated
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
Copy Markdown
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
Copy Markdown
CollaboratorAuthor

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.

Comment threadlightning/src/routing/scoring.rs Outdated
Comment threadlightning/src/routing/scoring.rs
Comment threadlightning/src/routing/scoring.rs Outdated
}

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

Copy link
Copy Markdown
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
Copy Markdown
CollaboratorAuthor

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
Copy Markdown
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
Copy Markdown
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
Copy Markdown
CollaboratorAuthor

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
Copy Markdown
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
Copy Markdown
CollaboratorAuthor

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
Copy Markdown
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.

Comment threadlightning/src/routing/scoring.rs

@tnulltnull left a comment

Copy link
Copy Markdown
Contributor

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.

Comment threadlightning/src/routing/scoring.rs Outdated
}

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

Copy link
Copy Markdown
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.
Closeslightningdevkit#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
Copy Markdown
CollaboratorAuthor

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
Copy Markdown
CollaboratorAuthor

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

@TheBlueMatt
TheBlueMatt merged commit 61b0a90 into lightningdevkit:mainJul 25, 2022
Sign up for freeto 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

@TheBlueMatt@jkczyz@codecov-commenter@tnull
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

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

Merged
TheBlueMatt merged 2 commits into
lightningdevkit:mainfrom
TheBlueMatt:2022-07-base-ppm
Jul 25, 2022
Merged

Add a per-amount base penalty in the ProbabilisticScorer#1617
TheBlueMatt merged 2 commits into
lightningdevkit:mainfrom
TheBlueMatt:2022-07-base-ppm

Conversation

@TheBlueMatt

Copy link
Copy Markdown
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

@TheBlueMattTheBlueMatt added this to the 0.0.110 milestone Jul 14, 2022
@jkczyz

Copy link
Copy Markdown
Contributor

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
Copy Markdown
CollaboratorAuthor

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.

Comment threadlightning/src/routing/scoring.rs
Comment threadlightning/src/routing/scoring.rs Outdated
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
Copy Markdown
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
Copy Markdown
CollaboratorAuthor

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

codecov-commenter commented Jul 14, 2022

Copy link
Copy Markdown

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 FilesCoverage Δ
lightning/src/routing/scoring.rs96.13% <100.00%> (+0.03%)⬆️
lightning/src/chain/onchaintx.rs93.98% <0.00%> (-0.93%)⬇️
lightning/src/ln/functional_tests.rs97.26% <0.00%> (+0.15%)⬆️
lightning/src/debug_sync.rs96.04% <0.00%> (+1.24%)⬆️
lightning/src/chain/channelmonitor.rs92.47% <0.00%> (+1.50%)⬆️
lightning/src/ln/peer_handler.rs59.04% <0.00%> (+1.97%)⬆️
lightning/src/ln/functional_test_utils.rs95.92% <0.00%> (+2.41%)⬆️
lightning-net-tokio/src/lib.rs82.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.

@tnull
tnull self-requested a review July 14, 2022 09:29
@TheBlueMatt

Copy link
Copy Markdown
CollaboratorAuthor

Rebased after dependency's dependency got merged.

@tnulltnull left a comment

Copy link
Copy Markdown
Contributor

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?

Comment threadlightning/src/routing/scoring.rs Outdated
Comment threadlightning/src/routing/scoring.rs Outdated
Comment threadlightning/src/routing/scoring.rs Outdated
@TheBlueMatt

Copy link
Copy Markdown
CollaboratorAuthor

Rebased after merge of dependent PR.

Comment threadlightning/src/routing/scoring.rs
Comment threadlightning/src/routing/scoring.rs Outdated
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
Copy Markdown
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
Copy Markdown
CollaboratorAuthor

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.

Comment threadlightning/src/routing/scoring.rs Outdated
Comment threadlightning/src/routing/scoring.rs
Comment threadlightning/src/routing/scoring.rs Outdated
}

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

Copy link
Copy Markdown
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
Copy Markdown
CollaboratorAuthor

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
Copy Markdown
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
Copy Markdown
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
Copy Markdown
CollaboratorAuthor

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
Copy Markdown
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
Copy Markdown
CollaboratorAuthor

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
Copy Markdown
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.

Comment threadlightning/src/routing/scoring.rs

@tnulltnull left a comment

Copy link
Copy Markdown
Contributor

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.

Comment threadlightning/src/routing/scoring.rs Outdated
}

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

Copy link
Copy Markdown
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.
Closeslightningdevkit#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
Copy Markdown
CollaboratorAuthor

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
Copy Markdown
CollaboratorAuthor

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

@TheBlueMatt
TheBlueMatt merged commit 61b0a90 into lightningdevkit:mainJul 25, 2022
Sign up for freeto 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

@TheBlueMatt@jkczyz@codecov-commenter@tnull
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

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

Merged
TheBlueMatt merged 2 commits into
lightningdevkit:mainfrom
TheBlueMatt:2022-07-base-ppm
Jul 25, 2022
Merged

Add a per-amount base penalty in the ProbabilisticScorer#1617
TheBlueMatt merged 2 commits into
lightningdevkit:mainfrom
TheBlueMatt:2022-07-base-ppm

Conversation

@TheBlueMatt

Copy link
Copy Markdown
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

@TheBlueMattTheBlueMatt added this to the 0.0.110 milestone Jul 14, 2022
@jkczyz

Copy link
Copy Markdown
Contributor

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
Copy Markdown
CollaboratorAuthor

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.

Comment threadlightning/src/routing/scoring.rs
Comment threadlightning/src/routing/scoring.rs Outdated
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
Copy Markdown
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
Copy Markdown
CollaboratorAuthor

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

codecov-commenter commented Jul 14, 2022

Copy link
Copy Markdown

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 FilesCoverage Δ
lightning/src/routing/scoring.rs96.13% <100.00%> (+0.03%)⬆️
lightning/src/chain/onchaintx.rs93.98% <0.00%> (-0.93%)⬇️
lightning/src/ln/functional_tests.rs97.26% <0.00%> (+0.15%)⬆️
lightning/src/debug_sync.rs96.04% <0.00%> (+1.24%)⬆️
lightning/src/chain/channelmonitor.rs92.47% <0.00%> (+1.50%)⬆️
lightning/src/ln/peer_handler.rs59.04% <0.00%> (+1.97%)⬆️
lightning/src/ln/functional_test_utils.rs95.92% <0.00%> (+2.41%)⬆️
lightning-net-tokio/src/lib.rs82.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.

@tnull
tnull self-requested a review July 14, 2022 09:29
@TheBlueMatt

Copy link
Copy Markdown
CollaboratorAuthor

Rebased after dependency's dependency got merged.

@tnulltnull left a comment

Copy link
Copy Markdown
Contributor

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?

Comment threadlightning/src/routing/scoring.rs Outdated
Comment threadlightning/src/routing/scoring.rs Outdated
Comment threadlightning/src/routing/scoring.rs Outdated
@TheBlueMatt

Copy link
Copy Markdown
CollaboratorAuthor

Rebased after merge of dependent PR.

Comment threadlightning/src/routing/scoring.rs
Comment threadlightning/src/routing/scoring.rs Outdated
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
Copy Markdown
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
Copy Markdown
CollaboratorAuthor

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.

Comment threadlightning/src/routing/scoring.rs Outdated
Comment threadlightning/src/routing/scoring.rs
Comment threadlightning/src/routing/scoring.rs Outdated
}

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

Copy link
Copy Markdown
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
Copy Markdown
CollaboratorAuthor

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
Copy Markdown
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
Copy Markdown
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
Copy Markdown
CollaboratorAuthor

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
Copy Markdown
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
Copy Markdown
CollaboratorAuthor

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
Copy Markdown
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.

Comment threadlightning/src/routing/scoring.rs

@tnulltnull left a comment

Copy link
Copy Markdown
Contributor

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.

Comment threadlightning/src/routing/scoring.rs Outdated
}

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

Copy link
Copy Markdown
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.
Closeslightningdevkit#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
Copy Markdown
CollaboratorAuthor

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
Copy Markdown
CollaboratorAuthor

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

@TheBlueMatt
TheBlueMatt merged commit 61b0a90 into lightningdevkit:mainJul 25, 2022
Sign up for freeto 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

@TheBlueMatt@jkczyz@codecov-commenter@tnull
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content

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

Merged
TheBlueMatt merged 2 commits into
lightningdevkit:mainfrom
TheBlueMatt:2022-07-base-ppm
Jul 25, 2022
Merged

Add a per-amount base penalty in the ProbabilisticScorer#1617
TheBlueMatt merged 2 commits into
lightningdevkit:mainfrom
TheBlueMatt:2022-07-base-ppm

Conversation

@TheBlueMatt

Copy link
Copy Markdown
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

@TheBlueMattTheBlueMatt added this to the 0.0.110 milestone Jul 14, 2022
@jkczyz

Copy link
Copy Markdown
Contributor

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
Copy Markdown
CollaboratorAuthor

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.

Comment threadlightning/src/routing/scoring.rs
Comment threadlightning/src/routing/scoring.rs Outdated
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
Copy Markdown
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
Copy Markdown
CollaboratorAuthor

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

codecov-commenter commented Jul 14, 2022

Copy link
Copy Markdown

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 FilesCoverage Δ
lightning/src/routing/scoring.rs96.13% <100.00%> (+0.03%)⬆️
lightning/src/chain/onchaintx.rs93.98% <0.00%> (-0.93%)⬇️
lightning/src/ln/functional_tests.rs97.26% <0.00%> (+0.15%)⬆️
lightning/src/debug_sync.rs96.04% <0.00%> (+1.24%)⬆️
lightning/src/chain/channelmonitor.rs92.47% <0.00%> (+1.50%)⬆️
lightning/src/ln/peer_handler.rs59.04% <0.00%> (+1.97%)⬆️
lightning/src/ln/functional_test_utils.rs95.92% <0.00%> (+2.41%)⬆️
lightning-net-tokio/src/lib.rs82.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.

@tnull
tnull self-requested a review July 14, 2022 09:29
@TheBlueMatt

Copy link
Copy Markdown
CollaboratorAuthor

Rebased after dependency's dependency got merged.

@tnulltnull left a comment

Copy link
Copy Markdown
Contributor

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?

Comment threadlightning/src/routing/scoring.rs Outdated
Comment threadlightning/src/routing/scoring.rs Outdated
Comment threadlightning/src/routing/scoring.rs Outdated
@TheBlueMatt

Copy link
Copy Markdown
CollaboratorAuthor

Rebased after merge of dependent PR.

Comment threadlightning/src/routing/scoring.rs
Comment threadlightning/src/routing/scoring.rs Outdated
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
Copy Markdown
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
Copy Markdown
CollaboratorAuthor

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.

Comment threadlightning/src/routing/scoring.rs Outdated
Comment threadlightning/src/routing/scoring.rs
Comment threadlightning/src/routing/scoring.rs Outdated
}

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

Copy link
Copy Markdown
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
Copy Markdown
CollaboratorAuthor

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
Copy Markdown
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
Copy Markdown
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
Copy Markdown
CollaboratorAuthor

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
Copy Markdown
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
Copy Markdown
CollaboratorAuthor

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
Copy Markdown
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.

Comment threadlightning/src/routing/scoring.rs

@tnulltnull left a comment

Copy link
Copy Markdown
Contributor

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.

Comment threadlightning/src/routing/scoring.rs Outdated
}

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

Copy link
Copy Markdown
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.
Closeslightningdevkit#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
Copy Markdown
CollaboratorAuthor

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
Copy Markdown
CollaboratorAuthor

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

@TheBlueMatt
TheBlueMatt merged commit 61b0a90 into lightningdevkit:mainJul 25, 2022
Sign up for freeto 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

@TheBlueMatt@jkczyz@codecov-commenter@tnull