<html><head><meta http-equiv="Content-Type" content="text/html; charset=utf-8"></head><body style="word-wrap: break-word; -webkit-nbsp-mode: space; line-break: after-white-space;" class="">Hi,<div class=""><br class=""></div><div class=""><blockquote type="cite" class="">In code this looks like this:<br class=""><br class=""><a href="https://github.com/lightningd/plugins/pull/246/commits/2dbff662f712c7883169e7557f5170e356c942e8" class="">https://github.com/lightningd/plugins/pull/246/commits/2dbff662f712c7883169e7557f5170e356c942e8</a><br class=""></blockquote><div><br class=""></div><div><div>Interesting! So if I understand this routine correctly, this finds a path with the least number of hops, and in the subset of paths of that length, a path with <i class="">high</i> msat (likely just the one with the <i class="">highest</i> msat in practice).</div><div><br class=""></div><div><div>I suppose it's not surprising that pathfinding's O(maxhop*(N log)) isn't the bottleneck for most practical usage, but to add to ZmnSCPxj's comment, if I'm not mistaken, I think we can redefine the edge weights in the graph and run the equivalent of your subroutine in a single pass of dijkstra. For instance, we can treat edge weights as a pythonic tuple of (hops, msat) and use the usual lexicographic comparator in one pass of dijkstra to get an equivalent route. I suspect the code I had would also produce pretty similar routes (although, I bias for smaller channels by a log(channel size) factor).</div><div><br class=""></div><div><blockquote type="cite" class=""><blockquote type="cite" class="">In any case, I know Rusty has (had?) plans to publicly publish the<br class="">routemap on-disk format, so that plugins can directly look at the<br class="">on-disk routemap and implement specifially-optimized routing<br class="">algorithms, what has happened to those?</blockquote></blockquote><br class=""></div><div>That sounds like a very powerful tool :) While I'm not sure about the details, another user-friendly way to support pathfinding customisations could be to allow plugin developers to implement their own edge weight functions and let c-lightning handle the actual pathfinding bulk of it. I imagine it would also be more efficient resource-wise as the plugin would only need to evaluate the edges used by pathfinding then. In practice, however, I'm not sure if it's easily possible to support customised edge weight functions via the current interface. Having a back-and-forth with plugins about every edge doesn’t sound like a fun coordination problem, anyway.</div></div><div class=""><br class=""></div><div class="">Thanks.</div><div class=""><br class=""></div></div><div><blockquote type="cite" class=""><div class="">On 31-May-2021, at 3:55 PM, <a href="mailto:michael@schmoock.net" class="">michael@schmoock.net</a> wrote:</div><br class="Apple-interchange-newline"><div class=""><div class="">Hm,<br class=""><br class="">I will make measurements how much the spent time in route finding is<br class="">using my modification towards trying these routes.<br class="">Im running on a Raspberry PI and still don't have a big issue with computational time.<br class=""><br class="">Pretty sure on decent machines its faster to try short/bigger routes first<br class="">for all the I/O between the nodes along the routes takes more time than<br class="">pre-filtering the routes using maxhops/msatoshi iterations...<br class=""><br class="">maybe we can have a quick chat this evening in the dev meeting<br class=""><br class="">Michael<br class=""><br class=""><br class="">On 2021-05-31 11:55, ZmnSCPxj wrote:<br class=""><blockquote type="cite" class="">Good morning Michael,<br class=""><blockquote type="cite" class="">Hi,<br class="">I'm currently thinking about the same issue while I'm polishing the<br class="">rebalance plugin.<br class="">My current thoughts on that: This should probably not be done by<br class="">changing the getroute<br class="">code but by the one that is using getroute in a way like for example:<br class="">-   Start trying shorter routes first via "maxhops" parameter.<br class="">-   In the first iteration use a lot higher "msatoshi" value than needed,<br class="">    for example by a factor of 4 times bigger.<br class="">-   When you get "route not found errors" decrease the msatoshi factor and<br class="">    retry getroute.<br class="">-   When you reached a msatoshi factor of 1 (neutral) and still run into<br class="">    "route not found": increase the maxhops paramter by 1 and reset the<br class="">    msatoshi factor to 4 again for the next interation.<br class="">-   Repeat the loop until maxhop reached i.e. 10<br class="">    Something like this. I'm still fiddling with the details.<br class="">    Just my two Satoshi...<br class="">    Michael<br class=""></blockquote>No comment on the overall "biasing" as yet, but --- note that the<br class="">underlying algorithm of `getroute` is Dijkstra pathfinding algorithm,<br class="">O(n log n) on length n.<br class="">With the above algorithm, the time complexity becomes O(n ^ 2 log n) i<br class="">think --- you iterate from `maxhops` 1 to the final length `n`, and<br class="">each `getroute` takes O(n log n).<br class="">Actually it may be worse in practice, by my memory, `maxhops` does not<br class="">limit the work done, it just forces `getroute` to repeat the<br class="">algorithm, though this may have changed.<br class="">In any case, I know Rusty has (had?) plans to publicly publish the<br class="">routemap on-disk format, so that plugins can directly look at the<br class="">on-disk routemap and implement specifially-optimized routing<br class="">algorithms, what has happened to those?<br class="">Regards,<br class="">ZmnSCPxj<br class=""></blockquote>-- <br class="">c-lightning mailing list<br class=""><a href="mailto:c-lightning@lists.ozlabs.org" class="">c-lightning@lists.ozlabs.org</a><br class="">https://lists.ozlabs.org/listinfo/c-lightning<br class=""></div></div></blockquote></div><br class=""></div></body></html>