move computation of largest channel into cached object

This commit is contained in:
Carsten Otto
2022-04-02 15:55:28 +02:00
parent 267dd3cb1d
commit ae503aff97
3 changed files with 29 additions and 13 deletions

View File

@@ -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;
}

View File

@@ -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<EdgeWithLiquidityInformation> edges) {
public record EdgesWithLiquidityInformation(List<EdgeWithLiquidityInformation> edges, Coins maximumCapacity) {
public static final EdgesWithLiquidityInformation EMPTY = new EdgesWithLiquidityInformation(List.of());
public EdgesWithLiquidityInformation(Collection<EdgeWithLiquidityInformation> 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<EdgeWithLiquidityInformation> edges) {
return edges.stream()
.map(EdgeWithLiquidityInformation::edge)
.map(Edge::capacity)
.reduce(Coins.NONE, Coins::maximum);
}
}

View File

@@ -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);
}
}