diff --git a/pickhardt-payments/src/main/java/de/cotto/lndmanagej/pickhardtpayments/ArcInitializer.java b/pickhardt-payments/src/main/java/de/cotto/lndmanagej/pickhardtpayments/ArcInitializer.java index 9fb03802..c398f545 100644 --- a/pickhardt-payments/src/main/java/de/cotto/lndmanagej/pickhardtpayments/ArcInitializer.java +++ b/pickhardt-payments/src/main/java/de/cotto/lndmanagej/pickhardtpayments/ArcInitializer.java @@ -46,17 +46,20 @@ class ArcInitializer { int endNode = pubkeyToIntegerMapping.getMappedInteger(edge.endNode()); long quantizedLowerBound = quantize(edgeWithLiquidityInformation.availableLiquidityLowerBound()); - addArcForKnownLiquidity(edge, startNode, endNode, quantizedLowerBound); + int remainingPieces = addArcForKnownLiquidity(edge, startNode, endNode, quantizedLowerBound); + if (remainingPieces == 0) { + return; + } Coins upperBound = edgeWithLiquidityInformation.availableLiquidityUpperBound(); long quantizedUpperBound = quantize(upperBound); long uncertainButPossibleLiquidity = quantizedUpperBound - quantizedLowerBound; - long capacityPiece = uncertainButPossibleLiquidity / piecewiseLinearApproximations; + long capacityPiece = uncertainButPossibleLiquidity / remainingPieces; if (capacityPiece == 0) { return; } long unitCost = quantize(maximumCapacity) / uncertainButPossibleLiquidity; - for (int i = 1; i <= piecewiseLinearApproximations; i++) { + for (int i = 1; i <= remainingPieces; i++) { int arcIndex = minCostFlow.addArcWithCapacityAndUnitCost( startNode, endNode, @@ -67,12 +70,13 @@ class ArcInitializer { } } - private void addArcForKnownLiquidity(Edge edge, int startNode, int endNode, long quantizedLowerBound) { + private int addArcForKnownLiquidity(Edge edge, int startNode, int endNode, long quantizedLowerBound) { if (quantizedLowerBound <= 0) { - return; + return piecewiseLinearApproximations; } int arcIndex = minCostFlow.addArcWithCapacityAndUnitCost(startNode, endNode, quantizedLowerBound, 0); edgeMapping.put(arcIndex, edge); + return piecewiseLinearApproximations - 1; } private Coins getMaximumCapacity(Collection edgesWithLiquidityInformation) { diff --git a/pickhardt-payments/src/test/java/de/cotto/lndmanagej/pickhardtpayments/ArcInitializerTest.java b/pickhardt-payments/src/test/java/de/cotto/lndmanagej/pickhardtpayments/ArcInitializerTest.java index 3cddabef..86c6e424 100644 --- a/pickhardt-payments/src/test/java/de/cotto/lndmanagej/pickhardtpayments/ArcInitializerTest.java +++ b/pickhardt-payments/src/test/java/de/cotto/lndmanagej/pickhardtpayments/ArcInitializerTest.java @@ -108,6 +108,13 @@ class ArcInitializerTest { @Test void adds_uncertain_liquidity_as_second_arc() { + ArcInitializer arcInitializer = new ArcInitializer( + minCostFlow, + integerMapping, + edgeMapping, + QUANTIZATION, + 2 + ); arcInitializer.addArcs(Set.of(edgeWithLiquidityInformation)); assertThat(minCostFlow.getUnitCost(1)).isEqualTo(1); assertThat(minCostFlow.getCapacity(1)).isEqualTo(75); @@ -123,7 +130,7 @@ class ArcInitializerTest { 5 ); arcInitializer.addArcs(Set.of(edgeWithLiquidityInformation)); - assertThat(minCostFlow.getNumArcs()).isEqualTo(6); + assertThat(minCostFlow.getNumArcs()).isEqualTo(5); } @Test @@ -159,7 +166,7 @@ class ArcInitializerTest { integerMapping, edgeMapping, 10, - QUANTIZATION + 2 ); arcInitializer.addArcs(Set.of(edgeWithLiquidityInformation)); // one arc for the known liquidity (25 / 10 = 2), 100 / 10 - 2 = 8 remaining @@ -173,7 +180,7 @@ class ArcInitializerTest { integerMapping, edgeMapping, 20, - 5 + 6 ); arcInitializer.addArcs(Set.of(edgeWithLiquidityInformation)); // one arc for the known liquidity (25 / 20 = 1), 100 / 20 - 1 = 4 remaining: 4 < 5, no additional arc added