diff --git a/src/main/java/ca/joeltherrien/randomforest/Settings.java b/src/main/java/ca/joeltherrien/randomforest/Settings.java index ddffeae..da83ff4 100644 --- a/src/main/java/ca/joeltherrien/randomforest/Settings.java +++ b/src/main/java/ca/joeltherrien/randomforest/Settings.java @@ -22,17 +22,15 @@ import ca.joeltherrien.randomforest.responses.competingrisk.CompetingRiskRespons import ca.joeltherrien.randomforest.responses.competingrisk.CompetingRiskResponseWithCensorTime; import ca.joeltherrien.randomforest.responses.competingrisk.combiner.CompetingRiskFunctionCombiner; import ca.joeltherrien.randomforest.responses.competingrisk.combiner.CompetingRiskResponseCombiner; -import ca.joeltherrien.randomforest.responses.competingrisk.differentiator.GrayLogRankMultipleGroupDifferentiator; -import ca.joeltherrien.randomforest.responses.competingrisk.differentiator.GrayLogRankSingleGroupDifferentiator; -import ca.joeltherrien.randomforest.responses.competingrisk.differentiator.LogRankMultipleGroupDifferentiator; -import ca.joeltherrien.randomforest.responses.competingrisk.differentiator.LogRankSingleGroupDifferentiator; +import ca.joeltherrien.randomforest.responses.competingrisk.differentiator.GrayLogRankDifferentiator; +import ca.joeltherrien.randomforest.responses.competingrisk.differentiator.LogRankDifferentiator; import ca.joeltherrien.randomforest.responses.regression.MeanResponseCombiner; import ca.joeltherrien.randomforest.responses.regression.WeightedVarianceGroupDifferentiator; import ca.joeltherrien.randomforest.tree.GroupDifferentiator; import ca.joeltherrien.randomforest.tree.ResponseCombiner; import ca.joeltherrien.randomforest.utils.DataUtils; +import ca.joeltherrien.randomforest.utils.Utils; import com.fasterxml.jackson.annotation.JsonIgnore; -import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.node.JsonNodeFactory; import com.fasterxml.jackson.databind.node.ObjectNode; @@ -44,7 +42,10 @@ import lombok.EqualsAndHashCode; import java.io.File; import java.io.IOException; -import java.util.*; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; import java.util.function.Function; /** @@ -87,57 +88,26 @@ public class Settings { registerGroupDifferentiatorConstructor("WeightedVarianceGroupDifferentiator", (node) -> new WeightedVarianceGroupDifferentiator() ); - registerGroupDifferentiatorConstructor("LogRankSingleGroupDifferentiator", + registerGroupDifferentiatorConstructor("GrayLogRankDifferentiator", (objectNode) -> { - final int eventOfFocus = objectNode.get("eventOfFocus").asInt(); + final int[] eventsOfFocusArray = Utils.jsonToIntArray(objectNode.get("eventsOfFocus")); + final int[] eventArray = Utils.jsonToIntArray(objectNode.get("events")); - final Iterator elements = objectNode.get("events").elements(); - final List elementList = new ArrayList<>(); - elements.forEachRemaining(node -> elementList.add(node)); - - final int[] eventArray = elementList.stream().mapToInt(node -> node.asInt()).toArray(); - - return new LogRankSingleGroupDifferentiator(eventOfFocus, eventArray); + return new GrayLogRankDifferentiator(eventsOfFocusArray, eventArray); } ); - registerGroupDifferentiatorConstructor("GrayLogRankMultipleGroupDifferentiator", + registerGroupDifferentiatorConstructor("LogRankDifferentiator", (objectNode) -> { - final Iterator elements = objectNode.get("events").elements(); - final List elementList = new ArrayList<>(); - elements.forEachRemaining(node -> elementList.add(node)); + final int[] eventsOfFocusArray = Utils.jsonToIntArray(objectNode.get("eventsOfFocus")); + final int[] eventArray = Utils.jsonToIntArray(objectNode.get("events")); - final int[] eventArray = elementList.stream().mapToInt(node -> node.asInt()).toArray(); - - return new GrayLogRankMultipleGroupDifferentiator(eventArray); - } - ); - registerGroupDifferentiatorConstructor("LogRankMultipleGroupDifferentiator", - (objectNode) -> { - final Iterator elements = objectNode.get("events").elements(); - final List elementList = new ArrayList<>(); - elements.forEachRemaining(node -> elementList.add(node)); - - final int[] eventArray = elementList.stream().mapToInt(node -> node.asInt()).toArray(); - - return new LogRankMultipleGroupDifferentiator(eventArray); - } - ); - registerGroupDifferentiatorConstructor("GrayLogRankSingleGroupDifferentiator", - (objectNode) -> { - final int eventOfFocus = objectNode.get("eventOfFocus").asInt(); - - final Iterator elements = objectNode.get("events").elements(); - final List elementList = new ArrayList<>(); - elements.forEachRemaining(node -> elementList.add(node)); - - final int[] eventArray = elementList.stream().mapToInt(node -> node.asInt()).toArray(); - - - return new GrayLogRankSingleGroupDifferentiator(eventOfFocus, eventArray); + return new LogRankDifferentiator(eventsOfFocusArray, eventArray); } ); } + + private static Map> RESPONSE_COMBINER_MAP = new HashMap<>(); public static Function getResponseCombinerConstructor(final String name){ return RESPONSE_COMBINER_MAP.get(name.toLowerCase()); @@ -153,10 +123,7 @@ public class Settings { ); registerResponseCombinerConstructor("CompetingRiskResponseCombiner", (node) -> { - final List eventList = new ArrayList<>(); - node.get("events").elements().forEachRemaining(event -> eventList.add(event.asInt())); - final int[] events = eventList.stream().mapToInt(i -> i).toArray(); - + final int[] events = Utils.jsonToIntArray(node.get("events")); return new CompetingRiskResponseCombiner(events); @@ -165,16 +132,11 @@ public class Settings { registerResponseCombinerConstructor("CompetingRiskFunctionCombiner", (node) -> { - final List eventList = new ArrayList<>(); - node.get("events").elements().forEachRemaining(event -> eventList.add(event.asInt())); - final int[] events = eventList.stream().mapToInt(i -> i).toArray(); + final int[] events = Utils.jsonToIntArray(node.get("events")); double[] times = null; - // note that times may be null if(node.hasNonNull("times")){ - final List timeList = new ArrayList<>(); - node.get("times").elements().forEachRemaining(time -> timeList.add(time.asDouble())); - times = timeList.stream().mapToDouble(db -> db).toArray(); + times = Utils.jsonToDoubleArray(node.get("times")); } return new CompetingRiskFunctionCombiner(events, times); diff --git a/src/main/java/ca/joeltherrien/randomforest/responses/competingrisk/differentiator/GrayLogRankMultipleGroupDifferentiator.java b/src/main/java/ca/joeltherrien/randomforest/responses/competingrisk/differentiator/GrayLogRankDifferentiator.java similarity index 64% rename from src/main/java/ca/joeltherrien/randomforest/responses/competingrisk/differentiator/GrayLogRankMultipleGroupDifferentiator.java rename to src/main/java/ca/joeltherrien/randomforest/responses/competingrisk/differentiator/GrayLogRankDifferentiator.java index 7ceebe0..420ad15 100644 --- a/src/main/java/ca/joeltherrien/randomforest/responses/competingrisk/differentiator/GrayLogRankMultipleGroupDifferentiator.java +++ b/src/main/java/ca/joeltherrien/randomforest/responses/competingrisk/differentiator/GrayLogRankDifferentiator.java @@ -19,19 +19,34 @@ package ca.joeltherrien.randomforest.responses.competingrisk.differentiator; import ca.joeltherrien.randomforest.responses.competingrisk.CompetingRiskResponseWithCensorTime; import ca.joeltherrien.randomforest.responses.competingrisk.CompetingRiskSets; import ca.joeltherrien.randomforest.responses.competingrisk.CompetingRiskUtils; -import lombok.RequiredArgsConstructor; +import java.util.Arrays; import java.util.List; /** * See page 761 of Random survival forests for competing risks by Ishwaran et al. * */ -@RequiredArgsConstructor -public class GrayLogRankMultipleGroupDifferentiator extends CompetingRiskGroupDifferentiator { +public class GrayLogRankDifferentiator extends CompetingRiskGroupDifferentiator { + private final int[] eventsOfFocus; private final int[] events; + public GrayLogRankDifferentiator(int[] eventsOfFocus, int[] events){ + this.eventsOfFocus = eventsOfFocus; + this.events = events; + + if(eventsOfFocus.length == 0){ + throw new IllegalArgumentException("eventsOfFocus must have length greater than 0"); + } + + for(final int eventOfFocus : eventsOfFocus){ + if(Arrays.binarySearch(events, eventOfFocus) == -1){ // i.e. eventOfFocus is not in events + throw new IllegalArgumentException("Array events must contain every eventOfFocus. Event " + eventOfFocus + " not found."); + } + } + } + @Override protected CompetingRiskSets createCompetingRiskSets(List leftHand, List rightHand){ return CompetingRiskUtils.calculateGraySetsEfficiently(leftHand, rightHand, events); @@ -42,11 +57,12 @@ public class GrayLogRankMultipleGroupDifferentiator extends CompetingRiskGroupDi double numerator = 0.0; double denominatorSquared = 0.0; - for(final int eventOfFocus : events){ + for(final int eventOfFocus : eventsOfFocus){ final LogRankValue valueOfInterest = specificLogRankValue(eventOfFocus, competingRiskSets); - // we use varianceSqrt instead of variance because numerator is not the same as the individual score - numerator += valueOfInterest.getNumerator()*valueOfInterest.getVarianceSqrt(); + // Important note - we follow what randomForestSRC does in its code; not in its documentation. + // See https://github.com/kogalur/randomForestSRC/issues/27#issuecomment-486017647 + numerator += valueOfInterest.getNumerator(); denominatorSquared += valueOfInterest.getVariance(); } diff --git a/src/main/java/ca/joeltherrien/randomforest/responses/competingrisk/differentiator/GrayLogRankSingleGroupDifferentiator.java b/src/main/java/ca/joeltherrien/randomforest/responses/competingrisk/differentiator/GrayLogRankSingleGroupDifferentiator.java deleted file mode 100644 index b75888e..0000000 --- a/src/main/java/ca/joeltherrien/randomforest/responses/competingrisk/differentiator/GrayLogRankSingleGroupDifferentiator.java +++ /dev/null @@ -1,47 +0,0 @@ -/* - * Copyright (c) 2019 Joel Therrien. - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -package ca.joeltherrien.randomforest.responses.competingrisk.differentiator; - -import ca.joeltherrien.randomforest.responses.competingrisk.CompetingRiskResponseWithCensorTime; -import ca.joeltherrien.randomforest.responses.competingrisk.CompetingRiskSets; -import ca.joeltherrien.randomforest.responses.competingrisk.CompetingRiskUtils; -import lombok.RequiredArgsConstructor; - -import java.util.List; - -/** - * See page 761 of Random survival forests for competing risks by Ishwaran et al. - * - */ -@RequiredArgsConstructor -public class GrayLogRankSingleGroupDifferentiator extends CompetingRiskGroupDifferentiator { - - private final int eventOfFocus; - private final int[] events; - - @Override - protected CompetingRiskSets createCompetingRiskSets(List leftHand, List rightHand){ - return CompetingRiskUtils.calculateGraySetsEfficiently(leftHand, rightHand, events); - } - - @Override - protected Double getScore(final CompetingRiskSets competingRiskSets){ - final LogRankValue valueOfInterest = specificLogRankValue(eventOfFocus, competingRiskSets); - return Math.abs(valueOfInterest.getNumerator() / valueOfInterest.getVarianceSqrt()); - } - -} diff --git a/src/main/java/ca/joeltherrien/randomforest/responses/competingrisk/differentiator/LogRankMultipleGroupDifferentiator.java b/src/main/java/ca/joeltherrien/randomforest/responses/competingrisk/differentiator/LogRankDifferentiator.java similarity index 63% rename from src/main/java/ca/joeltherrien/randomforest/responses/competingrisk/differentiator/LogRankMultipleGroupDifferentiator.java rename to src/main/java/ca/joeltherrien/randomforest/responses/competingrisk/differentiator/LogRankDifferentiator.java index 6ac25fb..d528de3 100644 --- a/src/main/java/ca/joeltherrien/randomforest/responses/competingrisk/differentiator/LogRankMultipleGroupDifferentiator.java +++ b/src/main/java/ca/joeltherrien/randomforest/responses/competingrisk/differentiator/LogRankDifferentiator.java @@ -19,19 +19,34 @@ package ca.joeltherrien.randomforest.responses.competingrisk.differentiator; import ca.joeltherrien.randomforest.responses.competingrisk.CompetingRiskResponse; import ca.joeltherrien.randomforest.responses.competingrisk.CompetingRiskSets; import ca.joeltherrien.randomforest.responses.competingrisk.CompetingRiskUtils; -import lombok.RequiredArgsConstructor; +import java.util.Arrays; import java.util.List; /** * See page 761 of Random survival forests for competing risks by Ishwaran et al. * */ -@RequiredArgsConstructor -public class LogRankMultipleGroupDifferentiator extends CompetingRiskGroupDifferentiator { +public class LogRankDifferentiator extends CompetingRiskGroupDifferentiator { + private final int[] eventsOfFocus; private final int[] events; + public LogRankDifferentiator(int[] eventsOfFocus, int[] events){ + this.eventsOfFocus = eventsOfFocus; + this.events = events; + + if(eventsOfFocus.length == 0){ + throw new IllegalArgumentException("eventsOfFocus must have length greater than 0"); + } + + for(final int eventOfFocus : eventsOfFocus){ + if(Arrays.binarySearch(events, eventOfFocus) == -1){ // i.e. eventOfFocus is not in events + throw new IllegalArgumentException("Array events must contain every eventOfFocus. Event " + eventOfFocus + " not found."); + } + } + } + @Override protected CompetingRiskSets createCompetingRiskSets(List leftHand, List rightHand){ return CompetingRiskUtils.calculateSetsEfficiently(leftHand, rightHand, events, true); @@ -42,11 +57,12 @@ public class LogRankMultipleGroupDifferentiator extends CompetingRiskGroupDiffer double numerator = 0.0; double denominatorSquared = 0.0; - for(final int eventOfFocus : events){ + for(final int eventOfFocus : eventsOfFocus){ final LogRankValue valueOfInterest = specificLogRankValue(eventOfFocus, competingRiskSets); - // we use varianceSqrt instead of variance because numerator is not the same as the individual score - numerator += valueOfInterest.getNumerator()*valueOfInterest.getVarianceSqrt(); + // Important note - we follow what randomForestSRC does in its code; not in its documentation. + // See https://github.com/kogalur/randomForestSRC/issues/27#issuecomment-486017647 + numerator += valueOfInterest.getNumerator(); denominatorSquared += valueOfInterest.getVariance(); } diff --git a/src/main/java/ca/joeltherrien/randomforest/responses/competingrisk/differentiator/LogRankSingleGroupDifferentiator.java b/src/main/java/ca/joeltherrien/randomforest/responses/competingrisk/differentiator/LogRankSingleGroupDifferentiator.java deleted file mode 100644 index fd1654b..0000000 --- a/src/main/java/ca/joeltherrien/randomforest/responses/competingrisk/differentiator/LogRankSingleGroupDifferentiator.java +++ /dev/null @@ -1,47 +0,0 @@ -/* - * Copyright (c) 2019 Joel Therrien. - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -package ca.joeltherrien.randomforest.responses.competingrisk.differentiator; - -import ca.joeltherrien.randomforest.responses.competingrisk.CompetingRiskResponse; -import ca.joeltherrien.randomforest.responses.competingrisk.CompetingRiskSets; -import ca.joeltherrien.randomforest.responses.competingrisk.CompetingRiskUtils; -import lombok.RequiredArgsConstructor; - -import java.util.List; - -/** - * See page 761 of Random survival forests for competing risks by Ishwaran et al. - * - */ -@RequiredArgsConstructor -public class LogRankSingleGroupDifferentiator extends CompetingRiskGroupDifferentiator { - - private final int eventOfFocus; - private final int[] events; - - @Override - protected CompetingRiskSets createCompetingRiskSets(List leftHand, List rightHand){ - return CompetingRiskUtils.calculateSetsEfficiently(leftHand, rightHand, events, true); - } - - @Override - protected Double getScore(final CompetingRiskSets competingRiskSets){ - final LogRankValue valueOfInterest = specificLogRankValue(eventOfFocus, competingRiskSets); - return Math.abs(valueOfInterest.getNumerator() / valueOfInterest.getVarianceSqrt()); - } - -} diff --git a/src/main/java/ca/joeltherrien/randomforest/utils/Utils.java b/src/main/java/ca/joeltherrien/randomforest/utils/Utils.java index 70e3e1f..ba3f7d6 100644 --- a/src/main/java/ca/joeltherrien/randomforest/utils/Utils.java +++ b/src/main/java/ca/joeltherrien/randomforest/utils/Utils.java @@ -16,6 +16,8 @@ package ca.joeltherrien.randomforest.utils; +import com.fasterxml.jackson.databind.JsonNode; + import java.util.*; public final class Utils { @@ -208,4 +210,22 @@ public final class Utils { return map; } + public static int[] jsonToIntArray(final JsonNode node){ + final Iterator elements = node.elements(); + final List elementList = new ArrayList<>(); + elements.forEachRemaining(n -> elementList.add(n)); + + final int[] array = elementList.stream().mapToInt(n -> n.asInt()).toArray(); + return array; + } + + public static double[] jsonToDoubleArray(final JsonNode node){ + final Iterator elements = node.elements(); + final List elementList = new ArrayList<>(); + elements.forEachRemaining(n -> elementList.add(n)); + + final double[] array = elementList.stream().mapToDouble(n -> n.asDouble()).toArray(); + return array; + } + } diff --git a/src/test/java/ca/joeltherrien/randomforest/TestSavingLoading.java b/src/test/java/ca/joeltherrien/randomforest/TestSavingLoading.java index 41907cc..77a3db6 100644 --- a/src/test/java/ca/joeltherrien/randomforest/TestSavingLoading.java +++ b/src/test/java/ca/joeltherrien/randomforest/TestSavingLoading.java @@ -45,8 +45,10 @@ public class TestSavingLoading { */ public Settings getSettings(){ final ObjectNode groupDifferentiatorSettings = new ObjectNode(JsonNodeFactory.instance); - groupDifferentiatorSettings.set("type", new TextNode("LogRankSingleGroupDifferentiator")); - groupDifferentiatorSettings.set("eventOfFocus", new IntNode(1)); + groupDifferentiatorSettings.set("type", new TextNode("LogRankDifferentiator")); + groupDifferentiatorSettings.set("eventsOfFocus", + new ArrayNode(JsonNodeFactory.instance, Utils.easyList(new IntNode(1))) + ); groupDifferentiatorSettings.set("events", new ArrayNode(JsonNodeFactory.instance, Utils.easyList(new IntNode(1), new IntNode(2))) ); diff --git a/src/test/java/ca/joeltherrien/randomforest/competingrisk/TestCompetingRisk.java b/src/test/java/ca/joeltherrien/randomforest/competingrisk/TestCompetingRisk.java index 72c09ce..9ba04d7 100644 --- a/src/test/java/ca/joeltherrien/randomforest/competingrisk/TestCompetingRisk.java +++ b/src/test/java/ca/joeltherrien/randomforest/competingrisk/TestCompetingRisk.java @@ -54,8 +54,10 @@ public class TestCompetingRisk { */ public Settings getSettings(){ final ObjectNode groupDifferentiatorSettings = new ObjectNode(JsonNodeFactory.instance); - groupDifferentiatorSettings.set("type", new TextNode("LogRankSingleGroupDifferentiator")); - groupDifferentiatorSettings.set("eventOfFocus", new IntNode(1)); + groupDifferentiatorSettings.set("type", new TextNode("LogRankDifferentiator")); + groupDifferentiatorSettings.set("eventsOfFocus", + new ArrayNode(JsonNodeFactory.instance, Utils.easyList(new IntNode(1))) + ); groupDifferentiatorSettings.set("events", new ArrayNode(JsonNodeFactory.instance, Utils.easyList(new IntNode(1), new IntNode(2))) ); diff --git a/src/test/java/ca/joeltherrien/randomforest/competingrisk/TestLogRankMultipleGroupDifferentiator.java b/src/test/java/ca/joeltherrien/randomforest/competingrisk/TestLogRankDifferentiator.java similarity index 69% rename from src/test/java/ca/joeltherrien/randomforest/competingrisk/TestLogRankMultipleGroupDifferentiator.java rename to src/test/java/ca/joeltherrien/randomforest/competingrisk/TestLogRankDifferentiator.java index ddb56d9..6a600dd 100644 --- a/src/test/java/ca/joeltherrien/randomforest/competingrisk/TestLogRankMultipleGroupDifferentiator.java +++ b/src/test/java/ca/joeltherrien/randomforest/competingrisk/TestLogRankDifferentiator.java @@ -16,14 +16,14 @@ package ca.joeltherrien.randomforest.competingrisk; -import ca.joeltherrien.randomforest.utils.DataUtils; import ca.joeltherrien.randomforest.Row; import ca.joeltherrien.randomforest.Settings; import ca.joeltherrien.randomforest.covariates.Covariate; import ca.joeltherrien.randomforest.covariates.settings.NumericCovariateSettings; import ca.joeltherrien.randomforest.responses.competingrisk.CompetingRiskResponse; -import ca.joeltherrien.randomforest.responses.competingrisk.differentiator.LogRankMultipleGroupDifferentiator; +import ca.joeltherrien.randomforest.responses.competingrisk.differentiator.LogRankDifferentiator; import ca.joeltherrien.randomforest.tree.Split; +import ca.joeltherrien.randomforest.utils.DataUtils; import ca.joeltherrien.randomforest.utils.SingletonIterator; import ca.joeltherrien.randomforest.utils.Utils; import com.fasterxml.jackson.databind.node.JsonNodeFactory; @@ -39,7 +39,7 @@ import java.util.List; import static org.junit.jupiter.api.Assertions.assertTrue; -public class TestLogRankMultipleGroupDifferentiator { +public class TestLogRankDifferentiator { private Iterator> turnIntoSplitIterator(List> leftList, List> rightList){ @@ -70,7 +70,7 @@ public class TestLogRankMultipleGroupDifferentiator { @Test public void testSplitRule() throws IOException { - final LogRankMultipleGroupDifferentiator groupDifferentiator = new LogRankMultipleGroupDifferentiator(new int[]{1,2}); + final LogRankDifferentiator groupDifferentiator = new LogRankDifferentiator(new int[]{1,2}, new int[]{1,2}); final List> data = loadData("src/test/resources/test_split_data.csv").getRows(); @@ -79,38 +79,11 @@ public class TestLogRankMultipleGroupDifferentiator { final double scoreBad = groupDifferentiator.differentiate(turnIntoSplitIterator(group1Bad, group2Bad)).getScore(); - final List> group1Good = data.subList(0, 199); - final List> group2Good= data.subList(199, data.size()); - - final double scoreGood = groupDifferentiator.differentiate(turnIntoSplitIterator(group1Good, group2Good)).getScore(); - // expected results calculated manually using survival::survdiff in R; see issue #10 in Gitea - closeEnough(71.41135, scoreBad, 0.00001); - closeEnough(71.5354, scoreGood, 0.00001); + closeEnough(9.413002, scoreBad, 0.00001); } - @Test - public void testSplitRuleV2() throws IOException { - final LogRankMultipleGroupDifferentiator groupDifferentiator = new LogRankMultipleGroupDifferentiator(new int[]{1,2}); - - final List> data = loadData("src/test/resources/new_data_that_triggers_difference_composite.csv").getRows(); - - final List> group1Bad = data.subList(0, 196); - final List> group2Bad = data.subList(196, data.size()); - - final double scoreBad = groupDifferentiator.differentiate(turnIntoSplitIterator(group1Bad, group2Bad)).getScore(); - - final List> group1Good = data.subList(0, 199); - final List> group2Good= data.subList(199, data.size()); - - final double scoreGood = groupDifferentiator.differentiate(turnIntoSplitIterator(group1Good, group2Good)).getScore(); - - // expected results calculated manually using survival::survdiff in R; see issue #10 in Gitea - closeEnough(71.41135, scoreBad, 0.00001); - closeEnough(71.5354, scoreGood, 0.00001); - - } private void closeEnough(double expected, double actual, double margin){ assertTrue(Math.abs(expected - actual) < margin, "Expected " + expected + " but saw " + actual); diff --git a/src/test/java/ca/joeltherrien/randomforest/competingrisk/TestLogRankSingleGroupDifferentiator.java b/src/test/java/ca/joeltherrien/randomforest/competingrisk/TestLogRankSingleGroupDifferentiator.java index d488b6e..8b0693f 100644 --- a/src/test/java/ca/joeltherrien/randomforest/competingrisk/TestLogRankSingleGroupDifferentiator.java +++ b/src/test/java/ca/joeltherrien/randomforest/competingrisk/TestLogRankSingleGroupDifferentiator.java @@ -18,7 +18,7 @@ package ca.joeltherrien.randomforest.competingrisk; import ca.joeltherrien.randomforest.Row; import ca.joeltherrien.randomforest.responses.competingrisk.CompetingRiskResponse; -import ca.joeltherrien.randomforest.responses.competingrisk.differentiator.LogRankSingleGroupDifferentiator; +import ca.joeltherrien.randomforest.responses.competingrisk.differentiator.LogRankDifferentiator; import ca.joeltherrien.randomforest.tree.GroupDifferentiator; import ca.joeltherrien.randomforest.tree.Split; import ca.joeltherrien.randomforest.utils.SingletonIterator; @@ -29,7 +29,6 @@ import java.util.ArrayList; import java.util.Collections; import java.util.Iterator; import java.util.List; -import java.util.stream.Collectors; import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertTrue; @@ -82,7 +81,7 @@ public class TestLogRankSingleGroupDifferentiator { final List> data1 = generateData1(); final List> data2 = generateData2(); - final LogRankSingleGroupDifferentiator differentiator = new LogRankSingleGroupDifferentiator(1, new int[]{1}); + final LogRankDifferentiator differentiator = new LogRankDifferentiator(new int[]{1}, new int[]{1}); final double score = getScore(differentiator, data1, data2); final double margin = 0.000001; @@ -95,10 +94,10 @@ public class TestLogRankSingleGroupDifferentiator { @Test public void testCorrectSplit() throws IOException { - final LogRankSingleGroupDifferentiator groupDifferentiator = - new LogRankSingleGroupDifferentiator(1, new int[]{1,2}); + final LogRankDifferentiator groupDifferentiator = + new LogRankDifferentiator(new int[]{1}, new int[]{1,2}); - final List> data = TestLogRankMultipleGroupDifferentiator. + final List> data = TestLogRankDifferentiator. loadData("src/test/resources/test_single_split.csv").getRows(); final List> group1Good = data.subList(0, 221); diff --git a/src/test/resources/new_data_that_triggers_difference_composite.csv b/src/test/resources/new_data_that_triggers_difference_composite.csv deleted file mode 100644 index 73d2c42..0000000 --- a/src/test/resources/new_data_that_triggers_difference_composite.csv +++ /dev/null @@ -1,422 +0,0 @@ -"T","J","x1","x2","x3","set","C","u","delta" -0.499867362999948,2,-1.95019832240832,-2.60627899155475,0.263872418621638,"d1",78.1147597315622,0.499867362999948,2 -0.411483192351542,2,-0.335587884128994,-2.59271420987147,-1.13466609937628,"d1",17.0940970062258,0.411483192351542,2 -6.26589199230665,1,-1.54140235787167,-2.30006437514968,0.233748690841754,"d1",25.4117258257213,6.26589199230665,1 -5.51302082790179,1,-2.14735528739845,-2.20493452952125,-0.00149264459250339,"d1",21.1466883780434,5.51302082790179,1 -0.589132356923074,2,-0.504171648695752,-2.12406874197516,0.966489874835643,"d1",63.6942574348221,0.589132356923074,2 -0.100430077962303,2,-0.690743614142311,-2.11417284528098,-0.462855490815159,"d1",1.99340037070215,0.100430077962303,2 -2.78052458150272,2,-0.551926772252824,-2.09000455633969,-0.177623152985041,"d1",30.9898108972197,2.78052458150272,2 -0.362287234184209,2,-0.115697384278896,-2.07978204758821,-0.637623319390929,"d1",39.3571070564871,0.362287234184209,2 -0.0379365109838545,2,-2.35088503668122,-2.06709410300666,0.829087459518316,"d1",19.5599143943729,0.0379365109838545,2 -0.030014815274626,2,-0.158798650966454,-2.05890835303292,-0.462039828875565,"d1",1.57979466716853,0.030014815274626,2 -5.47108585297847,1,-0.62692030358575,-2.02055602810388,0.444819057512709,"d1",10.4432902485132,5.47108585297847,1 -3.19113383128197,1,-1.00870532301789,-1.99366184170529,0.36597640035569,"d1",6.42029091715813,3.19113383128197,1 -7.01919485280539,1,-1.43655112723172,-1.95287956158818,-0.74781769436591,"d1",29.2763396335726,7.01919485280539,1 -5.6207995602991,1,-1.72940999679298,-1.880860671279,0.865723067991154,"d1",7.21366209874041,5.6207995602991,1 -2.35006319160078,2,-1.56730398966994,-1.87987513761127,-0.100405585728897,"d1",103.798832333753,2.35006319160078,2 -0.655913021415472,2,-0.381072772266333,-1.83726471030277,-1.91183811668422,"d1",47.9379538793988,0.655913021415472,2 -4.60259209920592,2,-0.447638765302678,-1.78988532702524,0.609071625258388,"d1",2.60597240030185,2.60597240030185,0 -5.82985093311453,1,-0.454478759553709,-1.77988775292904,-0.951380467801523,"d1",11.8871257267892,5.82985093311453,1 -4.00551166178143,2,-0.169952711026236,-1.77577954156175,-0.0743184050913884,"d1",4.01423139072942,4.00551166178143,2 -0.770518803927016,2,-0.217358259412447,-1.76478931337377,0.925995782542218,"d1",27.4441876254025,0.770518803927016,2 -1.464766157707,2,-0.907513823100056,-1.75462814010361,0.0618782092551372,"d1",7.28319086134434,1.464766157707,2 -5.85581386372292,1,-0.408218830092499,-1.7351551622775,-1.30565834762586,"d1",20.3997039211172,5.85581386372292,1 -0.627003119327128,2,-0.490915399276648,-1.7130888915695,-0.701850720754584,"d1",0.0501011684536934,0.0501011684536934,0 -5.28130548623981,1,-0.44820545440036,-1.67845567328654,-0.352553421039791,"d1",11.5045715961605,5.28130548623981,1 -1.07525985218109,2,-1.19338720662916,-1.66337144479934,0.796645773274118,"d1",59.376008582585,1.07525985218109,2 -6.54756452824936,1,-1.16617815904908,-1.63820855004219,-1.157168326241,"d1",53.0357338090367,6.54756452824936,1 -0.111345880643449,2,-0.78711928337837,-1.60644550943024,-2.24275122811157,"d1",3.74917807608269,0.111345880643449,2 -0.451999953016639,2,-0.812418624513425,-1.55229147176324,-0.349728885283845,"d1",20.7824087638621,0.451999953016639,2 -0.66187332617119,2,-0.508034279805,-1.53046688766278,-0.125548243031678,"d1",1.05018629103254,0.66187332617119,2 -0.615669948980212,2,-0.883736989422782,-1.5182885181224,-2.17546487280826,"d1",2.50971530564129,0.615669948980212,2 -4.59409849090741,1,-0.463742158823814,-1.51482036685259,-0.128794669558068,"d1",5.21418055519462,4.59409849090741,1 -1.70998832202497,2,-0.435222341947856,-1.46629935512921,0.366128738801027,"d1",22.9905674225631,1.70998832202497,2 -0.16477278387174,2,-0.158962000535981,-1.42734602325756,0.7814198196256,"d1",2.67401527323018,0.16477278387174,2 -2.69938570062134,2,-1.32872703004022,-1.42130869029821,0.348507166757712,"d1",8.26423623237792,2.69938570062134,2 -0.36591454860851,2,-0.272697388869142,-1.41996949576558,-1.09564014616258,"d1",6.61146112717688,0.36591454860851,2 -0.353021066088114,2,-0.705605038212206,-1.40316187616988,0.765560773782534,"d1",8.0167396645993,0.353021066088114,2 -6.06766719635048,1,-1.55037485195067,-1.34567809527089,-0.760841361837919,"d1",1.09786237904911,1.09786237904911,0 -0.644815232139081,2,-1.15963532979715,-1.31896146330714,-0.549007768600895,"d1",31.0450109077578,0.644815232139081,2 -1.07542936220289,2,-0.778554847469194,-1.30054996528693,-1.04023868273514,"d1",25.8691836140099,1.07542936220289,2 -0.25507666592619,2,-2.10743065316308,-1.28781900130437,-1.16449794284244,"d1",2.4481005128473,0.25507666592619,2 -4.22979112319602,1,-0.846428182531737,-1.27060985892563,-1.08205947085447,"d1",40.1862035302405,4.22979112319602,1 -1.54102904713693,2,-0.548921604883928,-1.26747682520373,0.269373223479816,"d1",7.15302918106318,1.54102904713693,2 -5.69764774521504,1,-0.334010020049075,-1.25874497163495,-0.0938705365567017,"d1",34.0617424678587,5.69764774521504,1 -3.6253245340717,1,-2.06010942376809,-1.25629035083821,0.064109659520042,"d1",4.88388891331851,3.6253245340717,1 -4.26293430757702,2,-1.32110118545274,-1.23852335684901,0.60335439407922,"d1",8.21151600219309,4.26293430757702,2 -5.71672319925689,1,-0.263168026690344,-1.22173402907403,-1.71587984337502,"d1",16.940669081265,5.71672319925689,1 -5.55431417646415,1,-0.447206372965553,-1.21303905186392,0.115815130048467,"d1",15.2463490135016,5.55431417646415,1 -1.2009382713166,2,-1.14899977428392,-1.20463083041379,-1.14429497936915,"d1",23.6061829878929,1.2009382713166,2 -6.79536680010782,1,-0.0111679873537602,-1.19546465375587,0.309993712292912,"d1",66.1284001137982,6.79536680010782,1 -2.46331876317475,2,-0.482701087662075,-1.1481795630697,-1.41455158117126,"d1",12.5331542361528,2.46331876317475,2 -4.07894908429539,2,-1.45510635149798,-1.14384314965535,0.808902319926509,"d1",1.44096298856773,1.44096298856773,0 -0.261695730034262,2,-0.943270301982324,-1.13748423127889,0.158355281672531,"d1",43.8340519384141,0.261695730034262,2 -4.81273439537871,1,-2.88793714208826,-1.13647240113562,0.0733609481714206,"d1",36.9158127142077,4.81273439537871,1 -0.230829819571227,2,-0.993323732615054,-1.13619235403737,0.63867136636673,"d1",24.4872925794663,0.230829819571227,2 -6.73293879458427,1,-0.296846101197127,-1.1340541598207,0.844698804524038,"d1",7.46175810694695,6.73293879458427,1 -0.168945440556854,2,-0.380773376847431,-1.13128996081587,0.900395196575448,"d1",2.01092992909253,0.168945440556854,2 -5.98011658047727,1,-0.318535890192892,-1.12903745621652,-0.449817470400936,"d1",3.46174228005111,3.46174228005111,0 -1.22577496986361,2,-1.7200511170872,-1.12831840181859,-0.273148385437603,"d1",33.532725049365,1.22577496986361,2 -0.0767893493175507,2,-0.461947633140275,-1.12825500347247,-0.558084112128901,"d1",13.0636250879616,0.0767893493175507,2 -1.39937541069556,2,-0.110885121668419,-1.11643165391362,0.364029349051793,"d1",1.39057802201063,1.39057802201063,0 -0.588528974447399,2,-1.00125994464178,-1.11548212705522,0.649809263983229,"d1",21.9685837335854,0.588528974447399,2 -2.602702756643,1,-0.220756378655706,-1.10142892192176,-0.178398683362156,"d1",15.1814339860323,2.602702756643,1 -0.107345493510365,2,-0.136424653945802,-1.08620427671388,-1.26310084972045,"d1",2.84996530041099,0.107345493510365,2 -4.84797774579147,1,-2.640037363721,-1.07718527449055,0.126706475783981,"d1",12.4836507998407,4.84797774579147,1 -0.400475817371724,2,-0.108508550893446,-1.07292122840034,0.00148134837676338,"d1",8.04725838098943,0.400475817371724,2 -7.87069047922983,1,-1.07958210533537,-1.06862747193719,-0.662154443222777,"d1",84.0155980685606,7.87069047922983,1 -5.16738377891322,1,-1.43866435150085,-1.05722321366436,-0.674634964462416,"d1",13.1439987290651,5.16738377891322,1 -0.312620884738863,2,-0.54002631314478,-1.03355420146742,-0.927435593761941,"d1",16.1636680881684,0.312620884738863,2 -0.594797343946993,2,-0.523630694310136,-1.032829845164,-0.3600040754558,"d1",6.55719876289368,0.594797343946993,2 -1.58756684689763,2,-0.708585547888652,-1.0275777802401,-0.0560092163149688,"d1",2.03709915644662,1.58756684689763,2 -0.157633140797128,2,-0.46463235612396,-1.01851485235356,-0.38464297772038,"d1",1.12309886419443,0.157633140797128,2 -0.430044363252819,2,-0.365832672904036,-1.0139697548521,-0.198040491088858,"d1",33.4787387384062,0.430044363252819,2 -6.3440347051184,1,-1.17668749863083,-1.00058075158278,-0.0651331410262753,"d1",23.426931534525,6.3440347051184,1 -4.03709980150802,1,-0.248227727286613,-0.973934607681733,-1.12630658813714,"d1",9.87860122695565,4.03709980150802,1 -0.896409576158602,2,-0.127588856767946,-0.972359927470434,-1.22561091633034,"d1",50.4587066978119,0.896409576158602,2 -5.04397998161953,1,-1.74108063837017,-0.957323822479406,0.745863098569719,"d1",10.5295320414007,5.04397998161953,1 -3.85294361146361,1,-1.26750294431399,-0.94789344647265,0.831736527945425,"d1",10.9185821376741,3.85294361146361,1 -0.442006511877013,2,-0.354036914659923,-0.942780627326355,-0.363831505743131,"d1",43.415603150887,0.442006511877013,2 -0.232622205279768,2,-1.66241321442347,-0.924117138889276,-0.814930976394094,"d1",1.5546501009788,0.232622205279768,2 -0.747469336683762,2,-0.831949103513653,-0.914532892677964,-0.123845288295496,"d1",4.54467300325632,0.747469336683762,2 -4.1848791638863,1,-2.14543063227577,-0.911795115892639,0.916083249608967,"d1",30.2966161302086,4.1848791638863,1 -1.66416368167374,1,-0.145463778274721,-0.90074686050758,-0.564459630306043,"d1",6.34306907272518,1.66416368167374,1 -6.72130595897616,1,-0.763857738580545,-0.872310481790421,0.28360030698429,"d1",6.98184758424759,6.72130595897616,1 -0.421556759160012,2,-1.02907312310893,-0.868297987116183,-2.04164832864124,"d1",22.1035440443995,0.421556759160012,2 -0.415698179975152,2,-0.565088432517738,-0.865971805743903,0.489298810095688,"d1",24.2157815015855,0.415698179975152,2 -6.04006984027352,1,-1.80378631546711,-0.865947701381903,-2.45143317065972,"d1",12.7496245224029,6.04006984027352,1 -4.43406675993612,1,-1.10530784304803,-0.855162013689037,0.825965077039436,"d1",12.3575822915882,4.43406675993612,1 -6.60455671871596,1,-0.753543782190729,-0.853065417847988,0.911528068965907,"d1",55.8949446644554,6.60455671871596,1 -5.86430583830404,1,-0.119270069843969,-0.832012305781867,-0.123396917106593,"d1",2.04369612969458,2.04369612969458,0 -0.765395824861464,2,-0.756590051392957,-0.825870681405957,-1.09459501923616,"d1",7.56691016256809,0.765395824861464,2 -6.13062823509473,1,-0.404367354122395,-0.794123265422334,0.519397084421048,"d1",6.57340552657843,6.13062823509473,1 -1.36763089332254,2,-1.26507040921231,-0.785245756841697,-0.791402036345245,"d1",3.11886790208519,1.36763089332254,2 -2.42700778147439,2,-0.487188196151172,-0.766669594197886,0.410330957888797,"d1",5.85054755210876,2.42700778147439,2 -6.73991273889714,1,-0.184761116886234,-0.761522374617492,-0.532248648464166,"d1",12.2256078850478,6.73991273889714,1 -4.36141455710945,1,-0.105471206029084,-0.754424978552752,-0.956983188268582,"d1",44.0004703749843,4.36141455710945,1 -0.0148825589567423,2,-0.832577791659755,-0.750814042922674,0.594368798149314,"d1",10.2718881517649,0.0148825589567423,2 -2.03035983248594,2,-1.35008072739753,-0.739254017411324,-0.934537708298102,"d1",6.93155937828124,2.03035983248594,2 -0.323219427368838,2,-3.30164481425116,-0.737413330682173,0.158535050544275,"d1",6.21096261776984,0.323219427368838,2 -4.56057912025861,1,-1.74103151571216,-0.736136753174071,0.288649407044573,"d1",62.3897792365322,4.56057912025861,1 -5.1935752095808,1,-1.29643082121738,-0.735905168742066,-0.935752993561474,"d1",5.09524474851787,5.09524474851787,0 -3.86531025709069,2,-0.0636095105971832,-0.732886515689508,-0.814307779468899,"d1",8.85476755909622,3.86531025709069,2 -0.634098547976464,2,-0.170986777740401,-0.732247546425096,-0.246855951431236,"d1",30.9612841089789,0.634098547976464,2 -4.87612400835413,1,-0.102394565999977,-0.677771864546318,0.0275786348531762,"d1",36.7549219137475,4.87612400835413,1 -1.06079483773084,2,-0.0561619275905622,-0.662931426871597,0.730700839291824,"d1",13.5279788542539,1.06079483773084,2 -6.60489732026799,1,-0.679722503289936,-0.646491972989746,-0.294445508374441,"d1",11.0387820657343,6.60489732026799,1 -3.73370052556696,1,-1.33588231931319,-0.626542518485307,0.976264181983691,"d1",34.0810245631223,3.73370052556696,1 -0.215206013061106,2,-0.487402140919274,-0.622077838675401,-0.985499563550701,"d1",12.1548983175308,0.215206013061106,2 -0.0742700085614745,2,-2.14895712262163,-0.621501276239038,0.136788117565418,"d1",8.04026352241635,0.0742700085614745,2 -7.1008527322065,1,-0.440348488037497,-0.615830025512935,-2.19194484398512,"d1",8.89550268650055,7.1008527322065,1 -6.7471566122746,1,-0.481224832366081,-0.600951099333045,-0.480762211269973,"d1",38.7437415106182,6.7471566122746,1 -2.24482986132119,2,-0.217731228444547,-0.600578883093281,0.940056160419262,"d1",20.6535042255166,2.24482986132119,2 -7.50474685696234,1,-1.10367757209531,-0.577843231260005,-0.0138303662264709,"d1",13.2619685679674,7.50474685696234,1 -0.713865732194423,2,-1.21517626693504,-0.575358915832213,-0.728181360609758,"d1",42.7921076222811,0.713865732194423,2 -5.33264101467657,1,-0.0724806947018318,-0.563523809200885,-0.204717134353468,"d1",0.187731010444536,0.187731010444536,0 -6.8586275618804,1,-1.46591798681562,-0.540729342476426,-0.754580363544986,"d1",20.3525460335558,6.8586275618804,1 -5.81992253219201,1,-0.444983494178246,-0.531714523661177,-0.277171929560516,"d1",6.38694288624484,5.81992253219201,1 -3.7151160815995,1,-0.237257721084836,-0.527018720350226,0.642959786423278,"d1",2.24223504598635,2.24223504598635,0 -1.22530156649174,2,-0.635791390940521,-0.526483309231819,-2.1949047574972,"d1",44.1750103582568,1.22530156649174,2 -7.00373084336256,1,-0.20081259124862,-0.525865240188069,0.99733337346096,"d1",9.77560072205961,7.00373084336256,1 -7.46638813745472,1,-0.613414594619111,-0.522864801860655,-1.70505864369456,"d1",1.32270062773303,1.32270062773303,0 -0.0770264104939997,2,-0.170624607385686,-0.521560426585595,0.284753182059407,"d1",3.57309073262642,0.0770264104939997,2 -0.141067513730377,2,-0.81252818099109,-0.520882451714799,-1.02508871215029,"d1",22.2968422240558,0.141067513730377,2 -8.08000240358258,1,-0.0589302051711418,-0.520026414725689,-1.21999195799251,"d1",6.38638902273251,6.38638902273251,0 -0.65961842937395,2,-1.38673148781067,-0.513633600019186,0.85706365337255,"d1",34.38266120683,0.65961842937395,2 -0.32432593498379,2,-1.35781650273435,-0.512039227314512,-0.204715271838212,"d1",13.1133704725653,0.32432593498379,2 -0.576963331084698,2,-0.0457498417621635,-0.501686863705973,0.174835042489924,"d1",31.1563714439857,0.576963331084698,2 -4.75434525966485,1,-0.599919349345153,-0.495367089666113,0.604377261065303,"d1",24.0383815979422,4.75434525966485,1 -0.818759842712206,2,-0.0952013785990633,-0.494432211818882,-1.46694803898337,"d1",16.0198312097289,0.818759842712206,2 -4.90561182719959,1,-1.81492443726033,-0.487671608873654,-1.97555745670925,"d1",33.5309124327051,4.90561182719959,1 -3.63952218537657,2,-0.927798420893534,-0.481793161685171,0.270857399145853,"d1",40.5118284730201,3.63952218537657,2 -1.00702644694121,2,-0.739796432115704,-0.465562602228936,0.0793119855033039,"d1",30.9101264396234,1.00702644694121,2 -6.76971502879328,1,-0.638730432059152,-0.465503594160261,0.331249150958679,"d1",20.2612976162674,6.76971502879328,1 -6.59249465181477,1,-0.142211253824736,-0.461603677722249,-0.752128672509869,"d1",26.7710029139164,6.59249465181477,1 -2.805273024192,1,-0.133514709139844,-0.459588211605541,0.222501548058442,"d1",1.4710845425725,1.4710845425725,0 -1.24453746150703,2,-1.67404168511301,-0.457658559466724,-2.94999228204974,"d1",0.0318882730873944,0.0318882730873944,0 -0.502410726577924,2,-0.198465011915808,-0.44726347609141,-1.01351429027039,"d1",19.663324690515,0.502410726577924,2 -6.25768367946802,1,-0.499300428082239,-0.433624573557182,0.772259655809996,"d1",16.2063858835938,6.25768367946802,1 -4.45243678390236,1,-2.27994890407291,-0.432600267100338,-0.192874202113765,"d1",16.1783087803962,4.45243678390236,1 -5.3456110942715,1,-0.0728341072992885,-0.426744213461414,-2.00347070619136,"d1",23.6349859825316,5.3456110942715,1 -6.13261237074062,1,-0.699906551948259,-0.412362816369978,-0.00380865176602626,"d1",11.5768774040043,6.13261237074062,1 -3.68682961056151,1,-0.0838928805075599,-0.411622202650781,0.568031700168796,"d1",22.4474866121056,3.68682961056151,1 -0.76100954706631,2,-0.878828901403943,-0.407136319659784,-0.422550777633684,"d1",8.09349642135203,0.76100954706631,2 -3.6396768946298,1,-0.493970497537286,-0.380437653626171,0.544980332189823,"d1",24.2342771767619,3.6396768946298,1 -0.226093608306023,2,-0.802450798273513,-0.379668398780153,-0.353597623913161,"d1",10.9755174070597,0.226093608306023,2 -7.14217677187447,1,-0.532156059460212,-0.377947838991342,0.865326864053416,"d1",83.4494295553544,7.14217677187447,1 -1.023792038258,2,-0.234775191661309,-0.377922510014183,0.491050706319866,"d1",13.4517656546086,1.023792038258,2 -0.325230990536511,2,-0.921853465743566,-0.376532243381352,-0.315304498057206,"d1",10.009858366102,0.325230990536511,2 -1.21214290052177,2,-1.01754659517164,-0.372131176422376,0.721744258141993,"d1",15.1669203109088,1.21214290052177,2 -1.05932499277861,2,-0.172861497329901,-0.368173871392029,-0.415327623237047,"d1",11.0319846123457,1.05932499277861,2 -1.15900027747722,2,-1.06357604916444,-0.355727286601868,-0.83295066853112,"d1",11.026405999437,1.15900027747722,2 -1.40432675174418,2,-2.00392240233422,-0.354311938693627,0.545223722435314,"d1",4.14780305698514,1.40432675174418,2 -5.24546520517952,1,-0.697060984902235,-0.352340824558248,-0.167827672286475,"d1",13.1773237604648,5.24546520517952,1 -2.20974060321662,2,-0.44644890041726,-0.341316173238382,-1.17368307746107,"d1",12.000501928851,2.20974060321662,2 -1.10313763608864,2,-1.01741977972463,-0.301238997620582,0.795809665949982,"d1",1.13211940973997,1.10313763608864,2 -0.0549348615779616,2,-0.638941905808089,-0.282836701929551,-0.222573540488648,"d1",18.5490127270171,0.0549348615779616,2 -6.19019369816236,1,-0.630025466535802,-0.278803767694466,0.363569772143073,"d1",14.0355504109504,6.19019369816236,1 -5.854815371233,1,-0.70528626965295,-0.27642123739972,0.755367666130202,"d1",0.0763031522171913,0.0763031522171913,0 -0.915718387383339,2,-0.599049699293295,-0.250802227183038,0.638905768770242,"d1",7.72378107532859,0.915718387383339,2 -0.408360831827446,2,-0.373723206001262,-0.250303662643863,-1.34600874310538,"d1",1.42498890869319,0.408360831827446,2 -0.207730723278592,2,-1.1498063304207,-0.242127769602012,0.187896014934178,"d1",18.3369519749022,0.207730723278592,2 -5.98386667120984,1,-1.02659650747139,-0.236076301428279,-0.221062460615409,"d1",37.3994422083372,5.98386667120984,1 -1.08100279043884,2,-1.94479416850934,-0.233685865260032,-1.95828191574904,"d1",12.4608694948256,1.08100279043884,2 -0.0099718258716166,2,-1.51095925832907,-0.226883732267773,0.538896410656343,"d1",1.69574242813753,0.0099718258716166,2 -0.654205780476332,2,-1.4121280129534,-0.224646176343045,0.992025433629389,"d1",13.1169978715479,0.654205780476332,2 -4.54793027405606,1,-0.828960039105809,-0.21371393692546,-1.56541454696946,"d1",11.5059393732247,4.54793027405606,1 -3.38249082101469,2,-0.304769221959177,-0.211731030982286,0.556224447936644,"d1",3.39749668724835,3.38249082101469,2 -3.96991475732246,1,-0.0883548658769718,-0.209627983367337,0.941399989549762,"d1",0.838029654696584,0.838029654696584,0 -6.59189400563318,1,-0.424866029345544,-0.201990758460719,-0.0530650487711301,"d1",14.3362023462337,6.59189400563318,1 -4.33577255715891,1,-0.733916490468392,-0.197969023048747,0.746621269395464,"d1",0.883020637944007,0.883020637944007,0 -0.101469402055628,2,-0.82052056082922,-0.190251451264261,-0.0639685408845276,"d1",13.7223364040256,0.101469402055628,2 -0.770054679736931,2,-0.214052821196357,-0.186398037836426,-1.21330515191523,"d1",43.0222481836505,0.770054679736931,2 -0.00398647907686216,2,-0.738955336683205,-0.18140384913684,-0.322614676260016,"d1",9.5018079970032,0.00398647907686216,2 -6.25516042635959,1,-0.605307676670324,-0.150378047353032,0.345014721638011,"d1",30.7541495917325,6.25516042635959,1 -8.1048077865766,1,-1.01710519216245,-0.149800375609999,-0.0364766720553888,"d1",0.944741234214027,0.944741234214027,0 -6.2812328382367,1,-0.6418689198448,-0.143668219208823,0.169791544958343,"d1",4.39846734516323,4.39846734516323,0 -6.92405921593974,1,-0.726680950407423,-0.135676733596106,0.25111223999711,"d1",1.39894222840667,1.39894222840667,0 -1.15639470513434,2,-0.375659527184283,-0.133457241096729,-0.720537460818236,"d1",4.6384328158824,1.15639470513434,2 -0.0127057878088691,2,-0.584704699337587,-0.129682557224926,0.714226452339785,"d1",11.5945034567267,0.0127057878088691,2 -1.02857265573186,2,-0.326048256016773,-0.129438718205001,-1.23355723518009,"d1",35.4771690426354,1.02857265573186,2 -0.0205982001498342,2,-0.359779776182028,-0.119297861520966,0.591992900562482,"d1",8.94692211411893,0.0205982001498342,2 -1.40970702545298,2,-0.213891739055617,-0.119294621033348,-0.182478549861398,"d1",12.1665546670556,1.40970702545298,2 -0.0254313736222684,2,-1.24521542217279,-0.119287220034298,0.625913797060942,"d1",3.49854445963949,0.0254313736222684,2 -5.83808202434836,1,-0.578403832247115,-0.112888224067282,0.262708993216398,"d1",13.8795710072452,5.83808202434836,1 -6.60082031797962,1,-1.46939977515696,-0.104406161639182,0.338158444800253,"d1",17.2645219841198,6.60082031797962,1 -0.117790273856372,2,-0.261344257340527,-0.0993180765045312,-1.18610183706866,"d1",17.3415739927542,0.117790273856372,2 -2.16273942540821,1,-0.721897078426956,-0.0746452491488003,-1.12270409405886,"d1",14.0247517622476,2.16273942540821,1 -0.0374332187223255,2,-0.492348529899591,-0.0740207812561484,-1.43891317872365,"d1",26.6852392061594,0.0374332187223255,2 -5.0002440073125,1,-1.17422958458737,-0.0611967996743354,0.924747957649965,"d1",15.1820505589439,5.0002440073125,1 -0.571775167714804,2,-1.71005056102592,-0.050562582643229,-1.27945291216992,"d1",12.6607749331743,0.571775167714804,2 -6.65550057687453,1,-0.405884732342281,-0.0456498072713263,-0.357571968752414,"d1",3.69402457028627,3.69402457028627,0 -0.857566208536637,2,-0.597174831778963,-0.0448578636565208,0.69300706154143,"d1",0.551790578173197,0.551790578173197,0 -6.59222101830647,1,-0.274371806644722,-0.0359840523969918,-0.00026315814818347,"d1",17.4641290572546,6.59222101830647,1 -0.67841577809304,2,-1.0772074617867,-0.0337208917027876,-0.403450657463133,"d1",35.4620265198832,0.67841577809304,2 -0.668002340011299,2,-1.08545723440476,-0.0251063950207619,0.939654469893472,"d1",8.34927806630731,0.668002340011299,2 -5.74339111739383,1,-0.04460856554122,-0.00835023844905028,-0.748071090622482,"d1",51.6425802160926,5.74339111739383,1 -1.82126400425079,2,-0.0177826697978964,-0.00525648348828892,0.960240386660172,"d1",6.33178289048374,1.82126400425079,2 -0.630121590569615,2,-0.374380456657173,-0.00283109908242781,-0.460421882711496,"d1",31.515871056219,0.630121590569615,2 -1.62263065547043,2,-0.578858002631244,0.0217249885551602,-1.96126361796654,"d2",11.4491322916001,1.62263065547043,2 -1.28221844159756,1,-0.393114588906499,0.0225499335063258,0.434198009477631,"d2",8.08907632716,1.28221844159756,1 -0.0710073061028453,2,-0.361240550986893,0.0247397479896548,0.284171178928202,"d2",42.1896167036723,0.0710073061028453,2 -2.1523897035229,2,-0.764435758530165,0.0272912914605349,-1.28327374747751,"d2",10.2206419493408,2.1523897035229,2 -0.753091441865533,2,-1.19613901592276,0.0276235791587881,0.835647672647747,"d2",2.74232354527797,0.753091441865533,2 -0.535127593551222,1,-0.576473388106182,0.035000668205451,-0.017356071098809,"d2",13.2582863140851,0.535127593551222,1 -1.59197683363992,2,-0.625362092530586,0.0370275041807405,0.126384613081724,"d2",37.5318089128632,1.59197683363992,2 -0.26349567654236,2,-0.290374267961153,0.0371321598830519,-0.513697391403867,"d2",2.80140158938636,0.26349567654236,2 -0.867308566107245,2,-1.95768667669643,0.0375659571563162,-0.634722892905126,"d2",24.0328325322809,0.867308566107245,2 -1.30410956147476,2,-0.762471841684381,0.0398737320545291,-0.872482297755538,"d2",22.1617450311126,1.30410956147476,2 -1.4835222529382,2,-1.0358066572848,0.0501944975859606,-0.735009056303785,"d2",15.6004232159796,1.4835222529382,2 -0.424044434532835,2,-0.476967266017635,0.050464990999201,-1.72141260365734,"d2",3.48480642773211,0.424044434532835,2 -0.0915709753815865,2,-0.49692692996925,0.0573151067167399,-0.497970169498318,"d2",65.3296588327656,0.0915709753815865,2 -1.51596810999106,2,-0.0770707331255256,0.0595677398533348,-1.92136075269802,"d2",79.3569109919381,1.51596810999106,2 -0.398533509233927,1,-0.826839943477568,0.0682015537417207,-0.882775820710363,"d2",7.15256387429906,0.398533509233927,1 -1.62587438911195,2,-0.245452415145027,0.068904786126836,-0.958155584397777,"d2",37.1642307547813,1.62587438911195,2 -0.634364937897617,2,-1.50830408406202,0.0754547310552607,0.0973234366406274,"d2",5.67512247152905,0.634364937897617,2 -0.711386162395278,2,-1.37503355669522,0.0770248811196285,-0.903993925010862,"d2",13.2279564812779,0.711386162395278,2 -0.747886747492562,2,-0.283476358868049,0.0790833893495843,0.867533784826467,"d2",4.36639625579119,0.747886747492562,2 -0.633273537163958,2,-0.866793185278675,0.0795548841871984,-0.800219422194315,"d2",3.86477720923722,0.633273537163958,2 -0.0204741884312118,2,-0.023090344746053,0.0816820451255088,0.865940404164304,"d2",0.800363280481217,0.0204741884312118,2 -0.809896258124635,2,-1.48811573495461,0.0868639459183109,-0.900670183447792,"d2",5.32053390517831,0.809896258124635,2 -0.224963228745801,2,-0.615143621366165,0.104343235385161,-0.528253178308493,"d2",0.781445745378733,0.224963228745801,2 -0.603945789213362,2,-0.902504927566528,0.108878805887301,-0.391791898161784,"d2",34.4152825247088,0.603945789213362,2 -1.06525917474196,2,-0.407066520246661,0.109326641421494,-0.557445394177184,"d2",32.2371522580046,1.06525917474196,2 -0.155089284692544,2,-0.420606469294957,0.109782326184036,-0.122495113916219,"d2",34.4508593512659,0.155089284692544,2 -0.35317332376549,2,-2.5323142576937,0.120387488663856,0.636340699537245,"d2",5.94721422530711,0.35317332376549,2 -1.50856900470565,1,-1.22695139353891,0.121946013509368,-0.408218272762679,"d2",18.801272283851,1.50856900470565,1 -0.237881308813816,2,-1.07670556129965,0.145063596669344,0.261855912282463,"d2",0.747899413108826,0.237881308813816,2 -0.416807783338289,2,-0.559334776653761,0.147863506690623,0.392412738069171,"d2",63.3123658563862,0.416807783338289,2 -0.426968297199823,2,-0.979582410026887,0.152162838490286,-0.414045614621551,"d2",2.62846374884248,0.426968297199823,2 -2.76032244439042,2,-0.154477550097877,0.152392990038237,-0.788371202318248,"d2",3.65458440035582,2.76032244439042,2 -1.11870077438705,1,-0.599146592866972,0.157556834575242,-0.352337371318032,"d2",13.7063298560679,1.11870077438705,1 -1.11279250104927,2,-2.09809697365531,0.158074370023265,-0.719280435970664,"d2",42.6600379420564,1.11279250104927,2 -0.0776825762644314,2,-0.480261572212739,0.161272558399741,0.968965684973622,"d2",2.59143915743156,0.0776825762644314,2 -0.489987619280431,1,-0.635686551578909,0.161944781152408,0.895820975927653,"d2",17.5853631297135,0.489987619280431,1 -1.04343064643425,2,-0.149356505562529,0.164850514714938,0.297633428264352,"d2",10.1497511658818,1.04343064643425,2 -0.376671124199688,2,-0.576339205353266,0.16794217688026,-0.449781393949157,"d2",5.56738465093076,0.376671124199688,2 -0.19522811809624,2,-0.269372430183501,0.168369369174143,0.538178217480167,"d2",11.3334511779249,0.19522811809624,2 -0.00393730867293355,2,-1.13342959760482,0.17212553858774,0.254573300555983,"d2",25.736616141254,0.00393730867293355,2 -0.00487037384654395,2,-1.66001341838688,0.174606749949963,0.073886191607426,"d2",34.9265615252738,0.00487037384654395,2 -1.80695842176759,1,-0.283551262821809,0.175514455770042,0.949342246098602,"d2",11.5669766161591,1.80695842176759,1 -0.455824922091771,2,-0.144645421275756,0.178097522229174,-0.521022563712938,"d2",16.1112212165667,0.455824922091771,2 -0.0746160078578386,2,-0.501953053166294,0.178353709926701,0.410891145994807,"d2",21.1762206434252,0.0746160078578386,2 -0.542051810065195,2,-0.574392137684709,0.207877118164282,-1.02410290164159,"d2",28.1358632801061,0.542051810065195,2 -0.667051993378265,2,-1.01160555863319,0.212807815139801,-0.66732415300705,"d2",23.3078352507629,0.667051993378265,2 -0.464077745170919,2,-1.22191628806067,0.217151436734035,0.542117095355253,"d2",1.25699988387794,0.464077745170919,2 -0.188328571210729,2,-1.24833410531118,0.217843836439306,-0.418763900432543,"d2",26.9082405037227,0.188328571210729,2 -0.109984107801926,2,-1.12971146599918,0.232712244585027,-0.654627515184759,"d2",12.7776817884296,0.109984107801926,2 -0.684764363403859,2,-0.491011598609,0.244209731015568,0.302834972546819,"d2",17.4576880215647,0.684764363403859,2 -0.158563602787365,2,-0.165604515383408,0.249030026190664,-0.127773547814587,"d2",33.2413780299907,0.158563602787365,2 -0.0219640541592192,2,-1.3067579864696,0.249909196820699,-0.433446637034466,"d2",10.5031970422715,0.0219640541592192,2 -0.50925306111601,2,-0.61955970532787,0.254657080408966,-1.61635114653478,"d2",6.01476361975074,0.50925306111601,2 -1.50096565631731,2,-0.711114087116904,0.257327019177981,-0.773550689281178,"d2",5.95401277152274,1.50096565631731,2 -1.36486072091309,2,-1.46404140252043,0.263358662945559,-3.1438059305269,"d2",21.8958537830951,1.36486072091309,2 -0.390309073876718,2,-0.840746132854337,0.263728700596104,0.562366476526802,"d2",68.2684893872509,0.390309073876718,2 -0.679795922646958,2,-0.236776446532667,0.278518245851649,-1.49230330163869,"d2",3.9876926317811,0.679795922646958,2 -0.724527445958358,2,-1.14697584689703,0.282593193012178,-0.885124173023745,"d2",3.45512878149748,0.724527445958358,2 -0.770066255889734,2,-1.21732980536083,0.284787357143001,0.255004208623053,"d2",36.792803405035,0.770066255889734,2 -0.46613123849456,2,-0.119226561525818,0.289592872297724,0.167523195535134,"d2",0.358355776726436,0.358355776726436,0 -2.22814567740949,2,-1.01775117085296,0.322546787489202,-0.106281524616066,"d2",61.7748028006325,2.22814567740949,2 -0.0844876296513269,2,-0.408227089927771,0.323994820815029,0.355693406349296,"d2",58.4905307409627,0.0844876296513269,2 -0.975371115075574,2,-0.970005476960108,0.327344824748461,-0.381834780102756,"d2",3.19861772006316,0.975371115075574,2 -1.27420084308242,2,-1.163148737653,0.327346149098577,-0.502271963277872,"d2",8.52371971277834,1.27420084308242,2 -1.11351881283745,2,-0.636724652658768,0.335991410094823,0.500814112962396,"d2",10.5844404920936,1.11351881283745,2 -0.643438751809849,2,-0.543988665190268,0.350366972506996,-0.691758619519765,"d2",5.08866863325238,0.643438751809849,2 -0.0822662131233913,2,-0.894686363777382,0.354365713414602,-0.279153989865185,"d2",1.81503525003791,0.0822662131233913,2 -2.02889611975621,2,-0.570161716639006,0.358293933194602,-0.550076376216918,"d2",22.8790422706845,2.02889611975621,2 -0.392365154875429,2,-0.342008685772426,0.359569267678778,-0.271785377711678,"d2",20.7963954927341,0.392365154875429,2 -1.31887461603156,1,-1.16347118158703,0.360191579747997,-0.0722309406630147,"d2",21.2704490178422,1.31887461603156,1 -1.50905049448219,2,-0.659341916939053,0.362644409133353,0.684459952719281,"d2",13.9709756388736,1.50905049448219,2 -3.15747903836754,2,-1.73840648591533,0.366406670280074,-0.298575326171553,"d2",37.2580288333778,3.15747903836754,2 -1.39137796913695,2,-0.412864641872336,0.378992297378,0.445693849903093,"d2",12.6039244420826,1.39137796913695,2 -1.00970436849354,2,-0.395082096738527,0.382010262648326,-1.28852719898889,"d2",17.5538274264874,1.00970436849354,2 -1.70669165340187,2,-0.270190960772896,0.391282234678308,0.930805801930924,"d2",5.77591234548557,1.70669165340187,2 -0.521773378678778,2,-0.126036476956779,0.39614040521448,0.665443358318428,"d2",27.6069133161547,0.521773378678778,2 -0.606416514476558,2,-1.025136908893,0.396581238292746,-1.67451392995307,"d2",11.6030932001657,0.606416514476558,2 -0.490568188109911,2,-0.749298579102425,0.411480978576853,-0.205434450059756,"d2",155.825299797651,0.490568188109911,2 -0.140466598799784,2,-1.26281148323805,0.414323993148583,0.388015149194928,"d2",24.8703219360652,0.140466598799784,2 -1.63550901332397,2,-0.806779130243142,0.417115948593644,-0.0658789043484457,"d2",23.8971231124344,1.63550901332397,2 -0.75374593547446,2,-0.567522013121231,0.417594817175236,0.188837679351814,"d2",16.54752952894,0.75374593547446,2 -0.152153590227425,2,-0.765818787426703,0.418522708402147,0.00731752166317815,"d2",6.28146065399051,0.152153590227425,2 -1.15987459540589,2,-0.121346489868558,0.424349849151581,0.240793818846837,"d2",58.639344271637,1.15987459540589,2 -1.49188357490541,2,-0.251981116796632,0.426723153204208,0.37391096516771,"d2",17.2055481662561,1.49188357490541,2 -0.465849839327852,2,-0.505358915271077,0.426868714871196,-0.0839968519859277,"d2",11.1470808833838,0.465849839327852,2 -0.514377606102378,2,-1.48435944511628,0.43823921711183,-0.270398122330151,"d2",2.83134931698442,0.514377606102378,2 -1.37083819437581,2,-0.942850848323754,0.43845089029677,-0.640576204026827,"d2",6.56377174891531,1.37083819437581,2 -0.604730482549567,2,-0.342686014810829,0.440428555800003,-0.585647349713446,"d2",58.1326644088993,0.604730482549567,2 -2.38162830860741,2,-0.0509251423442782,0.449250562133414,0.0153383773617419,"d2",5.86805497296154,2.38162830860741,2 -0.936987707937162,1,-1.27016523546516,0.451870143183855,0.6288446859123,"d2",29.1486597440213,0.936987707937162,1 -1.3514202925692,2,-0.231514029465654,0.472412528112696,0.864892542845737,"d2",13.3516124635935,1.3514202925692,2 -0.44545424739223,2,-0.537603264715137,0.485484972481348,-1.37162073165871,"d2",16.7040145016255,0.44545424739223,2 -0.37038505214194,2,-1.33992208021174,0.499363224209327,-2.22822062828528,"d2",31.4321481792216,0.37038505214194,2 -0.00743040960429768,2,-0.827233773203637,0.501657410834819,0.600360386941691,"d2",4.68624860048294,0.00743040960429768,2 -1.06928769540851,2,-1.79826966860824,0.511859081350625,-1.61509343921743,"d2",12.4147091992199,1.06928769540851,2 -0.398101279346337,2,-1.10775714804814,0.529026255873108,-0.181986138084938,"d2",13.129425290972,0.398101279346337,2 -1.14000506048611,2,-1.79765382194691,0.529220720193775,0.830035376518184,"d2",37.8915428725963,1.14000506048611,2 -1.10912364066992,2,-1.04433825797855,0.539416179060379,-2.05046671465067,"d2",12.9112015850842,1.10912364066992,2 -0.218780244008344,2,-0.608675711931701,0.548163722585798,-2.47352322276342,"d2",8.54718699119985,0.218780244008344,2 -0.850581004469453,1,-0.447511052245895,0.564801210678692,-1.81442820691436,"d2",2.26566986408528,0.850581004469453,1 -0.855666513631384,2,-2.13818244511402,0.62622330607782,-0.388154860024151,"d2",12.8540292102844,0.855666513631384,2 -2.1856308540942,2,-0.78196374129668,0.643926759205068,-2.26966417409628,"d2",12.1851485967636,2.1856308540942,2 -2.21783935658177,2,-0.651277743851512,0.64437711493386,-0.0628370633467478,"d2",4.7361337672919,2.21783935658177,2 -2.66605038493913,1,-0.90754497972906,0.644821644027934,-1.79315275911764,"d2",15.0149627067721,2.66605038493913,1 -0.602170499269422,2,-2.08283603059158,0.653338636167427,-0.0559950805249862,"d2",88.3255479434386,0.602170499269422,2 -0.505554509814011,2,-0.6209353607903,0.653553876086565,-1.46860814520335,"d2",28.7516077591066,0.505554509814011,2 -0.0686638595708569,2,-0.735071648729763,0.658458711046142,-0.902171510168721,"d2",20.3378800666871,0.0686638595708569,2 -1.23363737636628,2,-0.229141299074559,0.667769735492015,0.44426138711264,"d2",9.60924427956343,1.23363737636628,2 -0.734908695593717,2,-1.41643377648938,0.669102178169292,-0.363069784243584,"d2",1.13766871584323,0.734908695593717,2 -0.785797862992444,2,-0.707289099921422,0.670700320212791,-1.84705478809774,"d2",17.5849492839518,0.785797862992444,2 -0.0647379571435017,1,-1.46772218558662,0.676996341328256,0.423122436127203,"d2",20.9062523386421,0.0647379571435017,1 -0.68067476095048,2,-0.144366524893493,0.681225512127279,0.185094647980252,"d2",2.83637944067913,0.68067476095048,2 -0.496110307056098,2,-1.73561627917223,0.686181929261749,-0.896920673717545,"d2",27.1116044177654,0.496110307056098,2 -0.828971303610886,2,-0.0481468628741855,0.686343525508891,-1.3065311825373,"d2",11.7226412612945,0.828971303610886,2 -0.728124357404708,1,-1.40907499558226,0.688215933035988,-0.13602418646648,"d2",6.16357510909438,0.728124357404708,1 -1.74627794500434,1,-0.519287834824023,0.696344750633333,-1.16053542404109,"d2",3.98310596621714,1.74627794500434,1 -0.860169175773096,2,-1.12966715232129,0.707692044116363,0.449294456826711,"d2",16.1259185886922,0.860169175773096,2 -1.74960246903603,2,-1.15241420864627,0.708376912244165,0.0945302458165274,"d2",9.05113011598587,1.74960246903603,2 -0.620163383728912,2,-1.14485810944178,0.720578241579318,0.298376377809392,"d2",14.7201306232412,0.620163383728912,2 -0.599121518218681,2,-0.491805256281995,0.720845357405082,0.170067978878183,"d2",2.1413634903729,0.599121518218681,2 -0.258023886584911,2,-1.02468964249271,0.721904053264548,0.379341452116645,"d2",18.6108343853595,0.258023886584911,2 -0.713235444755807,2,-1.85268576462046,0.754783125581337,0.229541809119566,"d2",52.7147463311381,0.713235444755807,2 -1.3715883817522,2,-0.00951542871598267,0.755490788646641,-0.541187999043309,"d2",9.76649975404143,1.3715883817522,2 -0.139136541050377,2,-0.750398305804971,0.763985280222561,-0.905800470925745,"d2",7.22360649158305,0.139136541050377,2 -1.17117458340716,2,-1.86969806844165,0.779844507943365,-0.531280066778365,"d2",44.2495981951184,1.17117458340716,2 -0.528802586233419,2,-0.638218227996248,0.78095837107841,0.71170837351234,"d2",4.09247838892043,0.528802586233419,2 -15.9859128030783,1,-1.2749751848768,0.78885308243751,-2.37102557429026,"d2",33.3947736008053,15.9859128030783,1 -0.947866507167075,2,-0.377359616856185,0.790658665799771,-0.334371628832217,"d2",9.29856486618519,0.947866507167075,2 -0.645793883967361,2,-0.79224673672974,0.806751269297997,0.976406365543615,"d2",3.24837939813733,0.645793883967361,2 -0.310585423733822,2,-1.70916007971169,0.816935090855232,-1.36958432701944,"d2",27.4510624065044,0.310585423733822,2 -0.15098664696988,2,-0.621545910178871,0.828175732552656,-0.120092052906879,"d2",3.77097046934068,0.15098664696988,2 -1.39545865987322,2,-0.747841520418587,0.828358539607091,-0.121822404009773,"d2",6.38166908174753,1.39545865987322,2 -1.00432200867913,1,-1.07312835757515,0.84246881482389,0.6658920107911,"d2",12.654183935374,1.00432200867913,1 -0.376164471434408,2,-2.25749718255237,0.84686090594898,0.266513619424984,"d2",11.8262910097837,0.376164471434408,2 -0.92439962637748,2,-1.44275553582813,0.849469933628588,-0.799393627980222,"d2",25.2566761887612,0.92439962637748,2 -1.13734706267193,2,-0.214552486616779,0.86043447751587,-0.788632070223352,"d2",96.7150012353316,1.13734706267193,2 -0.417856744430816,2,-1.36994217513601,0.87504929650462,-0.072642473860285,"d2",19.9988145375184,0.417856744430816,2 -3.06296380306078,1,-0.907777416890521,0.879349192041277,-1.85621448262524,"d2",31.4180718567303,3.06296380306078,1 -0.609549967783587,2,-0.353895924710764,0.879649581240305,-2.43899018491939,"d2",37.7075326700159,0.609549967783587,2 -0.391106392937812,2,-0.00929502924538058,0.880112808863805,0.3641208320035,"d2",33.2838974755602,0.391106392937812,2 -0.0391002649473239,2,-0.119265636313351,0.903543923361854,-0.753988528524269,"d2",0.074649417946016,0.0391002649473239,2 -0.217673076954315,2,-0.991402236503461,0.927085095261113,-0.890088923311745,"d2",4.94580941274762,0.217673076954315,2 -0.912286231172002,2,-0.651751020375463,0.927563064724242,-0.255980255052049,"d2",26.9876665241065,0.912286231172002,2 -1.26422408098703,2,-1.59316198562629,0.955864860410794,-2.37511039436268,"d2",35.97322165798,1.26422408098703,2 -1.63798303075128,2,-0.944833506303253,0.957101283177756,0.107430927154945,"d2",8.76808514818549,1.63798303075128,2 -0.520085684978681,2,-1.93689648029229,0.960343687869681,-0.946446488528295,"d2",5.41821549126738,0.520085684978681,2 -0.0333522793002843,2,-0.406190415949957,0.974426310386208,-1.53532871882733,"d2",58.581854101635,0.0333522793002843,2 -0.52810010882123,2,-0.90366523639987,0.974877895389415,-0.0109691290904899,"d2",13.2324086781591,0.52810010882123,2 -0.175571716815793,2,-0.176394854786988,0.980980607940724,-0.0489264288249495,"d2",31.9512213749771,0.175571716815793,2 -0.529129727523435,2,-0.460396849812602,1.00094544353244,0.0662567586728054,"d2",1.88688070816757,0.529129727523435,2 -0.635567780011985,2,-0.76378882780698,1.00548327862127,0.423635270489904,"d2",42.4910559852548,0.635567780011985,2 -0.724904238278035,2,-0.907731768318047,1.00997063287553,0.538120581968774,"d2",36.0503575561528,0.724904238278035,2 -0.427629964225869,2,-1.56216126296095,1.01814611378071,-0.406674803306843,"d2",4.87516235560179,0.427629964225869,2 -0.161767293068696,2,-0.759473242254803,1.03657414400826,-0.977169880121158,"d2",48.7263685067124,0.161767293068696,2 -0.962126138834229,2,-0.56522171831491,1.05103830138578,-1.28735495414437,"d2",24.6044033012333,0.962126138834229,2 -0.448703828522713,2,-1.18508690906293,1.05794340357344,0.209893612875558,"d2",3.6171385717943,0.448703828522713,2 -2.29539588387135,2,-0.809591453713195,1.06264984735446,0.708970715100883,"d2",26.6586700818482,2.29539588387135,2 -0.690530526497498,2,-0.0267186723123176,1.0874311425292,-2.2279377944802,"d2",9.77258295752108,0.690530526497498,2 -0.472309753498816,1,-0.359882797031715,1.09786284055163,-0.288753197637377,"d2",81.2945778253389,0.472309753498816,1 -2.45214804477456,2,-0.21394029294774,1.13245244560219,0.514170048915875,"d2",24.8033722109141,2.45214804477456,2 -1.51453100008048,2,-0.376904852999008,1.137094128323,-0.769574027523774,"d2",31.9085638580804,1.51453100008048,2 -0.066087403612231,2,-1.01366783097158,1.14325704429475,0.0122662871490449,"d2",12.2102071903646,0.066087403612231,2 -2.27292557190558,2,-0.0613559687217213,1.15519370818209,0.206926829454031,"d2",13.3934736810625,2.27292557190558,2 -1.06101613204515,2,-1.08125475011268,1.15700722981978,-0.834547675087852,"d2",20.7887781775537,1.06101613204515,2 -1.29171527471949,2,-0.258163275873147,1.1571947075309,-0.343581741444281,"d2",13.2905606180429,1.29171527471949,2 -0.483420974791873,2,-0.247429099416824,1.18148342053382,0.666408548662519,"d2",27.3468879788163,0.483420974791873,2 -1.65322850434042,2,-0.618187508699168,1.20227668160115,-1.06876108987557,"d2",20.4747169642689,1.65322850434042,2 -1.25885674652328,2,-1.62801150855676,1.21660132215862,-1.27052258001484,"d2",0.0653019081801176,0.0653019081801176,0 -1.38317749248244,2,-0.412779168242635,1.2257839632566,-0.471509027445123,"d2",14.3918521018565,1.38317749248244,2 -0.29090056781615,2,-0.941711982878097,1.2452650785948,-1.13282683720939,"d2",33.3252260397076,0.29090056781615,2 -0.774384089212772,2,-0.821733976245432,1.24763858736497,0.215567163048395,"d2",15.7909392505371,0.774384089212772,2 -0.426550949391251,2,-0.613863471405316,1.26633615701241,-1.21869528367914,"d2",1.34932232089341,0.426550949391251,2 -2.16897273189479,2,-0.595914050488664,1.27706728920149,-1.74397046871294,"d2",7.73399090394378,2.16897273189479,2 -0.60714584775794,2,-0.732737873358977,1.27761478426247,0.00948414982453159,"d2",6.53633067384362,0.60714584775794,2 -0.928060938574253,2,-0.0593950423195912,1.30184730656887,0.269582930706893,"d2",16.8946285537424,0.928060938574253,2 -0.0652448540805098,2,-0.376171738015478,1.30902526364196,-2.2509856641888,"d2",34.4706994940756,0.0652448540805098,2 -0.290682706395645,2,-0.748192811516037,1.32500142107158,0.733254357772467,"d2",99.2230615333514,0.290682706395645,2 -0.099562649791565,2,-0.0646000063702595,1.33398179591883,0.271531892777113,"d2",1.23980532934852,0.099562649791565,2 -0.21834724290433,2,-1.63793111804505,1.33912858503736,-0.43680375689659,"d2",31.7336872575765,0.21834724290433,2 -0.355890267642353,2,-0.423946587126264,1.3856925052704,-0.276827203788486,"d2",7.60781746505117,0.355890267642353,2 -0.640673603062046,2,-0.186450402973362,1.39835032773893,-0.173427024327545,"d2",47.3483018924422,0.640673603062046,2 -1.48656976140796,2,-0.91541184985219,1.39989832103014,-0.992620752809943,"d2",7.52968023531139,1.48656976140796,2 -1.65555322752278,1,-0.485881634025376,1.41117763150536,-0.726434134251611,"d2",65.2425061132679,1.65555322752278,1 -1.19084622251781,2,-0.41575087352391,1.41304076324206,-0.89595965520797,"d2",35.4190194217448,1.19084622251781,2 -0.743826687228459,2,-0.486520668561888,1.41541061022267,0.0601947005008747,"d2",25.9400983705165,0.743826687228459,2 -0.80674393638146,2,-0.0583341820790928,1.42216295944444,0.0544646255026132,"d2",49.9927782614656,0.80674393638146,2 -0.531679737743372,2,-0.276771009359284,1.43140802191472,0.316807326856949,"d2",31.8341349421029,0.531679737743372,2 -0.946712639709247,1,-0.751586796242839,1.44325281817539,-0.228361206575733,"d2",0.967175701785795,0.946712639709247,1 -0.0102507216148591,2,-0.697153420063897,1.45011924808629,-0.1735760078557,"d2",50.4439213474221,0.0102507216148591,2 -0.97816637578579,2,-0.623542054555381,1.45326936864526,-1.04309452819424,"d2",0.221857391297817,0.221857391297817,0 -1.55592279163702,2,-0.176217002127984,1.49113258501544,-1.56410714129628,"d2",8.67591893300414,1.55592279163702,2 -0.436696810447691,2,-0.30260459699746,1.5548796741216,0.26223027233537,"d2",2.5096242376164,0.436696810447691,2 -1.56011947543939,2,-0.171702067200568,1.55615864606286,-0.00103340896897324,"d2",28.8497183082585,1.56011947543939,2 -0.041023977490151,2,-0.213494343986504,1.56225642569261,-0.367845350238968,"d2",10.8403069991618,0.041023977490151,2 -0.592072764055101,2,-0.143230072021797,1.56526082666509,-0.438323140711413,"d2",4.36732348054647,0.592072764055101,2 -1.29752014338006,2,-0.181245337921119,1.56600498772284,0.0982090925685866,"d2",8.29938241280615,1.29752014338006,2 -0.769091140462859,2,-1.04979902287923,1.652798333173,0.598218868632103,"d2",18.5340986682841,0.769091140462859,2 -0.614095462763319,2,-0.129243968919267,1.66882377416187,-0.553767152997795,"d2",9.75808587856591,0.614095462763319,2 -0.677081263269833,2,-0.461186220906231,1.68233756841276,-0.108397961050149,"d2",24.5852781451287,0.677081263269833,2 -0.167651205068143,2,-0.215571372145331,1.68370200482687,0.905971152345377,"d2",28.9677151275759,0.167651205068143,2 -0.760640574623506,2,-0.185659053672513,1.74441351026884,-0.290411394614044,"d2",3.6788512673229,0.760640574623506,2 -1.57059571330668,2,-0.00378045852779645,1.75199514594482,0.37518745697901,"d2",36.5044529346709,1.57059571330668,2 -1.22039732425317,2,-0.0409784974877476,1.8128663242746,0.518983973724044,"d2",8.14542844891548,1.22039732425317,2 -0.357746726203608,2,-1.13221511533544,1.82140525789747,-1.12823713903409,"d2",2.84647900611162,0.357746726203608,2 -0.506598376895596,2,-1.58623419714671,1.84630386483031,-0.871164001707083,"d2",7.05219495933504,0.506598376895596,2 -0.555298311726655,2,-0.653122290105271,1.87980904893923,0.601692658871586,"d2",10.4217884922989,0.555298311726655,2 -0.0497472713166745,2,-0.803414420619709,1.92869213509968,0.566759572983138,"d2",46.8863080789275,0.0497472713166745,2 -0.63588913711856,2,-1.55312674896571,1.9812307225371,-0.394362125613719,"d2",59.6746130358048,0.63588913711856,2 -0.344136944209492,2,-1.55011818795769,2.01308796757131,-1.10441392716533,"d2",3.32158831130657,0.344136944209492,2 -0.209930101087071,1,-0.17610319662441,2.04536354395301,-1.78388719927807,"d2",8.9971761777997,0.209930101087071,1 -1.96273178822442,2,-0.265413985422845,2.06717373344592,-1.5328302296829,"d2",6.70106924138963,1.96273178822442,2 -2.04208174814171,1,-1.20512563890975,2.17895259106906,0.463208094098719,"d2",24.6128874616159,2.04208174814171,1 -0.45294046876816,2,-0.220655663734128,2.18192023375661,0.0811841371808765,"d2",6.26351648010314,0.45294046876816,2 -1.68808336321915,2,-1.22492300639913,2.23292584390155,-0.69860353230613,"d2",79.5212812307191,1.68808336321915,2 -0.0830509647238433,2,-1.14387765956049,2.25144851755798,-0.782665324462104,"d2",4.72283883020282,0.0830509647238433,2 -0.392520671541139,2,-1.2204528537223,2.36374387346593,-1.79745435930711,"d2",0.827889424914617,0.392520671541139,2 -0.0423196883561676,2,-0.0824960908690546,2.46865766977258,-0.275587719866787,"d2",10.8342845924199,0.0423196883561676,2 -1.15467347169962,2,-1.61238280333006,2.53930227266609,-0.214709061234683,"d2",5.75399165041745,1.15467347169962,2 -1.29154389139611,2,-1.05643444903253,2.55910612622809,-0.505822986209181,"d2",3.11781542375684,1.29154389139611,2 -1.84823913917143,2,-1.32857310285023,2.62141379782439,-0.935292083483808,"d2",11.9421542808414,1.84823913917143,2 -1.82018302820833,2,-0.79030173881793,2.68172397486784,0.733114954575729,"d2",1.74682558514178,1.74682558514178,0 -0.531491206830686,2,-0.680665424931255,2.78232400978012,0.646038105645267,"d2",16.607096281721,0.531491206830686,2 -1.24968905194214,2,-1.14050466415036,3.00307107062192,0.253293764911859,"d2",2.94403710469961,1.24968905194214,2 -0.263627831636059,1,-1.58535429653281,3.10991648674058,0.688555636490684,"d2",10.3094351757318,0.263627831636059,1