keep number of pieces for linearization constant

see #10
This commit is contained in:
Carsten Otto
2022-03-27 19:41:25 +02:00
parent 37cd0e88e2
commit 5c8f0a0dea
2 changed files with 19 additions and 8 deletions

View File

@@ -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<EdgeWithLiquidityInformation> edgesWithLiquidityInformation) {

View File

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