diff --git a/src/main/java/fucoin/actions/aggregation/AggregationContext.java b/src/main/java/fucoin/actions/aggregation/AggregationContext.java index df216a15ec21d70c366cc2c3e620cb6db0035df3..43326be35442f9f66cd7e8b51290d0d8a07aaf5a 100644 --- a/src/main/java/fucoin/actions/aggregation/AggregationContext.java +++ b/src/main/java/fucoin/actions/aggregation/AggregationContext.java @@ -39,21 +39,26 @@ public class AggregationContext implements Serializable { public AggregationContext aggregate(AggregationContext neighborContext) { double[] aggregatedValues = getFunction().apply(neighborContext.getValues(), getValues()); - AggregationContext aggregatedContext = new AggregationContextBuilder(getFunction(), getValueExtractor(), getAltValueExtractor(), - aggregatedValues, resultExtractor) - .setCurrentExchanges(getCurrentExchanges() + 1) - .setMaxExchanges(getMaxExchanges()) - .setUuid(getUuid()) - .build(); + AggregationContext aggregatedContext = new AggregationContextBuilder(getFunction(), aggregatedValues) + .setCurrentExchanges(getCurrentExchanges() + 1) + .setValueExtractor(getValueExtractor()) + .setValueAltExtractor(getValueAltExtractor()) + .setMaxExchanges(getMaxExchanges()) + .setUuid(getUuid()) + .setResultExtractor(resultExtractor) + .build(); System.out.println("Aggregation: " + Arrays.toString(getValues()) + " + " + Arrays.toString(neighborContext.getValues()) + " = " + aggregatedValues); return aggregatedContext; } public AggregationContext initContext(AbstractWallet wallet, boolean useValueExtractor) { - double[] initValues = useValueExtractor ? getValueExtractor().apply(wallet) : getAltValueExtractor().apply(wallet); - AggregationContext initContext = new AggregationContextBuilder(getFunction(), getValueExtractor(), getAltValueExtractor(), initValues, resultExtractor) + double[] initValues = useValueExtractor ? getValueExtractor().apply(wallet) : getValueAltExtractor().apply(wallet); + AggregationContext initContext = new AggregationContextBuilder(getFunction(), initValues) .setMaxExchanges(getMaxExchanges()) + .setValueExtractor(getValueExtractor()) + .setValueAltExtractor(getValueAltExtractor()) .setUuid(getUuid()) + .setResultExtractor(resultExtractor) .build(); return initContext; } @@ -85,7 +90,7 @@ public class AggregationContext implements Serializable { return valueExtractor; } - private Function<AbstractWallet, double[]> getAltValueExtractor() { + private Function<AbstractWallet, double[]> getValueAltExtractor() { return valueAltExtractor; } @@ -104,23 +109,23 @@ public class AggregationContext implements Serializable { public static class AggregationContextBuilder { private final AggregationFunction function; private final double[] values; - private final Function<AbstractWallet, double[]> valueExtractor; - private final Function<AbstractWallet, double[]> valueAltExtractor; + private Function<AbstractWallet, double[]> valueExtractor; + private Function<AbstractWallet, double[]> valueAltExtractor; private int currentExchanges; private int maxExchanges; private UUID uuid; private Function<double[], Double> resultExtractor; - public AggregationContextBuilder(AggregationFunction function, Function<AbstractWallet, double[]> valueExtractor, Function<AbstractWallet, double[]> valueAltExtractor, - double[] values, Function<double[], Double> resultExtractor) { + public AggregationContextBuilder(AggregationFunction function, double[] values) { this.function = function; - this.valueExtractor = valueExtractor; - this.valueAltExtractor = valueAltExtractor; + this.valueExtractor = wallet -> new double[] { wallet.getAmount() }; + this.valueAltExtractor = this.valueExtractor; this.values = values; + this.currentExchanges = 0; this.maxExchanges = 20; this.uuid = UUID.randomUUID(); - this.resultExtractor = resultExtractor; + this.resultExtractor = valuesArray -> valuesArray[0]; } public AggregationContextBuilder setCurrentExchanges(int currentExchanges) { @@ -138,6 +143,21 @@ public class AggregationContext implements Serializable { return this; } + public AggregationContextBuilder setResultExtractor(Function<double[], Double> resultExtractor) { + this.resultExtractor = resultExtractor; + return this; + } + + public AggregationContextBuilder setValueExtractor(Function<AbstractWallet, double[]> valueExtractor) { + this.valueExtractor = valueExtractor; + return this; + } + + public AggregationContextBuilder setValueAltExtractor(Function<AbstractWallet, double[]> valueAltExtractor) { + this.valueAltExtractor = valueAltExtractor; + return this; + } + public AggregationContext build() { return new AggregationContext(function, valueExtractor, valueAltExtractor, values, currentExchanges, maxExchanges, uuid, resultExtractor); }