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 ac2b279f..0ef3509d 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 @@ -8,7 +8,6 @@ import de.cotto.lndmanagej.pickhardtpayments.model.EdgeWithLiquidityInformation; import de.cotto.lndmanagej.pickhardtpayments.model.EdgesWithLiquidityInformation; import de.cotto.lndmanagej.pickhardtpayments.model.IntegerMapping; -import java.util.Comparator; import java.util.Map; class ArcInitializer { @@ -39,7 +38,7 @@ class ArcInitializer { } public void addArcs(EdgesWithLiquidityInformation edgesWithLiquidityInformation) { - Coins maximumCapacity = getMaximumCapacity(edgesWithLiquidityInformation); + Coins maximumCapacity = edgesWithLiquidityInformation.maximumCapacity().maximum(ASSUMED_MAXIMUM); for (EdgeWithLiquidityInformation edgeWithLiquidityInformation : edgesWithLiquidityInformation.edges()) { addArcs(edgeWithLiquidityInformation, maximumCapacity); } @@ -86,15 +85,6 @@ class ArcInitializer { return piecewiseLinearApproximations - 1; } - private Coins getMaximumCapacity(EdgesWithLiquidityInformation edgesWithLiquidityInformation) { - Coins realMaximum = edgesWithLiquidityInformation.edges().stream() - .map(EdgeWithLiquidityInformation::edge) - .map(Edge::capacity) - .max(Comparator.naturalOrder()) - .orElse(Coins.NONE); - return realMaximum.maximum(ASSUMED_MAXIMUM); - } - private long quantize(Coins coins) { return coins.milliSatoshis() / 1_000 / quantization; } diff --git a/pickhardt-payments/src/main/java/de/cotto/lndmanagej/pickhardtpayments/model/EdgesWithLiquidityInformation.java b/pickhardt-payments/src/main/java/de/cotto/lndmanagej/pickhardtpayments/model/EdgesWithLiquidityInformation.java index 0809b317..acff4649 100644 --- a/pickhardt-payments/src/main/java/de/cotto/lndmanagej/pickhardtpayments/model/EdgesWithLiquidityInformation.java +++ b/pickhardt-payments/src/main/java/de/cotto/lndmanagej/pickhardtpayments/model/EdgesWithLiquidityInformation.java @@ -1,17 +1,26 @@ package de.cotto.lndmanagej.pickhardtpayments.model; +import de.cotto.lndmanagej.model.Coins; + import java.util.Arrays; import java.util.Collection; import java.util.List; -public record EdgesWithLiquidityInformation(List edges) { +public record EdgesWithLiquidityInformation(List edges, Coins maximumCapacity) { public static final EdgesWithLiquidityInformation EMPTY = new EdgesWithLiquidityInformation(List.of()); public EdgesWithLiquidityInformation(Collection edges) { - this(edges.stream().toList()); + this(edges.stream().toList(), getMaximumCapacity(edges)); } public EdgesWithLiquidityInformation(EdgeWithLiquidityInformation... edges) { this(Arrays.stream(edges).toList()); } + + private static Coins getMaximumCapacity(Collection edges) { + return edges.stream() + .map(EdgeWithLiquidityInformation::edge) + .map(Edge::capacity) + .reduce(Coins.NONE, Coins::maximum); + } } diff --git a/pickhardt-payments/src/test/java/de/cotto/lndmanagej/pickhardtpayments/model/EdgesWithLiquidityInformationTest.java b/pickhardt-payments/src/test/java/de/cotto/lndmanagej/pickhardtpayments/model/EdgesWithLiquidityInformationTest.java index 38dbf400..56c58cc7 100644 --- a/pickhardt-payments/src/test/java/de/cotto/lndmanagej/pickhardtpayments/model/EdgesWithLiquidityInformationTest.java +++ b/pickhardt-payments/src/test/java/de/cotto/lndmanagej/pickhardtpayments/model/EdgesWithLiquidityInformationTest.java @@ -19,4 +19,21 @@ class EdgesWithLiquidityInformationTest { EdgeWithLiquidityInformation edge2 = EdgeWithLiquidityInformation.forLowerBound(EDGE_1_3, Coins.ofSatoshis(10)); assertThat(new EdgesWithLiquidityInformation(edge1, edge2).edges()).containsExactly(edge1, edge2); } + + @Test + void maximumCapacity_empty() { + assertThat(EdgesWithLiquidityInformation.EMPTY.maximumCapacity()).isEqualTo(Coins.NONE); + } + + @Test + void maximumCapacity() { + Coins largerCapacity = Coins.ofSatoshis(100); + Coins smallerCapacity = Coins.ofSatoshis(10); + EdgeWithLiquidityInformation edge1 = + EdgeWithLiquidityInformation.forUpperBound(EDGE.withCapacity(largerCapacity), largerCapacity); + EdgeWithLiquidityInformation edge2 = + EdgeWithLiquidityInformation.forUpperBound(EDGE_1_3.withCapacity(smallerCapacity), smallerCapacity); + + assertThat(new EdgesWithLiquidityInformation(edge1, edge2).maximumCapacity()).isEqualTo(largerCapacity); + } }