From 454b6071348738d839281bf3c829e18c0b7870af Mon Sep 17 00:00:00 2001 From: Conor Okus Date: Tue, 28 Jan 2025 16:55:53 -0500 Subject: [PATCH 1/3] Adds LDK Pathfinding post --- docs/_blog/ldk-pathfinding.md | 48 ++++ package-lock.json | 517 +++++++++++++++++++++++++++++++++- package.json | 2 +- 3 files changed, 561 insertions(+), 6 deletions(-) create mode 100644 docs/_blog/ldk-pathfinding.md diff --git a/docs/_blog/ldk-pathfinding.md b/docs/_blog/ldk-pathfinding.md new file mode 100644 index 000000000..08e3bdeb2 --- /dev/null +++ b/docs/_blog/ldk-pathfinding.md @@ -0,0 +1,48 @@ +--- +title: "Pathfinding with LDK" +description: "..." +date: "2025-01-28" +authors: + - Matt Corallo +tags: + - Pathfinding +--- + +Some time ago, LDK shipped an overhaul of our pathfinding algorithm to incorporate substantially more learnings over time into each new path over which we sent a payment . At the time, we didn’t have any formal analysis framework for our pathfinder, so we didn’t run to our blog to declare it the most advanced pathfinder in the lightning world. As of Nov, 2024, [we do](https://bluematt.bitcoin.ninja/2024/11/22/ln-routing-replay/). + +All lightning pathfinders start with a standard graph traversal algorithm (generally Dijkstra’s) to find the “shortest path” as determined by some scoring heuristic. Typically, that heuristic is some combination of the fee for each hop added to the (logarithm of) a success probability. As the fee is trivially determined by looking at the network graph, determining the probability that a payment successfully traverses a channel in the network ultimately forms the “core” of a pathfinder - its accuracy directly determines the latency and success rates of lightning payments. + +Most pathfinders today owe much to [Rene Pickhardt’s observations](https://arxiv.org/abs/2107.05322). His proposed success probability calculation was straightforward but powerful - for each channel in the graph remember an upper bound and a lower bound on where liquidity in the channel lies. Whenever we send an HTLC, we can see if it succeeded, and if not where it failed. At each hop the HTLC successfully traversed, we can now learn a lower-bound on what the liquidity was before we sent the HTLC. Similarly, if an HTLC fails at a hop, we assume it was due to a liquidity limitation and learn an upper-bound on how much liquidity was available in the channel. When calculating a success probability, if the amount we want to send lies below the lower-bound, we simply assign a 100% chance, if it lies above the upper-bound 0%, and for payments in between our bounds, we simply compare at how close the amount we wish to send is to each bound. + +For example, if the lower-bound on a channel’s liquidity is 500,000 sats, and the upper bound is 1 million sats, and we wish to pay 750,000 sats, we’d assign a success probability of 50%. If instead we’re trying to send 600,000 sats, we’d assign a success probability of 80% $((1,000,000 - 600,000) / (1,000,000 - 500,000))$. The resulting cumulative probability function (CDF) is shown in the above chart. + +This model has served lightning pathfinders well for quite some time, but ultimately suffers from a number of issues in practice. First of all, we must somehow slowly decay the bounds we store for each channel. After all, over time liquidity in channels moves around and whatever hard upper- and lower- bounds we had may no longer be correct. In practice, in LDK we found that for most rates of bounds decay we picked, we were decaying both too fast and too slow. We’d find that one failed payment across a channel we regularly use (i.e. that generally has sufficient liquidity for us, but where they didn’t only for a very short period of time) would cause us to avoid a great channel for much too long. At the same time, we’d find that we’d much too regularly retry channels that rarely if ever succeeded at all. While more complex strategies around decay tuning are certainly possible, the same issues would ultimately apply, just somewhat less frequently. + +Instead, LDK decided to attempt a radically different direction, trying to learn the common upper- and lower- bounds on channels in the graph without any reference to time at all. In October, 2022, LDK shipped the first version of our “historical model”. This model relies on storing histograms of the upper- and lower- bounds for each channel in the network graph. Given a histogram for each bound, we can calculate an estimated success probability by using Rene’s liquidity estimation, just on each pair of fields in the histograms. In the first version, LDK’s historical model simply stored 8 buckets for each histogram - when we first sent an HTLC over a channel and saw it fail, if the lower-bound was in the lowest octile and the upper-bound was in the second-to-highest octile, we’d increment the lower bucket in the lower-bound histogram and the second-to-highest bucket in the upper-bound histogram. We’d then calculate the success probability of sending a payment that is half the channel’s capacity by looking at the only bucket pair with data - the (0, 6) pair, and calculate the probability as $((0.875 - 0.5) / (0.875 - 0))$. As we learn more about the channel over time, more buckets start to fill and we calculate a success probability for each bucket pair, multiplied by the histogram values for the bucket pair. The values in our histogram decay only with new data, rather than over time, removing the time parameter that caused our decay headaches entirely. + +Around the same time LND was playing with a slight variation on Rene’s original model. Fundamentally, Rene’s model works on the basis of assuming a flat probability density function for the liquidity across a channel’s capacity. In other words each potential liquidity split between a channel’s two participants is equally likely - an even split is just as likely as the liquidity being more on one side than the other. This doesn’t match the lightning network in practice, after all, many nodes send more payments than they receive, or vice versa, and many channels are opened and never see much use at all. Instead, LND proposed what they call their [“bimodal” model](https://lightning.engineering/posts/2024-04-11-pathfinding-1/). This model assumes liquidity lies at a fixed percentage (configurable between 75% and 99%) between the tracked upper- and lower-bounds on a channel’s liquidity. As the amount we’re trying to send approaches and passes this fixed percentage, the calculated payment success probability drops precipitously, but remains rather high before that. + +LDK took inspiration from this, noting that we don’t know which side opened a channel and thus, absent a history of attempted payments across a channel, there’s no reason to think the liquidity in that channel is more to either side. LDK thus updated the core probability density function from the original flat to a polynomial which assumes higher probability that liquidity lies on either end of the channel. Specifically, LDK as of October, 2023 assumes that the probability that the liquidity in a channel lies at any given point can be described by $12(x-0.5)^2$ (for an x representing liquidity normalized to between 0 and 1, the channel’s capacity, the CDF is charted below). This gives us a probability of around 50% that the channel’s liquidity lies either within the first or last 10% of the channel’s capacity. From there we can calculate our success probability the same as above, but ignoring any parts of the channel’s liquidity that lie outside our tracked upper- and lower-bounds. + +For example, if we believe a 1 million sat channel’s liquidity lower-bound is 500,000 sats, and its liquidity upper bound is 1 million sats, when trying to send an HTLC of 750,000 sats, we’d calculate its success probability as $0.75112(x-0.5)2dx0.5112(x-0.5)2dx$ (recall that to get the cumulative probability from a probability density function we integrate over the range we care about). This gives us a success probability of 87.5%, much higher than our earlier 50%! This is because once we learned that the liquidity in a channel was not close to 0, we immediately assumed it must be closer to 1 million sats than 0, because our PDF says so. The resulting PDF after learning a lower-bound of 500,000 is charted above, note that it is simply the original PDF with the bottom half chopped off, scaled back up to 1. + +At the same time, LDK also updated its historical model to provide substantially more granularity. Instead of only storing 8 evenly-sized buckets in our histograms, we started storing 32 variable-sized buckets, each representing different size ranges in liquidity bounds. The first bucket is only updated when the liquidity bounds of a channel is in the first 1/16,384th of the channel’s capacity. The second bucket represents liquidity bounds within the 2nd and 3rd 1/16,384th of the channel’s capacity, the third bucket the 4th, 5th, 6th, and 7th, and so on. This lines up roughly with our initial probability density function of $(x-0.5)2$ - if we assume that it's much more likely for a channel’s liquidity to be sitting near the edges, we should have much more resolution near a channel’s edges, giving us an equal probability of ending up in any given bucket and allowing us to calculate accurate probabilities when sending amounts that are much, much smaller than a channel’s capacity. The tradeoff is we cannot as accurately calculate success probabilities when sending amounts that are a large portion of a channel’s capacity, but such HTLCs aren’t particularly likely to succeed in any case. + +This design has worked quite well, somewhat accurately predicting successes and failures when pathfinding through the lightning network. In practice, LDK’s pathfinding wasn’t always the most successful as it defaulted to preferring lower-fee paths rather than more successful paths, but with LDK 0.1 we changed the default tuning to prefer higher-success-probability paths more strongly. + +At the same time, we utilized our new past-probing data to better tune the ratio between successes and failures, as well as tweaked the probability density function to maximize predictive ability, giving us a PDF of $128 . (1256+9(x-0.5)8)$ (the resulting CDF is shown below). + +The bottom diagram shows the results of our simulation run - breaking down results by hops that succeeded and ones that failed and showing cumulatively how often (on the Y axis) we assigned different success probabilities (on the X axis). In total, our changes give us a result which is the equivalent, on log-average, of returning a 67% success probability for channels that ultimately succeed and a 33% success probability for channels that ultimately fail (this being a log2-loss score of -0.58; a measurement of how often and by how much we’re wrong, with a best case of 0, -1 being the equivalent of always returning 50/50). + +$$ +\begin{array}{c} + +\nabla \times \vec{\mathbf{B}} -\, \frac1c\, \frac{\partial\vec{\mathbf{E}}}{\partial t} & += \frac{4\pi}{c}\vec{\mathbf{j}} \nabla \cdot \vec{\mathbf{E}} & = 4 \pi \rho \\ + +\nabla \times \vec{\mathbf{E}}\, +\, \frac1c\, \frac{\partial\vec{\mathbf{B}}}{\partial t} & = \vec{\mathbf{0}} \\ + +\nabla \cdot \vec{\mathbf{B}} & = 0 + +\end{array} +$$ diff --git a/package-lock.json b/package-lock.json index e8743a13d..c3a3393b0 100644 --- a/package-lock.json +++ b/package-lock.json @@ -9,7 +9,7 @@ "version": "1.0.0", "license": "MIT", "devDependencies": { - "@spiralbtc/vuepress-devkit-theme": "^0.19.0", + "@spiralbtc/vuepress-devkit-theme": "^0.21.0", "broken-link-checker": "0.7.8", "serve": "14.2.0", "start-server-and-test": "2.0.0", @@ -2028,9 +2028,9 @@ } }, "node_modules/@spiralbtc/vuepress-devkit-theme": { - "version": "0.19.0", - "resolved": "https://registry.npmjs.org/@spiralbtc/vuepress-devkit-theme/-/vuepress-devkit-theme-0.19.0.tgz", - "integrity": "sha512-dH4agKq+Kh0d+qfjmwfO7iF+Bs3jedVd5U6rG+18epg9Lf1mso/znoY0FGeQJjU7QQnt+dSs42t0NzPN8sVomw==", + "version": "0.21.0", + "resolved": "https://registry.npmjs.org/@spiralbtc/vuepress-devkit-theme/-/vuepress-devkit-theme-0.21.0.tgz", + "integrity": "sha512-4yD22bjJvMpsP+4hNKVuSt8yhLKXX3rm7w81+Gotz2tRRromjJLWGWVa8phgJBAMvNe6GLiAyqfVkiHUvRWdBQ==", "dev": true, "dependencies": { "@vuepress/plugin-back-to-top": "1.9.7", @@ -2041,6 +2041,7 @@ "lodash": "4.17.21", "markdown-it-footnote": "3.0.3", "markdown-it-implicit-figures": "0.10.0", + "markdown-it-mathjax3": "^4.3.2", "vue-tabs-component": "1.5.0", "vuepress-plugin-clean-urls": "1.1.2", "vuepress-plugin-code-copy": "1.0.6", @@ -5074,6 +5075,173 @@ "node": ">= 0.8.0" } }, + "node_modules/cheerio": { + "version": "1.0.0-rc.10", + "resolved": "https://registry.npmjs.org/cheerio/-/cheerio-1.0.0-rc.10.tgz", + "integrity": "sha512-g0J0q/O6mW8z5zxQ3A8E8J1hUgp4SMOvEoW/x84OwyHKe/Zccz83PVT4y5Crcr530FV6NgmKI1qvGTKVl9XXVw==", + "dev": true, + "dependencies": { + "cheerio-select": "^1.5.0", + "dom-serializer": "^1.3.2", + "domhandler": "^4.2.0", + "htmlparser2": "^6.1.0", + "parse5": "^6.0.1", + "parse5-htmlparser2-tree-adapter": "^6.0.1", + "tslib": "^2.2.0" + }, + "engines": { + "node": ">= 6" + }, + "funding": { + "url": "https://github.com/cheeriojs/cheerio?sponsor=1" + } + }, + "node_modules/cheerio-select": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/cheerio-select/-/cheerio-select-1.6.0.tgz", + "integrity": "sha512-eq0GdBvxVFbqWgmCm7M3XGs1I8oLy/nExUnh6oLqmBditPO9AqQJrkslDpMun/hZ0yyTs8L0m85OHp4ho6Qm9g==", + "dev": true, + "dependencies": { + "css-select": "^4.3.0", + "css-what": "^6.0.1", + "domelementtype": "^2.2.0", + "domhandler": "^4.3.1", + "domutils": "^2.8.0" + }, + "funding": { + "url": "https://github.com/sponsors/fb55" + } + }, + "node_modules/cheerio-select/node_modules/css-select": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/css-select/-/css-select-4.3.0.tgz", + "integrity": "sha512-wPpOYtnsVontu2mODhA19JrqWxNsfdatRKd64kmpRbQgh1KtItko5sTnEpPdpSaJszTOhEMlF/RPz28qj4HqhQ==", + "dev": true, + "dependencies": { + "boolbase": "^1.0.0", + "css-what": "^6.0.1", + "domhandler": "^4.3.1", + "domutils": "^2.8.0", + "nth-check": "^2.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/fb55" + } + }, + "node_modules/cheerio-select/node_modules/css-what": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/css-what/-/css-what-6.1.0.tgz", + "integrity": "sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw==", + "dev": true, + "engines": { + "node": ">= 6" + }, + "funding": { + "url": "https://github.com/sponsors/fb55" + } + }, + "node_modules/cheerio-select/node_modules/dom-serializer": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-1.4.1.tgz", + "integrity": "sha512-VHwB3KfrcOOkelEG2ZOfxqLZdfkil8PtJi4P8N2MMXucZq2yLp75ClViUlOVwyoHEDjYU433Aq+5zWP61+RGag==", + "dev": true, + "dependencies": { + "domelementtype": "^2.0.1", + "domhandler": "^4.2.0", + "entities": "^2.0.0" + }, + "funding": { + "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1" + } + }, + "node_modules/cheerio-select/node_modules/domelementtype": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz", + "integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fb55" + } + ] + }, + "node_modules/cheerio-select/node_modules/domutils": { + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-2.8.0.tgz", + "integrity": "sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A==", + "dev": true, + "dependencies": { + "dom-serializer": "^1.0.1", + "domelementtype": "^2.2.0", + "domhandler": "^4.2.0" + }, + "funding": { + "url": "https://github.com/fb55/domutils?sponsor=1" + } + }, + "node_modules/cheerio-select/node_modules/entities": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz", + "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==", + "dev": true, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/cheerio-select/node_modules/nth-check": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.1.1.tgz", + "integrity": "sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==", + "dev": true, + "dependencies": { + "boolbase": "^1.0.0" + }, + "funding": { + "url": "https://github.com/fb55/nth-check?sponsor=1" + } + }, + "node_modules/cheerio/node_modules/dom-serializer": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-1.4.1.tgz", + "integrity": "sha512-VHwB3KfrcOOkelEG2ZOfxqLZdfkil8PtJi4P8N2MMXucZq2yLp75ClViUlOVwyoHEDjYU433Aq+5zWP61+RGag==", + "dev": true, + "dependencies": { + "domelementtype": "^2.0.1", + "domhandler": "^4.2.0", + "entities": "^2.0.0" + }, + "funding": { + "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1" + } + }, + "node_modules/cheerio/node_modules/domelementtype": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz", + "integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fb55" + } + ] + }, + "node_modules/cheerio/node_modules/entities": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz", + "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==", + "dev": true, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/cheerio/node_modules/parse5": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-6.0.1.tgz", + "integrity": "sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw==", + "dev": true + }, "node_modules/chokidar": { "version": "2.1.8", "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-2.1.8.tgz", @@ -8428,7 +8596,6 @@ "resolved": "https://registry.npmjs.org/esm/-/esm-3.2.25.tgz", "integrity": "sha512-U1suiZ2oDVWv4zPO56S0NcR5QriEahGtdN2OR6FiOG4WJvcjBVFB0qI4+eKoWFH483PKGuLuu6V8Z4T5g63UVA==", "dev": true, - "peer": true, "engines": { "node": ">=6" } @@ -11331,6 +11498,34 @@ "node": ">=0.6.0" } }, + "node_modules/juice": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/juice/-/juice-8.1.0.tgz", + "integrity": "sha512-FLzurJrx5Iv1e7CfBSZH68dC04EEvXvvVvPYB7Vx1WAuhCp1ZPIMtqxc+WTWxVkpTIC2Ach/GAv0rQbtGf6YMA==", + "dev": true, + "dependencies": { + "cheerio": "1.0.0-rc.10", + "commander": "^6.1.0", + "mensch": "^0.3.4", + "slick": "^1.12.2", + "web-resource-inliner": "^6.0.1" + }, + "bin": { + "juice": "bin/juice" + }, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/juice/node_modules/commander": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-6.2.1.tgz", + "integrity": "sha512-U7VdrJFnJgo4xjrHpTzu0yrHPGImdsmD95ZlgYSEajAn2JKzDhDTPG9kBTefmObL2w/ngeZnilk+OV9CG3d7UA==", + "dev": true, + "engines": { + "node": ">= 6" + } + }, "node_modules/keyv": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/keyv/-/keyv-3.1.0.tgz", @@ -11754,6 +11949,16 @@ "node": ">=0.10.0" } }, + "node_modules/markdown-it-mathjax3": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/markdown-it-mathjax3/-/markdown-it-mathjax3-4.3.2.tgz", + "integrity": "sha512-TX3GW5NjmupgFtMJGRauioMbbkGsOXAAt1DZ/rzzYmTHqzkO1rNAdiMD4NiruurToPApn2kYy76x02QN26qr2w==", + "dev": true, + "dependencies": { + "juice": "^8.0.0", + "mathjax-full": "^3.2.0" + } + }, "node_modules/markdown-it-table-of-contents": { "version": "0.4.4", "resolved": "https://registry.npmjs.org/markdown-it-table-of-contents/-/markdown-it-table-of-contents-0.4.4.tgz", @@ -11763,6 +11968,18 @@ "node": ">6.4.0" } }, + "node_modules/mathjax-full": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/mathjax-full/-/mathjax-full-3.2.2.tgz", + "integrity": "sha512-+LfG9Fik+OuI8SLwsiR02IVdjcnRCy5MufYLi0C3TdMT56L/pjB0alMVGgoWJF8pN9Rc7FESycZB9BMNWIid5w==", + "dev": true, + "dependencies": { + "esm": "^3.2.25", + "mhchemparser": "^4.1.0", + "mj-context-menu": "^0.6.1", + "speech-rule-engine": "^4.0.6" + } + }, "node_modules/maybe-callback": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/maybe-callback/-/maybe-callback-2.1.0.tgz", @@ -11817,6 +12034,12 @@ "readable-stream": "^2.0.1" } }, + "node_modules/mensch": { + "version": "0.3.4", + "resolved": "https://registry.npmjs.org/mensch/-/mensch-0.3.4.tgz", + "integrity": "sha512-IAeFvcOnV9V0Yk+bFhYR07O3yNina9ANIN5MoXBKYJ/RLYPurd2d0yw14MDhpr9/momp0WofT1bPUh3hkzdi/g==", + "dev": true + }, "node_modules/merge-descriptors": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", @@ -11873,6 +12096,12 @@ "node": ">= 0.6" } }, + "node_modules/mhchemparser": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/mhchemparser/-/mhchemparser-4.2.1.tgz", + "integrity": "sha512-kYmyrCirqJf3zZ9t/0wGgRZ4/ZJw//VwaRVGA75C4nhE60vtnIzhl9J9ndkX/h6hxSN7pjg/cE0VxbnNM+bnDQ==", + "dev": true + }, "node_modules/micromatch": { "version": "4.0.5", "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", @@ -12095,6 +12324,12 @@ "node": ">=0.10.0" } }, + "node_modules/mj-context-menu": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/mj-context-menu/-/mj-context-menu-0.6.1.tgz", + "integrity": "sha512-7NO5s6n10TIV96d4g2uDpG7ZDpIhMh0QNfGdJw/W47JswFcosz457wqz/b5sAKvl12sxINGFCn80NZHKwxQEXA==", + "dev": true + }, "node_modules/mkdirp": { "version": "0.3.0", "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.3.0.tgz", @@ -12315,6 +12550,48 @@ "lower-case": "^1.1.1" } }, + "node_modules/node-fetch": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.7.0.tgz", + "integrity": "sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==", + "dev": true, + "dependencies": { + "whatwg-url": "^5.0.0" + }, + "engines": { + "node": "4.x || >=6.0.0" + }, + "peerDependencies": { + "encoding": "^0.1.0" + }, + "peerDependenciesMeta": { + "encoding": { + "optional": true + } + } + }, + "node_modules/node-fetch/node_modules/tr46": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", + "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==", + "dev": true + }, + "node_modules/node-fetch/node_modules/webidl-conversions": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", + "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==", + "dev": true + }, + "node_modules/node-fetch/node_modules/whatwg-url": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", + "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", + "dev": true, + "dependencies": { + "tr46": "~0.0.3", + "webidl-conversions": "^3.0.0" + } + }, "node_modules/node-forge": { "version": "0.10.0", "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-0.10.0.tgz", @@ -13044,6 +13321,21 @@ "@types/node": "*" } }, + "node_modules/parse5-htmlparser2-tree-adapter": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/parse5-htmlparser2-tree-adapter/-/parse5-htmlparser2-tree-adapter-6.0.1.tgz", + "integrity": "sha512-qPuWvbLgvDGilKc5BoicRovlT4MtYT6JfJyBOMDsKoiT+GiuP5qyrPCnR9HcPECIJJmZh5jRndyNThnhhb/vlA==", + "dev": true, + "dependencies": { + "parse5": "^6.0.1" + } + }, + "node_modules/parse5-htmlparser2-tree-adapter/node_modules/parse5": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-6.0.1.tgz", + "integrity": "sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw==", + "dev": true + }, "node_modules/parseurl": { "version": "1.3.3", "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", @@ -16321,6 +16613,15 @@ "node": ">=6" } }, + "node_modules/slick": { + "version": "1.12.2", + "resolved": "https://registry.npmjs.org/slick/-/slick-1.12.2.tgz", + "integrity": "sha512-4qdtOGcBjral6YIBCWJ0ljFSKNLz9KkhbWtuGvUyRowl1kxfuE1x/Z/aJcaiilpb3do9bl5K7/1h9XC5wWpY/A==", + "dev": true, + "engines": { + "node": "*" + } + }, "node_modules/smoothscroll-polyfill": { "version": "0.4.4", "resolved": "https://registry.npmjs.org/smoothscroll-polyfill/-/smoothscroll-polyfill-0.4.4.tgz", @@ -16663,6 +16964,29 @@ "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", "dev": true }, + "node_modules/speech-rule-engine": { + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/speech-rule-engine/-/speech-rule-engine-4.0.7.tgz", + "integrity": "sha512-sJrL3/wHzNwJRLBdf6CjJWIlxC04iYKkyXvYSVsWVOiC2DSkHmxsqOhEeMsBA9XK+CHuNcsdkbFDnoUfAsmp9g==", + "dev": true, + "dependencies": { + "commander": "9.2.0", + "wicked-good-xpath": "1.3.0", + "xmldom-sre": "0.1.31" + }, + "bin": { + "sre": "bin/sre" + } + }, + "node_modules/speech-rule-engine/node_modules/commander": { + "version": "9.2.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-9.2.0.tgz", + "integrity": "sha512-e2i4wANQiSXgnrBlIatyHtP1odfUp0BbV5Y5nEGbxtIrStkEOAAzCUirvLBNXHLr7kwLvJl6V+4V3XV9x7Wd9w==", + "dev": true, + "engines": { + "node": "^12.20.0 || >=14" + } + }, "node_modules/split": { "version": "0.3.3", "resolved": "https://registry.npmjs.org/split/-/split-0.3.3.tgz", @@ -18619,6 +18943,15 @@ "deprecated": "Please upgrade to version 7 or higher. Older versions may use Math.random() in certain circumstances, which is known to be problematic. See https://v8.dev/blog/math-random for details.", "dev": true }, + "node_modules/valid-data-url": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/valid-data-url/-/valid-data-url-3.0.1.tgz", + "integrity": "sha512-jOWVmzVceKlVVdwjNSenT4PbGghU0SBIizAev8ofZVgivk/TVHXSbNL8LP6M3spZvkR9/QolkyJavGSX5Cs0UA==", + "dev": true, + "engines": { + "node": ">=10" + } + }, "node_modules/vary": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", @@ -19379,6 +19712,165 @@ "minimalistic-assert": "^1.0.0" } }, + "node_modules/web-resource-inliner": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/web-resource-inliner/-/web-resource-inliner-6.0.1.tgz", + "integrity": "sha512-kfqDxt5dTB1JhqsCUQVFDj0rmY+4HLwGQIsLPbyrsN9y9WV/1oFDSx3BQ4GfCv9X+jVeQ7rouTqwK53rA/7t8A==", + "dev": true, + "dependencies": { + "ansi-colors": "^4.1.1", + "escape-goat": "^3.0.0", + "htmlparser2": "^5.0.0", + "mime": "^2.4.6", + "node-fetch": "^2.6.0", + "valid-data-url": "^3.0.0" + }, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/web-resource-inliner/node_modules/ansi-colors": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.3.tgz", + "integrity": "sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/web-resource-inliner/node_modules/dom-serializer": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-1.4.1.tgz", + "integrity": "sha512-VHwB3KfrcOOkelEG2ZOfxqLZdfkil8PtJi4P8N2MMXucZq2yLp75ClViUlOVwyoHEDjYU433Aq+5zWP61+RGag==", + "dev": true, + "dependencies": { + "domelementtype": "^2.0.1", + "domhandler": "^4.2.0", + "entities": "^2.0.0" + }, + "funding": { + "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1" + } + }, + "node_modules/web-resource-inliner/node_modules/dom-serializer/node_modules/domhandler": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-4.3.1.tgz", + "integrity": "sha512-GrwoxYN+uWlzO8uhUXRl0P+kHE4GtVPfYzVLcUxPL7KNdHKj66vvlhiweIHqYYXWlw+T8iLMp42Lm67ghw4WMQ==", + "dev": true, + "dependencies": { + "domelementtype": "^2.2.0" + }, + "engines": { + "node": ">= 4" + }, + "funding": { + "url": "https://github.com/fb55/domhandler?sponsor=1" + } + }, + "node_modules/web-resource-inliner/node_modules/domelementtype": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz", + "integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fb55" + } + ] + }, + "node_modules/web-resource-inliner/node_modules/domhandler": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-3.3.0.tgz", + "integrity": "sha512-J1C5rIANUbuYK+FuFL98650rihynUOEzRLxW+90bKZRWB6A1X1Tf82GxR1qAWLyfNPRvjqfip3Q5tdYlmAa9lA==", + "dev": true, + "dependencies": { + "domelementtype": "^2.0.1" + }, + "engines": { + "node": ">= 4" + }, + "funding": { + "url": "https://github.com/fb55/domhandler?sponsor=1" + } + }, + "node_modules/web-resource-inliner/node_modules/domutils": { + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-2.8.0.tgz", + "integrity": "sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A==", + "dev": true, + "dependencies": { + "dom-serializer": "^1.0.1", + "domelementtype": "^2.2.0", + "domhandler": "^4.2.0" + }, + "funding": { + "url": "https://github.com/fb55/domutils?sponsor=1" + } + }, + "node_modules/web-resource-inliner/node_modules/domutils/node_modules/domhandler": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-4.3.1.tgz", + "integrity": "sha512-GrwoxYN+uWlzO8uhUXRl0P+kHE4GtVPfYzVLcUxPL7KNdHKj66vvlhiweIHqYYXWlw+T8iLMp42Lm67ghw4WMQ==", + "dev": true, + "dependencies": { + "domelementtype": "^2.2.0" + }, + "engines": { + "node": ">= 4" + }, + "funding": { + "url": "https://github.com/fb55/domhandler?sponsor=1" + } + }, + "node_modules/web-resource-inliner/node_modules/entities": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz", + "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==", + "dev": true, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/web-resource-inliner/node_modules/escape-goat": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/escape-goat/-/escape-goat-3.0.0.tgz", + "integrity": "sha512-w3PwNZJwRxlp47QGzhuEBldEqVHHhh8/tIPcl6ecf2Bou99cdAt0knihBV0Ecc7CGxYduXVBDheH1K2oADRlvw==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/web-resource-inliner/node_modules/htmlparser2": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-5.0.1.tgz", + "integrity": "sha512-vKZZra6CSe9qsJzh0BjBGXo8dvzNsq/oGvsjfRdOrrryfeD9UOBEEQdeoqCRmKZchF5h2zOBMQ6YuQ0uRUmdbQ==", + "dev": true, + "dependencies": { + "domelementtype": "^2.0.1", + "domhandler": "^3.3.0", + "domutils": "^2.4.2", + "entities": "^2.0.0" + }, + "funding": { + "url": "https://github.com/fb55/htmlparser2?sponsor=1" + } + }, + "node_modules/web-resource-inliner/node_modules/mime": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-2.6.0.tgz", + "integrity": "sha512-USPkMeET31rOMiarsBNIHZKLGgvKc/LrjofAnBlOttf5ajRvqiRA8QsenbcooctK6d6Ts6aqZXBA+XbkKthiQg==", + "dev": true, + "bin": { + "mime": "cli.js" + }, + "engines": { + "node": ">=4.0.0" + } + }, "node_modules/webidl-conversions": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-4.0.2.tgz", @@ -20253,6 +20745,12 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/wicked-good-xpath": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/wicked-good-xpath/-/wicked-good-xpath-1.3.0.tgz", + "integrity": "sha512-Gd9+TUn5nXdwj/hFsPVx5cuHHiF5Bwuc30jZ4+ronF1qHK5O7HD0sgmXWSEgwKquT3ClLoKPVbO6qGwVwLzvAw==", + "dev": true + }, "node_modules/widest-line": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/widest-line/-/widest-line-4.0.1.tgz", @@ -20369,6 +20867,15 @@ "node": ">=6.0" } }, + "node_modules/xmldom-sre": { + "version": "0.1.31", + "resolved": "https://registry.npmjs.org/xmldom-sre/-/xmldom-sre-0.1.31.tgz", + "integrity": "sha512-f9s+fUkX04BxQf+7mMWAp5zk61pciie+fFLC9hX9UVvCeJQfNHRHXpeo5MPcR0EUf57PYLdt+ZO4f3Ipk2oZUw==", + "dev": true, + "engines": { + "node": ">=0.1" + } + }, "node_modules/xtend": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/xtend/-/xtend-3.0.0.tgz", diff --git a/package.json b/package.json index a4745f313..d6fa3b92a 100644 --- a/package.json +++ b/package.json @@ -30,7 +30,7 @@ "linkcheck:local": "$npm_package_config_linkcheck http://localhost:$npm_package_config_port" }, "devDependencies": { - "@spiralbtc/vuepress-devkit-theme": "^0.19.0", + "@spiralbtc/vuepress-devkit-theme": "^0.21.0", "broken-link-checker": "0.7.8", "serve": "14.2.0", "start-server-and-test": "2.0.0", From 2107209efc861318f095b5df7a93008c176c1022 Mon Sep 17 00:00:00 2001 From: Matt Corallo Date: Fri, 7 Feb 2025 17:58:14 +0000 Subject: [PATCH 2/3] Update to latest copy, include images, do math --- docs/_blog/ldk-pathfinding.md | 43 +++++++++++-------- docs/assets/scoring_initial_histogram.png | Bin 0 -> 19601 bytes docs/assets/scoring_initial_rene_cdf.png | Bin 0 -> 18029 bytes docs/assets/scoring_modern_nonlinear_cdf.png | Bin 0 -> 23001 bytes docs/assets/scoring_og_nonlinear_cdf.png | Bin 0 -> 20280 bytes docs/assets/scoring_real_histogram.png | Bin 0 -> 74992 bytes docs/assets/scoring_results.png | Bin 0 -> 49010 bytes docs/assets/scoring_second_histogram.png | Bin 0 -> 20233 bytes docs/assets/scoring_truncated_og_cdf.png | Bin 0 -> 18135 bytes 9 files changed, 25 insertions(+), 18 deletions(-) create mode 100644 docs/assets/scoring_initial_histogram.png create mode 100644 docs/assets/scoring_initial_rene_cdf.png create mode 100644 docs/assets/scoring_modern_nonlinear_cdf.png create mode 100644 docs/assets/scoring_og_nonlinear_cdf.png create mode 100644 docs/assets/scoring_real_histogram.png create mode 100644 docs/assets/scoring_results.png create mode 100644 docs/assets/scoring_second_histogram.png create mode 100644 docs/assets/scoring_truncated_og_cdf.png diff --git a/docs/_blog/ldk-pathfinding.md b/docs/_blog/ldk-pathfinding.md index 08e3bdeb2..7eaa9b2c1 100644 --- a/docs/_blog/ldk-pathfinding.md +++ b/docs/_blog/ldk-pathfinding.md @@ -8,41 +8,48 @@ tags: - Pathfinding --- -Some time ago, LDK shipped an overhaul of our pathfinding algorithm to incorporate substantially more learnings over time into each new path over which we sent a payment . At the time, we didn’t have any formal analysis framework for our pathfinder, so we didn’t run to our blog to declare it the most advanced pathfinder in the lightning world. As of Nov, 2024, [we do](https://bluematt.bitcoin.ninja/2024/11/22/ln-routing-replay/). +Some time ago, LDK shipped an overhaul of our pathfinding algorithm to incorporate substantially more learnings over time into each new path over which we sent a payment. At the time, we didn’t have any formal analysis framework for our pathfinder, so we didn’t run to our blog to declare it the most advanced pathfinder in the lightning world. As of Nov, 2024, [we do](https://bluematt.bitcoin.ninja/2024/11/22/ln-routing-replay/). All lightning pathfinders start with a standard graph traversal algorithm (generally Dijkstra’s) to find the “shortest path” as determined by some scoring heuristic. Typically, that heuristic is some combination of the fee for each hop added to the (logarithm of) a success probability. As the fee is trivially determined by looking at the network graph, determining the probability that a payment successfully traverses a channel in the network ultimately forms the “core” of a pathfinder - its accuracy directly determines the latency and success rates of lightning payments. Most pathfinders today owe much to [Rene Pickhardt’s observations](https://arxiv.org/abs/2107.05322). His proposed success probability calculation was straightforward but powerful - for each channel in the graph remember an upper bound and a lower bound on where liquidity in the channel lies. Whenever we send an HTLC, we can see if it succeeded, and if not where it failed. At each hop the HTLC successfully traversed, we can now learn a lower-bound on what the liquidity was before we sent the HTLC. Similarly, if an HTLC fails at a hop, we assume it was due to a liquidity limitation and learn an upper-bound on how much liquidity was available in the channel. When calculating a success probability, if the amount we want to send lies below the lower-bound, we simply assign a 100% chance, if it lies above the upper-bound 0%, and for payments in between our bounds, we simply compare at how close the amount we wish to send is to each bound. -For example, if the lower-bound on a channel’s liquidity is 500,000 sats, and the upper bound is 1 million sats, and we wish to pay 750,000 sats, we’d assign a success probability of 50%. If instead we’re trying to send 600,000 sats, we’d assign a success probability of 80% $((1,000,000 - 600,000) / (1,000,000 - 500,000))$. The resulting cumulative probability function (CDF) is shown in the above chart. +For example, if the lower-bound on a channel’s liquidity is 500,000 sats, and the upper bound is 1 million sats, and we wish to pay 750,000 sats, we’d assign a success probability of 50%. If instead we’re trying to send 600,000 sats, we’d assign a success probability of 80% $((1,000,000 - 600,000) / (1,000,000 - 500,000))$. The resulting cumulative probability density function (CDF) is shown in the below chart. + +[assets/scoring_initial_rene_cdf.png] This model has served lightning pathfinders well for quite some time, but ultimately suffers from a number of issues in practice. First of all, we must somehow slowly decay the bounds we store for each channel. After all, over time liquidity in channels moves around and whatever hard upper- and lower- bounds we had may no longer be correct. In practice, in LDK we found that for most rates of bounds decay we picked, we were decaying both too fast and too slow. We’d find that one failed payment across a channel we regularly use (i.e. that generally has sufficient liquidity for us, but where they didn’t only for a very short period of time) would cause us to avoid a great channel for much too long. At the same time, we’d find that we’d much too regularly retry channels that rarely if ever succeeded at all. While more complex strategies around decay tuning are certainly possible, the same issues would ultimately apply, just somewhat less frequently. -Instead, LDK decided to attempt a radically different direction, trying to learn the common upper- and lower- bounds on channels in the graph without any reference to time at all. In October, 2022, LDK shipped the first version of our “historical model”. This model relies on storing histograms of the upper- and lower- bounds for each channel in the network graph. Given a histogram for each bound, we can calculate an estimated success probability by using Rene’s liquidity estimation, just on each pair of fields in the histograms. In the first version, LDK’s historical model simply stored 8 buckets for each histogram - when we first sent an HTLC over a channel and saw it fail, if the lower-bound was in the lowest octile and the upper-bound was in the second-to-highest octile, we’d increment the lower bucket in the lower-bound histogram and the second-to-highest bucket in the upper-bound histogram. We’d then calculate the success probability of sending a payment that is half the channel’s capacity by looking at the only bucket pair with data - the (0, 6) pair, and calculate the probability as $((0.875 - 0.5) / (0.875 - 0))$. As we learn more about the channel over time, more buckets start to fill and we calculate a success probability for each bucket pair, multiplied by the histogram values for the bucket pair. The values in our histogram decay only with new data, rather than over time, removing the time parameter that caused our decay headaches entirely. +Instead, LDK decided to attempt a radically different direction, trying to learn the common upper- and lower- bounds on channels in the graph without any reference to time at all. In October, 2022, LDK shipped the first version of our “historical model”. This model relies on storing histograms of the upper- and lower- bounds for each channel in the network graph. Given a histogram for each bound, we can calculate an estimated success probability by using Rene’s probability density function (PDF), just on each pair of fields in the histograms. -Around the same time LND was playing with a slight variation on Rene’s original model. Fundamentally, Rene’s model works on the basis of assuming a flat probability density function for the liquidity across a channel’s capacity. In other words each potential liquidity split between a channel’s two participants is equally likely - an even split is just as likely as the liquidity being more on one side than the other. This doesn’t match the lightning network in practice, after all, many nodes send more payments than they receive, or vice versa, and many channels are opened and never see much use at all. Instead, LND proposed what they call their [“bimodal” model](https://lightning.engineering/posts/2024-04-11-pathfinding-1/). This model assumes liquidity lies at a fixed percentage (configurable between 75% and 99%) between the tracked upper- and lower-bounds on a channel’s liquidity. As the amount we’re trying to send approaches and passes this fixed percentage, the calculated payment success probability drops precipitously, but remains rather high before that. +In the first version, LDK’s historical model simply stored 8 buckets for each histogram - when we first sent an HTLC over a channel and saw it fail, if the lower-bound was in the lowest octile and the upper-bound was in the second-to-highest octile, we’d increment the lower bucket in the lower-bound histogram and the second-to-highest bucket in the upper-bound histogram, leaving us with the histogram below. We’d then calculate the success probability of sending a payment that is half the channel’s capacity by looking at the only bucket pair with data - the (0, 6) pair, and calculate the probability as $((0.875 - 0.5) / (0.875 - 0))$. -LDK took inspiration from this, noting that we don’t know which side opened a channel and thus, absent a history of attempted payments across a channel, there’s no reason to think the liquidity in that channel is more to either side. LDK thus updated the core probability density function from the original flat to a polynomial which assumes higher probability that liquidity lies on either end of the channel. Specifically, LDK as of October, 2023 assumes that the probability that the liquidity in a channel lies at any given point can be described by $12(x-0.5)^2$ (for an x representing liquidity normalized to between 0 and 1, the channel’s capacity, the CDF is charted below). This gives us a probability of around 50% that the channel’s liquidity lies either within the first or last 10% of the channel’s capacity. From there we can calculate our success probability the same as above, but ignoring any parts of the channel’s liquidity that lie outside our tracked upper- and lower-bounds. +[assets/scoring_initial_histogram.png] -For example, if we believe a 1 million sat channel’s liquidity lower-bound is 500,000 sats, and its liquidity upper bound is 1 million sats, when trying to send an HTLC of 750,000 sats, we’d calculate its success probability as $0.75112(x-0.5)2dx0.5112(x-0.5)2dx$ (recall that to get the cumulative probability from a probability density function we integrate over the range we care about). This gives us a success probability of 87.5%, much higher than our earlier 50%! This is because once we learned that the liquidity in a channel was not close to 0, we immediately assumed it must be closer to 1 million sats than 0, because our PDF says so. The resulting PDF after learning a lower-bound of 500,000 is charted above, note that it is simply the original PDF with the bottom half chopped off, scaled back up to 1. +As we learn more about the channel over time, more buckets start to fill. For example, if we later failed to send an HTLC in the third-to-highest octile, and then successfully sent an HTLC in the second octile, we might have the below histogram (note that the values in our histogram decay with new data, rather than over time, and thus the older data has been slightly decayed). We then calculate success probability by iterating every min- and max-bucket pair using the same PDF and weighting by the bucket values. For example if we’re again attempting to send 50% of the channel’s total liquidity we’d sum each `max-bucket weight * min-bucket weight * (upper edge of max-bucket - 0.5) / (upper edge of max-bucket - lower edge of min-bucket)` and then divide by the total `max-bucket weight * min-bucket weights`. In the example below (with min-bucket weights 61, 32 and max-bucket weights 31, 30, 32) we get a probability of ~3852.6 / 8649, or roughly 44.5%. The actual LDK probability estimation is somewhat more complicated and handles a few degenerate cases better. -At the same time, LDK also updated its historical model to provide substantially more granularity. Instead of only storing 8 evenly-sized buckets in our histograms, we started storing 32 variable-sized buckets, each representing different size ranges in liquidity bounds. The first bucket is only updated when the liquidity bounds of a channel is in the first 1/16,384th of the channel’s capacity. The second bucket represents liquidity bounds within the 2nd and 3rd 1/16,384th of the channel’s capacity, the third bucket the 4th, 5th, 6th, and 7th, and so on. This lines up roughly with our initial probability density function of $(x-0.5)2$ - if we assume that it's much more likely for a channel’s liquidity to be sitting near the edges, we should have much more resolution near a channel’s edges, giving us an equal probability of ending up in any given bucket and allowing us to calculate accurate probabilities when sending amounts that are much, much smaller than a channel’s capacity. The tradeoff is we cannot as accurately calculate success probabilities when sending amounts that are a large portion of a channel’s capacity, but such HTLCs aren’t particularly likely to succeed in any case. +[assets/scoring_second_histogram.png] -This design has worked quite well, somewhat accurately predicting successes and failures when pathfinding through the lightning network. In practice, LDK’s pathfinding wasn’t always the most successful as it defaulted to preferring lower-fee paths rather than more successful paths, but with LDK 0.1 we changed the default tuning to prefer higher-success-probability paths more strongly. +Around the same time LND was playing with a slight variation on Rene’s original model. Fundamentally, Rene’s model works on the basis of assuming a flat PDF for the liquidity across a channel’s capacity. In other words each potential liquidity split between a channel’s two participants is equally likely - an even split is just as likely as the liquidity being more on one side than the other. This doesn’t match the lightning network in practice, however; after all, many nodes send more payments than they receive, or vice versa, and many channels are opened and never see much use at all. Instead, LND proposed what they call their [“bimodal” model](https://lightning.engineering/posts/2024-04-11-pathfinding-1/). This model assumes liquidity lies at a fixed percentage (configurable between 75% and 99%) between the tracked upper- and lower-bounds on a channel’s liquidity. As the amount we’re trying to send approaches and passes this fixed percentage, the calculated payment success probability drops precipitously, but remains rather high before that. + +LDK took inspiration from this, noting that we don’t know which side opened a channel and thus, absent a history of attempted payments across a channel, there’s no reason to think the liquidity in that channel is more to either side. LDK thus updated the core PDF from the original flat to a polynomial which assumes higher probability that liquidity lies on either end of the channel. Specifically, LDK as of October, 2023 assumes that the probability that the liquidity in a channel lies at any given point can be described by $12 \cdot (x-0.5)^2$ (for an x representing liquidity normalized to between 0 and 1, the channel’s capacity, the CDF is charted below). This gives us a probability of around 50% that the channel’s liquidity lies either within the first or last 10% of the channel’s capacity. From there we can calculate our success probability the same as above, but ignoring any parts of the channel’s liquidity that lie outside our tracked upper- and lower-bounds. + +[assets/scoring_og_nonlinear_cdf.png] -At the same time, we utilized our new past-probing data to better tune the ratio between successes and failures, as well as tweaked the probability density function to maximize predictive ability, giving us a PDF of $128 . (1256+9(x-0.5)8)$ (the resulting CDF is shown below). +For example, if we believe a 1 million sat channel’s liquidity lower-bound is 500,000 sats, and its liquidity upper bound is 1 million sats, when trying to send an HTLC of 750,000 sats, we’d calculate its success probability as $\frac{\int_{0.75}^1 12 \cdot (x-0.5)^2dx}{\int_{0.5}^1 12 \cdot (x-0.5)^2dx}$ (recall that to get the CDF from a PDF we integrate over the range we care about). This gives us a success probability of 87.5%, much higher than our earlier 50%! This is because once we learned that the liquidity in a channel was not close to 0, we immediately assumed it must be closer to 1 million sats than 500,000, because our PDF says so. The resulting PDF after learning a lower-bound of 500,000 is charted below, note that it is simply the original PDF with the bottom half chopped off, scaled back up to 1. -The bottom diagram shows the results of our simulation run - breaking down results by hops that succeeded and ones that failed and showing cumulatively how often (on the Y axis) we assigned different success probabilities (on the X axis). In total, our changes give us a result which is the equivalent, on log-average, of returning a 67% success probability for channels that ultimately succeed and a 33% success probability for channels that ultimately fail (this being a log2-loss score of -0.58; a measurement of how often and by how much we’re wrong, with a best case of 0, -1 being the equivalent of always returning 50/50). +[assets/scoring_truncated_og_cdf.png] -$$ -\begin{array}{c} +At the same time, LDK also updated its historical model to provide substantially more granularity. Instead of only storing 8 evenly-sized buckets in our histograms, we started storing 32 variable-sized buckets, each representing different size ranges in liquidity bounds. The first bucket is only updated when the liquidity bounds of a channel is in the first 1/16,384th of the channel’s capacity. The second bucket represents liquidity bounds within the 2nd and 3rd 1/16,384th of the channel’s capacity, the third bucket the 4th, 5th, 6th, and 7th, and so on. This lines up roughly with our initial PDF of $(x-0.5)^2$ - if we assume that it's much more likely for a channel’s liquidity to be sitting near the edges, we should have much more resolution near a channel’s edges, giving us an equal probability of ending up in any given bucket and allowing us to calculate accurate probabilities when sending amounts that are much, much smaller than a channel’s capacity. The tradeoff is we cannot as accurately calculate success probabilities when sending amounts that are a large portion of a channel’s capacity, but such HTLCs aren’t particularly likely to succeed in any case. A real histogram might look like the following (pulled from a running LDK node). There is a line all the way on the right of the bottom chart up to 4,177, it's just less than a pixel wide as the buckets on the edges get much too small to display proportionally! + +[assets/scoring_real_histogram.png] + +This design has worked quite well, somewhat accurately predicting successes and failures when pathfinding through the lightning network. In practice, LDK’s pathfinding wasn’t always the most successful as it defaulted to preferring lower-fee paths rather than more successful paths, but with LDK 0.1 we changed the default tuning to prefer higher-success-probability paths more strongly. -\nabla \times \vec{\mathbf{B}} -\, \frac1c\, \frac{\partial\vec{\mathbf{E}}}{\partial t} & -= \frac{4\pi}{c}\vec{\mathbf{j}} \nabla \cdot \vec{\mathbf{E}} & = 4 \pi \rho \\ +At the same time, we utilized our new past-probing data to better tune the ratio between successes and failures, as well as tweaked the PDF to maximize predictive ability, giving us $128 \cdot (\frac{1}{256} + 9 \cdot (x-0.5)^8)$ (the resulting CDF is shown below). -\nabla \times \vec{\mathbf{E}}\, +\, \frac1c\, \frac{\partial\vec{\mathbf{B}}}{\partial t} & = \vec{\mathbf{0}} \\ +[assets/scoring_modern_nonlinear_cdf.png] -\nabla \cdot \vec{\mathbf{B}} & = 0 +The bottom diagram shows the results of our simulation run - breaking down results by hops that succeeded and ones that failed and showing cumulatively how often (on the Y axis) we assigned different success probabilities (on the X axis). In total, our changes give us a result which is the equivalent, on log-average, of returning a 67% success probability for channels that ultimately succeed and a 33% success probability for channels that ultimately fail (this being a log2-loss score of -0.58; a measurement of how often and by how much we’re wrong, with the best being 0 and -1 being the equivalent of always returning 50/50). -\end{array} -$$ +[assets/scoring_results.png] diff --git a/docs/assets/scoring_initial_histogram.png b/docs/assets/scoring_initial_histogram.png new file mode 100644 index 0000000000000000000000000000000000000000..d3daf4228be0121a9898985c38706a112840c830 GIT binary patch literal 19601 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 NN-11Vy{iBC{{RTfx5)qi literal 0 HcmV?d00001 diff --git a/docs/assets/scoring_modern_nonlinear_cdf.png b/docs/assets/scoring_modern_nonlinear_cdf.png new file mode 100644 index 0000000000000000000000000000000000000000..0b72b824eeacf0e8cb910ff5b0dbf6a8f579644c GIT binary patch literal 23001 zcmZ_02RzmN`#*lv9W5k^C`utCl8kUj86kUbk*ttC56Uf@%F4*zJ9|@-z4u<(<5Qe zJq2FrIaS;P{yS~`L|pOg*|Q^4GLtaaO_;c_kfKBM%9x{OFKQUOaY1wN1^&=qSI&gs zq3?0tV=mEuWiZ6fL6X$gUC#H#dPOnSx&+Icii+khW_%W578ao#`AXe{+Ma~sM*za` zz1g6lt6Qhk^oe*>ei$O6EKf4EDn0e>{# z@;?Cy)=sO6gF)hw-b?5=ZK!kD=QXm~tz&2}>A^^D;a?)b{YQk{PMtO6Qa)Jg!3+1r zONI8Am(^;)^weVefi;0L&@+hY%k1D+Qi&kgEXnD!?C##{Yaar$ z7i0rejM%u{tda0$ByQ?=L;@NwO+IDDoV#B@Yb60K?LzZGF_TSkS--Zb_=`skK@80B zQz2qtE0gCn5vV?76*{I{;b1Odi+|$>so&Lm@-L|e|K`;S7N}xxw*M1dB}lU9>|>)5)Gj2+w`R3Hjlpl;>qL3?lm=T($eiB zGzSl=j`o*X_pHkg&1{=P6SKs6XFXncd6ao znIH@rDQLeoN+%gs=(5h{w%0P(7Db5vR9kzzGybWLb-d;_U7$FaQ!s|S5fD(WR zXn1Xmf~et4%*@2p{0p+r~nh}19kq_Xjv*$WhfRa9+v zO9Gug(3*~Idiemg)R&o;m$xUR{t5#&N=0YMrgp-B0bhJ5^fB6Wmm2F(Du*STlDeH7BQiWTe7T&h+)`(E>vm zBcp}JkGCZyBqD2;eo|Q+GzcDb&FzHU(>ORhyl~-y6up9|==-3cj`*iu!!8wgr}1Bp zl^5;pyeFg*4Wb^KBdYTvo+z=H@U#ZY;9_K4l;5HV_&GW{+Su6G+1Uxi#?2<~cDSrV z&Za%OdG@xb|L%GnF`LUTtqQv_tCoA@hb_jACPPC*)z#H}b}L3lE!VhS4+>)UI#}II z+VF{~E3N0-xzNUYhD`VF*;-nbtqXmxt7ALJxIk0MNkbFs=gLn{KPTh1uduaRSy?$= zVVSkJX`mCUzBZ~*KhpmwM=die9_&m7G%tChj8*)>{HQc}vw{Xl<_SRR+% z_3iC#uG_#?CR{PACPhvQo$(e`DCL$0!?wsGvyo!I_S>}5($ZK=4VDl19R^v0o${hF z*XHpTO^k}tXu18jmshL+Vt*66q%K(GdbpphUBxRPP@SK@Y2k*^c=oJubGD`8Al;`C zEF4&TZq3ntzs}%(ta$DKHzz0Lurjd%!3;9vW!9 zFaZX89PT{jNzM<4&rDAXC+&rwvZ­TYuzy*5^1Fp`;-70qQf{O-&JNU8QnZIY(e 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 CUR&q@ literal 0 HcmV?d00001 diff --git a/docs/assets/scoring_og_nonlinear_cdf.png b/docs/assets/scoring_og_nonlinear_cdf.png new file mode 100644 index 0000000000000000000000000000000000000000..bd8c17512a42a7fd0245dfb6deac3d85e8bd09e8 GIT binary patch literal 20280 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 AumAu6 literal 0 HcmV?d00001 diff --git a/docs/assets/scoring_real_histogram.png b/docs/assets/scoring_real_histogram.png new file mode 100644 index 0000000000000000000000000000000000000000..dae28b47ad74917fc22ee99a64167c7cae2580fa GIT binary patch literal 74992 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

KKzE`|Gv@kJ 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 literal 0 HcmV?d00001 diff --git a/docs/assets/scoring_results.png b/docs/assets/scoring_results.png new file mode 100644 index 0000000000000000000000000000000000000000..c10671ba78686ff7c8b516797ed32130185194f1 GIT binary patch literal 49010 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

{W#> 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
V>zOpmA=^UG9e)x+8v5e+q z^OIs_M!rg%y{&Edfa%XyLs&vL3p?!V`fKU%UPDB`=e02k7)0zO!cPcY8FiK(e+MkbiboV;L(Ybh+m0)JvCO@+&elasH3ZE&a#yhH^uJTgNjC6VJ} zLVq*BnpE9(`tqS;yMZuHq2e=1%Fb@H{2WqV)wDG!a}nX0osn`h z59RRir^z1N69S+BEQPVe`@kfH#aep5?>0bIuJ^bmCba(t0svym41ke$p`3q!r<$Cc zT(EawV4%AhJ{H+ccq_FB4{ijhQ1O~WafD^twT}>tVJIHTGbr=1thIo~Qn3QEe4KDU9?(}x|S$o=J z>N3PX@~ literal 0 HcmV?d00001 diff --git a/docs/assets/scoring_second_histogram.png b/docs/assets/scoring_second_histogram.png new file mode 100644 index 0000000000000000000000000000000000000000..cff94689ce9f37f48d60ac08b91f75c2dd682319 GIT binary patch literal 20233 zcmeIa2UJw)wlzuz6&n>>Py`grpn|jr0uo9@)RrWQB3T7QBne0k)kY+Vih>A&f+R@- zl2eOhT9KSVa;7B5s(N#mcH6g4_kH(`_y1%3@14WwQPNtqYw!JiYpuEFoNK$EP(Hfy z2d*EOn3z`neC+T^CZ_LSF)@AD&-^X^MpojU7ykIp`q0m6%*@Qq9V#E0m^Lx}d{|b^ zK4`d=eC2e{wOP9L&rI$=Todh5`)Sh?-nes_agWT5YXx8MpWPIHUcuiZZe1e3>Fz8K z=UFSuA!hMSacV}JU%fsPq$5^vj#_y#`PlC0ed*1bA0D43Ir}D>ENr)wy%cu4d!cwE z<;9)71=hYS6+=@;`+9@+^*Oxv?evG>Zo0@H#dj8s*X-;tVZ%WLCx0}-#wY1pP!rPW98l-o0KH%_xu~2^i$$8cD!Fm zBQK=Ad-pEOj&e8jQrW|u85tQqB%1x@`fP^@TS{Aw9i>gtiv^d)fqou;^ACF9N8m?>G5-0Rn`o5W}A@Cc2Fh)7LM z?dz-EGV@D1G40#^SP|Ct$fWu?FSOn6_?WKW^)%nF?AqnXt><<;D>%y{Mh zw||Xlu~$hmEcaWiwj3v9g;u5AKQC ziZ7n|V8=`n>(lq&!_(NFj7Vkkb3g7eB7Kv4ziImXU`)H-jggU&EZdPMGA@pe3i9%W zxh@OSly=^FB48#Dnaa+V>(Ry^DD2UAeW|kK{#F(imb@`b9?ONBW_ETt=EL6mnHnRsHcxA~~KH@{>pC zABlvMNF;6Ue9WvH#6L7PO4tn6;L|Si)giQT|2*x}r>B0~S25g}92wTtQ1R)Q8Rt(Q zL@ZBIUCYisK;{>)B~-Bnt&!35eak5I&6$6L3f zlvX}PiL3o5Cfi){&9CzKY(k+>K3{4up1$+pbJkWbKIWrd>n(c&jB;u7Lj!`?4(_4- zUi;p!mv+30B(JZp@2Ea#X>4pPAom@DNpkG_^IPse7B(#Nah(hcJL(gWDn*^Fc0YV! zadu2XLZYXq2lr^;hRNm29v&V=UYu;@j9aU0N`CBG=&=^b$kNcTM=Wpd9d%(wNGsKJ zG^IY+uFXM}T~H&*ptHc8g=0_9eltxM7ixr3;C_p?4fW~7+TZ}Toopeq1?0tIGO-@@ z+Sc#Jd&=_;I89SorS3I}p3lEII5_xJ((e7^z4}9SaYOY9A(D3H+KhxHIYy6OIJ<3) z#(_lN)_I}qE33uwga8_89Q10d_dHThEXD2T(SD`OQOM-Bi;Px^{;op zLy$Smtl4kY8n;@35*Hu8XZP;%^77p~cSgT_>0xpL?{^dwi)TwoO%1lG)8G~}SG3?H zxjGNZ{xcwmX8?j*4cA|VhxY_ozYmbG?p?5p(@Yuk*d2d1%hrrt-j`3s+}vC@@xm=) zC->_m<`}#V4>z3s)In))Yir9jsgED1j*LuGQ&SsmPP3rXsFo`U93WJ%?q*zE+}0yr z_Vnqm7{HH#0n%@yR6pbBT#+9c;(CBYB7gk#8i)3kH&x*Zth_QC{tN|55WzKLUyo_m z?lSWotJEjokj3s&zL4zcCX>9G918Va`=S!NJOdU402ch}w&JOHuz@gV{Y_w=BqiYh zDf1tYD->67G`p2OWc<9~Q3;lkz_(Y1$|vMZYYuwfie9+6({0s8kG3q825&%!^j-o} zoIJL}m-i~S0Gra|Xp$niQXVL)rm9L9StvU@8-YI=U(;1pRkea~A_8ffefNBJ65wYS`DV_2%5SLyi&KY`B+Kk!96&9eNrP^(7A+Ks@o-f4rt; zks~^l`C+?)pJI@>Wk>$4>IkKngoO6j#?`&=0=u|47^zH<8F(+vva6`Kw-?{#_weE3 zCpS`%w3F@S`kTwyUdF`u3u>jFe|sD7U}~to;;E!qyya&AXzOaLu;qR@n`C1gJ)gy` z-7zxHs4_(6ubI58#)%mpD6#rq3vmDccQnrB`4-My+{ntPkOP9XwY7$Zh7Jx6+qZ8A zWDi)+js;^|LtagQNTh3>w3^!5cTYr3s$Tqzm-!w;hm_ z)R$@nDxlxxCD8!jLfq-*XYpn*@{j@J+?zj5f z=@k7`yQ^0>*p>hC4X^OkPWuO?2HI?hy^{T(OXsm|!h5x)ggEitF2jk%)5DF{NJ0D_ zw8=8@F&7(i#xbbLe@LK&B3n<|}=Q zyt(~-eNUliYiUX1qHEe1Ab(2;KT){zI+y1^VEjz_8wFV&VV5V*`I7_YC2uPD2?U5+ zcIMw=iBt+aqoXg(G|A8!g+4`}#H+kmGeQ9BJb|6Ahjs1{l4Im*=zsl@MXR_VzPNKK*q2kbwc zW0#k6TcyP77ZSoNuWDjq;zg9aE1@X)TILx&8GXS{i(|z`6~WX;3C@Od<2|bEHi&;~ zbn0I-fEObJ?D|s%2omDlC}Gu&P9co{$pM?ova$qbu*jY3{a5U5Yg;5PhL{-kSKLAB z-+y+;lb=qJALqu#4)<4vDJdxdOusKLH!(F;q#T#tBPjUp0|Pl9j<|lM@BP#7maUSa zWKURGS(V{UCMMNcml+V-ITT6dAl;*Hdzhr{a5}Ez;`<;8+u??^cGs-<_)*#dMeo(Q zH+O#A8p^MkWKde*&c?AvTimSaHK-T>Y_qm(2|q>|PO-oKsf(9B8>Jd{CP9~4#BH&H zOC%~i-F~Dgg=L+gXziGpXvuD#?sq-1ueMMgqh05x?T%s=*0$ulA zByzwJ0e!5?YEQ)+x7E060Y0L1f4luZum5ld)@rRzef?VC?5lG%QL3obUBy1_ug=TW z=lrF5TdqW2IGE4_!tL(eyXAYbh9|34^fIh^kPfIdr&L<)yS#5KU70zWITXqd&=n|Z zQWq-kSr@BuN>7i3x&Q=r`plUkVMf*S?H?ZY>N%W{J3oju!|pn%=Q^OEH`w1lJ6A#G zk^ggTkN=0RyH1kPz-LJCW?daCX;4}CSSyr6Yr5Z{;^V8Pw{KZVe}?Ri7Ot+Y?DDA80qcpTo5zE`sv}t1$vkr)0>q#bO753nKltZh zA7%vmnm+~mZ+6VwTwD>#PaWT`6cfC{Jiwk~7xIc*Mhzf=8SsAb zS@XGoOZnoI)wyU1&=#xf*wp6Cv<0?_e}(DjJ^<6#yWuk*4;QW@NKM}zN}0n+GIL%d`4e$VC0^Zj)lcTOGp0OlutXc}2nHSCDeuzw z&}wO+p`DLM{u0(>tB9}`D&V|HqK)|obg?U%P$GlS4_AcHOSbwH zh%?aHJ??sU8nvBHogZSfW2t7%fa+PJnkkoS*Q#qL+Kx2wd+bmNZfR-BzEJ2$#j;L|S)W-%-_?rluzYjIRDj(T!JOVO{B3OIOU^d(KwutGHvIhzhorE9#+7;34x;e{a?Qpsb+Ms z-d@Yj|6SY&OA`sNwPaS|NZ3DB!VFdh*x}~PlUpxe`MGJe8*PyQppDZ?i`UC@9c{^Q z`H8sot#^<`^wEycyuZZ5Fj4P5n7CMeu6Nu1Al zS-XSSpas9R{AYG9F=YBpjGiMkWh;K$X4TQNH8c%JL81=o!Ep30 zwss9W#?7xiDtq?7V&PgbLazGYoy(k`nVG4Pd{OC%i1EVoh;{F80jP~zeWa?EG5A97 z7Mb<>wJ%SrYg-l~Mu6_59MI!Vc&y#MYxnMja|H7%a}2vMH7$*TH_T5C3<$1WyB5c4 z&Lfi}h?M?}o0B#FuT+yFE5SyI3G>|in^yFqBXQi!`(rb!ZGZ1Rt3nYOr>wUatV z@%i%|Y2XI}%`>A}mlFL0w+lO?4-E9mV}!@>|MT#eyYiQmnYbb2kAxaJROIL9w}fS# z7nkTRAt4K}(Wqj_C{3wmTAdXL-qEeP>Jf&emnRLl_*%th%O9{%N=1^KxBL9Kuy$%O`eM1CV8}vC z-}uDDvQ-<>9j69sihM`w^I`-trdgjB{XC=g!C$?`*W$v_qs8dSPOGVjpeccz(dN1^ z0%9Pf^XU=4lHgkL(L6=*(>>EO-6TCmt27J(Ej{|^k~z~7VT&U!GRc| zy~yNQg!)3B$!gyyX5O+~DU4!RdTZv>41b{d`1(XW)ryeIkbNwq7eBrAWHiy!3C&Pu5o*odTGNb|)q3lm#8|F~=(314OS;iY174=xc`eMCKLiYG^ zEZKZHgw3CQcZBmKXlIOvdhVI$=cp=9G7xnX_x3gESr`v>6t8Qx$ZMS{PjE4NKRedt z->OsaV*ge(Gqv;ryrpzqTw`Z00 zMqba&4&}LPGgio9d!gI^cQ1e*nL0HfL>~yDML&DCsmR#CT|mRzoMxCGU8ZnkK-tM@ zAzmjdLM0@)?WC$|qD6Zy1dy5el9>3+%k}X($UqJNaz2eVw7I^%?(P?P0s;b3S3Vvb zv{Xrs2J(S!_4X@5qNavBC007L3Iylv-1 zl5D?h+ut>?^0Klv@&n)g&-*o4B`n6&byt7+?!mdUAjiegD$keK)z#IQwVjQ)zdgxF zG;_{>dE_qHV|HJg@6To5(WRSMZ|E+;UbHU={kXKbnc2p@7Yf|()c(EDA~IP<6kPhE<1j$dS7E?!6cC zLW4s-`R6V6Z1>krx>Okoy?x!fb*^39?e-Jz#C)9Io6CG}An%s$}loz?CW@aw)1CggfmR)(XghN0la}w*2BWcY`Tv#hI0%VRKy1BUvakk&0EAR+Oj8gQcSg)Ut^aAt86v-96hWm_LKdU?R44< zp`dJAL#P#RSY1DP>MeGrhpfHd^JUX@a_%e-VZ@Nk8FT|mN(57T#B2Rt^m4^KPNtCO zEtR$^oLxD8pY_pmNkVdHh2ZcDC>FR7YKmlUEVZ#V5Gra-HmXp9CXc%v*|vP6d}XU$ zI~DQGv2I;zN(v#TP7T&NO%KlvsF0gHeP^!GG`)RjN~N?%75(xq50_;3_-VzXPXrSI zy4a;>w_XNyx>-H;Y~|E1Aoe$a2LWfGXi=J)qBNAiLYbO38ad9>6{e?3@$3Kf+ILT% zK0OtwtmG2)F_J_b07TS9w}S7>KqjbmGo&Yw)u}ckyj0`;xLjdJ`5fIGbv>7<)MoRn z?gt8BH8Rk-4khH}Mnv>NZ84xkRK5-G*Qcg%6+550>#&vSc|S#L?}J)hm#JEQk6!?8YaNUh#gE0xy zgGs{id1tz|x}H+@U|joT$l$|AyVX%47du$V$1Dc=`}ue7oEucnYw|U|N*e zKW|j=`{nXa<)%YBne?m4qw`=pO#1nDBHn13(>}AOo={bmaOQ-z#kEz29VLyqtEinh z6Cv|WR9u`HXk^qRThKeWxRGxs1F;19xjS`y=AMxQt_)hb-5d4#9rcc3pIo@CfMUxo zkJ<&{YF@~7%(I4YUtr_8ez?yk(rJ>Ab4FL!6-d9;iIUU0!S)ZW2n-Qhc0}%ncbQK= zI4EBgjZh4z8nP%WO&aHWo$8YDi_Rm6?$VC0(QhN0rS!P-1>2*!r1$92!uhKEXF>*b z=}hDT79SI8ve9;*%As4-I|?Ef3hwNykeZmP*Hf{;emKT1PjJnH<-R?*e4afQhwEuS zl8-0Tqdy)dA7A)rw^&HHQwllIpFW)b{uvxM?P!p~j(9g^SR2jP<~8QM;(h71n|I;z zh6yG2g(UHxC++S(7y-d#3A*t`-eRv0f-}w|(#` zj5Xqlp1bj&nA}-7r0=&qX6$*jIH!6pN{n3bWpi`de0`n_I2Ih9kUc{n$>h` zE7Yla4tDm}DJdJRdxy0@=i@~l!@1);Tc>vqcAR>b;5rpkE|e#QzVg|#kA8s`G%%tK z4&$V;izxqBxcDkh$?EB;oz=Nl-n1Mwv z6lD++zTD*+t9WIkkk_GYmB+k%d3z;ys?*FU+*)}k7jSwQ{VPKKLO_2u{y3tJ!hrXX zHV!F$dPtAndy7N&PUt0cV^E%`?<`!|$`9gR7HmoN_p*(9!|$<*M@j@>xuy&83*Nn0 z6ofNVBEgXTt&C7J4Se(C)*}Vt#QXO4dsQI({SNd=^aUlGHK$Ha!?}X;v&yZg*x z)yeU4Arjn>w{G16iwA3?ZjR#=D0rd^u(f`9c*}eD`_j%vgu(9*XB-@Gy=R-z*+sro z#6L|XCta?68Lr?DthA^Cn6x)57u#7#^L2l%x*qb%@G|9c*0G&scK_8o_ti64R$#aP zzbFlqcAMYpz=P)ua>iY8Nyq!AlDGo|GN9uPsN~VT|g+Y6`wu~noX?bE|LjMoD6Txl~3?;CJ1)P)5WN$#t0shT8_vU&{ z8{7kCE$N9F84hq@K&>XB;G)OdSkCYOY5L{1*KnU#IsK1z!rIcw=fcG5NXQ-w(ad#r zAggrL7%&W!f81Y&^YEa7b`lIfcPZ(*g_Bt(iiFD`oFkJort1MGCLIGQFHFAocI+9Bv6DBFs zD!TRPJ!iV5R^_6^l}!u_8qtQJy5G21O_h5cKJlwLh81Fod79n#9Y(8 zVaHOYpc-2Hd>T*gKo4<&f%JyiMeAiVGXnk5r^$29AL$QsI(d(h$77a2_BeF{CWgP{ zA%2gh=4QK*CQ+C9$;o&m6L<_q+Ve|W@onRx?Z zgc)Mr#RB1VIJ3l(|2UZbXX6QpOU{G#xW0tth&R_Ge}6H+MHmNO*r7fPj`h{WX>ok9 zg_;W(p&d(yWTs4_PNGW-22@dzo~rQ{YZC`Q0)=ajM<@z@^7{iOFa-=iSLNmXQct90 z#nC9kQ2@(IcX#(;RW)5*S~F;=ViL`A7qgb8=6isGfPF?qpO^2>$o8XA^;Nn=&6u-wLwc0lOgEt!XgCB$nm|u$@y={1r$f3 z>VD-HcpV=UjBWERRa9J$BXZ-nu80#`?w1r?fyVhNM%rn*s+=Wq` zQtqo)uh2juk;SMdw4u`{97v-T)s2mu3oZEiB#l2L$;UTd!6!9X6D`(qA&%RKklOSJ?S{TXzv7>(x*tN^!cV~yc7esEwV5vEf4}wBM?U^#09Le}nX~&uG{ru=FjZJlc4tklh^w#QB-eUV zn}^dA#ol5%f<37%PEO?uW3xkTGt$xtGYd9OtS(lg864kkC%o6+AO9?&9%Ke8i+a5z zA2e3hXr>8-dgNK~67Uia(=Ndw4sjcCh>;)6raX)f#cHo;`1E=>JUMxy$s|E~rp3BG zPRkCll?`|fEYOE=G)J4vFcJ|HNme~&i2l|rJ0g$6wF2|GqJlAwvvh~_wJTs%y}iBJ zb|{uqRQQBOVL0Ljs|+#nvSqc*bb~&&m@7;}Vf@(bm(9#{k}rA_r~FfT)wEwF%zWGK zFJ(Kf@YzAEdi3Z~ga^3D2dwbj4r9~?Lo)-r2w9WKU{KDm4Q(*dd3uDR^GHccQ+Xn? zbM8dvG*n+;1Wb?s;}u-K@I2VsPB(1YD{R_eoODTDUA>7ISh`n! zA+aG^`G(;ZwureE9r$`;z=>cFX4=W*3kJvvl^lJ`*-)mrTr7hLYtNep?+@AouY>V| z9fr z|Il0!R4;~?s!kG)g>Mv8HW4)N8jJ6hoY`DX0#D&HV2)Jv^ynYtScyL4_3KFjR-#9# z{`#4^wA|Vmx9jgi2(!$baWv$sgPI0|o{U^!`R!+bdkEifaQWw!{N<`iPs1HP4+H|SEksgXnhPa{|Ys;HFr0^w(XUr$v{twvvp$0vkLn*;1D zy$_l}qz?D|9252mLByf;HOI<=9fFqI%6r+wBn!+Ehrro;@tQbTP{!*V!>iEcVV;4N zRl>6Ku#X#py6Eo4z<4YZ(+l~gZwWAlrLP>48?(=bSy<;5{^6LXsdL#SDV}z4jTqEH zYmLraJwew6d%T*arfYE_@oaA&Y^*?g8FMW zIq#(cB4d^jV}Pzi270h`^XgoH+$Bqvz&+F`M99V`_qPcjz&sVVdHVC%*x2OcWgb^__P!*1* zv@KEpD6;a58;{d)B5b=P+H999J5nJ$>jaR&9LAUW@nU2}2i(|!fr0)48djL08tsA# zgm{1%U*Rs){Qp{RUI-FS&CBRZ^ms@Z4TCZX*!Ezndo%h}1$9RG+td{z>8a%DAD|~ z7Vl-^i1t#t+S)<4h`sV+kHR&=3oS1%kE}=-9KohyPbn{)`n)Scgs>|=-ub#K%Zo&B zVj>LErwT?GKTGg+33}~SRpZbqC#k1UQZycOBejm=Q;`Q&`nfAU_CAOx#?Sq99YmX& z8i5kg#youV$ng0AoJJ1UO`(VoxV_osflWSV=BiEK&jsFj!o;*Hns_ciKEP(=vuDq; zv!xcoaV5vfinNXxy?bH<=O~T?@bfXch6+yQ$@x_yyxv#wf7zW|N!YE*^o3!PCI1lbw{T~d1Y{UGJ(K7szt~J(r z7A|%A!HCcM-Rdv@EqRtV4(HcWr&T#6<>i&`mbaynIYSe_{AZQAf0{l*E4J{b+q^Q` zTjG~0~n{@(WCvbEE_Ge?-9&V!?02_@c;u#0Lw~d|` z!Ctr@LP{|&8EpZ81FAL5+ydI^Kd}&-O8k*m$mZex{!8ZO!D1G=RxctVE@IvbzOvu0 z5=ngi-q=BVj5@&x0Gf3B(KTr^BhCH;Rg9g~Wx*-U5NKgDRlbWkKzUVmpW+4D8)S1Y zWv@4#0e{>x{35Ltw`=1tXHfVVYW=y2j{+%!e*Bq+ulQsy3-d5bN=iCyQF!b@>x#B91ub@Tg_naUS=?Xt&^nYm$6#a?TfR&T=CPuR0@j}m4dLK__ zfNBYn%^;KTZMu{c&8&{cASeWS41X5F2}?W^0&+S=`D39+$?6DO;89nHL7CURT5FF7Mh?J}x_DV`KS zr?%JQUK*qE#!SBBY=;}6l^x}A=;m&pJ%V0v#(QSCaROc}Q#7p9Cr74xO7c%RZ|t$+ zb2_%*agtO+Oqec0#CD=nXA*ErFgk(#eE0Up^1Q4K8cw^a*K4|6H;v~n-mkQ^a8gE*fJzgM};d{#I-$mqna>nbwg3g|AG* zR$x=;8q#nd{*o4iS$HrI54I~P2Z>j9JtqhX5{cxHh9(%cCiiC4GK8#j^^}1E&VI^x z#dG59qwBf$UN}6Hh5fS;D9Ycip{a@B)_JM@M}J?DkR$JHliXe>@K0^T#vh9aG=Bm@ z#@|l(rY^0ur=;mr$Pv2?Xa162kCO?fwY8mrE4y3mrGmxZ1^O9x-)R{*!V7y#>Kf*O zatHztPxzFcJOmPK!?yb+Z37rSEZNCu8ZpZR&yagFqlrtW?_R$_qRP7_(y})tX-A;v zpn4pf#CQxtJ7KLYyg=yl#FJ};EGA;~s4ri<=*Hb0trtlWI=U`+Uc@TZSNesEd^F_~ zD|z-U9yI~~VwvZj%qZND1=zBnSJe&4SkE!mz~$W07uquH2G;V?^_g_qf}Z0*_%dGS zPneSib2K-FAx!vjw&+xs{FqVgT?2nv?B>-~{sm-N8+u4&0e4x~*z7N9ik0x^!69r% z$(h+PTGTa$rxomwVLb=P4%$`*o}6E&gO=c$t|@ITmJE3(KNV9)m_G?W&xna$3^>uz zj6P79wfZ-}VY_ORQ2^gHpfLww!uqo)OznD zpR~%G;MA!J5cxC;!F(Vh5T=2anwm*iJ^EnP(uOm8W@V~*t0RoOl9cRy5)Vvrl(=GV zv8K}{noD`!JIjA(QVD%9D>IYerwZJD(1jxiv7d{%CrwRF!e`kcFr!CnU0K&uvG`LU zF4HUi(yy%x-M%WsOgrWnt=?Q;0xD5E^Qtk(A;Rj3+g^Capz)kdSg~(a*CD1udmA|R zKB$Im#+Tp2cC;m6!yGijFn&jnS6E5EMM2FRM;l(P;LCm1eeXx6F7#j=GU~+(gPyWS zE{XzUqjzArF*sOWmi}h2h*M^#TqxtB>1X(2wbJ&GNOU|j#L4Of`gn|l5NhBq*dO~e zemcvdqE5Gt^py^p^H^FJT3};|2k?~MFK8zt>uOsW9LrwJ;*L!T>98;!<^4f8GxVAb zrMuJ@-1q>-c-cajYA{EQXR*MYvWdrs)s)L+|G5t<&WJfm?QBhxsMXsM`)wT2ng*btMl+cNWY3Dn6nZcyx8pL~VY4zwqScJ18xvsX5r z!-9!rJ@Q0g`wL-jS$Z7LC!tTAd!%%z6;G9?fBIMyeBKkDfC?^sz?50yPf;@jhK+$wpX=~*e7SwL|78WSV>6etfZD~2kTC@Uyj_}FgFoGcSdTr z$fMehx8`NEH&h=_oG_*w@!{LvT7Kcq`r*UJ;{(C)!3OPXhj&c_ZP3i;h-j-;A&n$b z{po!JaL|MOO^3fqIasQ3CKfahSRy0_zxhK+0w`&nBDc>FC5pV?A@!S5Yn3wR(5o<)U6Fg!vi-q9Yqz3*nnYGw&r7#o_q|(Df*}mOkGpjc;U;77-D-YGXr~9*LlUrCl9$2Q`<_1YkrR z(7p7e=a`tXr1$fNInzCZuTwyl5zp=L<|VnJJP}r2%ukKsX+TK}%iTah0-(K4OPgu1 zHlNTw+w>e-ndT cL;rU3j%;yCuB;lqi|J>1<-_rZ&Rze%0BY3SlmGw# literal 0 HcmV?d00001 diff --git a/docs/assets/scoring_truncated_og_cdf.png b/docs/assets/scoring_truncated_og_cdf.png new file mode 100644 index 0000000000000000000000000000000000000000..5667c5c0dd5026c864480d15b301db140238d8f6 GIT binary patch literal 18135 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 bHVDs#=a0y^+q1#{aHQ|b-^ms?eDr?+VCdvY literal 0 HcmV?d00001 From 681de116c62ee458b8e874021d72739ce4d9928a Mon Sep 17 00:00:00 2001 From: Conor Okus Date: Mon, 10 Feb 2025 11:06:20 -0500 Subject: [PATCH 3/3] Adds images --- docs/_blog/ldk-pathfinding.md | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/docs/_blog/ldk-pathfinding.md b/docs/_blog/ldk-pathfinding.md index 7eaa9b2c1..efa37bd74 100644 --- a/docs/_blog/ldk-pathfinding.md +++ b/docs/_blog/ldk-pathfinding.md @@ -1,7 +1,7 @@ --- title: "Pathfinding with LDK" -description: "..." -date: "2025-01-28" +description: "Learn how LDK built the most advanced pathfinder in the Lightning Network" +date: "2025-02-10" authors: - Matt Corallo tags: @@ -16,7 +16,7 @@ Most pathfinders today owe much to [Rene Pickhardt’s observations](https://arx For example, if the lower-bound on a channel’s liquidity is 500,000 sats, and the upper bound is 1 million sats, and we wish to pay 750,000 sats, we’d assign a success probability of 50%. If instead we’re trying to send 600,000 sats, we’d assign a success probability of 80% $((1,000,000 - 600,000) / (1,000,000 - 500,000))$. The resulting cumulative probability density function (CDF) is shown in the below chart. -[assets/scoring_initial_rene_cdf.png] +![Scoring Initial Rene](../assets/scoring_initial_rene_cdf.png) This model has served lightning pathfinders well for quite some time, but ultimately suffers from a number of issues in practice. First of all, we must somehow slowly decay the bounds we store for each channel. After all, over time liquidity in channels moves around and whatever hard upper- and lower- bounds we had may no longer be correct. In practice, in LDK we found that for most rates of bounds decay we picked, we were decaying both too fast and too slow. We’d find that one failed payment across a channel we regularly use (i.e. that generally has sufficient liquidity for us, but where they didn’t only for a very short period of time) would cause us to avoid a great channel for much too long. At the same time, we’d find that we’d much too regularly retry channels that rarely if ever succeeded at all. While more complex strategies around decay tuning are certainly possible, the same issues would ultimately apply, just somewhat less frequently. @@ -24,32 +24,32 @@ Instead, LDK decided to attempt a radically different direction, trying to learn In the first version, LDK’s historical model simply stored 8 buckets for each histogram - when we first sent an HTLC over a channel and saw it fail, if the lower-bound was in the lowest octile and the upper-bound was in the second-to-highest octile, we’d increment the lower bucket in the lower-bound histogram and the second-to-highest bucket in the upper-bound histogram, leaving us with the histogram below. We’d then calculate the success probability of sending a payment that is half the channel’s capacity by looking at the only bucket pair with data - the (0, 6) pair, and calculate the probability as $((0.875 - 0.5) / (0.875 - 0))$. -[assets/scoring_initial_histogram.png] +![Scoring Initial Histogram](../assets/scoring_initial_histogram.png) As we learn more about the channel over time, more buckets start to fill. For example, if we later failed to send an HTLC in the third-to-highest octile, and then successfully sent an HTLC in the second octile, we might have the below histogram (note that the values in our histogram decay with new data, rather than over time, and thus the older data has been slightly decayed). We then calculate success probability by iterating every min- and max-bucket pair using the same PDF and weighting by the bucket values. For example if we’re again attempting to send 50% of the channel’s total liquidity we’d sum each `max-bucket weight * min-bucket weight * (upper edge of max-bucket - 0.5) / (upper edge of max-bucket - lower edge of min-bucket)` and then divide by the total `max-bucket weight * min-bucket weights`. In the example below (with min-bucket weights 61, 32 and max-bucket weights 31, 30, 32) we get a probability of ~3852.6 / 8649, or roughly 44.5%. The actual LDK probability estimation is somewhat more complicated and handles a few degenerate cases better. -[assets/scoring_second_histogram.png] +![Second Scoring Histogram](../assets/scoring_second_histogram.png) Around the same time LND was playing with a slight variation on Rene’s original model. Fundamentally, Rene’s model works on the basis of assuming a flat PDF for the liquidity across a channel’s capacity. In other words each potential liquidity split between a channel’s two participants is equally likely - an even split is just as likely as the liquidity being more on one side than the other. This doesn’t match the lightning network in practice, however; after all, many nodes send more payments than they receive, or vice versa, and many channels are opened and never see much use at all. Instead, LND proposed what they call their [“bimodal” model](https://lightning.engineering/posts/2024-04-11-pathfinding-1/). This model assumes liquidity lies at a fixed percentage (configurable between 75% and 99%) between the tracked upper- and lower-bounds on a channel’s liquidity. As the amount we’re trying to send approaches and passes this fixed percentage, the calculated payment success probability drops precipitously, but remains rather high before that. LDK took inspiration from this, noting that we don’t know which side opened a channel and thus, absent a history of attempted payments across a channel, there’s no reason to think the liquidity in that channel is more to either side. LDK thus updated the core PDF from the original flat to a polynomial which assumes higher probability that liquidity lies on either end of the channel. Specifically, LDK as of October, 2023 assumes that the probability that the liquidity in a channel lies at any given point can be described by $12 \cdot (x-0.5)^2$ (for an x representing liquidity normalized to between 0 and 1, the channel’s capacity, the CDF is charted below). This gives us a probability of around 50% that the channel’s liquidity lies either within the first or last 10% of the channel’s capacity. From there we can calculate our success probability the same as above, but ignoring any parts of the channel’s liquidity that lie outside our tracked upper- and lower-bounds. -[assets/scoring_og_nonlinear_cdf.png] +![Scoring OG Non Linear](../assets/scoring_og_nonlinear_cdf.png) For example, if we believe a 1 million sat channel’s liquidity lower-bound is 500,000 sats, and its liquidity upper bound is 1 million sats, when trying to send an HTLC of 750,000 sats, we’d calculate its success probability as $\frac{\int_{0.75}^1 12 \cdot (x-0.5)^2dx}{\int_{0.5}^1 12 \cdot (x-0.5)^2dx}$ (recall that to get the CDF from a PDF we integrate over the range we care about). This gives us a success probability of 87.5%, much higher than our earlier 50%! This is because once we learned that the liquidity in a channel was not close to 0, we immediately assumed it must be closer to 1 million sats than 500,000, because our PDF says so. The resulting PDF after learning a lower-bound of 500,000 is charted below, note that it is simply the original PDF with the bottom half chopped off, scaled back up to 1. -[assets/scoring_truncated_og_cdf.png] +![Scoring OG Truncated](../assets/scoring_truncated_og_cdf.png) At the same time, LDK also updated its historical model to provide substantially more granularity. Instead of only storing 8 evenly-sized buckets in our histograms, we started storing 32 variable-sized buckets, each representing different size ranges in liquidity bounds. The first bucket is only updated when the liquidity bounds of a channel is in the first 1/16,384th of the channel’s capacity. The second bucket represents liquidity bounds within the 2nd and 3rd 1/16,384th of the channel’s capacity, the third bucket the 4th, 5th, 6th, and 7th, and so on. This lines up roughly with our initial PDF of $(x-0.5)^2$ - if we assume that it's much more likely for a channel’s liquidity to be sitting near the edges, we should have much more resolution near a channel’s edges, giving us an equal probability of ending up in any given bucket and allowing us to calculate accurate probabilities when sending amounts that are much, much smaller than a channel’s capacity. The tradeoff is we cannot as accurately calculate success probabilities when sending amounts that are a large portion of a channel’s capacity, but such HTLCs aren’t particularly likely to succeed in any case. A real histogram might look like the following (pulled from a running LDK node). There is a line all the way on the right of the bottom chart up to 4,177, it's just less than a pixel wide as the buckets on the edges get much too small to display proportionally! -[assets/scoring_real_histogram.png] +![Scoring Real Histogram](../assets/scoring_real_histogram.png) This design has worked quite well, somewhat accurately predicting successes and failures when pathfinding through the lightning network. In practice, LDK’s pathfinding wasn’t always the most successful as it defaulted to preferring lower-fee paths rather than more successful paths, but with LDK 0.1 we changed the default tuning to prefer higher-success-probability paths more strongly. At the same time, we utilized our new past-probing data to better tune the ratio between successes and failures, as well as tweaked the PDF to maximize predictive ability, giving us $128 \cdot (\frac{1}{256} + 9 \cdot (x-0.5)^8)$ (the resulting CDF is shown below). -[assets/scoring_modern_nonlinear_cdf.png] +![Scoring Modern Non Linear](../assets/scoring_modern_nonlinear_cdf.png) -The bottom diagram shows the results of our simulation run - breaking down results by hops that succeeded and ones that failed and showing cumulatively how often (on the Y axis) we assigned different success probabilities (on the X axis). In total, our changes give us a result which is the equivalent, on log-average, of returning a 67% success probability for channels that ultimately succeed and a 33% success probability for channels that ultimately fail (this being a log2-loss score of -0.58; a measurement of how often and by how much we’re wrong, with the best being 0 and -1 being the equivalent of always returning 50/50). +The bottom diagram shows the results of our simulation run - breaking down results by hops that succeeded and ones that failed and showing cumulatively how often (on the Y axis) we assigned different success probabilities (on the X axis). In total, our changes give us a result which is the equivalent, on log-average, of returning a 67% success probability for channels that ultimately succeed and a 33% success probability for channels that ultimately fail (this being a log2-loss score of -0.58; a measurement of how often and by how much we’re wrong, with the best being 0 and -1 being the equivalent of always returning 50/50). -[assets/scoring_results.png] +![Scoring Results](../assets/scoring_results.png)