From 1e643385eeeaa2a24b54ba9e823071d126089253 Mon Sep 17 00:00:00 2001 From: Joel Therrien Date: Tue, 23 Apr 2019 14:17:43 -0700 Subject: [PATCH] Adjust MultipleLogRankDifferentiators to use actual implementation found in randomForestSRC Also merge SingleLogRankDifferentiators with the Group variants, as they now reduce tot he simple case when given only one event of focus. --- .../joeltherrien/randomforest/Settings.java | 78 +--- ...or.java => GrayLogRankDifferentiator.java} | 28 +- .../GrayLogRankSingleGroupDifferentiator.java | 47 -- ...tiator.java => LogRankDifferentiator.java} | 28 +- .../LogRankSingleGroupDifferentiator.java | 47 -- .../randomforest/utils/Utils.java | 20 + .../randomforest/TestSavingLoading.java | 6 +- .../competingrisk/TestCompetingRisk.java | 6 +- ...or.java => TestLogRankDifferentiator.java} | 37 +- .../TestLogRankSingleGroupDifferentiator.java | 11 +- ...ata_that_triggers_difference_composite.csv | 422 ------------------ 11 files changed, 102 insertions(+), 628 deletions(-) rename src/main/java/ca/joeltherrien/randomforest/responses/competingrisk/differentiator/{GrayLogRankMultipleGroupDifferentiator.java => GrayLogRankDifferentiator.java} (64%) delete mode 100644 src/main/java/ca/joeltherrien/randomforest/responses/competingrisk/differentiator/GrayLogRankSingleGroupDifferentiator.java rename src/main/java/ca/joeltherrien/randomforest/responses/competingrisk/differentiator/{LogRankMultipleGroupDifferentiator.java => LogRankDifferentiator.java} (63%) delete mode 100644 src/main/java/ca/joeltherrien/randomforest/responses/competingrisk/differentiator/LogRankSingleGroupDifferentiator.java rename src/test/java/ca/joeltherrien/randomforest/competingrisk/{TestLogRankMultipleGroupDifferentiator.java => TestLogRankDifferentiator.java} (69%) delete mode 100644 src/test/resources/new_data_that_triggers_difference_composite.csv 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