Merge branch 'optimizations' of joel/RandomSurvivalForests into master
This commit is contained in:
commit
7a5a8ab0fc
58 changed files with 2361 additions and 671 deletions
93
pmd-rules.xml
Normal file
93
pmd-rules.xml
Normal file
|
@ -0,0 +1,93 @@
|
||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<!--
|
||||||
|
Licensed to the Apache Software Foundation (ASF) under one
|
||||||
|
or more contributor license agreements. See the NOTICE file
|
||||||
|
distributed with this work for additional information
|
||||||
|
regarding copyright ownership. The ASF licenses this file
|
||||||
|
to you under the Apache License, Version 2.0 (the
|
||||||
|
"License"); you may not use this file except in compliance
|
||||||
|
with the License. You may obtain a copy of the License at
|
||||||
|
|
||||||
|
http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
|
||||||
|
Unless required by applicable law or agreed to in writing,
|
||||||
|
software distributed under the License is distributed on an
|
||||||
|
"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
||||||
|
KIND, either express or implied. See the License for the
|
||||||
|
specific language governing permissions and limitations
|
||||||
|
under the License.
|
||||||
|
-->
|
||||||
|
<ruleset name="Default Maven PMD Plugin Ruleset"
|
||||||
|
xmlns="http://pmd.sourceforge.net/ruleset/2.0.0"
|
||||||
|
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||||
|
xsi:schemaLocation="http://pmd.sourceforge.net/ruleset/2.0.0 http://pmd.sourceforge.net/ruleset_2_0_0.xsd">
|
||||||
|
|
||||||
|
<description>
|
||||||
|
The default ruleset used by the Maven PMD Plugin, when no other ruleset is specified.
|
||||||
|
It contains the rules of the old (pre PMD 6.0.0) rulesets java-basic, java-empty, java-imports,
|
||||||
|
java-unnecessary, java-unusedcode.
|
||||||
|
|
||||||
|
This ruleset might be used as a starting point for an own customized ruleset [0].
|
||||||
|
|
||||||
|
[0] https://pmd.github.io/latest/pmd_userdocs_understanding_rulesets.html
|
||||||
|
</description>
|
||||||
|
|
||||||
|
<rule ref="category/java/bestpractices.xml/AvoidUsingHardCodedIP" />
|
||||||
|
<rule ref="category/java/bestpractices.xml/CheckResultSet" />
|
||||||
|
<rule ref="category/java/bestpractices.xml/UnusedImports" />
|
||||||
|
<rule ref="category/java/bestpractices.xml/UnusedFormalParameter" />
|
||||||
|
<rule ref="category/java/bestpractices.xml/UnusedLocalVariable" />
|
||||||
|
<rule ref="category/java/bestpractices.xml/UnusedPrivateField" />
|
||||||
|
<rule ref="category/java/bestpractices.xml/UnusedPrivateMethod" />
|
||||||
|
|
||||||
|
<rule ref="category/java/codestyle.xml/DontImportJavaLang" />
|
||||||
|
<rule ref="category/java/codestyle.xml/DuplicateImports" />
|
||||||
|
<rule ref="category/java/codestyle.xml/ExtendsObject" />
|
||||||
|
<rule ref="category/java/codestyle.xml/ForLoopShouldBeWhileLoop" />
|
||||||
|
<rule ref="category/java/codestyle.xml/TooManyStaticImports" />
|
||||||
|
<rule ref="category/java/codestyle.xml/UnnecessaryFullyQualifiedName" />
|
||||||
|
<rule ref="category/java/codestyle.xml/UnnecessaryModifier" />
|
||||||
|
<rule ref="category/java/codestyle.xml/UnnecessaryReturn" />
|
||||||
|
<!--<rule ref="category/java/codestyle.xml/UselessParentheses" /> Sometimes parentheses are used for human eyes -->
|
||||||
|
<rule ref="category/java/codestyle.xml/UselessQualifiedThis" />
|
||||||
|
|
||||||
|
<rule ref="category/java/design.xml/CollapsibleIfStatements" />
|
||||||
|
<rule ref="category/java/design.xml/SimplifiedTernary" />
|
||||||
|
<rule ref="category/java/design.xml/UselessOverridingMethod" />
|
||||||
|
|
||||||
|
<rule ref="category/java/errorprone.xml/AvoidBranchingStatementAsLastInLoop" />
|
||||||
|
<rule ref="category/java/errorprone.xml/AvoidDecimalLiteralsInBigDecimalConstructor" />
|
||||||
|
<rule ref="category/java/errorprone.xml/AvoidMultipleUnaryOperators" />
|
||||||
|
<rule ref="category/java/errorprone.xml/AvoidUsingOctalValues" />
|
||||||
|
<rule ref="category/java/errorprone.xml/BrokenNullCheck" />
|
||||||
|
<rule ref="category/java/errorprone.xml/CheckSkipResult" />
|
||||||
|
<rule ref="category/java/errorprone.xml/ClassCastExceptionWithToArray" />
|
||||||
|
<rule ref="category/java/errorprone.xml/DontUseFloatTypeForLoopIndices" />
|
||||||
|
<rule ref="category/java/errorprone.xml/EmptyCatchBlock" />
|
||||||
|
<rule ref="category/java/errorprone.xml/EmptyFinallyBlock" />
|
||||||
|
<rule ref="category/java/errorprone.xml/EmptyIfStmt" />
|
||||||
|
<rule ref="category/java/errorprone.xml/EmptyInitializer" />
|
||||||
|
<rule ref="category/java/errorprone.xml/EmptyStatementBlock" />
|
||||||
|
<rule ref="category/java/errorprone.xml/EmptyStatementNotInLoop" />
|
||||||
|
<rule ref="category/java/errorprone.xml/EmptySwitchStatements" />
|
||||||
|
<rule ref="category/java/errorprone.xml/EmptySynchronizedBlock" />
|
||||||
|
<rule ref="category/java/errorprone.xml/EmptyTryBlock" />
|
||||||
|
<rule ref="category/java/errorprone.xml/EmptyWhileStmt" />
|
||||||
|
<rule ref="category/java/errorprone.xml/ImportFromSamePackage" />
|
||||||
|
<rule ref="category/java/errorprone.xml/JumbledIncrementer" />
|
||||||
|
<rule ref="category/java/errorprone.xml/MisplacedNullCheck" />
|
||||||
|
<rule ref="category/java/errorprone.xml/OverrideBothEqualsAndHashcode" />
|
||||||
|
<rule ref="category/java/errorprone.xml/ReturnFromFinallyBlock" />
|
||||||
|
<rule ref="category/java/errorprone.xml/UnconditionalIfStatement" />
|
||||||
|
<rule ref="category/java/errorprone.xml/UnnecessaryConversionTemporary" />
|
||||||
|
<rule ref="category/java/errorprone.xml/UnusedNullCheckInEquals" />
|
||||||
|
<rule ref="category/java/errorprone.xml/UselessOperationOnImmutable" />
|
||||||
|
|
||||||
|
<rule ref="category/java/multithreading.xml/AvoidThreadGroup" />
|
||||||
|
<rule ref="category/java/multithreading.xml/DontCallThreadRun" />
|
||||||
|
<rule ref="category/java/multithreading.xml/DoubleCheckedLocking" />
|
||||||
|
|
||||||
|
<rule ref="category/java/performance.xml/BigIntegerInstantiation" />
|
||||||
|
<rule ref="category/java/performance.xml/BooleanInstantiation" />
|
||||||
|
|
||||||
|
</ruleset>
|
23
pom.xml
23
pom.xml
|
@ -13,6 +13,9 @@
|
||||||
<maven.compiler.target>1.8</maven.compiler.target>
|
<maven.compiler.target>1.8</maven.compiler.target>
|
||||||
<maven.compiler.source>1.8</maven.compiler.source>
|
<maven.compiler.source>1.8</maven.compiler.source>
|
||||||
<jackson.version>2.9.6</jackson.version>
|
<jackson.version>2.9.6</jackson.version>
|
||||||
|
|
||||||
|
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
|
||||||
|
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
|
||||||
</properties>
|
</properties>
|
||||||
|
|
||||||
|
|
||||||
|
@ -89,9 +92,27 @@
|
||||||
</execution>
|
</execution>
|
||||||
</executions>
|
</executions>
|
||||||
</plugin>
|
</plugin>
|
||||||
|
<plugin>
|
||||||
|
<groupId>org.apache.maven.plugins</groupId>
|
||||||
|
<artifactId>maven-pmd-plugin</artifactId>
|
||||||
|
<version>3.11.0</version>
|
||||||
|
<executions>
|
||||||
|
<execution>
|
||||||
|
<phase>package</phase> <!-- bind to the packaging phase -->
|
||||||
|
<goals>
|
||||||
|
<goal>check</goal>
|
||||||
|
</goals>
|
||||||
|
</execution>
|
||||||
|
</executions>
|
||||||
|
<configuration>
|
||||||
|
<rulesets>
|
||||||
|
<!-- Custom local file system rule set -->
|
||||||
|
<ruleset>${project.basedir}/pmd-rules.xml</ruleset>
|
||||||
|
</rulesets>
|
||||||
|
</configuration>
|
||||||
|
</plugin>
|
||||||
</plugins>
|
</plugins>
|
||||||
</build>
|
</build>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
</project>
|
</project>
|
|
@ -4,20 +4,20 @@ import lombok.RequiredArgsConstructor;
|
||||||
|
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.concurrent.ThreadLocalRandom;
|
import java.util.Random;
|
||||||
|
|
||||||
@RequiredArgsConstructor
|
@RequiredArgsConstructor
|
||||||
public class Bootstrapper<T> {
|
public class Bootstrapper<T> {
|
||||||
|
|
||||||
final private List<T> originalData;
|
final private List<T> originalData;
|
||||||
|
|
||||||
public List<T> bootstrap(){
|
public List<T> bootstrap(Random random){
|
||||||
final int n = originalData.size();
|
final int n = originalData.size();
|
||||||
|
|
||||||
final List<T> newList = new ArrayList<>(n);
|
final List<T> newList = new ArrayList<>(n);
|
||||||
|
|
||||||
for(int i=0; i<n; i++){
|
for(int i=0; i<n; i++){
|
||||||
final int index = ThreadLocalRandom.current().nextInt(n);
|
final int index = random.nextInt(n);
|
||||||
|
|
||||||
newList.add(originalData.get(index));
|
newList.add(originalData.get(index));
|
||||||
}
|
}
|
||||||
|
|
|
@ -17,7 +17,7 @@ public class CovariateRow implements Serializable {
|
||||||
@Getter
|
@Getter
|
||||||
private final int id;
|
private final int id;
|
||||||
|
|
||||||
public Covariate.Value<?> getCovariateValue(Covariate covariate){
|
public <V> Covariate.Value<V> getCovariateValue(Covariate<V> covariate){
|
||||||
return valueArray[covariate.getIndex()];
|
return valueArray[covariate.getIndex()];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -58,7 +58,7 @@ public class DataLoader {
|
||||||
throw new IllegalArgumentException("Tree directory must be a directory!");
|
throw new IllegalArgumentException("Tree directory must be a directory!");
|
||||||
}
|
}
|
||||||
|
|
||||||
final File[] treeFiles = folder.listFiles(((file, s) -> s.endsWith(".tree")));
|
final File[] treeFiles = folder.listFiles((file, s) -> s.endsWith(".tree"));
|
||||||
final List<File> treeFileList = Arrays.asList(treeFiles);
|
final List<File> treeFileList = Arrays.asList(treeFiles);
|
||||||
|
|
||||||
Collections.sort(treeFileList, Comparator.comparing(File::getName));
|
Collections.sort(treeFileList, Comparator.comparing(File::getName));
|
||||||
|
|
|
@ -1,9 +1,9 @@
|
||||||
package ca.joeltherrien.randomforest;
|
package ca.joeltherrien.randomforest;
|
||||||
|
|
||||||
import ca.joeltherrien.randomforest.covariates.BooleanCovariateSettings;
|
import ca.joeltherrien.randomforest.covariates.settings.BooleanCovariateSettings;
|
||||||
import ca.joeltherrien.randomforest.covariates.Covariate;
|
import ca.joeltherrien.randomforest.covariates.Covariate;
|
||||||
import ca.joeltherrien.randomforest.covariates.FactorCovariateSettings;
|
import ca.joeltherrien.randomforest.covariates.settings.FactorCovariateSettings;
|
||||||
import ca.joeltherrien.randomforest.covariates.NumericCovariateSettings;
|
import ca.joeltherrien.randomforest.covariates.settings.NumericCovariateSettings;
|
||||||
import ca.joeltherrien.randomforest.responses.competingrisk.CompetingRiskErrorRateCalculator;
|
import ca.joeltherrien.randomforest.responses.competingrisk.CompetingRiskErrorRateCalculator;
|
||||||
import ca.joeltherrien.randomforest.responses.competingrisk.CompetingRiskFunctions;
|
import ca.joeltherrien.randomforest.responses.competingrisk.CompetingRiskFunctions;
|
||||||
import ca.joeltherrien.randomforest.responses.competingrisk.CompetingRiskResponse;
|
import ca.joeltherrien.randomforest.responses.competingrisk.CompetingRiskResponse;
|
||||||
|
|
|
@ -17,6 +17,8 @@ public class Row<Y> extends CovariateRow {
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
public Y getResponse() {
|
public Y getResponse() {
|
||||||
return this.response;
|
return this.response;
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
package ca.joeltherrien.randomforest;
|
package ca.joeltherrien.randomforest;
|
||||||
|
|
||||||
import ca.joeltherrien.randomforest.covariates.Covariate;
|
import ca.joeltherrien.randomforest.covariates.Covariate;
|
||||||
import ca.joeltherrien.randomforest.covariates.CovariateSettings;
|
import ca.joeltherrien.randomforest.covariates.settings.CovariateSettings;
|
||||||
import ca.joeltherrien.randomforest.responses.competingrisk.CompetingRiskResponse;
|
import ca.joeltherrien.randomforest.responses.competingrisk.CompetingRiskResponse;
|
||||||
import ca.joeltherrien.randomforest.responses.competingrisk.CompetingRiskResponseWithCensorTime;
|
import ca.joeltherrien.randomforest.responses.competingrisk.CompetingRiskResponseWithCensorTime;
|
||||||
import ca.joeltherrien.randomforest.responses.competingrisk.combiner.CompetingRiskFunctionCombiner;
|
import ca.joeltherrien.randomforest.responses.competingrisk.combiner.CompetingRiskFunctionCombiner;
|
||||||
|
@ -10,7 +10,6 @@ import ca.joeltherrien.randomforest.responses.competingrisk.differentiator.GrayL
|
||||||
import ca.joeltherrien.randomforest.responses.competingrisk.differentiator.GrayLogRankSingleGroupDifferentiator;
|
import ca.joeltherrien.randomforest.responses.competingrisk.differentiator.GrayLogRankSingleGroupDifferentiator;
|
||||||
import ca.joeltherrien.randomforest.responses.competingrisk.differentiator.LogRankMultipleGroupDifferentiator;
|
import ca.joeltherrien.randomforest.responses.competingrisk.differentiator.LogRankMultipleGroupDifferentiator;
|
||||||
import ca.joeltherrien.randomforest.responses.competingrisk.differentiator.LogRankSingleGroupDifferentiator;
|
import ca.joeltherrien.randomforest.responses.competingrisk.differentiator.LogRankSingleGroupDifferentiator;
|
||||||
import ca.joeltherrien.randomforest.responses.regression.MeanGroupDifferentiator;
|
|
||||||
import ca.joeltherrien.randomforest.responses.regression.MeanResponseCombiner;
|
import ca.joeltherrien.randomforest.responses.regression.MeanResponseCombiner;
|
||||||
import ca.joeltherrien.randomforest.responses.regression.WeightedVarianceGroupDifferentiator;
|
import ca.joeltherrien.randomforest.responses.regression.WeightedVarianceGroupDifferentiator;
|
||||||
import ca.joeltherrien.randomforest.tree.GroupDifferentiator;
|
import ca.joeltherrien.randomforest.tree.GroupDifferentiator;
|
||||||
|
@ -68,9 +67,6 @@ public class Settings {
|
||||||
GROUP_DIFFERENTIATOR_MAP.put(name.toLowerCase(), groupDifferentiatorConstructor);
|
GROUP_DIFFERENTIATOR_MAP.put(name.toLowerCase(), groupDifferentiatorConstructor);
|
||||||
}
|
}
|
||||||
static{
|
static{
|
||||||
registerGroupDifferentiatorConstructor("MeanGroupDifferentiator",
|
|
||||||
(node) -> new MeanGroupDifferentiator()
|
|
||||||
);
|
|
||||||
registerGroupDifferentiatorConstructor("WeightedVarianceGroupDifferentiator",
|
registerGroupDifferentiatorConstructor("WeightedVarianceGroupDifferentiator",
|
||||||
(node) -> new WeightedVarianceGroupDifferentiator()
|
(node) -> new WeightedVarianceGroupDifferentiator()
|
||||||
);
|
);
|
||||||
|
|
|
@ -1,11 +1,12 @@
|
||||||
package ca.joeltherrien.randomforest.covariates;
|
package ca.joeltherrien.randomforest.covariates;
|
||||||
|
|
||||||
|
import ca.joeltherrien.randomforest.Row;
|
||||||
|
import ca.joeltherrien.randomforest.tree.Split;
|
||||||
|
import ca.joeltherrien.randomforest.utils.SingletonIterator;
|
||||||
import lombok.Getter;
|
import lombok.Getter;
|
||||||
import lombok.RequiredArgsConstructor;
|
import lombok.RequiredArgsConstructor;
|
||||||
|
|
||||||
import java.util.Collection;
|
import java.util.*;
|
||||||
import java.util.Collections;
|
|
||||||
import java.util.List;
|
|
||||||
|
|
||||||
@RequiredArgsConstructor
|
@RequiredArgsConstructor
|
||||||
public final class BooleanCovariate implements Covariate<Boolean> {
|
public final class BooleanCovariate implements Covariate<Boolean> {
|
||||||
|
@ -16,11 +17,13 @@ public final class BooleanCovariate implements Covariate<Boolean>{
|
||||||
@Getter
|
@Getter
|
||||||
private final int index;
|
private final int index;
|
||||||
|
|
||||||
|
private boolean hasNAs = false;
|
||||||
|
|
||||||
private final BooleanSplitRule splitRule = new BooleanSplitRule(); // there's only one possible rule for BooleanCovariates.
|
private final BooleanSplitRule splitRule = new BooleanSplitRule(); // there's only one possible rule for BooleanCovariates.
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public Collection<BooleanSplitRule> generateSplitRules(List<Value<Boolean>> data, int number) {
|
public <Y> Iterator<Split<Y, Boolean>> generateSplitRuleUpdater(List<Row<Y>> data, int number, Random random) {
|
||||||
return Collections.singleton(splitRule);
|
return new SingletonIterator<>(this.splitRule.applyRule(data));
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@ -31,6 +34,7 @@ public final class BooleanCovariate implements Covariate<Boolean>{
|
||||||
@Override
|
@Override
|
||||||
public Value<Boolean> createValue(String value) {
|
public Value<Boolean> createValue(String value) {
|
||||||
if(value == null || value.equalsIgnoreCase("na")){
|
if(value == null || value.equalsIgnoreCase("na")){
|
||||||
|
hasNAs = true;
|
||||||
return createValue( (Boolean) null);
|
return createValue( (Boolean) null);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -45,6 +49,11 @@ public final class BooleanCovariate implements Covariate<Boolean>{
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean hasNAs() {
|
||||||
|
return hasNAs;
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public String toString(){
|
public String toString(){
|
||||||
return "BooleanCovariate(name=" + name + ")";
|
return "BooleanCovariate(name=" + name + ")";
|
||||||
|
@ -74,6 +83,7 @@ public final class BooleanCovariate implements Covariate<Boolean>{
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
public class BooleanSplitRule implements SplitRule<Boolean>{
|
public class BooleanSplitRule implements SplitRule<Boolean>{
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|
|
@ -5,10 +5,7 @@ import ca.joeltherrien.randomforest.Row;
|
||||||
import ca.joeltherrien.randomforest.tree.Split;
|
import ca.joeltherrien.randomforest.tree.Split;
|
||||||
|
|
||||||
import java.io.Serializable;
|
import java.io.Serializable;
|
||||||
import java.util.ArrayList;
|
import java.util.*;
|
||||||
import java.util.Collection;
|
|
||||||
import java.util.LinkedList;
|
|
||||||
import java.util.List;
|
|
||||||
import java.util.concurrent.ThreadLocalRandom;
|
import java.util.concurrent.ThreadLocalRandom;
|
||||||
|
|
||||||
public interface Covariate<V> extends Serializable {
|
public interface Covariate<V> extends Serializable {
|
||||||
|
@ -17,7 +14,7 @@ public interface Covariate<V> extends Serializable {
|
||||||
|
|
||||||
int getIndex();
|
int getIndex();
|
||||||
|
|
||||||
Collection<? extends SplitRule<V>> generateSplitRules(final List<Value<V>> data, final int number);
|
<Y> Iterator<Split<Y, V>> generateSplitRuleUpdater(final List<Row<Y>> data, final int number, final Random random);
|
||||||
|
|
||||||
Value<V> createValue(V value);
|
Value<V> createValue(V value);
|
||||||
|
|
||||||
|
@ -29,6 +26,8 @@ public interface Covariate<V> extends Serializable {
|
||||||
*/
|
*/
|
||||||
Value<V> createValue(String value);
|
Value<V> createValue(String value);
|
||||||
|
|
||||||
|
boolean hasNAs();
|
||||||
|
|
||||||
interface Value<V> extends Serializable{
|
interface Value<V> extends Serializable{
|
||||||
|
|
||||||
Covariate<V> getParent();
|
Covariate<V> getParent();
|
||||||
|
@ -39,6 +38,17 @@ public interface Covariate<V> extends Serializable {
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
interface SplitRuleUpdater<Y, V> extends Iterator<Split<Y, V>>{
|
||||||
|
Split<Y, V> currentSplit();
|
||||||
|
boolean currentSplitValid();
|
||||||
|
SplitUpdate<Y, V> nextUpdate();
|
||||||
|
}
|
||||||
|
|
||||||
|
interface SplitUpdate<Y, V> {
|
||||||
|
SplitRule<V> getSplitRule();
|
||||||
|
Collection<Row<Y>> rowsMovedToLeftHand();
|
||||||
|
}
|
||||||
|
|
||||||
interface SplitRule<V> extends Serializable{
|
interface SplitRule<V> extends Serializable{
|
||||||
|
|
||||||
Covariate<V> getParent();
|
Covariate<V> getParent();
|
||||||
|
@ -51,7 +61,7 @@ public interface Covariate<V> extends Serializable {
|
||||||
* @param <Y>
|
* @param <Y>
|
||||||
* @return
|
* @return
|
||||||
*/
|
*/
|
||||||
default <Y> Split<Y> applyRule(List<Row<Y>> rows) {
|
default <Y> Split<Y, V> applyRule(List<Row<Y>> rows) {
|
||||||
final List<Row<Y>> leftHand = new LinkedList<>();
|
final List<Row<Y>> leftHand = new LinkedList<>();
|
||||||
final List<Row<Y>> rightHand = new LinkedList<>();
|
final List<Row<Y>> rightHand = new LinkedList<>();
|
||||||
|
|
||||||
|
@ -59,7 +69,7 @@ public interface Covariate<V> extends Serializable {
|
||||||
|
|
||||||
|
|
||||||
for(final Row<Y> row : rows) {
|
for(final Row<Y> row : rows) {
|
||||||
final Value<V> value = (Value<V>) row.getCovariateValue(getParent());
|
final Value<V> value = row.getCovariateValue(getParent());
|
||||||
|
|
||||||
if(value.isNA()){
|
if(value.isNA()){
|
||||||
missingValueRows.add(row);
|
missingValueRows.add(row);
|
||||||
|
@ -77,11 +87,11 @@ public interface Covariate<V> extends Serializable {
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
return new Split<>(leftHand, rightHand, missingValueRows);
|
return new Split<>(this, leftHand, rightHand, missingValueRows);
|
||||||
}
|
}
|
||||||
|
|
||||||
default boolean isLeftHand(CovariateRow row, final double probabilityNaLeftHand){
|
default boolean isLeftHand(CovariateRow row, final double probabilityNaLeftHand){
|
||||||
final Value<V> value = (Value<V>) row.getCovariateValue(getParent());
|
final Value<V> value = row.getCovariateValue(getParent());
|
||||||
|
|
||||||
if(value.isNA()){
|
if(value.isNA()){
|
||||||
return ThreadLocalRandom.current().nextDouble() <= probabilityNaLeftHand;
|
return ThreadLocalRandom.current().nextDouble() <= probabilityNaLeftHand;
|
||||||
|
|
|
@ -1,10 +1,11 @@
|
||||||
package ca.joeltherrien.randomforest.covariates;
|
package ca.joeltherrien.randomforest.covariates;
|
||||||
|
|
||||||
|
import ca.joeltherrien.randomforest.Row;
|
||||||
|
import ca.joeltherrien.randomforest.tree.Split;
|
||||||
import lombok.EqualsAndHashCode;
|
import lombok.EqualsAndHashCode;
|
||||||
import lombok.Getter;
|
import lombok.Getter;
|
||||||
|
|
||||||
import java.util.*;
|
import java.util.*;
|
||||||
import java.util.concurrent.ThreadLocalRandom;
|
|
||||||
|
|
||||||
public final class FactorCovariate implements Covariate<String>{
|
public final class FactorCovariate implements Covariate<String>{
|
||||||
|
|
||||||
|
@ -18,6 +19,8 @@ public final class FactorCovariate implements Covariate<String>{
|
||||||
private final FactorValue naValue;
|
private final FactorValue naValue;
|
||||||
private final int numberOfPossiblePairings;
|
private final int numberOfPossiblePairings;
|
||||||
|
|
||||||
|
private boolean hasNAs;
|
||||||
|
|
||||||
|
|
||||||
public FactorCovariate(final String name, final int index, List<String> levels){
|
public FactorCovariate(final String name, final int index, List<String> levels){
|
||||||
this.name = name;
|
this.name = name;
|
||||||
|
@ -42,17 +45,14 @@ public final class FactorCovariate implements Covariate<String>{
|
||||||
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public Set<FactorSplitRule> generateSplitRules(List<Value<String>> data, int number) {
|
public <Y> Iterator<Split<Y, String>> generateSplitRuleUpdater(List<Row<Y>> data, int number, Random random) {
|
||||||
final Set<FactorSplitRule> splitRules = new HashSet<>();
|
final Set<Split<Y, String>> splits = new HashSet<>();
|
||||||
|
|
||||||
// This is to ensure we don't get stuck in an infinite loop for small factors
|
// This is to ensure we don't get stuck in an infinite loop for small factors
|
||||||
number = Math.min(number, numberOfPossiblePairings);
|
number = Math.min(number, numberOfPossiblePairings);
|
||||||
final Random random = ThreadLocalRandom.current();
|
|
||||||
final List<FactorValue> levels = new ArrayList<>(factorLevels.values());
|
final List<FactorValue> levels = new ArrayList<>(factorLevels.values());
|
||||||
|
|
||||||
|
while(splits.size() < number){
|
||||||
|
|
||||||
while(splitRules.size() < number){
|
|
||||||
Collections.shuffle(levels, random);
|
Collections.shuffle(levels, random);
|
||||||
final Set<FactorValue> leftSideValues = new HashSet<>();
|
final Set<FactorValue> leftSideValues = new HashSet<>();
|
||||||
leftSideValues.add(levels.get(0));
|
leftSideValues.add(levels.get(0));
|
||||||
|
@ -63,16 +63,18 @@ public final class FactorCovariate implements Covariate<String>{
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
splitRules.add(new FactorSplitRule(leftSideValues));
|
splits.add(new FactorSplitRule(leftSideValues).applyRule(data));
|
||||||
}
|
}
|
||||||
|
|
||||||
return splitRules;
|
return splits.iterator();
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public FactorValue createValue(String value) {
|
public FactorValue createValue(String value) {
|
||||||
if(value == null || value.equalsIgnoreCase("na")){
|
if(value == null || value.equalsIgnoreCase("na")){
|
||||||
|
this.hasNAs = true;
|
||||||
return this.naValue;
|
return this.naValue;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -85,6 +87,12 @@ public final class FactorCovariate implements Covariate<String>{
|
||||||
return factorValue;
|
return factorValue;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean hasNAs() {
|
||||||
|
return hasNAs;
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public String toString(){
|
public String toString(){
|
||||||
return "FactorCovariate(name=" + name + ")";
|
return "FactorCovariate(name=" + name + ")";
|
||||||
|
|
|
@ -1,13 +1,18 @@
|
||||||
package ca.joeltherrien.randomforest.covariates;
|
package ca.joeltherrien.randomforest.covariates.numeric;
|
||||||
|
|
||||||
|
import ca.joeltherrien.randomforest.Row;
|
||||||
|
import ca.joeltherrien.randomforest.covariates.Covariate;
|
||||||
|
import ca.joeltherrien.randomforest.utils.IndexedIterator;
|
||||||
|
import ca.joeltherrien.randomforest.utils.UniqueSubsetValueIterator;
|
||||||
|
import ca.joeltherrien.randomforest.utils.UniqueValueIterator;
|
||||||
import lombok.EqualsAndHashCode;
|
import lombok.EqualsAndHashCode;
|
||||||
import lombok.Getter;
|
import lombok.Getter;
|
||||||
import lombok.RequiredArgsConstructor;
|
import lombok.RequiredArgsConstructor;
|
||||||
import lombok.ToString;
|
import lombok.ToString;
|
||||||
|
|
||||||
import java.util.*;
|
import java.util.*;
|
||||||
import java.util.concurrent.ThreadLocalRandom;
|
|
||||||
import java.util.stream.Collectors;
|
import java.util.stream.Collectors;
|
||||||
|
import java.util.stream.Stream;
|
||||||
|
|
||||||
@RequiredArgsConstructor
|
@RequiredArgsConstructor
|
||||||
@ToString
|
@ToString
|
||||||
|
@ -19,42 +24,51 @@ public final class NumericCovariate implements Covariate<Double>{
|
||||||
@Getter
|
@Getter
|
||||||
private final int index;
|
private final int index;
|
||||||
|
|
||||||
|
private boolean hasNAs = false;
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public Collection<NumericSplitRule> generateSplitRules(List<Value<Double>> data, int number) {
|
public <Y> NumericSplitRuleUpdater<Y> generateSplitRuleUpdater(List<Row<Y>> data, int number, Random random) {
|
||||||
|
Stream<Row<Y>> stream = data.stream();
|
||||||
|
|
||||||
final Random random = ThreadLocalRandom.current();
|
if(hasNAs()){
|
||||||
|
stream = stream.filter(row -> !row.getCovariateValue(this).isNA());
|
||||||
// only work with non-NA values
|
|
||||||
data = data.stream().filter(value -> !value.isNA()).collect(Collectors.toList());
|
|
||||||
//data = data.stream().filter(value -> !value.isNA()).distinct().collect(Collectors.toList()); // TODO which to use?
|
|
||||||
|
|
||||||
// for this implementation we need to shuffle the data
|
|
||||||
final List<Value<Double>> shuffledData;
|
|
||||||
if(number >= data.size()){
|
|
||||||
shuffledData = new ArrayList<>(data);
|
|
||||||
Collections.shuffle(shuffledData, random);
|
|
||||||
}
|
}
|
||||||
else{ // only need the top number entries
|
|
||||||
shuffledData = new ArrayList<>(number);
|
|
||||||
final Set<Integer> indexesToUse = new HashSet<>();
|
|
||||||
//final List<Integer> indexesToUse = new ArrayList<>(); // TODO which to use?
|
|
||||||
|
|
||||||
while(indexesToUse.size() < number){
|
data = stream
|
||||||
final int index = random.nextInt(data.size());
|
.sorted((r1, r2) -> {
|
||||||
|
Double d1 = r1.getCovariateValue(this).getValue();
|
||||||
|
Double d2 = r2.getCovariateValue(this).getValue();
|
||||||
|
|
||||||
if(indexesToUse.add(index)){
|
return d1.compareTo(d2);
|
||||||
shuffledData.add(data.get(index));
|
})
|
||||||
|
.collect(Collectors.toList());
|
||||||
|
|
||||||
|
Iterator<Double> sortedDataIterator = data.stream()
|
||||||
|
.map(row -> row.getCovariateValue(this).getValue())
|
||||||
|
.iterator();
|
||||||
|
|
||||||
|
|
||||||
|
final IndexedIterator<Double> dataIterator;
|
||||||
|
if(number == 0){
|
||||||
|
dataIterator = new UniqueValueIterator<>(sortedDataIterator);
|
||||||
}
|
}
|
||||||
|
else{
|
||||||
|
final TreeSet<Integer> indexSet = new TreeSet<>();
|
||||||
|
|
||||||
|
final int maxIndex = data.size();
|
||||||
|
|
||||||
|
for(int i=0; i<number; i++){
|
||||||
|
indexSet.add(random.nextInt(maxIndex));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
dataIterator = new UniqueSubsetValueIterator<>(
|
||||||
|
new UniqueValueIterator<>(sortedDataIterator),
|
||||||
|
indexSet.toArray(new Integer[indexSet.size()])
|
||||||
|
);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return shuffledData.stream()
|
return new NumericSplitRuleUpdater<>(this, data, dataIterator);
|
||||||
.mapToDouble(v -> v.getValue())
|
|
||||||
.mapToObj(threshold -> new NumericSplitRule(threshold))
|
|
||||||
.collect(Collectors.toSet());
|
|
||||||
// by returning a set we'll make everything far more efficient as a lot of rules can repeat due to bootstrapping
|
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -66,12 +80,19 @@ public final class NumericCovariate implements Covariate<Double>{
|
||||||
@Override
|
@Override
|
||||||
public NumericValue createValue(String value) {
|
public NumericValue createValue(String value) {
|
||||||
if(value == null || value.equalsIgnoreCase("na")){
|
if(value == null || value.equalsIgnoreCase("na")){
|
||||||
|
this.hasNAs = true;
|
||||||
return createValue((Double) null);
|
return createValue((Double) null);
|
||||||
}
|
}
|
||||||
|
|
||||||
return createValue(Double.parseDouble(value));
|
return createValue(Double.parseDouble(value));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean hasNAs() {
|
||||||
|
return hasNAs;
|
||||||
|
}
|
||||||
|
|
||||||
@EqualsAndHashCode
|
@EqualsAndHashCode
|
||||||
public class NumericValue implements Covariate.Value<Double>{
|
public class NumericValue implements Covariate.Value<Double>{
|
||||||
|
|
||||||
|
@ -102,7 +123,7 @@ public final class NumericCovariate implements Covariate<Double>{
|
||||||
|
|
||||||
private final double threshold;
|
private final double threshold;
|
||||||
|
|
||||||
private NumericSplitRule(final double threshold){
|
NumericSplitRule(final double threshold){
|
||||||
this.threshold = threshold;
|
this.threshold = threshold;
|
||||||
}
|
}
|
||||||
|
|
|
@ -0,0 +1,84 @@
|
||||||
|
package ca.joeltherrien.randomforest.covariates.numeric;
|
||||||
|
|
||||||
|
import ca.joeltherrien.randomforest.Row;
|
||||||
|
import ca.joeltherrien.randomforest.covariates.Covariate;
|
||||||
|
import ca.joeltherrien.randomforest.tree.Split;
|
||||||
|
import ca.joeltherrien.randomforest.utils.IndexedIterator;
|
||||||
|
|
||||||
|
import java.util.Collections;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
public class NumericSplitRuleUpdater<Y> implements Covariate.SplitRuleUpdater<Y, Double> {
|
||||||
|
|
||||||
|
private final NumericCovariate covariate;
|
||||||
|
private final List<Row<Y>> orderedData;
|
||||||
|
private final IndexedIterator<Double> dataIterator;
|
||||||
|
|
||||||
|
private Split<Y, Double> currentSplit;
|
||||||
|
|
||||||
|
public NumericSplitRuleUpdater(final NumericCovariate covariate, final List<Row<Y>> orderedData, final IndexedIterator<Double> iterator){
|
||||||
|
this.covariate = covariate;
|
||||||
|
this.orderedData = orderedData;
|
||||||
|
this.dataIterator = iterator;
|
||||||
|
|
||||||
|
final List<Row<Y>> leftHandList = Collections.emptyList();
|
||||||
|
final List<Row<Y>> rightHandList = orderedData;
|
||||||
|
|
||||||
|
this.currentSplit = new Split<>(
|
||||||
|
covariate.new NumericSplitRule(Double.MIN_VALUE),
|
||||||
|
leftHandList,
|
||||||
|
rightHandList,
|
||||||
|
Collections.emptyList());
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Split<Y, Double> currentSplit() {
|
||||||
|
return this.currentSplit;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean currentSplitValid() {
|
||||||
|
return currentSplit.getLeftHand().size() > 0 && currentSplit.getRightHand().size() > 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public NumericSplitUpdate<Y> nextUpdate() {
|
||||||
|
if(hasNext()){
|
||||||
|
final int currentPosition = dataIterator.getIndex();
|
||||||
|
final Double splitValue = dataIterator.next();
|
||||||
|
final int newPosition = dataIterator.getIndex();
|
||||||
|
|
||||||
|
final List<Row<Y>> rowsMoved = orderedData.subList(currentPosition, newPosition);
|
||||||
|
|
||||||
|
final NumericCovariate.NumericSplitRule splitRule = covariate.new NumericSplitRule(splitValue);
|
||||||
|
|
||||||
|
// Update current split
|
||||||
|
this.currentSplit = new Split<>(
|
||||||
|
splitRule,
|
||||||
|
Collections.unmodifiableList(orderedData.subList(0, newPosition)),
|
||||||
|
Collections.unmodifiableList(orderedData.subList(newPosition, orderedData.size())),
|
||||||
|
Collections.emptyList());
|
||||||
|
|
||||||
|
|
||||||
|
return new NumericSplitUpdate<>(splitRule, rowsMoved);
|
||||||
|
}
|
||||||
|
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean hasNext() {
|
||||||
|
return dataIterator.hasNext();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Split<Y, Double> next() {
|
||||||
|
if(hasNext()){
|
||||||
|
nextUpdate();
|
||||||
|
}
|
||||||
|
|
||||||
|
return this.currentSplit();
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,24 @@
|
||||||
|
package ca.joeltherrien.randomforest.covariates.numeric;
|
||||||
|
|
||||||
|
import ca.joeltherrien.randomforest.Row;
|
||||||
|
import ca.joeltherrien.randomforest.covariates.Covariate;
|
||||||
|
import lombok.AllArgsConstructor;
|
||||||
|
|
||||||
|
import java.util.Collection;
|
||||||
|
|
||||||
|
@AllArgsConstructor
|
||||||
|
public class NumericSplitUpdate<Y> implements Covariate.SplitUpdate<Y, Double> {
|
||||||
|
|
||||||
|
private final NumericCovariate.NumericSplitRule numericSplitRule;
|
||||||
|
private final Collection<Row<Y>> rowsMoved;
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public NumericCovariate.NumericSplitRule getSplitRule() {
|
||||||
|
return numericSplitRule;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Collection<Row<Y>> rowsMovedToLeftHand() {
|
||||||
|
return rowsMoved;
|
||||||
|
}
|
||||||
|
}
|
|
@ -1,5 +1,6 @@
|
||||||
package ca.joeltherrien.randomforest.covariates;
|
package ca.joeltherrien.randomforest.covariates.settings;
|
||||||
|
|
||||||
|
import ca.joeltherrien.randomforest.covariates.BooleanCovariate;
|
||||||
import lombok.Data;
|
import lombok.Data;
|
||||||
import lombok.NoArgsConstructor;
|
import lombok.NoArgsConstructor;
|
||||||
|
|
|
@ -1,5 +1,6 @@
|
||||||
package ca.joeltherrien.randomforest.covariates;
|
package ca.joeltherrien.randomforest.covariates.settings;
|
||||||
|
|
||||||
|
import ca.joeltherrien.randomforest.covariates.Covariate;
|
||||||
import com.fasterxml.jackson.annotation.JsonSubTypes;
|
import com.fasterxml.jackson.annotation.JsonSubTypes;
|
||||||
import com.fasterxml.jackson.annotation.JsonTypeInfo;
|
import com.fasterxml.jackson.annotation.JsonTypeInfo;
|
||||||
import lombok.Getter;
|
import lombok.Getter;
|
|
@ -1,5 +1,6 @@
|
||||||
package ca.joeltherrien.randomforest.covariates;
|
package ca.joeltherrien.randomforest.covariates.settings;
|
||||||
|
|
||||||
|
import ca.joeltherrien.randomforest.covariates.FactorCovariate;
|
||||||
import lombok.Data;
|
import lombok.Data;
|
||||||
import lombok.NoArgsConstructor;
|
import lombok.NoArgsConstructor;
|
||||||
|
|
|
@ -1,5 +1,6 @@
|
||||||
package ca.joeltherrien.randomforest.covariates;
|
package ca.joeltherrien.randomforest.covariates.settings;
|
||||||
|
|
||||||
|
import ca.joeltherrien.randomforest.covariates.numeric.NumericCovariate;
|
||||||
import lombok.Data;
|
import lombok.Data;
|
||||||
import lombok.NoArgsConstructor;
|
import lombok.NoArgsConstructor;
|
||||||
|
|
|
@ -1,37 +1,77 @@
|
||||||
package ca.joeltherrien.randomforest.responses.competingrisk;
|
package ca.joeltherrien.randomforest.responses.competingrisk;
|
||||||
|
|
||||||
import ca.joeltherrien.randomforest.utils.MathFunction;
|
import java.util.Arrays;
|
||||||
import lombok.Builder;
|
|
||||||
import lombok.Getter;
|
|
||||||
|
|
||||||
import java.util.List;
|
public class CompetingRiskGraySetsImpl implements CompetingRiskSets<CompetingRiskResponseWithCensorTime> {
|
||||||
import java.util.Map;
|
|
||||||
|
|
||||||
/**
|
final double[] times; // length m array
|
||||||
* Represents a response from CompetingRiskUtils#calculateGraySetsEfficiently
|
int[][] riskSetLeft; // J x m array
|
||||||
*
|
final int[][] riskSetTotal; // J x m array
|
||||||
*/
|
int[][] numberOfEventsLeft; // J+1 x m array
|
||||||
@Builder
|
final int[][] numberOfEventsTotal; // J+1 x m array
|
||||||
@Getter
|
|
||||||
public class CompetingRiskGraySetsImpl implements CompetingRiskSets{
|
|
||||||
|
|
||||||
private final List<Double> eventTimes;
|
public CompetingRiskGraySetsImpl(double[] times, int[][] riskSetLeft, int[][] riskSetTotal, int[][] numberOfEventsLeft, int[][] numberOfEventsTotal) {
|
||||||
private final MathFunction[] riskSet;
|
this.times = times;
|
||||||
private final Map<Double, int[]> numberOfEvents;
|
this.riskSetLeft = riskSetLeft;
|
||||||
|
this.riskSetTotal = riskSetTotal;
|
||||||
@Override
|
this.numberOfEventsLeft = numberOfEventsLeft;
|
||||||
public MathFunction getRiskSet(int event){
|
this.numberOfEventsTotal = numberOfEventsTotal;
|
||||||
return(riskSet[event-1]);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public int getNumberOfEvents(Double time, int event){
|
public double[] getDistinctTimes() {
|
||||||
if(numberOfEvents.containsKey(time)){
|
return times;
|
||||||
return numberOfEvents.get(time)[event];
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return 0;
|
@Override
|
||||||
|
public int getRiskSetLeft(int timeIndex, int event) {
|
||||||
|
return riskSetLeft[event-1][timeIndex];
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public int getRiskSetTotal(int timeIndex, int event) {
|
||||||
|
return riskSetTotal[event-1][timeIndex];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public int getNumberOfEventsLeft(int timeIndex, int event) {
|
||||||
|
return numberOfEventsLeft[event][timeIndex];
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public int getNumberOfEventsTotal(int timeIndex, int event) {
|
||||||
|
return numberOfEventsTotal[event][timeIndex];
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void update(CompetingRiskResponseWithCensorTime rowMovedToLeft) {
|
||||||
|
final double time = rowMovedToLeft.getU();
|
||||||
|
final int k = Arrays.binarySearch(times, time);
|
||||||
|
final int delta_m_1 = rowMovedToLeft.getDelta() - 1;
|
||||||
|
final double censorTime = rowMovedToLeft.getC();
|
||||||
|
|
||||||
|
for(int j=0; j<riskSetLeft.length; j++){
|
||||||
|
final int[] riskSetLeftJ = riskSetLeft[j];
|
||||||
|
|
||||||
|
// first iteration; perform normal increment as if Y is normal
|
||||||
|
// corresponds to the first part, U_i >= t, in I(...)
|
||||||
|
for(int i=0; i<=k; i++){
|
||||||
|
riskSetLeftJ[i]++;
|
||||||
|
}
|
||||||
|
|
||||||
|
// second iteration; only if delta-1 != j
|
||||||
|
// corresponds to the second part, U_i < t & delta_i != j & C_i > t
|
||||||
|
if(delta_m_1 != j && !rowMovedToLeft.isCensored()){
|
||||||
|
int i = k+1;
|
||||||
|
while(i < times.length && times[i] < censorTime){
|
||||||
|
riskSetLeftJ[i]++;
|
||||||
|
i++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
numberOfEventsLeft[rowMovedToLeft.getDelta()][k]++;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,13 +1,13 @@
|
||||||
package ca.joeltherrien.randomforest.responses.competingrisk;
|
package ca.joeltherrien.randomforest.responses.competingrisk;
|
||||||
|
|
||||||
import ca.joeltherrien.randomforest.utils.MathFunction;
|
public interface CompetingRiskSets<T extends CompetingRiskResponse> {
|
||||||
|
|
||||||
import java.util.List;
|
double[] getDistinctTimes();
|
||||||
|
int getRiskSetLeft(int timeIndex, int event);
|
||||||
|
int getRiskSetTotal(int timeIndex, int event);
|
||||||
|
int getNumberOfEventsLeft(int timeIndex, int event);
|
||||||
|
int getNumberOfEventsTotal(int timeIndex, int event);
|
||||||
|
|
||||||
public interface CompetingRiskSets {
|
void update(T rowMovedToLeft);
|
||||||
|
|
||||||
MathFunction getRiskSet(int event);
|
|
||||||
int getNumberOfEvents(Double time, int event);
|
|
||||||
List<Double> getEventTimes();
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,36 +1,59 @@
|
||||||
package ca.joeltherrien.randomforest.responses.competingrisk;
|
package ca.joeltherrien.randomforest.responses.competingrisk;
|
||||||
|
|
||||||
import ca.joeltherrien.randomforest.utils.MathFunction;
|
import java.util.Arrays;
|
||||||
import lombok.Builder;
|
|
||||||
import lombok.Getter;
|
|
||||||
|
|
||||||
import java.util.List;
|
public class CompetingRiskSetsImpl implements CompetingRiskSets<CompetingRiskResponse> {
|
||||||
import java.util.Map;
|
|
||||||
|
|
||||||
/**
|
final double[] times; // length m array
|
||||||
* Represents a response from CompetingRiskUtils#calculateSetsEfficiently
|
int[] riskSetLeft; // length m array
|
||||||
*
|
final int[] riskSetTotal; // length m array
|
||||||
*/
|
int[][] numberOfEventsLeft; // J+1 x m array
|
||||||
@Builder
|
final int[][] numberOfEventsTotal; // J+1 x m array
|
||||||
@Getter
|
|
||||||
public class CompetingRiskSetsImpl implements CompetingRiskSets{
|
|
||||||
|
|
||||||
private final List<Double> eventTimes;
|
|
||||||
private final MathFunction riskSet;
|
|
||||||
private final Map<Double, int[]> numberOfEvents;
|
|
||||||
|
|
||||||
@Override
|
public CompetingRiskSetsImpl(double[] times, int[] riskSetLeft, int[] riskSetTotal, int[][] numberOfEventsLeft, int[][] numberOfEventsTotal) {
|
||||||
public MathFunction getRiskSet(int event){
|
this.times = times;
|
||||||
return riskSet;
|
this.riskSetLeft = riskSetLeft;
|
||||||
|
this.riskSetTotal = riskSetTotal;
|
||||||
|
this.numberOfEventsLeft = numberOfEventsLeft;
|
||||||
|
this.numberOfEventsTotal = numberOfEventsTotal;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public int getNumberOfEvents(Double time, int event){
|
public double[] getDistinctTimes() {
|
||||||
if(numberOfEvents.containsKey(time)){
|
return times;
|
||||||
return numberOfEvents.get(time)[event];
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return 0;
|
@Override
|
||||||
|
public int getRiskSetLeft(int timeIndex, int event) {
|
||||||
|
return riskSetLeft[timeIndex];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public int getRiskSetTotal(int timeIndex, int event) {
|
||||||
|
return riskSetTotal[timeIndex];
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public int getNumberOfEventsLeft(int timeIndex, int event) {
|
||||||
|
return numberOfEventsLeft[event][timeIndex];
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public int getNumberOfEventsTotal(int timeIndex, int event) {
|
||||||
|
return numberOfEventsTotal[event][timeIndex];
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void update(CompetingRiskResponse rowMovedToLeft) {
|
||||||
|
final double time = rowMovedToLeft.getU();
|
||||||
|
final int k = Arrays.binarySearch(times, time);
|
||||||
|
|
||||||
|
for(int i=0; i<=k; i++){
|
||||||
|
riskSetLeft[i]++;
|
||||||
|
}
|
||||||
|
|
||||||
|
numberOfEventsLeft[rowMovedToLeft.getDelta()][k]++;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,11 +1,9 @@
|
||||||
package ca.joeltherrien.randomforest.responses.competingrisk;
|
package ca.joeltherrien.randomforest.responses.competingrisk;
|
||||||
|
|
||||||
import ca.joeltherrien.randomforest.utils.LeftContinuousStepFunction;
|
|
||||||
import ca.joeltherrien.randomforest.utils.StepFunction;
|
import ca.joeltherrien.randomforest.utils.StepFunction;
|
||||||
import ca.joeltherrien.randomforest.utils.VeryDiscontinuousStepFunction;
|
|
||||||
|
|
||||||
import java.util.*;
|
import java.util.*;
|
||||||
import java.util.stream.DoubleStream;
|
import java.util.stream.Stream;
|
||||||
|
|
||||||
public class CompetingRiskUtils {
|
public class CompetingRiskUtils {
|
||||||
|
|
||||||
|
@ -102,18 +100,30 @@ public class CompetingRiskUtils {
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public static CompetingRiskSetsImpl calculateSetsEfficiently(final List<CompetingRiskResponse> responses, int[] eventsOfFocus){
|
|
||||||
final int n = responses.size();
|
|
||||||
int[] numberOfCurrentEvents = new int[eventsOfFocus.length+1];
|
|
||||||
|
|
||||||
final Map<Double, int[]> numberOfEvents = new HashMap<>();
|
public static CompetingRiskSetsImpl calculateSetsEfficiently(final List<CompetingRiskResponse> initialLeftHand,
|
||||||
|
final List<CompetingRiskResponse> initialRightHand,
|
||||||
|
int[] eventsOfFocus,
|
||||||
|
boolean calculateRiskSets){
|
||||||
|
|
||||||
final List<Double> eventTimes = new ArrayList<>(n);
|
final double[] distinctEventTimes = Stream.concat(
|
||||||
final List<Double> eventAndCensorTimes = new ArrayList<>(n);
|
initialLeftHand.stream(),
|
||||||
final List<Integer> riskSetNumberList = new ArrayList<>(n);
|
initialRightHand.stream())
|
||||||
|
//.filter(y -> !y.isCensored())
|
||||||
|
.map(CompetingRiskResponse::getU)
|
||||||
|
.mapToDouble(Double::doubleValue)
|
||||||
|
.sorted()
|
||||||
|
.distinct()
|
||||||
|
.toArray();
|
||||||
|
|
||||||
|
|
||||||
|
final int m = distinctEventTimes.length;
|
||||||
|
final int[][] numberOfCurrentEventsTotal = new int[eventsOfFocus.length+1][m];
|
||||||
|
|
||||||
|
// Left Hand First
|
||||||
|
|
||||||
// need to first sort responses
|
// need to first sort responses
|
||||||
Collections.sort(responses, (y1, y2) -> {
|
Collections.sort(initialLeftHand, (y1, y2) -> {
|
||||||
if(y1.getU() < y2.getU()){
|
if(y1.getU() < y2.getU()){
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
@ -125,127 +135,191 @@ public class CompetingRiskUtils {
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
|
final int nLeft = initialLeftHand.size();
|
||||||
|
final int nRight = initialRightHand.size();
|
||||||
|
|
||||||
|
final int[][] numberOfCurrentEventsLeft = new int[eventsOfFocus.length+1][m];
|
||||||
|
final int[] riskSetArrayLeft = new int[m];
|
||||||
|
final int[] riskSetArrayTotal = new int[m];
|
||||||
|
|
||||||
|
|
||||||
for(int i=0; i<n; i++){
|
|
||||||
final CompetingRiskResponse currentResponse = responses.get(i);
|
|
||||||
final boolean lastOfTime = (i+1)==n || responses.get(i+1).getU() > currentResponse.getU();
|
|
||||||
|
|
||||||
numberOfCurrentEvents[currentResponse.getDelta()]++;
|
for(int k=0; k<m; k++){
|
||||||
|
riskSetArrayLeft[k] = nLeft;
|
||||||
|
riskSetArrayTotal[k] = nLeft + nRight;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Left Hand
|
||||||
|
for(int i=0; i<nLeft; i++){
|
||||||
|
final CompetingRiskResponse currentResponse = initialLeftHand.get(i);
|
||||||
|
final boolean lastOfTime = (i+1)==nLeft || initialLeftHand.get(i+1).getU() > currentResponse.getU();
|
||||||
|
|
||||||
|
final int k = Arrays.binarySearch(distinctEventTimes, currentResponse.getU());
|
||||||
|
|
||||||
|
numberOfCurrentEventsLeft[currentResponse.getDelta()][k]++;
|
||||||
|
numberOfCurrentEventsTotal[currentResponse.getDelta()][k]++;
|
||||||
|
|
||||||
if(lastOfTime){
|
if(lastOfTime){
|
||||||
int totalNumberOfCurrentEvents = 0;
|
int totalNumberOfCurrentEvents = 0;
|
||||||
for(int e = 1; e < numberOfCurrentEvents.length; e++){ // exclude censored events
|
for(int e = 1; e < eventsOfFocus.length+1; e++){ // exclude censored events
|
||||||
totalNumberOfCurrentEvents += numberOfCurrentEvents[e];
|
totalNumberOfCurrentEvents += numberOfCurrentEventsLeft[e][k];
|
||||||
}
|
}
|
||||||
|
|
||||||
final double currentTime = currentResponse.getU();
|
// Calculate risk set values
|
||||||
|
// Note that we only decrease values in the *future*
|
||||||
|
if(calculateRiskSets){
|
||||||
|
final int decreaseBy = totalNumberOfCurrentEvents + numberOfCurrentEventsLeft[0][k];
|
||||||
|
for(int j=k+1; j<m; j++){
|
||||||
|
riskSetArrayLeft[j] = riskSetArrayLeft[j] - decreaseBy;
|
||||||
|
riskSetArrayTotal[j] = riskSetArrayTotal[j] - decreaseBy;
|
||||||
|
|
||||||
if(totalNumberOfCurrentEvents > 0){ // add numberOfCurrentEvents
|
}
|
||||||
// Add point
|
|
||||||
eventTimes.add(currentTime);
|
|
||||||
numberOfEvents.put(currentTime, numberOfCurrentEvents);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Always do risk set
|
|
||||||
// remember that the LeftContinuousFunction takes into account that at this currentTime the risk value is the previous value
|
|
||||||
final int riskSet = n - (i+1);
|
|
||||||
riskSetNumberList.add(riskSet);
|
|
||||||
eventAndCensorTimes.add(currentTime);
|
|
||||||
|
|
||||||
// reset counters
|
|
||||||
numberOfCurrentEvents = new int[eventsOfFocus.length+1];
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
final double[] riskSetArray = new double[eventAndCensorTimes.size()];
|
|
||||||
final double[] timesArray = new double[eventAndCensorTimes.size()];
|
// Right Hand Next. Note that we only need to keep track of the Left Hand and the Total
|
||||||
for(int i=0; i<riskSetArray.length; i++){
|
|
||||||
timesArray[i] = eventAndCensorTimes.get(i);
|
// need to first sort responses
|
||||||
riskSetArray[i] = riskSetNumberList.get(i);
|
Collections.sort(initialRightHand, (y1, y2) -> {
|
||||||
}
|
if(y1.getU() < y2.getU()){
|
||||||
|
return -1;
|
||||||
final LeftContinuousStepFunction riskSetFunction = new LeftContinuousStepFunction(timesArray, riskSetArray, n);
|
|
||||||
|
|
||||||
return CompetingRiskSetsImpl.builder()
|
|
||||||
.numberOfEvents(numberOfEvents)
|
|
||||||
.riskSet(riskSetFunction)
|
|
||||||
.eventTimes(eventTimes)
|
|
||||||
.build();
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
public static CompetingRiskGraySetsImpl calculateGraySetsEfficiently(final List<CompetingRiskResponseWithCensorTime> responses, int[] eventsOfFocus){
|
|
||||||
final List sillyList = responses; // annoying Java generic work-around
|
|
||||||
final CompetingRiskSetsImpl originalSets = calculateSetsEfficiently(sillyList, eventsOfFocus);
|
|
||||||
|
|
||||||
final double[] allTimes = DoubleStream.concat(
|
|
||||||
responses.stream()
|
|
||||||
.mapToDouble(CompetingRiskResponseWithCensorTime::getC),
|
|
||||||
responses.stream()
|
|
||||||
.mapToDouble(CompetingRiskResponseWithCensorTime::getU)
|
|
||||||
).sorted().distinct().toArray();
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
final VeryDiscontinuousStepFunction[] riskSets = new VeryDiscontinuousStepFunction[eventsOfFocus.length];
|
|
||||||
|
|
||||||
for(final int event : eventsOfFocus){
|
|
||||||
final double[] yAt = new double[allTimes.length];
|
|
||||||
final double[] yRight = new double[allTimes.length];
|
|
||||||
|
|
||||||
for(final CompetingRiskResponseWithCensorTime response : responses){
|
|
||||||
if(response.getDelta() == event){
|
|
||||||
// traditional case only; increment on time t when I(t <= Ui)
|
|
||||||
final double time = response.getU();
|
|
||||||
final int index = Arrays.binarySearch(allTimes, time);
|
|
||||||
|
|
||||||
if(index < 0){ // TODO remove once code is stable
|
|
||||||
throw new IllegalStateException("Index shouldn't be negative!");
|
|
||||||
}
|
|
||||||
|
|
||||||
// All yAts up to and including index are incremented;
|
|
||||||
// All yRights up to index are incremented
|
|
||||||
yAt[index]++;
|
|
||||||
for(int i=0; i<index; i++){
|
|
||||||
yAt[i]++;
|
|
||||||
yRight[i]++;
|
|
||||||
}
|
}
|
||||||
|
else if(y1.getU() > y2.getU()){
|
||||||
|
return 1;
|
||||||
}
|
}
|
||||||
else{
|
else{
|
||||||
// need to increment on time t on following conditions; I(t <= Ui | t < Ci)
|
return 0;
|
||||||
// Fact: Ci >= Ui.
|
}
|
||||||
|
});
|
||||||
|
|
||||||
// increment yAt up to Ci. If Ui==Ci, increment yAt at Ci.
|
// Right Hand
|
||||||
final double time = response.getC();
|
int[] currentEventsRight = new int[eventsOfFocus.length+1];
|
||||||
final int index = Arrays.binarySearch(allTimes, time);
|
for(int i=0; i<nRight; i++){
|
||||||
|
final CompetingRiskResponse currentResponse = initialRightHand.get(i);
|
||||||
|
final boolean lastOfTime = (i+1)==nRight || initialRightHand.get(i+1).getU() > currentResponse.getU();
|
||||||
|
|
||||||
if(index < 0){ // TODO remove once code is stable
|
final int k = Arrays.binarySearch(distinctEventTimes, currentResponse.getU());
|
||||||
throw new IllegalStateException("Index shouldn't be negative!");
|
|
||||||
}
|
currentEventsRight[currentResponse.getDelta()]++;
|
||||||
|
numberOfCurrentEventsTotal[currentResponse.getDelta()][k]++;
|
||||||
for(int i=0; i<index; i++){
|
|
||||||
yAt[i]++;
|
if(lastOfTime){
|
||||||
yRight[i]++;
|
int totalNumberOfCurrentEvents = 0;
|
||||||
}
|
for(int e = 1; e < eventsOfFocus.length+1; e++){ // exclude censored events
|
||||||
if(response.getU() == response.getC()){
|
totalNumberOfCurrentEvents += currentEventsRight[e];
|
||||||
yAt[index]++;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Calculate risk set values
|
||||||
|
// Note that we only decrease values in the *future*
|
||||||
|
if(calculateRiskSets){
|
||||||
|
final int decreaseBy = totalNumberOfCurrentEvents + currentEventsRight[0];
|
||||||
|
for(int j=k+1; j<m; j++){
|
||||||
|
riskSetArrayTotal[j] = riskSetArrayTotal[j] - decreaseBy;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
riskSets[event-1] = new VeryDiscontinuousStepFunction(allTimes, yAt, yRight, responses.size());
|
// Reset
|
||||||
|
currentEventsRight = new int[eventsOfFocus.length+1];
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return CompetingRiskGraySetsImpl.builder()
|
}
|
||||||
.numberOfEvents(originalSets.getNumberOfEvents())
|
|
||||||
.eventTimes(originalSets.getEventTimes())
|
return new CompetingRiskSetsImpl(distinctEventTimes, riskSetArrayLeft, riskSetArrayTotal, numberOfCurrentEventsLeft, numberOfCurrentEventsTotal);
|
||||||
.riskSet(riskSets)
|
|
||||||
.build();
|
}
|
||||||
|
|
||||||
|
|
||||||
|
public static CompetingRiskGraySetsImpl calculateGraySetsEfficiently(final List<CompetingRiskResponseWithCensorTime> initialLeftHand,
|
||||||
|
final List<CompetingRiskResponseWithCensorTime> initialRightHand,
|
||||||
|
int[] eventsOfFocus){
|
||||||
|
|
||||||
|
final List leftHandGenericsSuck = initialLeftHand;
|
||||||
|
final List rightHandGenericsSuck = initialRightHand;
|
||||||
|
|
||||||
|
final CompetingRiskSetsImpl normalSets = calculateSetsEfficiently(
|
||||||
|
leftHandGenericsSuck,
|
||||||
|
rightHandGenericsSuck,
|
||||||
|
eventsOfFocus, false);
|
||||||
|
|
||||||
|
final double[] times = normalSets.times;
|
||||||
|
final int[][] numberOfEventsLeft = normalSets.numberOfEventsLeft;
|
||||||
|
final int[][] numberOfEventsTotal = normalSets.numberOfEventsTotal;
|
||||||
|
|
||||||
|
// FYI; initialLeftHand and initialRightHand have both now been sorted
|
||||||
|
// Time to calculate the Gray modified risk sets
|
||||||
|
final int[][] riskSetsLeft = new int[eventsOfFocus.length][times.length];
|
||||||
|
final int[][] riskSetsTotal = new int[eventsOfFocus.length][times.length];
|
||||||
|
|
||||||
|
// Left hand first
|
||||||
|
for(final CompetingRiskResponseWithCensorTime response : initialLeftHand){
|
||||||
|
final double time = response.getU();
|
||||||
|
final int k = Arrays.binarySearch(times, time);
|
||||||
|
final int delta_m_1 = response.getDelta() - 1;
|
||||||
|
final double censorTime = response.getC();
|
||||||
|
|
||||||
|
for(int j=0; j<eventsOfFocus.length; j++){
|
||||||
|
final int[] riskSetLeftJ = riskSetsLeft[j];
|
||||||
|
final int[] riskSetTotalJ = riskSetsTotal[j];
|
||||||
|
|
||||||
|
// first iteration; perform normal increment as if Y is normal
|
||||||
|
// corresponds to the first part, U_i >= t, in I(...)
|
||||||
|
for(int i=0; i<=k; i++){
|
||||||
|
riskSetLeftJ[i]++;
|
||||||
|
riskSetTotalJ[i]++;
|
||||||
|
}
|
||||||
|
|
||||||
|
// second iteration; only if delta-1 != j
|
||||||
|
// corresponds to the second part, U_i < t & delta_i != j & C_i > t
|
||||||
|
if(delta_m_1 != j && !response.isCensored()){
|
||||||
|
int i = k+1;
|
||||||
|
while(i < times.length && times[i] < censorTime){
|
||||||
|
riskSetLeftJ[i]++;
|
||||||
|
riskSetTotalJ[i]++;
|
||||||
|
i++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
// Repeat for right hand
|
||||||
|
for(final CompetingRiskResponseWithCensorTime response : initialRightHand){
|
||||||
|
final double time = response.getU();
|
||||||
|
final int k = Arrays.binarySearch(times, time);
|
||||||
|
final int delta_m_1 = response.getDelta() - 1;
|
||||||
|
final double censorTime = response.getC();
|
||||||
|
|
||||||
|
for(int j=0; j<eventsOfFocus.length; j++){
|
||||||
|
final int[] riskSetTotalJ = riskSetsTotal[j];
|
||||||
|
|
||||||
|
// first iteration; perform normal increment as if Y is normal
|
||||||
|
// corresponds to the first part, U_i >= t, in I(...)
|
||||||
|
for(int i=0; i<=k; i++){
|
||||||
|
riskSetTotalJ[i]++;
|
||||||
|
}
|
||||||
|
|
||||||
|
// second iteration; only if delta-1 != j
|
||||||
|
// corresponds to the second part, U_i < t & delta_i != j & C_i > t
|
||||||
|
if(delta_m_1 != j && !response.isCensored()){
|
||||||
|
int i = k+1;
|
||||||
|
while(i < times.length && times[i] < censorTime){
|
||||||
|
riskSetTotalJ[i]++;
|
||||||
|
i++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
return new CompetingRiskGraySetsImpl(times, riskSetsLeft, riskSetsTotal, numberOfEventsLeft, numberOfEventsTotal);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -1,13 +1,18 @@
|
||||||
package ca.joeltherrien.randomforest.responses.competingrisk.differentiator;
|
package ca.joeltherrien.randomforest.responses.competingrisk.differentiator;
|
||||||
|
|
||||||
|
import ca.joeltherrien.randomforest.Row;
|
||||||
|
import ca.joeltherrien.randomforest.covariates.Covariate;
|
||||||
import ca.joeltherrien.randomforest.responses.competingrisk.CompetingRiskResponse;
|
import ca.joeltherrien.randomforest.responses.competingrisk.CompetingRiskResponse;
|
||||||
import ca.joeltherrien.randomforest.responses.competingrisk.CompetingRiskSets;
|
import ca.joeltherrien.randomforest.responses.competingrisk.CompetingRiskSets;
|
||||||
import ca.joeltherrien.randomforest.tree.GroupDifferentiator;
|
import ca.joeltherrien.randomforest.tree.GroupDifferentiator;
|
||||||
|
import ca.joeltherrien.randomforest.tree.Split;
|
||||||
|
import ca.joeltherrien.randomforest.tree.SplitAndScore;
|
||||||
import lombok.AllArgsConstructor;
|
import lombok.AllArgsConstructor;
|
||||||
import lombok.Data;
|
import lombok.Data;
|
||||||
|
|
||||||
|
import java.util.Iterator;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.stream.Stream;
|
import java.util.stream.Collectors;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* See page 761 of Random survival forests for competing risks by Ishwaran et al. The class is abstract as Gray's test
|
* See page 761 of Random survival forests for competing risks by Ishwaran et al. The class is abstract as Gray's test
|
||||||
|
@ -16,45 +21,112 @@ import java.util.stream.Stream;
|
||||||
*/
|
*/
|
||||||
public abstract class CompetingRiskGroupDifferentiator<Y extends CompetingRiskResponse> implements GroupDifferentiator<Y> {
|
public abstract class CompetingRiskGroupDifferentiator<Y extends CompetingRiskResponse> implements GroupDifferentiator<Y> {
|
||||||
|
|
||||||
@Override
|
abstract protected CompetingRiskSets<Y> createCompetingRiskSets(List<Y> leftHand, List<Y> rightHand);
|
||||||
public abstract Double differentiate(List<Y> leftHand, List<Y> rightHand);
|
|
||||||
|
|
||||||
|
abstract protected Double getScore(final CompetingRiskSets<Y> competingRiskSets);
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public SplitAndScore<Y, ?> differentiate(Iterator<Split<Y, ?>> splitIterator) {
|
||||||
|
|
||||||
|
if(splitIterator instanceof Covariate.SplitRuleUpdater){
|
||||||
|
return differentiateWithSplitUpdater((Covariate.SplitRuleUpdater) splitIterator);
|
||||||
|
}
|
||||||
|
else{
|
||||||
|
return differentiateWithBasicIterator(splitIterator);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private SplitAndScore<Y, ?> differentiateWithBasicIterator(Iterator<Split<Y, ?>> splitIterator){
|
||||||
|
Double bestScore = null;
|
||||||
|
Split<Y, ?> bestSplit = null;
|
||||||
|
|
||||||
|
while(splitIterator.hasNext()){
|
||||||
|
final Split<Y, ?> candidateSplit = splitIterator.next();
|
||||||
|
|
||||||
|
final List<Y> leftHand = candidateSplit.getLeftHand().stream().map(Row::getResponse).collect(Collectors.toList());
|
||||||
|
final List<Y> rightHand = candidateSplit.getRightHand().stream().map(Row::getResponse).collect(Collectors.toList());
|
||||||
|
|
||||||
|
if(leftHand.isEmpty() || rightHand.isEmpty()){
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
final CompetingRiskSets<Y> competingRiskSets = createCompetingRiskSets(leftHand, rightHand);
|
||||||
|
|
||||||
|
final Double score = getScore(competingRiskSets);
|
||||||
|
|
||||||
|
if(Double.isFinite(score) && (bestScore == null || score > bestScore)){
|
||||||
|
bestScore = score;
|
||||||
|
bestSplit = candidateSplit;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if(bestSplit == null){
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
return new SplitAndScore<>(bestSplit, bestScore);
|
||||||
|
}
|
||||||
|
|
||||||
|
private SplitAndScore<Y, ?> differentiateWithSplitUpdater(Covariate.SplitRuleUpdater<Y, ?> splitRuleUpdater) {
|
||||||
|
|
||||||
|
final List<Y> leftInitialSplit = splitRuleUpdater.currentSplit().getLeftHand()
|
||||||
|
.stream().map(Row::getResponse).collect(Collectors.toList());
|
||||||
|
final List<Y> rightInitialSplit = splitRuleUpdater.currentSplit().getRightHand()
|
||||||
|
.stream().map(Row::getResponse).collect(Collectors.toList());
|
||||||
|
|
||||||
|
final CompetingRiskSets<Y> competingRiskSets = createCompetingRiskSets(leftInitialSplit, rightInitialSplit);
|
||||||
|
|
||||||
|
Double bestScore = null;
|
||||||
|
Split<Y, ?> bestSplit = null;
|
||||||
|
|
||||||
|
while(splitRuleUpdater.hasNext()){
|
||||||
|
for(Row<Y> rowMoved : splitRuleUpdater.nextUpdate().rowsMovedToLeftHand()){
|
||||||
|
competingRiskSets.update(rowMoved.getResponse());
|
||||||
|
}
|
||||||
|
|
||||||
|
final Double score = getScore(competingRiskSets);
|
||||||
|
|
||||||
|
if(Double.isFinite(score) && (bestScore == null || score > bestScore)){
|
||||||
|
bestScore = score;
|
||||||
|
bestSplit = splitRuleUpdater.currentSplit();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if(bestSplit == null){
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
return new SplitAndScore<>(bestSplit, bestScore);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Calculates the log rank value (or the Gray's test value) for a *specific* event cause.
|
* Calculates the log rank value (or the Gray's test value) for a *specific* event cause.
|
||||||
*
|
*
|
||||||
* @param eventOfFocus
|
* @param eventOfFocus
|
||||||
* @param competingRiskSetsLeft A summary of the different sets used in the calculation for the left side
|
* @param competingRiskSets A summary of the different sets used in the calculation
|
||||||
* @param competingRiskSetsRight A summary of the different sets used in the calculation for the right side
|
|
||||||
* @return
|
* @return
|
||||||
*/
|
*/
|
||||||
LogRankValue specificLogRankValue(final int eventOfFocus, final CompetingRiskSets competingRiskSetsLeft, final CompetingRiskSets competingRiskSetsRight){
|
LogRankValue specificLogRankValue(final int eventOfFocus, final CompetingRiskSets<Y> competingRiskSets){
|
||||||
|
|
||||||
final double[] distinctEventTimes = Stream.concat(
|
|
||||||
competingRiskSetsLeft.getEventTimes().stream(),
|
|
||||||
competingRiskSetsRight.getEventTimes().stream())
|
|
||||||
.mapToDouble(Double::doubleValue)
|
|
||||||
.sorted()
|
|
||||||
.distinct()
|
|
||||||
.toArray();
|
|
||||||
|
|
||||||
double summation = 0.0;
|
double summation = 0.0;
|
||||||
double variance = 0.0;
|
double variance = 0.0;
|
||||||
|
|
||||||
for(final double time_k : distinctEventTimes){
|
final double[] distinctTimes = competingRiskSets.getDistinctTimes();
|
||||||
|
|
||||||
|
for(int k = 0; k<distinctTimes.length; k++){
|
||||||
|
final double time_k = distinctTimes[k];
|
||||||
final double weight = weight(time_k); // W_j(t_k)
|
final double weight = weight(time_k); // W_j(t_k)
|
||||||
final double numberEventsAtTimeDaughterLeft = competingRiskSetsLeft.getNumberOfEvents(time_k, eventOfFocus); // // d_{j,l}(t_k)
|
final double numberEventsAtTimeDaughterLeft = competingRiskSets.getNumberOfEventsLeft(k, eventOfFocus); // // d_{j,l}(t_k)
|
||||||
final double numberEventsAtTimeDaughterRight = competingRiskSetsRight.getNumberOfEvents(time_k, eventOfFocus); // d_{j,r}(t_k)
|
final double numberEventsAtTimeDaughterTotal = competingRiskSets.getNumberOfEventsTotal(k, eventOfFocus); // d_j(t_k)
|
||||||
final double numberOfEventsAtTime = numberEventsAtTimeDaughterLeft + numberEventsAtTimeDaughterRight; // d_j(t_k)
|
|
||||||
|
|
||||||
final double individualsAtRiskDaughterLeft = competingRiskSetsLeft.getRiskSet(eventOfFocus).evaluate(time_k); // Y_l(t_k)
|
final double individualsAtRiskDaughterLeft = competingRiskSets.getRiskSetLeft(k, eventOfFocus); // Y_l(t_k)
|
||||||
final double individualsAtRiskDaughterRight = competingRiskSetsRight.getRiskSet(eventOfFocus).evaluate(time_k); // Y_r(t_k)
|
final double individualsAtRiskDaughterTotal = competingRiskSets.getRiskSetTotal(k, eventOfFocus); // Y(t_k)
|
||||||
final double individualsAtRisk = individualsAtRiskDaughterLeft + individualsAtRiskDaughterRight; // Y(t_k)
|
|
||||||
|
|
||||||
final double deltaSummation = weight*(numberEventsAtTimeDaughterLeft - numberOfEventsAtTime*individualsAtRiskDaughterLeft/individualsAtRisk);
|
final double deltaSummation = weight*(numberEventsAtTimeDaughterLeft - numberEventsAtTimeDaughterTotal*individualsAtRiskDaughterLeft/individualsAtRiskDaughterTotal);
|
||||||
final double deltaVariance = weight*weight*numberOfEventsAtTime*individualsAtRiskDaughterLeft/individualsAtRisk
|
final double deltaVariance = weight*weight*numberEventsAtTimeDaughterTotal*individualsAtRiskDaughterLeft/individualsAtRiskDaughterTotal
|
||||||
* (1.0 - individualsAtRiskDaughterLeft / individualsAtRisk)
|
* (1.0 - individualsAtRiskDaughterLeft / individualsAtRiskDaughterTotal)
|
||||||
* ((individualsAtRisk - numberOfEventsAtTime) / (individualsAtRisk - 1.0));
|
* ((individualsAtRiskDaughterTotal - numberEventsAtTimeDaughterTotal) / (individualsAtRiskDaughterTotal - 1.0));
|
||||||
|
|
||||||
// Note - notation differs slightly with what is found in STAT 855 notes, but they are equivalent.
|
// Note - notation differs slightly with what is found in STAT 855 notes, but they are equivalent.
|
||||||
// Note - if individualsAtRisk == 1 then variance will be NaN.
|
// Note - if individualsAtRisk == 1 then variance will be NaN.
|
||||||
|
@ -62,10 +134,6 @@ public abstract class CompetingRiskGroupDifferentiator<Y extends CompetingRiskRe
|
||||||
summation += deltaSummation;
|
summation += deltaSummation;
|
||||||
variance += deltaVariance;
|
variance += deltaVariance;
|
||||||
}
|
}
|
||||||
else{
|
|
||||||
// Do nothing; else statement left for breakpoints.
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return new LogRankValue(summation, variance);
|
return new LogRankValue(summation, variance);
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
package ca.joeltherrien.randomforest.responses.competingrisk.differentiator;
|
package ca.joeltherrien.randomforest.responses.competingrisk.differentiator;
|
||||||
|
|
||||||
import ca.joeltherrien.randomforest.responses.competingrisk.CompetingRiskGraySetsImpl;
|
|
||||||
import ca.joeltherrien.randomforest.responses.competingrisk.CompetingRiskResponseWithCensorTime;
|
import ca.joeltherrien.randomforest.responses.competingrisk.CompetingRiskResponseWithCensorTime;
|
||||||
|
import ca.joeltherrien.randomforest.responses.competingrisk.CompetingRiskSets;
|
||||||
import ca.joeltherrien.randomforest.responses.competingrisk.CompetingRiskUtils;
|
import ca.joeltherrien.randomforest.responses.competingrisk.CompetingRiskUtils;
|
||||||
import lombok.RequiredArgsConstructor;
|
import lombok.RequiredArgsConstructor;
|
||||||
|
|
||||||
|
@ -17,19 +17,17 @@ public class GrayLogRankMultipleGroupDifferentiator extends CompetingRiskGroupDi
|
||||||
private final int[] events;
|
private final int[] events;
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public Double differentiate(List<CompetingRiskResponseWithCensorTime> leftHand, List<CompetingRiskResponseWithCensorTime> rightHand) {
|
protected CompetingRiskSets<CompetingRiskResponseWithCensorTime> createCompetingRiskSets(List<CompetingRiskResponseWithCensorTime> leftHand, List<CompetingRiskResponseWithCensorTime> rightHand){
|
||||||
if(leftHand.size() == 0 || rightHand.size() == 0){
|
return CompetingRiskUtils.calculateGraySetsEfficiently(leftHand, rightHand, events);
|
||||||
return null;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
final CompetingRiskGraySetsImpl competingRiskSetsLeft = CompetingRiskUtils.calculateGraySetsEfficiently(leftHand, events);
|
@Override
|
||||||
final CompetingRiskGraySetsImpl competingRiskSetsRight = CompetingRiskUtils.calculateGraySetsEfficiently(rightHand, events);
|
protected Double getScore(final CompetingRiskSets<CompetingRiskResponseWithCensorTime> competingRiskSets){
|
||||||
|
|
||||||
double numerator = 0.0;
|
double numerator = 0.0;
|
||||||
double denominatorSquared = 0.0;
|
double denominatorSquared = 0.0;
|
||||||
|
|
||||||
for(final int eventOfFocus : events){
|
for(final int eventOfFocus : events){
|
||||||
final LogRankValue valueOfInterest = specificLogRankValue(eventOfFocus, competingRiskSetsLeft, competingRiskSetsRight);
|
final LogRankValue valueOfInterest = specificLogRankValue(eventOfFocus, competingRiskSets);
|
||||||
|
|
||||||
numerator += valueOfInterest.getNumerator()*valueOfInterest.getVarianceSqrt();
|
numerator += valueOfInterest.getNumerator()*valueOfInterest.getVarianceSqrt();
|
||||||
denominatorSquared += valueOfInterest.getVariance();
|
denominatorSquared += valueOfInterest.getVariance();
|
||||||
|
@ -37,7 +35,6 @@ public class GrayLogRankMultipleGroupDifferentiator extends CompetingRiskGroupDi
|
||||||
}
|
}
|
||||||
|
|
||||||
return Math.abs(numerator / Math.sqrt(denominatorSquared));
|
return Math.abs(numerator / Math.sqrt(denominatorSquared));
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
package ca.joeltherrien.randomforest.responses.competingrisk.differentiator;
|
package ca.joeltherrien.randomforest.responses.competingrisk.differentiator;
|
||||||
|
|
||||||
import ca.joeltherrien.randomforest.responses.competingrisk.CompetingRiskGraySetsImpl;
|
|
||||||
import ca.joeltherrien.randomforest.responses.competingrisk.CompetingRiskResponseWithCensorTime;
|
import ca.joeltherrien.randomforest.responses.competingrisk.CompetingRiskResponseWithCensorTime;
|
||||||
|
import ca.joeltherrien.randomforest.responses.competingrisk.CompetingRiskSets;
|
||||||
import ca.joeltherrien.randomforest.responses.competingrisk.CompetingRiskUtils;
|
import ca.joeltherrien.randomforest.responses.competingrisk.CompetingRiskUtils;
|
||||||
import lombok.RequiredArgsConstructor;
|
import lombok.RequiredArgsConstructor;
|
||||||
|
|
||||||
|
@ -18,18 +18,14 @@ public class GrayLogRankSingleGroupDifferentiator extends CompetingRiskGroupDiff
|
||||||
private final int[] events;
|
private final int[] events;
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public Double differentiate(List<CompetingRiskResponseWithCensorTime> leftHand, List<CompetingRiskResponseWithCensorTime> rightHand) {
|
protected CompetingRiskSets<CompetingRiskResponseWithCensorTime> createCompetingRiskSets(List<CompetingRiskResponseWithCensorTime> leftHand, List<CompetingRiskResponseWithCensorTime> rightHand){
|
||||||
if(leftHand.size() == 0 || rightHand.size() == 0){
|
return CompetingRiskUtils.calculateGraySetsEfficiently(leftHand, rightHand, events);
|
||||||
return null;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
final CompetingRiskGraySetsImpl competingRiskSetsLeft = CompetingRiskUtils.calculateGraySetsEfficiently(leftHand, events);
|
@Override
|
||||||
final CompetingRiskGraySetsImpl competingRiskSetsRight = CompetingRiskUtils.calculateGraySetsEfficiently(rightHand, events);
|
protected Double getScore(final CompetingRiskSets<CompetingRiskResponseWithCensorTime> competingRiskSets){
|
||||||
|
final LogRankValue valueOfInterest = specificLogRankValue(eventOfFocus, competingRiskSets);
|
||||||
final LogRankValue valueOfInterest = specificLogRankValue(eventOfFocus, competingRiskSetsLeft, competingRiskSetsRight);
|
|
||||||
|
|
||||||
return Math.abs(valueOfInterest.getNumerator() / valueOfInterest.getVarianceSqrt());
|
return Math.abs(valueOfInterest.getNumerator() / valueOfInterest.getVarianceSqrt());
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
package ca.joeltherrien.randomforest.responses.competingrisk.differentiator;
|
package ca.joeltherrien.randomforest.responses.competingrisk.differentiator;
|
||||||
|
|
||||||
import ca.joeltherrien.randomforest.responses.competingrisk.CompetingRiskResponse;
|
import ca.joeltherrien.randomforest.responses.competingrisk.CompetingRiskResponse;
|
||||||
import ca.joeltherrien.randomforest.responses.competingrisk.CompetingRiskSetsImpl;
|
import ca.joeltherrien.randomforest.responses.competingrisk.CompetingRiskSets;
|
||||||
import ca.joeltherrien.randomforest.responses.competingrisk.CompetingRiskUtils;
|
import ca.joeltherrien.randomforest.responses.competingrisk.CompetingRiskUtils;
|
||||||
import lombok.RequiredArgsConstructor;
|
import lombok.RequiredArgsConstructor;
|
||||||
|
|
||||||
|
@ -17,19 +17,17 @@ public class LogRankMultipleGroupDifferentiator extends CompetingRiskGroupDiffer
|
||||||
private final int[] events;
|
private final int[] events;
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public Double differentiate(List<CompetingRiskResponse> leftHand, List<CompetingRiskResponse> rightHand) {
|
protected CompetingRiskSets<CompetingRiskResponse> createCompetingRiskSets(List<CompetingRiskResponse> leftHand, List<CompetingRiskResponse> rightHand){
|
||||||
if(leftHand.size() == 0 || rightHand.size() == 0){
|
return CompetingRiskUtils.calculateSetsEfficiently(leftHand, rightHand, events, true);
|
||||||
return null;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
final CompetingRiskSetsImpl competingRiskSetsLeft = CompetingRiskUtils.calculateSetsEfficiently(leftHand, events);
|
@Override
|
||||||
final CompetingRiskSetsImpl competingRiskSetsRight = CompetingRiskUtils.calculateSetsEfficiently(rightHand, events);
|
protected Double getScore(final CompetingRiskSets<CompetingRiskResponse> competingRiskSets){
|
||||||
|
|
||||||
double numerator = 0.0;
|
double numerator = 0.0;
|
||||||
double denominatorSquared = 0.0;
|
double denominatorSquared = 0.0;
|
||||||
|
|
||||||
for(final int eventOfFocus : events){
|
for(final int eventOfFocus : events){
|
||||||
final LogRankValue valueOfInterest = specificLogRankValue(eventOfFocus, competingRiskSetsLeft, competingRiskSetsRight);
|
final LogRankValue valueOfInterest = specificLogRankValue(eventOfFocus, competingRiskSets);
|
||||||
|
|
||||||
numerator += valueOfInterest.getNumerator()*valueOfInterest.getVarianceSqrt();
|
numerator += valueOfInterest.getNumerator()*valueOfInterest.getVarianceSqrt();
|
||||||
denominatorSquared += valueOfInterest.getVariance();
|
denominatorSquared += valueOfInterest.getVariance();
|
||||||
|
@ -37,7 +35,7 @@ public class LogRankMultipleGroupDifferentiator extends CompetingRiskGroupDiffer
|
||||||
}
|
}
|
||||||
|
|
||||||
return Math.abs(numerator / Math.sqrt(denominatorSquared));
|
return Math.abs(numerator / Math.sqrt(denominatorSquared));
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
package ca.joeltherrien.randomforest.responses.competingrisk.differentiator;
|
package ca.joeltherrien.randomforest.responses.competingrisk.differentiator;
|
||||||
|
|
||||||
import ca.joeltherrien.randomforest.responses.competingrisk.CompetingRiskResponse;
|
import ca.joeltherrien.randomforest.responses.competingrisk.CompetingRiskResponse;
|
||||||
import ca.joeltherrien.randomforest.responses.competingrisk.CompetingRiskSetsImpl;
|
import ca.joeltherrien.randomforest.responses.competingrisk.CompetingRiskSets;
|
||||||
import ca.joeltherrien.randomforest.responses.competingrisk.CompetingRiskUtils;
|
import ca.joeltherrien.randomforest.responses.competingrisk.CompetingRiskUtils;
|
||||||
import lombok.RequiredArgsConstructor;
|
import lombok.RequiredArgsConstructor;
|
||||||
|
|
||||||
|
@ -18,18 +18,14 @@ public class LogRankSingleGroupDifferentiator extends CompetingRiskGroupDifferen
|
||||||
private final int[] events;
|
private final int[] events;
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public Double differentiate(List<CompetingRiskResponse> leftHand, List<CompetingRiskResponse> rightHand) {
|
protected CompetingRiskSets<CompetingRiskResponse> createCompetingRiskSets(List<CompetingRiskResponse> leftHand, List<CompetingRiskResponse> rightHand){
|
||||||
if(leftHand.size() == 0 || rightHand.size() == 0){
|
return CompetingRiskUtils.calculateSetsEfficiently(leftHand, rightHand, events, true);
|
||||||
return null;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
final CompetingRiskSetsImpl competingRiskSetsLeft = CompetingRiskUtils.calculateSetsEfficiently(leftHand, events);
|
@Override
|
||||||
final CompetingRiskSetsImpl competingRiskSetsRight = CompetingRiskUtils.calculateSetsEfficiently(rightHand, events);
|
protected Double getScore(final CompetingRiskSets<CompetingRiskResponse> competingRiskSets){
|
||||||
|
final LogRankValue valueOfInterest = specificLogRankValue(eventOfFocus, competingRiskSets);
|
||||||
final LogRankValue valueOfInterest = specificLogRankValue(eventOfFocus, competingRiskSetsLeft, competingRiskSetsRight);
|
|
||||||
|
|
||||||
return Math.abs(valueOfInterest.getNumerator() / valueOfInterest.getVarianceSqrt());
|
return Math.abs(valueOfInterest.getNumerator() / valueOfInterest.getVarianceSqrt());
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,26 +0,0 @@
|
||||||
package ca.joeltherrien.randomforest.responses.regression;
|
|
||||||
|
|
||||||
import ca.joeltherrien.randomforest.tree.GroupDifferentiator;
|
|
||||||
|
|
||||||
import java.util.List;
|
|
||||||
|
|
||||||
public class MeanGroupDifferentiator implements GroupDifferentiator<Double> {
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public Double differentiate(List<Double> leftHand, List<Double> rightHand) {
|
|
||||||
|
|
||||||
double leftHandSize = leftHand.size();
|
|
||||||
double rightHandSize = rightHand.size();
|
|
||||||
|
|
||||||
if(leftHandSize == 0 || rightHandSize == 0){
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
double leftHandMean = leftHand.stream().mapToDouble(db -> db/leftHandSize).sum();
|
|
||||||
double rightHandMean = rightHand.stream().mapToDouble(db -> db/rightHandSize).sum();
|
|
||||||
|
|
||||||
return Math.abs(leftHandMean - rightHandMean);
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
|
@ -1,13 +1,13 @@
|
||||||
package ca.joeltherrien.randomforest.responses.regression;
|
package ca.joeltherrien.randomforest.responses.regression;
|
||||||
|
|
||||||
import ca.joeltherrien.randomforest.tree.GroupDifferentiator;
|
import ca.joeltherrien.randomforest.tree.SimpleGroupDifferentiator;
|
||||||
|
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
public class WeightedVarianceGroupDifferentiator implements GroupDifferentiator<Double> {
|
public class WeightedVarianceGroupDifferentiator extends SimpleGroupDifferentiator<Double> {
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public Double differentiate(List<Double> leftHand, List<Double> rightHand) {
|
public Double getScore(List<Double> leftHand, List<Double> rightHand) {
|
||||||
|
|
||||||
final double leftHandSize = leftHand.size();
|
final double leftHandSize = leftHand.size();
|
||||||
final double rightHandSize = rightHand.size();
|
final double rightHandSize = rightHand.size();
|
||||||
|
|
|
@ -14,8 +14,10 @@ import java.io.IOException;
|
||||||
import java.io.ObjectOutputStream;
|
import java.io.ObjectOutputStream;
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
import java.util.Random;
|
||||||
import java.util.concurrent.ExecutorService;
|
import java.util.concurrent.ExecutorService;
|
||||||
import java.util.concurrent.Executors;
|
import java.util.concurrent.Executors;
|
||||||
|
import java.util.concurrent.ThreadLocalRandom;
|
||||||
import java.util.concurrent.atomic.AtomicInteger;
|
import java.util.concurrent.atomic.AtomicInteger;
|
||||||
import java.util.stream.Collectors;
|
import java.util.stream.Collectors;
|
||||||
import java.util.stream.Stream;
|
import java.util.stream.Stream;
|
||||||
|
@ -45,17 +47,17 @@ public class ForestTrainer<Y, TO, FO> {
|
||||||
this.covariates = covariates;
|
this.covariates = covariates;
|
||||||
this.treeResponseCombiner = settings.getTreeCombiner();
|
this.treeResponseCombiner = settings.getTreeCombiner();
|
||||||
this.treeTrainer = new TreeTrainer<>(settings, covariates);
|
this.treeTrainer = new TreeTrainer<>(settings, covariates);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public Forest<TO, FO> trainSerial(){
|
public Forest<TO, FO> trainSerial(){
|
||||||
|
|
||||||
final List<Tree<TO>> trees = new ArrayList<>(ntree);
|
final List<Tree<TO>> trees = new ArrayList<>(ntree);
|
||||||
final Bootstrapper<Row<Y>> bootstrapper = new Bootstrapper<>(data);
|
final Bootstrapper<Row<Y>> bootstrapper = new Bootstrapper<>(data);
|
||||||
|
final Random random = new Random();
|
||||||
|
|
||||||
for(int j=0; j<ntree; j++){
|
for(int j=0; j<ntree; j++){
|
||||||
|
|
||||||
trees.add(trainTree(bootstrapper));
|
trees.add(trainTree(bootstrapper, random));
|
||||||
|
|
||||||
if(displayProgress){
|
if(displayProgress){
|
||||||
if(j==0) {
|
if(j==0) {
|
||||||
|
@ -130,7 +132,7 @@ public class ForestTrainer<Y, TO, FO> {
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
final File[] treeFiles = folder.listFiles(((file, s) -> s.endsWith(".tree")));
|
final File[] treeFiles = folder.listFiles((file, s) -> s.endsWith(".tree"));
|
||||||
|
|
||||||
final ExecutorService executorService = Executors.newFixedThreadPool(threads);
|
final ExecutorService executorService = Executors.newFixedThreadPool(threads);
|
||||||
final AtomicInteger treeCount = new AtomicInteger(treeFiles.length); // tracks how many trees are finished
|
final AtomicInteger treeCount = new AtomicInteger(treeFiles.length); // tracks how many trees are finished
|
||||||
|
@ -162,9 +164,9 @@ public class ForestTrainer<Y, TO, FO> {
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private Tree<TO> trainTree(final Bootstrapper<Row<Y>> bootstrapper){
|
private Tree<TO> trainTree(final Bootstrapper<Row<Y>> bootstrapper, Random random){
|
||||||
final List<Row<Y>> bootstrappedData = bootstrapper.bootstrap();
|
final List<Row<Y>> bootstrappedData = bootstrapper.bootstrap(random);
|
||||||
return treeTrainer.growTree(bootstrappedData);
|
return treeTrainer.growTree(bootstrappedData, random);
|
||||||
}
|
}
|
||||||
|
|
||||||
public void saveTree(final Tree<TO> tree, String name) throws IOException {
|
public void saveTree(final Tree<TO> tree, String name) throws IOException {
|
||||||
|
@ -193,7 +195,8 @@ public class ForestTrainer<Y, TO, FO> {
|
||||||
@Override
|
@Override
|
||||||
public void run() {
|
public void run() {
|
||||||
|
|
||||||
final Tree<TO> tree = trainTree(bootstrapper);
|
// ThreadLocalRandom should make sure we don't duplicate seeds
|
||||||
|
final Tree<TO> tree = trainTree(bootstrapper, ThreadLocalRandom.current());
|
||||||
|
|
||||||
// should be okay as the list structure isn't changing
|
// should be okay as the list structure isn't changing
|
||||||
treeList.set(treeIndex, tree);
|
treeList.set(treeIndex, tree);
|
||||||
|
@ -216,7 +219,8 @@ public class ForestTrainer<Y, TO, FO> {
|
||||||
@Override
|
@Override
|
||||||
public void run() {
|
public void run() {
|
||||||
|
|
||||||
final Tree<TO> tree = trainTree(bootstrapper);
|
// ThreadLocalRandom should make sure we don't duplicate seeds
|
||||||
|
final Tree<TO> tree = trainTree(bootstrapper, ThreadLocalRandom.current());
|
||||||
|
|
||||||
try {
|
try {
|
||||||
saveTree(tree, filename);
|
saveTree(tree, filename);
|
||||||
|
|
|
@ -1,15 +1,17 @@
|
||||||
package ca.joeltherrien.randomforest.tree;
|
package ca.joeltherrien.randomforest.tree;
|
||||||
|
|
||||||
import java.util.List;
|
import java.util.Iterator;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* When choosing an optimal node to split on, we choose the split that maximizes the difference between the two groups.
|
* When choosing an optimal node to split on, we choose the split that maximizes the difference between the two groups.
|
||||||
* The GroupDifferentiator has one method that outputs a score to show how different groups are. The larger the score,
|
* The GroupDifferentiator has one method that cycles through an iterator of Splits (FYI; check if the iterator is an
|
||||||
* the greater the difference.
|
* instance of Covariate.SplitRuleUpdater; in which case you get access to the rows that change between splits)
|
||||||
*
|
*
|
||||||
|
* If you want to implement a very trivial GroupDifferentiator that just takes two Lists as arguments, try extending
|
||||||
|
* SimpleGroupDifferentiator.
|
||||||
*/
|
*/
|
||||||
public interface GroupDifferentiator<Y> {
|
public interface GroupDifferentiator<Y> {
|
||||||
|
|
||||||
Double differentiate(List<Y> leftHand, List<Y> rightHand);
|
SplitAndScore<Y, ?> differentiate(Iterator<Split<Y, ?>> splitIterator);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -0,0 +1,50 @@
|
||||||
|
package ca.joeltherrien.randomforest.tree;
|
||||||
|
|
||||||
|
import ca.joeltherrien.randomforest.Row;
|
||||||
|
|
||||||
|
import java.util.Iterator;
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.stream.Collectors;
|
||||||
|
|
||||||
|
public abstract class SimpleGroupDifferentiator<Y> implements GroupDifferentiator<Y> {
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public SplitAndScore<Y, ?> differentiate(Iterator<Split<Y, ?>> splitIterator) {
|
||||||
|
Double bestScore = null;
|
||||||
|
Split<Y, ?> bestSplit = null;
|
||||||
|
|
||||||
|
while(splitIterator.hasNext()){
|
||||||
|
final Split<Y, ?> candidateSplit = splitIterator.next();
|
||||||
|
|
||||||
|
final List<Y> leftHand = candidateSplit.getLeftHand().stream().map(Row::getResponse).collect(Collectors.toList());
|
||||||
|
final List<Y> rightHand = candidateSplit.getRightHand().stream().map(Row::getResponse).collect(Collectors.toList());
|
||||||
|
|
||||||
|
if(leftHand.isEmpty() || rightHand.isEmpty()){
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
final Double score = getScore(leftHand, rightHand);
|
||||||
|
|
||||||
|
if(score != null && (bestScore == null || score > bestScore)){
|
||||||
|
bestScore = score;
|
||||||
|
bestSplit = candidateSplit;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if(bestSplit == null){
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
return new SplitAndScore<>(bestSplit, bestScore);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Return a score; higher is better.
|
||||||
|
*
|
||||||
|
* @param leftHand
|
||||||
|
* @param rightHand
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
public abstract Double getScore(List<Y> leftHand, List<Y> rightHand);
|
||||||
|
|
||||||
|
}
|
|
@ -1,19 +1,21 @@
|
||||||
package ca.joeltherrien.randomforest.tree;
|
package ca.joeltherrien.randomforest.tree;
|
||||||
|
|
||||||
import ca.joeltherrien.randomforest.Row;
|
import ca.joeltherrien.randomforest.Row;
|
||||||
|
import ca.joeltherrien.randomforest.covariates.Covariate;
|
||||||
import lombok.Data;
|
import lombok.Data;
|
||||||
|
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Very simple class that contains three lists; it's essentially a thruple.
|
* Very simple class that contains three lists and a SplitRule.
|
||||||
*
|
*
|
||||||
* @author joel
|
* @author joel
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
@Data
|
@Data
|
||||||
public class Split<Y> {
|
public final class Split<Y, V> {
|
||||||
|
|
||||||
|
public final Covariate.SplitRule<V> splitRule;
|
||||||
public final List<Row<Y>> leftHand;
|
public final List<Row<Y>> leftHand;
|
||||||
public final List<Row<Y>> rightHand;
|
public final List<Row<Y>> rightHand;
|
||||||
public final List<Row<Y>> naHand;
|
public final List<Row<Y>> naHand;
|
||||||
|
|
|
@ -0,0 +1,15 @@
|
||||||
|
package ca.joeltherrien.randomforest.tree;
|
||||||
|
|
||||||
|
import lombok.AllArgsConstructor;
|
||||||
|
import lombok.Getter;
|
||||||
|
|
||||||
|
@AllArgsConstructor
|
||||||
|
public class SplitAndScore<Y, V> {
|
||||||
|
|
||||||
|
@Getter
|
||||||
|
private final Split<Y, V> split;
|
||||||
|
|
||||||
|
@Getter
|
||||||
|
private final Double score;
|
||||||
|
|
||||||
|
}
|
|
@ -3,8 +3,10 @@ package ca.joeltherrien.randomforest.tree;
|
||||||
import ca.joeltherrien.randomforest.CovariateRow;
|
import ca.joeltherrien.randomforest.CovariateRow;
|
||||||
import ca.joeltherrien.randomforest.covariates.Covariate;
|
import ca.joeltherrien.randomforest.covariates.Covariate;
|
||||||
import lombok.Builder;
|
import lombok.Builder;
|
||||||
|
import lombok.ToString;
|
||||||
|
|
||||||
@Builder
|
@Builder
|
||||||
|
@ToString
|
||||||
public class SplitNode<Y> implements Node<Y> {
|
public class SplitNode<Y> implements Node<Y> {
|
||||||
|
|
||||||
private final Node<Y> leftHand;
|
private final Node<Y> leftHand;
|
||||||
|
|
|
@ -2,8 +2,10 @@ package ca.joeltherrien.randomforest.tree;
|
||||||
|
|
||||||
import ca.joeltherrien.randomforest.CovariateRow;
|
import ca.joeltherrien.randomforest.CovariateRow;
|
||||||
import lombok.RequiredArgsConstructor;
|
import lombok.RequiredArgsConstructor;
|
||||||
|
import lombok.ToString;
|
||||||
|
|
||||||
@RequiredArgsConstructor
|
@RequiredArgsConstructor
|
||||||
|
@ToString
|
||||||
public class TerminalNode<Y> implements Node<Y> {
|
public class TerminalNode<Y> implements Node<Y> {
|
||||||
|
|
||||||
private final Y responseValue;
|
private final Y responseValue;
|
||||||
|
@ -14,6 +16,4 @@ public class TerminalNode<Y> implements Node<Y> {
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -29,4 +29,8 @@ public class Tree<Y> implements Node<Y> {
|
||||||
return Arrays.binarySearch(this.bootstrapRowIds, id) >= 0;
|
return Arrays.binarySearch(this.bootstrapRowIds, id) >= 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String toString(){
|
||||||
|
return rootNode.toString();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -8,7 +8,6 @@ import lombok.AllArgsConstructor;
|
||||||
import lombok.Builder;
|
import lombok.Builder;
|
||||||
|
|
||||||
import java.util.*;
|
import java.util.*;
|
||||||
import java.util.concurrent.ThreadLocalRandom;
|
|
||||||
import java.util.stream.Collectors;
|
import java.util.stream.Collectors;
|
||||||
|
|
||||||
@Builder
|
@Builder
|
||||||
|
@ -47,20 +46,21 @@ public class TreeTrainer<Y, O> {
|
||||||
this.covariates = covariates;
|
this.covariates = covariates;
|
||||||
}
|
}
|
||||||
|
|
||||||
public Tree<O> growTree(List<Row<Y>> data){
|
public Tree<O> growTree(List<Row<Y>> data, Random random){
|
||||||
|
|
||||||
final Node<O> rootNode = growNode(data, 0);
|
final Node<O> rootNode = growNode(data, 0, random);
|
||||||
return new Tree<>(rootNode, data.stream().mapToInt(Row::getId).toArray());
|
return new Tree<>(rootNode, data.stream().mapToInt(Row::getId).toArray());
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private Node<O> growNode(List<Row<Y>> data, int depth){
|
private Node<O> growNode(List<Row<Y>> data, int depth, Random random){
|
||||||
// See https://kogalur.github.io/randomForestSRC/theory.html#section3.1 (near bottom)
|
// See https://kogalur.github.io/randomForestSRC/theory.html#section3.1 (near bottom)
|
||||||
if(data.size() >= 2*nodeSize && depth < maxNodeDepth && !nodeIsPure(data)){
|
if(data.size() >= 2*nodeSize && depth < maxNodeDepth && !nodeIsPure(data)){
|
||||||
final List<Covariate> covariatesToTry = selectCovariates(this.mtry);
|
final List<Covariate> covariatesToTry = selectCovariates(this.mtry, random);
|
||||||
final SplitRuleAndSplit bestSplitRuleAndSplit = findBestSplitRule(data, covariatesToTry);
|
final Split<Y,?> bestSplit = findBestSplitRule(data, covariatesToTry, random);
|
||||||
|
|
||||||
if(bestSplitRuleAndSplit.splitRule == null){
|
|
||||||
|
if(bestSplit == null){
|
||||||
|
|
||||||
return new TerminalNode<>(
|
return new TerminalNode<>(
|
||||||
responseCombiner.combine(
|
responseCombiner.combine(
|
||||||
|
@ -71,14 +71,34 @@ public class TreeTrainer<Y, O> {
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
final Split<Y> split = bestSplitRuleAndSplit.split;
|
|
||||||
// Note that NAs have already been handled
|
// Now that we have the best split; we need to handle any NAs that were dropped off
|
||||||
|
final double probabilityLeftHand = (double) bestSplit.leftHand.size() /
|
||||||
|
(double) (bestSplit.leftHand.size() + bestSplit.rightHand.size());
|
||||||
|
|
||||||
|
// Assign missing values to the split if necessary
|
||||||
|
if(bestSplit.getSplitRule().getParent().hasNAs()){
|
||||||
|
for(Row<Y> row : data) {
|
||||||
|
if(row.getCovariateValue(bestSplit.getSplitRule().getParent()).isNA()) {
|
||||||
|
final boolean randomDecision = random.nextDouble() <= probabilityLeftHand;
|
||||||
|
|
||||||
|
if(randomDecision){
|
||||||
|
bestSplit.getLeftHand().add(row);
|
||||||
|
}
|
||||||
|
else{
|
||||||
|
bestSplit.getRightHand().add(row);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
final Node<O> leftNode = growNode(split.leftHand, depth+1);
|
|
||||||
final Node<O> rightNode = growNode(split.rightHand, depth+1);
|
|
||||||
|
|
||||||
return new SplitNode<>(leftNode, rightNode, bestSplitRuleAndSplit.splitRule, bestSplitRuleAndSplit.probabilityLeftHand);
|
final Node<O> leftNode = growNode(bestSplit.leftHand, depth+1, random);
|
||||||
|
final Node<O> rightNode = growNode(bestSplit.rightHand, depth+1, random);
|
||||||
|
|
||||||
|
return new SplitNode<>(leftNode, rightNode, bestSplit.getSplitRule(), probabilityLeftHand);
|
||||||
|
|
||||||
}
|
}
|
||||||
else{
|
else{
|
||||||
|
@ -92,13 +112,13 @@ public class TreeTrainer<Y, O> {
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private List<Covariate> selectCovariates(int mtry){
|
private List<Covariate> selectCovariates(int mtry, Random random){
|
||||||
if(mtry >= covariates.size()){
|
if(mtry >= covariates.size()){
|
||||||
return covariates;
|
return covariates;
|
||||||
}
|
}
|
||||||
|
|
||||||
final List<Covariate> splitCovariates = new ArrayList<>(covariates);
|
final List<Covariate> splitCovariates = new ArrayList<>(covariates);
|
||||||
Collections.shuffle(splitCovariates, ThreadLocalRandom.current());
|
Collections.shuffle(splitCovariates, random);
|
||||||
|
|
||||||
if (splitCovariates.size() > mtry) {
|
if (splitCovariates.size() > mtry) {
|
||||||
splitCovariates.subList(mtry, splitCovariates.size()).clear();
|
splitCovariates.subList(mtry, splitCovariates.size()).clear();
|
||||||
|
@ -107,63 +127,28 @@ public class TreeTrainer<Y, O> {
|
||||||
return splitCovariates;
|
return splitCovariates;
|
||||||
}
|
}
|
||||||
|
|
||||||
private SplitRuleAndSplit findBestSplitRule(List<Row<Y>> data, List<Covariate> covariatesToTry){
|
private Split<Y, ?> findBestSplitRule(List<Row<Y>> data, List<Covariate> covariatesToTry, Random random){
|
||||||
SplitRuleAndSplit bestSplitRuleAndSplit = new SplitRuleAndSplit();
|
|
||||||
double bestSplitScore = 0.0;
|
SplitAndScore<Y, ?> bestSplitAndScore = null;
|
||||||
boolean first = true;
|
final GroupDifferentiator noGenericDifferentiator = groupDifferentiator; // cause Java generics suck
|
||||||
|
|
||||||
for(final Covariate covariate : covariatesToTry) {
|
for(final Covariate covariate : covariatesToTry) {
|
||||||
|
final Iterator<Split> iterator = covariate.generateSplitRuleUpdater(data, this.numberOfSplits, random);
|
||||||
|
|
||||||
final int numberToTry = numberOfSplits==0 ? data.size() : numberOfSplits;
|
final SplitAndScore<Y, ?> candidateSplitAndScore = noGenericDifferentiator.differentiate(iterator);
|
||||||
|
|
||||||
final Collection<Covariate.SplitRule> splitRulesToTry = covariate
|
if(candidateSplitAndScore != null && (bestSplitAndScore == null ||
|
||||||
.generateSplitRules(
|
candidateSplitAndScore.getScore() > bestSplitAndScore.getScore())) {
|
||||||
data
|
bestSplitAndScore = candidateSplitAndScore;
|
||||||
.stream()
|
|
||||||
.map(row -> row.getCovariateValue(covariate))
|
|
||||||
.collect(Collectors.toList())
|
|
||||||
, numberToTry);
|
|
||||||
|
|
||||||
for(final Covariate.SplitRule possibleRule : splitRulesToTry){
|
|
||||||
final Split<Y> possibleSplit = possibleRule.applyRule(data);
|
|
||||||
|
|
||||||
// We have to handle any NAs
|
|
||||||
if(possibleSplit.leftHand.size() == 0 && possibleSplit.rightHand.size() == 0 && possibleSplit.naHand.size() > 0){
|
|
||||||
throw new IllegalArgumentException("Can't apply " + this + " when there are rows with missing data and no non-missing value rows");
|
|
||||||
}
|
|
||||||
|
|
||||||
final double probabilityLeftHand = (double) possibleSplit.leftHand.size() / (double) (possibleSplit.leftHand.size() + possibleSplit.rightHand.size());
|
|
||||||
|
|
||||||
final Random random = ThreadLocalRandom.current();
|
|
||||||
for(final Row<Y> missingValueRow : possibleSplit.naHand){
|
|
||||||
final boolean randomDecision = random.nextDouble() <= probabilityLeftHand;
|
|
||||||
if(randomDecision){
|
|
||||||
possibleSplit.leftHand.add(missingValueRow);
|
|
||||||
}
|
|
||||||
else{
|
|
||||||
possibleSplit.rightHand.add(missingValueRow);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
final Double score = groupDifferentiator.differentiate(
|
|
||||||
possibleSplit.leftHand.stream().map(row -> row.getResponse()).collect(Collectors.toList()),
|
|
||||||
possibleSplit.rightHand.stream().map(row -> row.getResponse()).collect(Collectors.toList())
|
|
||||||
);
|
|
||||||
|
|
||||||
|
|
||||||
if(score != null && !Double.isNaN(score) && (score > bestSplitScore || first)){
|
|
||||||
bestSplitRuleAndSplit.splitRule = possibleRule;
|
|
||||||
bestSplitRuleAndSplit.split = possibleSplit;
|
|
||||||
bestSplitRuleAndSplit.probabilityLeftHand = probabilityLeftHand;
|
|
||||||
|
|
||||||
bestSplitScore = score;
|
|
||||||
first = false;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return bestSplitRuleAndSplit;
|
if(bestSplitAndScore == null){
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
return bestSplitAndScore.getSplit();
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -186,10 +171,4 @@ public class TreeTrainer<Y, O> {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
private class SplitRuleAndSplit{
|
|
||||||
private Covariate.SplitRule splitRule = null;
|
|
||||||
private Split<Y> split = null;
|
|
||||||
private double probabilityLeftHand;
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -0,0 +1,9 @@
|
||||||
|
package ca.joeltherrien.randomforest.utils;
|
||||||
|
|
||||||
|
import java.util.Iterator;
|
||||||
|
|
||||||
|
public interface IndexedIterator<E> extends Iterator<E> {
|
||||||
|
|
||||||
|
int getIndex();
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,29 @@
|
||||||
|
package ca.joeltherrien.randomforest.utils;
|
||||||
|
|
||||||
|
import lombok.RequiredArgsConstructor;
|
||||||
|
|
||||||
|
import java.util.Iterator;
|
||||||
|
|
||||||
|
@RequiredArgsConstructor
|
||||||
|
public class SingletonIterator<E> implements Iterator<E> {
|
||||||
|
|
||||||
|
private final E value;
|
||||||
|
|
||||||
|
private boolean beenCalled = false;
|
||||||
|
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean hasNext() {
|
||||||
|
return !beenCalled;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public E next() {
|
||||||
|
if(!beenCalled){
|
||||||
|
beenCalled = true;
|
||||||
|
return value;
|
||||||
|
}
|
||||||
|
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,61 @@
|
||||||
|
package ca.joeltherrien.randomforest.utils;
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Iterator that wraps around a UniqueValueIterator. It continues to iterate until it gets to one of the prespecified indexes,
|
||||||
|
* and then proceeds just past that to the end of the existing values it's at.
|
||||||
|
*
|
||||||
|
* The wrapped iterator must be from a sorted collection of some sort such that equal values are clumped together.
|
||||||
|
* I.e. "b b c c c d d a a" is okay but "a b b c c a" is not as 'a' appears twice at different locations
|
||||||
|
*
|
||||||
|
* @param <E>
|
||||||
|
*/
|
||||||
|
public class UniqueSubsetValueIterator<E> implements IndexedIterator<E> {
|
||||||
|
|
||||||
|
private final UniqueValueIterator<E> iterator;
|
||||||
|
private final Integer[] indexValues;
|
||||||
|
|
||||||
|
private int currentIndexSpot = 0;
|
||||||
|
|
||||||
|
public UniqueSubsetValueIterator(final UniqueValueIterator<E> iterator, final Integer[] indexValues){
|
||||||
|
this.iterator = iterator;
|
||||||
|
this.indexValues = indexValues;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean hasNext() {
|
||||||
|
return iterator.hasNext() && iterator.getIndex() <= indexValues[indexValues.length-1];
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public E next() {
|
||||||
|
if(hasNext()){
|
||||||
|
final int indexToStopBy = indexValues[currentIndexSpot];
|
||||||
|
|
||||||
|
while(iterator.getIndex() <= indexToStopBy){
|
||||||
|
iterator.next();
|
||||||
|
}
|
||||||
|
|
||||||
|
for(int i = currentIndexSpot + 1; i < indexValues.length; i++){
|
||||||
|
if(iterator.getIndex() <= indexValues[i]){
|
||||||
|
currentIndexSpot = i;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
return iterator.getCurrentValue();
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
return null;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public int getIndex(){
|
||||||
|
return iterator.getIndex();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,71 @@
|
||||||
|
package ca.joeltherrien.randomforest.utils;
|
||||||
|
|
||||||
|
|
||||||
|
import lombok.Getter;
|
||||||
|
|
||||||
|
import java.util.Iterator;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Iterator that wraps around another iterator. It continues to iterate until it gets to the *end* of a sequence of identical values.
|
||||||
|
* It also tracks the current index in the original iterator.
|
||||||
|
*
|
||||||
|
* The wrapped iterator must be from a sorted collection of some sort such that equal values are clumped together.
|
||||||
|
* I.e. "b b c c c d d a a" is okay but "a b b c c a" is not as 'a' appears twice at different locations
|
||||||
|
*
|
||||||
|
* @param <E>
|
||||||
|
*/
|
||||||
|
public class UniqueValueIterator<E> implements IndexedIterator<E> {
|
||||||
|
|
||||||
|
private final Iterator<E> wrappedIterator;
|
||||||
|
|
||||||
|
@Getter private E currentValue = null;
|
||||||
|
@Getter private E nextValue;
|
||||||
|
|
||||||
|
public UniqueValueIterator(final Iterator<E> wrappedIterator){
|
||||||
|
this.wrappedIterator = wrappedIterator;
|
||||||
|
this.nextValue = wrappedIterator.next();
|
||||||
|
}
|
||||||
|
|
||||||
|
// Count must return the index of the last value of the sequence returned by next()
|
||||||
|
@Getter
|
||||||
|
private int index = 0;
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean hasNext() {
|
||||||
|
return nextValue != null;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public E next() {
|
||||||
|
|
||||||
|
int count = 1;
|
||||||
|
while(wrappedIterator.hasNext()){
|
||||||
|
final E currentIteratorValue = wrappedIterator.next();
|
||||||
|
|
||||||
|
if(currentIteratorValue.equals(nextValue)){
|
||||||
|
count++;
|
||||||
|
}
|
||||||
|
else{
|
||||||
|
index +=count;
|
||||||
|
currentValue = nextValue;
|
||||||
|
nextValue = currentIteratorValue;
|
||||||
|
|
||||||
|
return currentValue;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
if(nextValue != null){
|
||||||
|
index += count;
|
||||||
|
currentValue = nextValue;
|
||||||
|
nextValue = null;
|
||||||
|
|
||||||
|
return currentValue;
|
||||||
|
}
|
||||||
|
else{
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
|
@ -1,8 +1,8 @@
|
||||||
package ca.joeltherrien.randomforest;
|
package ca.joeltherrien.randomforest;
|
||||||
|
|
||||||
import ca.joeltherrien.randomforest.covariates.BooleanCovariateSettings;
|
import ca.joeltherrien.randomforest.covariates.settings.BooleanCovariateSettings;
|
||||||
import ca.joeltherrien.randomforest.covariates.Covariate;
|
import ca.joeltherrien.randomforest.covariates.Covariate;
|
||||||
import ca.joeltherrien.randomforest.covariates.NumericCovariateSettings;
|
import ca.joeltherrien.randomforest.covariates.settings.NumericCovariateSettings;
|
||||||
import ca.joeltherrien.randomforest.responses.competingrisk.combiner.CompetingRiskFunctionCombiner;
|
import ca.joeltherrien.randomforest.responses.competingrisk.combiner.CompetingRiskFunctionCombiner;
|
||||||
import ca.joeltherrien.randomforest.responses.competingrisk.CompetingRiskFunctions;
|
import ca.joeltherrien.randomforest.responses.competingrisk.CompetingRiskFunctions;
|
||||||
import ca.joeltherrien.randomforest.responses.competingrisk.CompetingRiskResponse;
|
import ca.joeltherrien.randomforest.responses.competingrisk.CompetingRiskResponse;
|
||||||
|
|
|
@ -1,214 +0,0 @@
|
||||||
package ca.joeltherrien.randomforest.competingrisk;
|
|
||||||
|
|
||||||
import ca.joeltherrien.randomforest.responses.competingrisk.CompetingRiskGraySetsImpl;
|
|
||||||
import ca.joeltherrien.randomforest.responses.competingrisk.CompetingRiskResponseWithCensorTime;
|
|
||||||
import ca.joeltherrien.randomforest.responses.competingrisk.CompetingRiskSetsImpl;
|
|
||||||
import ca.joeltherrien.randomforest.responses.competingrisk.CompetingRiskUtils;
|
|
||||||
import org.junit.jupiter.api.Test;
|
|
||||||
|
|
||||||
import java.util.ArrayList;
|
|
||||||
import java.util.List;
|
|
||||||
|
|
||||||
import static org.junit.jupiter.api.Assertions.assertEquals;
|
|
||||||
|
|
||||||
public class TestCalculatingCompetingRiskSets {
|
|
||||||
|
|
||||||
public List<CompetingRiskResponseWithCensorTime> generateData(){
|
|
||||||
final List<CompetingRiskResponseWithCensorTime> data = new ArrayList<>();
|
|
||||||
|
|
||||||
data.add(new CompetingRiskResponseWithCensorTime(1, 1, 3));
|
|
||||||
data.add(new CompetingRiskResponseWithCensorTime(1, 1, 3));
|
|
||||||
data.add(new CompetingRiskResponseWithCensorTime(0, 1, 1));
|
|
||||||
data.add(new CompetingRiskResponseWithCensorTime(1, 2, 2.5));
|
|
||||||
data.add(new CompetingRiskResponseWithCensorTime(2, 3, 4));
|
|
||||||
data.add(new CompetingRiskResponseWithCensorTime(0, 3, 3));
|
|
||||||
data.add(new CompetingRiskResponseWithCensorTime(1, 4, 4));
|
|
||||||
data.add(new CompetingRiskResponseWithCensorTime(0, 5, 5));
|
|
||||||
data.add(new CompetingRiskResponseWithCensorTime(2, 6, 7));
|
|
||||||
|
|
||||||
return data;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Test
|
|
||||||
public void testCalculatingSets(){
|
|
||||||
final List data = generateData();
|
|
||||||
|
|
||||||
final CompetingRiskSetsImpl sets = CompetingRiskUtils.calculateSetsEfficiently(data, new int[]{1,2});
|
|
||||||
|
|
||||||
final List<Double> times = sets.getEventTimes();
|
|
||||||
assertEquals(5, times.size());
|
|
||||||
|
|
||||||
// Times
|
|
||||||
assertEquals(1.0, times.get(0).doubleValue());
|
|
||||||
assertEquals(2.0, times.get(1).doubleValue());
|
|
||||||
assertEquals(3.0, times.get(2).doubleValue());
|
|
||||||
assertEquals(4.0, times.get(3).doubleValue());
|
|
||||||
assertEquals(6.0, times.get(4).doubleValue());
|
|
||||||
|
|
||||||
// Number of Events
|
|
||||||
assertEquals(2, sets.getNumberOfEvents(1.0, 1));
|
|
||||||
assertEquals(0, sets.getNumberOfEvents(1.0, 2));
|
|
||||||
|
|
||||||
assertEquals(1, sets.getNumberOfEvents(2.0, 1));
|
|
||||||
assertEquals(0, sets.getNumberOfEvents(2.0, 2));
|
|
||||||
|
|
||||||
assertEquals(0, sets.getNumberOfEvents(3.0, 1));
|
|
||||||
assertEquals(1, sets.getNumberOfEvents(3.0, 2));
|
|
||||||
|
|
||||||
assertEquals(1, sets.getNumberOfEvents(4.0, 1));
|
|
||||||
assertEquals(0, sets.getNumberOfEvents(4.0, 2));
|
|
||||||
|
|
||||||
assertEquals(0, sets.getNumberOfEvents(6.0, 1));
|
|
||||||
assertEquals(1, sets.getNumberOfEvents(6.0, 2));
|
|
||||||
|
|
||||||
// Make sure it doesn't break for other times
|
|
||||||
assertEquals(0, sets.getNumberOfEvents(5.5, 1));
|
|
||||||
assertEquals(0, sets.getNumberOfEvents(5.5, 2));
|
|
||||||
|
|
||||||
|
|
||||||
// Risk set
|
|
||||||
assertEquals(9, sets.getRiskSet(1).evaluate(0.5));
|
|
||||||
assertEquals(9, sets.getRiskSet(2).evaluate(0.5));
|
|
||||||
|
|
||||||
assertEquals(9, sets.getRiskSet(1).evaluate(1.0));
|
|
||||||
assertEquals(9, sets.getRiskSet(2).evaluate(1.0));
|
|
||||||
|
|
||||||
assertEquals(6, sets.getRiskSet(1).evaluate(1.5));
|
|
||||||
assertEquals(6, sets.getRiskSet(2).evaluate(1.5));
|
|
||||||
|
|
||||||
assertEquals(6, sets.getRiskSet(1).evaluate(2.0));
|
|
||||||
assertEquals(6, sets.getRiskSet(2).evaluate(2.0));
|
|
||||||
|
|
||||||
assertEquals(5, sets.getRiskSet(1).evaluate(2.3));
|
|
||||||
assertEquals(5, sets.getRiskSet(2).evaluate(2.3));
|
|
||||||
|
|
||||||
assertEquals(5, sets.getRiskSet(1).evaluate(2.5));
|
|
||||||
assertEquals(5, sets.getRiskSet(2).evaluate(2.5));
|
|
||||||
|
|
||||||
assertEquals(5, sets.getRiskSet(1).evaluate(2.7));
|
|
||||||
assertEquals(5, sets.getRiskSet(2).evaluate(2.7));
|
|
||||||
|
|
||||||
assertEquals(5, sets.getRiskSet(1).evaluate(3.0));
|
|
||||||
assertEquals(5, sets.getRiskSet(2).evaluate(3.0));
|
|
||||||
|
|
||||||
assertEquals(3, sets.getRiskSet(1).evaluate(3.5));
|
|
||||||
assertEquals(3, sets.getRiskSet(2).evaluate(3.5));
|
|
||||||
|
|
||||||
assertEquals(3, sets.getRiskSet(1).evaluate(4.0));
|
|
||||||
assertEquals(3, sets.getRiskSet(2).evaluate(4.0));
|
|
||||||
|
|
||||||
assertEquals(2, sets.getRiskSet(1).evaluate(4.5));
|
|
||||||
assertEquals(2, sets.getRiskSet(2).evaluate(4.5));
|
|
||||||
|
|
||||||
assertEquals(2, sets.getRiskSet(1).evaluate(5.0));
|
|
||||||
assertEquals(2, sets.getRiskSet(2).evaluate(5.0));
|
|
||||||
|
|
||||||
assertEquals(1, sets.getRiskSet(1).evaluate(5.5));
|
|
||||||
assertEquals(1, sets.getRiskSet(2).evaluate(5.5));
|
|
||||||
|
|
||||||
assertEquals(1, sets.getRiskSet(1).evaluate(6.0));
|
|
||||||
assertEquals(1, sets.getRiskSet(2).evaluate(6.0));
|
|
||||||
|
|
||||||
assertEquals(0, sets.getRiskSet(1).evaluate(6.5));
|
|
||||||
assertEquals(0, sets.getRiskSet(2).evaluate(6.5));
|
|
||||||
|
|
||||||
assertEquals(0, sets.getRiskSet(1).evaluate(7.0));
|
|
||||||
assertEquals(0, sets.getRiskSet(2).evaluate(7.0));
|
|
||||||
|
|
||||||
assertEquals(0, sets.getRiskSet(1).evaluate(7.5));
|
|
||||||
assertEquals(0, sets.getRiskSet(2).evaluate(7.5));
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
@Test
|
|
||||||
public void testCalculatingGraySets(){
|
|
||||||
final List<CompetingRiskResponseWithCensorTime> data = generateData();
|
|
||||||
|
|
||||||
final CompetingRiskGraySetsImpl sets = CompetingRiskUtils.calculateGraySetsEfficiently(data, new int[]{1,2});
|
|
||||||
|
|
||||||
final List<Double> times = sets.getEventTimes();
|
|
||||||
assertEquals(5, times.size());
|
|
||||||
|
|
||||||
// Times
|
|
||||||
assertEquals(1.0, times.get(0).doubleValue());
|
|
||||||
assertEquals(2.0, times.get(1).doubleValue());
|
|
||||||
assertEquals(3.0, times.get(2).doubleValue());
|
|
||||||
assertEquals(4.0, times.get(3).doubleValue());
|
|
||||||
assertEquals(6.0, times.get(4).doubleValue());
|
|
||||||
|
|
||||||
// Number of Events
|
|
||||||
assertEquals(2, sets.getNumberOfEvents(1.0, 1));
|
|
||||||
assertEquals(0, sets.getNumberOfEvents(1.0, 2));
|
|
||||||
|
|
||||||
assertEquals(1, sets.getNumberOfEvents(2.0, 1));
|
|
||||||
assertEquals(0, sets.getNumberOfEvents(2.0, 2));
|
|
||||||
|
|
||||||
assertEquals(0, sets.getNumberOfEvents(3.0, 1));
|
|
||||||
assertEquals(1, sets.getNumberOfEvents(3.0, 2));
|
|
||||||
|
|
||||||
assertEquals(1, sets.getNumberOfEvents(4.0, 1));
|
|
||||||
assertEquals(0, sets.getNumberOfEvents(4.0, 2));
|
|
||||||
|
|
||||||
assertEquals(0, sets.getNumberOfEvents(6.0, 1));
|
|
||||||
assertEquals(1, sets.getNumberOfEvents(6.0, 2));
|
|
||||||
|
|
||||||
// Make sure it doesn't break for other times
|
|
||||||
assertEquals(0, sets.getNumberOfEvents(5.5, 1));
|
|
||||||
assertEquals(0, sets.getNumberOfEvents(5.5, 2));
|
|
||||||
|
|
||||||
|
|
||||||
// Risk set
|
|
||||||
assertEquals(9, sets.getRiskSet(1).evaluate(0.5));
|
|
||||||
assertEquals(9, sets.getRiskSet(2).evaluate(0.5));
|
|
||||||
|
|
||||||
assertEquals(9, sets.getRiskSet(1).evaluate(1.0));
|
|
||||||
assertEquals(9, sets.getRiskSet(2).evaluate(1.0));
|
|
||||||
|
|
||||||
assertEquals(6, sets.getRiskSet(1).evaluate(1.5));
|
|
||||||
assertEquals(8, sets.getRiskSet(2).evaluate(1.5));
|
|
||||||
|
|
||||||
assertEquals(6, sets.getRiskSet(1).evaluate(2.0));
|
|
||||||
assertEquals(8, sets.getRiskSet(2).evaluate(2.0));
|
|
||||||
|
|
||||||
assertEquals(5, sets.getRiskSet(1).evaluate(2.3));
|
|
||||||
assertEquals(8, sets.getRiskSet(2).evaluate(2.3));
|
|
||||||
|
|
||||||
assertEquals(5, sets.getRiskSet(1).evaluate(2.5));
|
|
||||||
assertEquals(7, sets.getRiskSet(2).evaluate(2.5));
|
|
||||||
|
|
||||||
assertEquals(5, sets.getRiskSet(1).evaluate(2.7));
|
|
||||||
assertEquals(7, sets.getRiskSet(2).evaluate(2.7));
|
|
||||||
|
|
||||||
assertEquals(5, sets.getRiskSet(1).evaluate(3.0));
|
|
||||||
assertEquals(5, sets.getRiskSet(2).evaluate(3.0));
|
|
||||||
|
|
||||||
assertEquals(4, sets.getRiskSet(1).evaluate(3.5));
|
|
||||||
assertEquals(3, sets.getRiskSet(2).evaluate(3.5));
|
|
||||||
|
|
||||||
assertEquals(3, sets.getRiskSet(1).evaluate(4.0));
|
|
||||||
assertEquals(3, sets.getRiskSet(2).evaluate(4.0));
|
|
||||||
|
|
||||||
assertEquals(2, sets.getRiskSet(1).evaluate(4.5));
|
|
||||||
assertEquals(2, sets.getRiskSet(2).evaluate(4.5));
|
|
||||||
|
|
||||||
assertEquals(2, sets.getRiskSet(1).evaluate(5.0));
|
|
||||||
assertEquals(2, sets.getRiskSet(2).evaluate(5.0));
|
|
||||||
|
|
||||||
assertEquals(1, sets.getRiskSet(1).evaluate(5.5));
|
|
||||||
assertEquals(1, sets.getRiskSet(2).evaluate(5.5));
|
|
||||||
|
|
||||||
assertEquals(1, sets.getRiskSet(1).evaluate(6.0));
|
|
||||||
assertEquals(1, sets.getRiskSet(2).evaluate(6.0));
|
|
||||||
|
|
||||||
assertEquals(1, sets.getRiskSet(1).evaluate(6.5));
|
|
||||||
assertEquals(0, sets.getRiskSet(2).evaluate(6.5));
|
|
||||||
|
|
||||||
assertEquals(0, sets.getRiskSet(1).evaluate(7.0));
|
|
||||||
assertEquals(0, sets.getRiskSet(2).evaluate(7.0));
|
|
||||||
|
|
||||||
assertEquals(0, sets.getRiskSet(1).evaluate(7.5));
|
|
||||||
assertEquals(0, sets.getRiskSet(2).evaluate(7.5));
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
|
@ -1,8 +1,15 @@
|
||||||
package ca.joeltherrien.randomforest.competingrisk;
|
package ca.joeltherrien.randomforest.competingrisk;
|
||||||
|
|
||||||
import ca.joeltherrien.randomforest.*;
|
import ca.joeltherrien.randomforest.CovariateRow;
|
||||||
import ca.joeltherrien.randomforest.covariates.*;
|
import ca.joeltherrien.randomforest.DataLoader;
|
||||||
import ca.joeltherrien.randomforest.responses.competingrisk.*;
|
import ca.joeltherrien.randomforest.Row;
|
||||||
|
import ca.joeltherrien.randomforest.Settings;
|
||||||
|
import ca.joeltherrien.randomforest.covariates.Covariate;
|
||||||
|
import ca.joeltherrien.randomforest.covariates.settings.BooleanCovariateSettings;
|
||||||
|
import ca.joeltherrien.randomforest.covariates.settings.NumericCovariateSettings;
|
||||||
|
import ca.joeltherrien.randomforest.responses.competingrisk.CompetingRiskErrorRateCalculator;
|
||||||
|
import ca.joeltherrien.randomforest.responses.competingrisk.CompetingRiskFunctions;
|
||||||
|
import ca.joeltherrien.randomforest.responses.competingrisk.CompetingRiskResponse;
|
||||||
import ca.joeltherrien.randomforest.tree.Forest;
|
import ca.joeltherrien.randomforest.tree.Forest;
|
||||||
import ca.joeltherrien.randomforest.tree.ForestTrainer;
|
import ca.joeltherrien.randomforest.tree.ForestTrainer;
|
||||||
import ca.joeltherrien.randomforest.tree.Node;
|
import ca.joeltherrien.randomforest.tree.Node;
|
||||||
|
@ -12,12 +19,14 @@ import ca.joeltherrien.randomforest.utils.Utils;
|
||||||
import com.fasterxml.jackson.databind.node.*;
|
import com.fasterxml.jackson.databind.node.*;
|
||||||
import org.junit.jupiter.api.Test;
|
import org.junit.jupiter.api.Test;
|
||||||
|
|
||||||
import static ca.joeltherrien.randomforest.TestUtils.assertCumulativeFunction;
|
|
||||||
import static ca.joeltherrien.randomforest.TestUtils.closeEnough;
|
|
||||||
import static org.junit.jupiter.api.Assertions.*;
|
|
||||||
|
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
import java.util.Random;
|
||||||
|
|
||||||
|
import static ca.joeltherrien.randomforest.TestUtils.assertCumulativeFunction;
|
||||||
|
import static ca.joeltherrien.randomforest.TestUtils.closeEnough;
|
||||||
|
import static org.junit.jupiter.api.Assertions.assertEquals;
|
||||||
|
import static org.junit.jupiter.api.Assertions.assertTrue;
|
||||||
|
|
||||||
public class TestCompetingRisk {
|
public class TestCompetingRisk {
|
||||||
|
|
||||||
|
@ -104,7 +113,7 @@ public class TestCompetingRisk {
|
||||||
final List<Row<CompetingRiskResponse>> dataset = DataLoader.loadData(covariates, settings.getResponseLoader(), settings.getTrainingDataLocation());
|
final List<Row<CompetingRiskResponse>> dataset = DataLoader.loadData(covariates, settings.getResponseLoader(), settings.getTrainingDataLocation());
|
||||||
|
|
||||||
final TreeTrainer<CompetingRiskResponse, CompetingRiskFunctions> treeTrainer = new TreeTrainer<>(settings, covariates);
|
final TreeTrainer<CompetingRiskResponse, CompetingRiskFunctions> treeTrainer = new TreeTrainer<>(settings, covariates);
|
||||||
final Node<CompetingRiskFunctions> node = treeTrainer.growTree(dataset);
|
final Node<CompetingRiskFunctions> node = treeTrainer.growTree(dataset, new Random());
|
||||||
|
|
||||||
final CovariateRow newRow = getPredictionRow(covariates);
|
final CovariateRow newRow = getPredictionRow(covariates);
|
||||||
|
|
||||||
|
@ -157,7 +166,7 @@ public class TestCompetingRisk {
|
||||||
final List<Row<CompetingRiskResponse>> dataset = DataLoader.loadData(covariates, settings.getResponseLoader(), settings.getTrainingDataLocation());
|
final List<Row<CompetingRiskResponse>> dataset = DataLoader.loadData(covariates, settings.getResponseLoader(), settings.getTrainingDataLocation());
|
||||||
|
|
||||||
final TreeTrainer<CompetingRiskResponse, CompetingRiskFunctions> treeTrainer = new TreeTrainer<>(settings, covariates);
|
final TreeTrainer<CompetingRiskResponse, CompetingRiskFunctions> treeTrainer = new TreeTrainer<>(settings, covariates);
|
||||||
final Node<CompetingRiskFunctions> node = treeTrainer.growTree(dataset);
|
final Node<CompetingRiskFunctions> node = treeTrainer.growTree(dataset, new Random());
|
||||||
|
|
||||||
final CovariateRow newRow = getPredictionRow(covariates);
|
final CovariateRow newRow = getPredictionRow(covariates);
|
||||||
|
|
||||||
|
@ -281,6 +290,34 @@ public class TestCompetingRisk {
|
||||||
assertEquals(359, countEventTwo);
|
assertEquals(359, countEventTwo);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Used to time how long the algorithm takes
|
||||||
|
*
|
||||||
|
* @param args Not used.
|
||||||
|
* @throws IOException
|
||||||
|
*/
|
||||||
|
public static void main(String[] args) throws IOException {
|
||||||
|
// timing
|
||||||
|
final TestCompetingRisk tcr = new TestCompetingRisk();
|
||||||
|
|
||||||
|
final Settings settings = tcr.getSettings();
|
||||||
|
settings.setNtree(300); // results are too variable at 100
|
||||||
|
|
||||||
|
final List<Covariate> covariates = settings.getCovariates();
|
||||||
|
final List<Row<CompetingRiskResponse>> dataset = DataLoader.loadData(covariates, settings.getResponseLoader(),
|
||||||
|
settings.getTrainingDataLocation());
|
||||||
|
final ForestTrainer<CompetingRiskResponse, CompetingRiskFunctions, CompetingRiskFunctions> forestTrainer = new ForestTrainer<>(settings, dataset, covariates);
|
||||||
|
|
||||||
|
final long startTime = System.currentTimeMillis();
|
||||||
|
for(int i=0; i<50; i++){
|
||||||
|
forestTrainer.trainSerial();
|
||||||
|
}
|
||||||
|
final long endTime = System.currentTimeMillis();
|
||||||
|
|
||||||
|
final double diffTime = endTime - startTime;
|
||||||
|
System.out.println(diffTime / 1000.0 / 50.0);
|
||||||
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void testLogRankSingleGroupDifferentiatorAllCovariates() throws IOException {
|
public void testLogRankSingleGroupDifferentiatorAllCovariates() throws IOException {
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,89 @@
|
||||||
|
package ca.joeltherrien.randomforest.competingrisk;
|
||||||
|
|
||||||
|
import ca.joeltherrien.randomforest.DataLoader;
|
||||||
|
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.tree.Split;
|
||||||
|
import ca.joeltherrien.randomforest.utils.SingletonIterator;
|
||||||
|
import ca.joeltherrien.randomforest.utils.Utils;
|
||||||
|
import com.fasterxml.jackson.databind.node.JsonNodeFactory;
|
||||||
|
import com.fasterxml.jackson.databind.node.ObjectNode;
|
||||||
|
import com.fasterxml.jackson.databind.node.TextNode;
|
||||||
|
import lombok.AllArgsConstructor;
|
||||||
|
import org.junit.jupiter.api.Test;
|
||||||
|
|
||||||
|
import java.io.IOException;
|
||||||
|
import java.util.Collections;
|
||||||
|
import java.util.Iterator;
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.stream.Collectors;
|
||||||
|
|
||||||
|
import static org.junit.jupiter.api.Assertions.assertTrue;
|
||||||
|
|
||||||
|
public class TestLogRankMultipleGroupDifferentiator {
|
||||||
|
|
||||||
|
private Iterator<Split<CompetingRiskResponse, ?>> turnIntoSplitIterator(List<Row<CompetingRiskResponse>> leftList,
|
||||||
|
List<Row<CompetingRiskResponse>> rightList){
|
||||||
|
return new SingletonIterator<Split<CompetingRiskResponse, ?>>(new Split(null, leftList, rightList, Collections.emptyList()));
|
||||||
|
}
|
||||||
|
|
||||||
|
public static Data<CompetingRiskResponse> loadData(String filename) throws IOException {
|
||||||
|
final ObjectNode yVarSettings = new ObjectNode(JsonNodeFactory.instance);
|
||||||
|
yVarSettings.set("type", new TextNode("CompetingRiskResponse"));
|
||||||
|
yVarSettings.set("delta", new TextNode("delta"));
|
||||||
|
yVarSettings.set("u", new TextNode("u"));
|
||||||
|
|
||||||
|
final Settings settings = Settings.builder()
|
||||||
|
.trainingDataLocation(filename)
|
||||||
|
.covariateSettings(
|
||||||
|
Utils.easyList(new NumericCovariateSettings("x2"))
|
||||||
|
)
|
||||||
|
.yVarSettings(yVarSettings)
|
||||||
|
.build();
|
||||||
|
|
||||||
|
final List<Covariate> covariates = settings.getCovariates();
|
||||||
|
|
||||||
|
final DataLoader.ResponseLoader loader = settings.getResponseLoader();
|
||||||
|
final List<Row<CompetingRiskResponse>> rows = DataLoader.loadData(covariates, loader, settings.getTrainingDataLocation());
|
||||||
|
|
||||||
|
return new Data<>(rows, covariates);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testSplitRule() throws IOException {
|
||||||
|
final LogRankMultipleGroupDifferentiator groupDifferentiator = new LogRankMultipleGroupDifferentiator(new int[]{1,2});
|
||||||
|
|
||||||
|
final List<Row<CompetingRiskResponse>> data = loadData("src/test/resources/test_split_data.csv").getRows();
|
||||||
|
|
||||||
|
final List<Row<CompetingRiskResponse>> group1Bad = data.subList(0, 196);
|
||||||
|
final List<Row<CompetingRiskResponse>> group2Bad = data.subList(196, data.size());
|
||||||
|
|
||||||
|
final double scoreBad = groupDifferentiator.differentiate(turnIntoSplitIterator(group1Bad, group2Bad)).getScore();
|
||||||
|
|
||||||
|
final List<Row<CompetingRiskResponse>> group1Good = data.subList(0, 199);
|
||||||
|
final List<Row<CompetingRiskResponse>> 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);
|
||||||
|
}
|
||||||
|
|
||||||
|
@lombok.Data
|
||||||
|
@AllArgsConstructor
|
||||||
|
public static class Data<Y> {
|
||||||
|
private List<Row<Y>> rows;
|
||||||
|
private List<Covariate> covariateList;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -1,52 +1,74 @@
|
||||||
package ca.joeltherrien.randomforest.competingrisk;
|
package ca.joeltherrien.randomforest.competingrisk;
|
||||||
|
|
||||||
import ca.joeltherrien.randomforest.responses.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.LogRankSingleGroupDifferentiator;
|
||||||
|
import ca.joeltherrien.randomforest.tree.GroupDifferentiator;
|
||||||
|
import ca.joeltherrien.randomforest.tree.Split;
|
||||||
|
import ca.joeltherrien.randomforest.utils.SingletonIterator;
|
||||||
import org.junit.jupiter.api.Test;
|
import org.junit.jupiter.api.Test;
|
||||||
|
|
||||||
|
import java.io.IOException;
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
|
import java.util.Collections;
|
||||||
|
import java.util.Iterator;
|
||||||
import java.util.List;
|
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;
|
import static org.junit.jupiter.api.Assertions.assertTrue;
|
||||||
|
|
||||||
public class TestLogRankSingleGroupDifferentiator {
|
public class TestLogRankSingleGroupDifferentiator {
|
||||||
|
|
||||||
private List<CompetingRiskResponse> generateData1(){
|
private double getScore(final GroupDifferentiator<CompetingRiskResponse> groupDifferentiator, List<Row<CompetingRiskResponse>> left, List<Row<CompetingRiskResponse>> right){
|
||||||
final List<CompetingRiskResponse> data = new ArrayList<>();
|
final Iterator<Split<CompetingRiskResponse, ?>> iterator = new SingletonIterator<>(
|
||||||
|
new Split<>(null, left, right, Collections.emptyList()));
|
||||||
|
|
||||||
data.add(new CompetingRiskResponse(1, 1.0));
|
return groupDifferentiator.differentiate(iterator).getScore();
|
||||||
data.add(new CompetingRiskResponse(1, 1.0));
|
|
||||||
data.add(new CompetingRiskResponse(1, 2.0));
|
}
|
||||||
data.add(new CompetingRiskResponse(1, 1.5));
|
|
||||||
data.add(new CompetingRiskResponse(0, 2.0));
|
int count = 1;
|
||||||
data.add(new CompetingRiskResponse(0, 1.5));
|
private <Y> Row<Y> createRow(Y response){
|
||||||
data.add(new CompetingRiskResponse(0, 2.5));
|
return new Row<>(null, count++, response);
|
||||||
|
}
|
||||||
|
|
||||||
|
private List<Row<CompetingRiskResponse>> generateData1(){
|
||||||
|
final List<Row<CompetingRiskResponse>> data = new ArrayList<>();
|
||||||
|
|
||||||
|
data.add(createRow(new CompetingRiskResponse(1, 1.0)));
|
||||||
|
data.add(createRow(new CompetingRiskResponse(1, 1.0)));
|
||||||
|
data.add(createRow(new CompetingRiskResponse(1, 2.0)));
|
||||||
|
data.add(createRow(new CompetingRiskResponse(1, 1.5)));
|
||||||
|
data.add(createRow(new CompetingRiskResponse(0, 2.0)));
|
||||||
|
data.add(createRow(new CompetingRiskResponse(0, 1.5)));
|
||||||
|
data.add(createRow(new CompetingRiskResponse(0, 2.5)));
|
||||||
|
|
||||||
return data;
|
return data;
|
||||||
}
|
}
|
||||||
|
|
||||||
private List<CompetingRiskResponse> generateData2(){
|
private List<Row<CompetingRiskResponse>> generateData2(){
|
||||||
final List<CompetingRiskResponse> data = new ArrayList<>();
|
final List<Row<CompetingRiskResponse>> data = new ArrayList<>();
|
||||||
|
|
||||||
data.add(new CompetingRiskResponse(1, 2.0));
|
data.add(createRow(new CompetingRiskResponse(1, 2.0)));
|
||||||
data.add(new CompetingRiskResponse(1, 2.0));
|
data.add(createRow(new CompetingRiskResponse(1, 2.0)));
|
||||||
data.add(new CompetingRiskResponse(1, 4.0));
|
data.add(createRow(new CompetingRiskResponse(1, 4.0)));
|
||||||
data.add(new CompetingRiskResponse(1, 3.0));
|
data.add(createRow(new CompetingRiskResponse(1, 3.0)));
|
||||||
data.add(new CompetingRiskResponse(0, 4.0));
|
data.add(createRow(new CompetingRiskResponse(0, 4.0)));
|
||||||
data.add(new CompetingRiskResponse(0, 3.0));
|
data.add(createRow(new CompetingRiskResponse(0, 3.0)));
|
||||||
data.add(new CompetingRiskResponse(0, 5.0));
|
data.add(createRow(new CompetingRiskResponse(0, 5.0)));
|
||||||
|
|
||||||
return data;
|
return data;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void testCompetingRiskResponseCombiner(){
|
public void testCompetingRiskResponseCombiner(){
|
||||||
final List<CompetingRiskResponse> data1 = generateData1();
|
final List<Row<CompetingRiskResponse>> data1 = generateData1();
|
||||||
final List<CompetingRiskResponse> data2 = generateData2();
|
final List<Row<CompetingRiskResponse>> data2 = generateData2();
|
||||||
|
|
||||||
final LogRankSingleGroupDifferentiator differentiator = new LogRankSingleGroupDifferentiator(1, new int[]{1});
|
final LogRankSingleGroupDifferentiator differentiator = new LogRankSingleGroupDifferentiator(1, new int[]{1});
|
||||||
|
|
||||||
final double score = differentiator.differentiate(data1, data2);
|
final double score = getScore(differentiator, data1, data2);
|
||||||
final double margin = 0.000001;
|
final double margin = 0.000001;
|
||||||
|
|
||||||
// Tested using 855 method
|
// Tested using 855 method
|
||||||
|
@ -55,6 +77,28 @@ public class TestLogRankSingleGroupDifferentiator {
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testCorrectSplit() throws IOException {
|
||||||
|
final LogRankSingleGroupDifferentiator groupDifferentiator =
|
||||||
|
new LogRankSingleGroupDifferentiator(1, new int[]{1,2});
|
||||||
|
|
||||||
|
final List<Row<CompetingRiskResponse>> data = TestLogRankMultipleGroupDifferentiator.
|
||||||
|
loadData("src/test/resources/test_single_split.csv").getRows();
|
||||||
|
|
||||||
|
final List<Row<CompetingRiskResponse>> group1Good = data.subList(0, 221);
|
||||||
|
final List<Row<CompetingRiskResponse>> group2Good = data.subList(221, data.size());
|
||||||
|
|
||||||
|
final double scoreGood = getScore(groupDifferentiator, group1Good, group2Good);
|
||||||
|
|
||||||
|
final List<Row<CompetingRiskResponse>> group1Bad = data.subList(0, 222);
|
||||||
|
final List<Row<CompetingRiskResponse>> group2Bad = data.subList(222, data.size());
|
||||||
|
|
||||||
|
final double scoreBad = getScore(groupDifferentiator, group1Bad, group2Bad);
|
||||||
|
|
||||||
|
// Apparently not all groups are unique when splitting
|
||||||
|
assertEquals(scoreGood, scoreBad);
|
||||||
|
}
|
||||||
|
|
||||||
private void closeEnough(double expected, double actual, double margin){
|
private void closeEnough(double expected, double actual, double margin){
|
||||||
assertTrue(Math.abs(expected - actual) < margin, "Expected " + expected + " but saw " + actual);
|
assertTrue(Math.abs(expected - actual) < margin, "Expected " + expected + " but saw " + actual);
|
||||||
}
|
}
|
||||||
|
|
|
@ -5,8 +5,9 @@ import ca.joeltherrien.randomforest.utils.Utils;
|
||||||
import org.junit.jupiter.api.Test;
|
import org.junit.jupiter.api.Test;
|
||||||
import org.junit.jupiter.api.function.Executable;
|
import org.junit.jupiter.api.function.Executable;
|
||||||
|
|
||||||
import java.util.Collection;
|
import java.util.ArrayList;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
import java.util.Random;
|
||||||
|
|
||||||
import static org.junit.jupiter.api.Assertions.*;
|
import static org.junit.jupiter.api.Assertions.*;
|
||||||
|
|
||||||
|
@ -46,7 +47,10 @@ public class FactorCovariateTest {
|
||||||
void testAllSubsets(){
|
void testAllSubsets(){
|
||||||
final FactorCovariate petCovariate = createTestCovariate();
|
final FactorCovariate petCovariate = createTestCovariate();
|
||||||
|
|
||||||
final Collection<FactorCovariate.FactorSplitRule> splitRules = petCovariate.generateSplitRules(null, 100);
|
final List<Covariate.SplitRule<String>> splitRules = new ArrayList<>();
|
||||||
|
|
||||||
|
petCovariate.generateSplitRuleUpdater(null, 100, new Random())
|
||||||
|
.forEachRemaining(split -> splitRules.add(split.getSplitRule()));
|
||||||
|
|
||||||
assertEquals(splitRules.size(), 3);
|
assertEquals(splitRules.size(), 3);
|
||||||
|
|
||||||
|
|
|
@ -3,10 +3,10 @@ package ca.joeltherrien.randomforest.csv;
|
||||||
import ca.joeltherrien.randomforest.DataLoader;
|
import ca.joeltherrien.randomforest.DataLoader;
|
||||||
import ca.joeltherrien.randomforest.Row;
|
import ca.joeltherrien.randomforest.Row;
|
||||||
import ca.joeltherrien.randomforest.Settings;
|
import ca.joeltherrien.randomforest.Settings;
|
||||||
import ca.joeltherrien.randomforest.covariates.BooleanCovariateSettings;
|
import ca.joeltherrien.randomforest.covariates.settings.BooleanCovariateSettings;
|
||||||
import ca.joeltherrien.randomforest.covariates.Covariate;
|
import ca.joeltherrien.randomforest.covariates.Covariate;
|
||||||
import ca.joeltherrien.randomforest.covariates.FactorCovariateSettings;
|
import ca.joeltherrien.randomforest.covariates.settings.FactorCovariateSettings;
|
||||||
import ca.joeltherrien.randomforest.covariates.NumericCovariateSettings;
|
import ca.joeltherrien.randomforest.covariates.settings.NumericCovariateSettings;
|
||||||
import ca.joeltherrien.randomforest.utils.Utils;
|
import ca.joeltherrien.randomforest.utils.Utils;
|
||||||
import com.fasterxml.jackson.databind.node.JsonNodeFactory;
|
import com.fasterxml.jackson.databind.node.JsonNodeFactory;
|
||||||
import com.fasterxml.jackson.databind.node.ObjectNode;
|
import com.fasterxml.jackson.databind.node.ObjectNode;
|
||||||
|
@ -15,7 +15,6 @@ import org.junit.jupiter.api.Test;
|
||||||
|
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.stream.Collectors;
|
|
||||||
|
|
||||||
import static org.junit.jupiter.api.Assertions.assertEquals;
|
import static org.junit.jupiter.api.Assertions.assertEquals;
|
||||||
import static org.junit.jupiter.api.Assertions.assertTrue;
|
import static org.junit.jupiter.api.Assertions.assertTrue;
|
||||||
|
|
|
@ -3,7 +3,9 @@ package ca.joeltherrien.randomforest.settings;
|
||||||
import ca.joeltherrien.randomforest.Settings;
|
import ca.joeltherrien.randomforest.Settings;
|
||||||
import static org.junit.jupiter.api.Assertions.assertEquals;
|
import static org.junit.jupiter.api.Assertions.assertEquals;
|
||||||
|
|
||||||
import ca.joeltherrien.randomforest.covariates.*;
|
import ca.joeltherrien.randomforest.covariates.settings.BooleanCovariateSettings;
|
||||||
|
import ca.joeltherrien.randomforest.covariates.settings.FactorCovariateSettings;
|
||||||
|
import ca.joeltherrien.randomforest.covariates.settings.NumericCovariateSettings;
|
||||||
import ca.joeltherrien.randomforest.utils.Utils;
|
import ca.joeltherrien.randomforest.utils.Utils;
|
||||||
import com.fasterxml.jackson.databind.node.JsonNodeFactory;
|
import com.fasterxml.jackson.databind.node.JsonNodeFactory;
|
||||||
import com.fasterxml.jackson.databind.node.ObjectNode;
|
import com.fasterxml.jackson.databind.node.ObjectNode;
|
||||||
|
|
|
@ -0,0 +1,25 @@
|
||||||
|
package ca.joeltherrien.randomforest.utils;
|
||||||
|
|
||||||
|
import org.junit.jupiter.api.Test;
|
||||||
|
|
||||||
|
import static org.junit.jupiter.api.Assertions.*;
|
||||||
|
|
||||||
|
public class TestSingletonIterator {
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void verifyBehaviour(){
|
||||||
|
final Integer element = 5;
|
||||||
|
|
||||||
|
final SingletonIterator<Integer> iterator = new SingletonIterator<>(element);
|
||||||
|
|
||||||
|
assertTrue(iterator.hasNext());
|
||||||
|
assertTrue(iterator.hasNext());
|
||||||
|
|
||||||
|
assertEquals(Integer.valueOf(5), iterator.next());
|
||||||
|
|
||||||
|
assertFalse(iterator.hasNext());
|
||||||
|
assertNull(iterator.next());
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,68 @@
|
||||||
|
package ca.joeltherrien.randomforest.utils;
|
||||||
|
|
||||||
|
import org.junit.jupiter.api.Test;
|
||||||
|
|
||||||
|
import java.util.Arrays;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
import static org.junit.jupiter.api.Assertions.*;
|
||||||
|
|
||||||
|
public class TestUniqueSubsetValueIterator {
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testIterator1(){
|
||||||
|
final List<Integer> testData = Arrays.asList(
|
||||||
|
1,1,2,3,5,5,5,6,7,7
|
||||||
|
);
|
||||||
|
|
||||||
|
final Integer[] indexes = new Integer[]{2,3,4,5};
|
||||||
|
|
||||||
|
final UniqueValueIterator<Integer> uniqueValueIterator = new UniqueValueIterator<>(testData.iterator());
|
||||||
|
final UniqueSubsetValueIterator<Integer> iterator = new UniqueSubsetValueIterator<>(uniqueValueIterator, indexes);
|
||||||
|
|
||||||
|
// we expect to get 2, 3, and 5 back. 5 should happen only once
|
||||||
|
|
||||||
|
assertEquals(iterator.getIndex(), 0);
|
||||||
|
assertTrue(iterator.hasNext());
|
||||||
|
|
||||||
|
assertEquals(iterator.next().intValue(), 2);
|
||||||
|
assertEquals(iterator.getIndex(), 3);
|
||||||
|
assertTrue(iterator.hasNext());
|
||||||
|
|
||||||
|
assertEquals(iterator.next().intValue(), 3);
|
||||||
|
assertEquals(iterator.getIndex(), 4);
|
||||||
|
assertTrue(iterator.hasNext());
|
||||||
|
|
||||||
|
assertEquals(iterator.next().intValue(), 5);
|
||||||
|
assertEquals(iterator.getIndex(), 7);
|
||||||
|
assertFalse(iterator.hasNext());
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testIterator2(){
|
||||||
|
final List<Integer> testData = Arrays.asList(
|
||||||
|
1,1,2,3,5,5,5,6,7,7
|
||||||
|
);
|
||||||
|
|
||||||
|
final Integer[] indexes = new Integer[]{1,8};
|
||||||
|
|
||||||
|
final UniqueValueIterator<Integer> uniqueValueIterator = new UniqueValueIterator<>(testData.iterator());
|
||||||
|
final UniqueSubsetValueIterator<Integer> iterator = new UniqueSubsetValueIterator<>(uniqueValueIterator, indexes);
|
||||||
|
|
||||||
|
assertEquals(iterator.getIndex(), 0);
|
||||||
|
assertTrue(iterator.hasNext());
|
||||||
|
|
||||||
|
assertEquals(iterator.next().intValue(), 1);
|
||||||
|
assertEquals(iterator.getIndex(), 2);
|
||||||
|
assertTrue(iterator.hasNext());
|
||||||
|
|
||||||
|
assertEquals(iterator.next().intValue(), 7);
|
||||||
|
assertEquals(iterator.getIndex(), 10);
|
||||||
|
assertFalse(iterator.hasNext());
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,112 @@
|
||||||
|
package ca.joeltherrien.randomforest.utils;
|
||||||
|
|
||||||
|
import org.junit.jupiter.api.Test;
|
||||||
|
|
||||||
|
import java.util.Arrays;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
import static org.junit.jupiter.api.Assertions.*;
|
||||||
|
|
||||||
|
public class TestUniqueValueIterator {
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testIterator1(){
|
||||||
|
final List<Integer> testData = Arrays.asList(
|
||||||
|
1,1,2,3,5,5,5,6,7,7
|
||||||
|
);
|
||||||
|
|
||||||
|
final UniqueValueIterator<Integer> iterator = new UniqueValueIterator<>(testData.iterator());
|
||||||
|
|
||||||
|
assertEquals(iterator.getIndex(), 0);
|
||||||
|
assertTrue(iterator.hasNext());
|
||||||
|
|
||||||
|
assertEquals(iterator.next().intValue(), 1);
|
||||||
|
assertEquals(iterator.getIndex(), 2);
|
||||||
|
assertTrue(iterator.hasNext());
|
||||||
|
|
||||||
|
assertEquals(iterator.next().intValue(), 2);
|
||||||
|
assertEquals(iterator.getIndex(), 3);
|
||||||
|
assertTrue(iterator.hasNext());
|
||||||
|
|
||||||
|
assertEquals(iterator.next().intValue(), 3);
|
||||||
|
assertEquals(iterator.getIndex(), 4);
|
||||||
|
assertTrue(iterator.hasNext());
|
||||||
|
|
||||||
|
assertEquals(iterator.next().intValue(), 5);
|
||||||
|
assertEquals(iterator.getIndex(), 7);
|
||||||
|
assertTrue(iterator.hasNext());
|
||||||
|
|
||||||
|
assertEquals(iterator.next().intValue(), 6);
|
||||||
|
assertEquals(iterator.getIndex(), 8);
|
||||||
|
assertTrue(iterator.hasNext());
|
||||||
|
|
||||||
|
assertEquals(iterator.next().intValue(), 7);
|
||||||
|
assertEquals(iterator.getIndex(), 10);
|
||||||
|
assertTrue(!iterator.hasNext());
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testIterator2(){
|
||||||
|
final List<Integer> testData = Arrays.asList(
|
||||||
|
1,2,3,5,5,5,6,7 // same numbers; but 1 and 7 only appear once each
|
||||||
|
);
|
||||||
|
|
||||||
|
final UniqueValueIterator<Integer> iterator = new UniqueValueIterator<>(testData.iterator());
|
||||||
|
|
||||||
|
assertEquals(iterator.getIndex(), 0);
|
||||||
|
assertTrue(iterator.hasNext());
|
||||||
|
|
||||||
|
assertEquals(iterator.next().intValue(), 1);
|
||||||
|
assertEquals(iterator.getIndex(), 1);
|
||||||
|
assertTrue(iterator.hasNext());
|
||||||
|
|
||||||
|
assertEquals(iterator.next().intValue(), 2);
|
||||||
|
assertEquals(iterator.getIndex(), 2);
|
||||||
|
assertTrue(iterator.hasNext());
|
||||||
|
|
||||||
|
assertEquals(iterator.next().intValue(), 3);
|
||||||
|
assertEquals(iterator.getIndex(), 3);
|
||||||
|
assertTrue(iterator.hasNext());
|
||||||
|
|
||||||
|
assertEquals(iterator.next().intValue(), 5);
|
||||||
|
assertEquals(iterator.getIndex(), 6);
|
||||||
|
assertTrue(iterator.hasNext());
|
||||||
|
|
||||||
|
assertEquals(iterator.next().intValue(), 6);
|
||||||
|
assertEquals(iterator.getIndex(), 7);
|
||||||
|
assertTrue(iterator.hasNext());
|
||||||
|
|
||||||
|
assertEquals(iterator.next().intValue(), 7);
|
||||||
|
assertEquals(iterator.getIndex(), 8);
|
||||||
|
assertFalse(iterator.hasNext());
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testIterator3(){
|
||||||
|
final List<Integer> testData = Arrays.asList(
|
||||||
|
1,1,1,1,1,1,1,2,2,2,2,2,3
|
||||||
|
);
|
||||||
|
|
||||||
|
final UniqueValueIterator<Integer> iterator = new UniqueValueIterator<>(testData.iterator());
|
||||||
|
|
||||||
|
assertEquals(iterator.getIndex(), 0);
|
||||||
|
assertTrue(iterator.hasNext());
|
||||||
|
|
||||||
|
assertEquals(iterator.next().intValue(), 1);
|
||||||
|
assertEquals(iterator.getIndex(), 7);
|
||||||
|
assertTrue(iterator.hasNext());
|
||||||
|
|
||||||
|
assertEquals(iterator.next().intValue(), 2);
|
||||||
|
assertEquals(iterator.getIndex(), 12);
|
||||||
|
assertTrue(iterator.hasNext());
|
||||||
|
|
||||||
|
assertEquals(iterator.next().intValue(), 3);
|
||||||
|
assertEquals(iterator.getIndex(), 13);
|
||||||
|
assertFalse(iterator.hasNext());
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -2,7 +2,7 @@ package ca.joeltherrien.randomforest.workshop;
|
||||||
|
|
||||||
import ca.joeltherrien.randomforest.*;
|
import ca.joeltherrien.randomforest.*;
|
||||||
import ca.joeltherrien.randomforest.covariates.Covariate;
|
import ca.joeltherrien.randomforest.covariates.Covariate;
|
||||||
import ca.joeltherrien.randomforest.covariates.NumericCovariate;
|
import ca.joeltherrien.randomforest.covariates.numeric.NumericCovariate;
|
||||||
import ca.joeltherrien.randomforest.responses.regression.MeanResponseCombiner;
|
import ca.joeltherrien.randomforest.responses.regression.MeanResponseCombiner;
|
||||||
import ca.joeltherrien.randomforest.responses.regression.WeightedVarianceGroupDifferentiator;
|
import ca.joeltherrien.randomforest.responses.regression.WeightedVarianceGroupDifferentiator;
|
||||||
import ca.joeltherrien.randomforest.tree.ForestTrainer;
|
import ca.joeltherrien.randomforest.tree.ForestTrainer;
|
||||||
|
|
|
@ -3,7 +3,7 @@ package ca.joeltherrien.randomforest.workshop;
|
||||||
|
|
||||||
import ca.joeltherrien.randomforest.covariates.Covariate;
|
import ca.joeltherrien.randomforest.covariates.Covariate;
|
||||||
import ca.joeltherrien.randomforest.CovariateRow;
|
import ca.joeltherrien.randomforest.CovariateRow;
|
||||||
import ca.joeltherrien.randomforest.covariates.NumericCovariate;
|
import ca.joeltherrien.randomforest.covariates.numeric.NumericCovariate;
|
||||||
import ca.joeltherrien.randomforest.Row;
|
import ca.joeltherrien.randomforest.Row;
|
||||||
import ca.joeltherrien.randomforest.responses.regression.MeanResponseCombiner;
|
import ca.joeltherrien.randomforest.responses.regression.MeanResponseCombiner;
|
||||||
import ca.joeltherrien.randomforest.responses.regression.WeightedVarianceGroupDifferentiator;
|
import ca.joeltherrien.randomforest.responses.regression.WeightedVarianceGroupDifferentiator;
|
||||||
|
@ -54,13 +54,14 @@ public class TrainSingleTree {
|
||||||
.covariates(covariateNames)
|
.covariates(covariateNames)
|
||||||
.responseCombiner(new MeanResponseCombiner())
|
.responseCombiner(new MeanResponseCombiner())
|
||||||
.maxNodeDepth(30)
|
.maxNodeDepth(30)
|
||||||
|
.mtry(2)
|
||||||
.nodeSize(5)
|
.nodeSize(5)
|
||||||
.numberOfSplits(0)
|
.numberOfSplits(0)
|
||||||
.build();
|
.build();
|
||||||
|
|
||||||
|
|
||||||
final long startTime = System.currentTimeMillis();
|
final long startTime = System.currentTimeMillis();
|
||||||
final Node<Double> baseNode = treeTrainer.growTree(trainingSet);
|
final Node<Double> baseNode = treeTrainer.growTree(trainingSet, new Random());
|
||||||
final long endTime = System.currentTimeMillis();
|
final long endTime = System.currentTimeMillis();
|
||||||
|
|
||||||
System.out.println(((double)(endTime - startTime))/1000.0);
|
System.out.println(((double)(endTime - startTime))/1000.0);
|
||||||
|
|
|
@ -4,7 +4,7 @@ package ca.joeltherrien.randomforest.workshop;
|
||||||
import ca.joeltherrien.randomforest.*;
|
import ca.joeltherrien.randomforest.*;
|
||||||
import ca.joeltherrien.randomforest.covariates.Covariate;
|
import ca.joeltherrien.randomforest.covariates.Covariate;
|
||||||
import ca.joeltherrien.randomforest.covariates.FactorCovariate;
|
import ca.joeltherrien.randomforest.covariates.FactorCovariate;
|
||||||
import ca.joeltherrien.randomforest.covariates.NumericCovariate;
|
import ca.joeltherrien.randomforest.covariates.numeric.NumericCovariate;
|
||||||
import ca.joeltherrien.randomforest.responses.regression.MeanResponseCombiner;
|
import ca.joeltherrien.randomforest.responses.regression.MeanResponseCombiner;
|
||||||
import ca.joeltherrien.randomforest.responses.regression.WeightedVarianceGroupDifferentiator;
|
import ca.joeltherrien.randomforest.responses.regression.WeightedVarianceGroupDifferentiator;
|
||||||
import ca.joeltherrien.randomforest.tree.Node;
|
import ca.joeltherrien.randomforest.tree.Node;
|
||||||
|
@ -13,7 +13,6 @@ import ca.joeltherrien.randomforest.utils.Utils;
|
||||||
|
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Map;
|
|
||||||
import java.util.Random;
|
import java.util.Random;
|
||||||
import java.util.stream.Collectors;
|
import java.util.stream.Collectors;
|
||||||
import java.util.stream.DoubleStream;
|
import java.util.stream.DoubleStream;
|
||||||
|
@ -21,8 +20,6 @@ import java.util.stream.DoubleStream;
|
||||||
public class TrainSingleTreeFactor {
|
public class TrainSingleTreeFactor {
|
||||||
|
|
||||||
public static void main(String[] args) {
|
public static void main(String[] args) {
|
||||||
System.out.println("Hello world!");
|
|
||||||
|
|
||||||
final Random random = new Random(123);
|
final Random random = new Random(123);
|
||||||
|
|
||||||
final int n = 10000;
|
final int n = 10000;
|
||||||
|
@ -84,7 +81,7 @@ public class TrainSingleTreeFactor {
|
||||||
|
|
||||||
|
|
||||||
final long startTime = System.currentTimeMillis();
|
final long startTime = System.currentTimeMillis();
|
||||||
final Node<Double> baseNode = treeTrainer.growTree(trainingSet);
|
final Node<Double> baseNode = treeTrainer.growTree(trainingSet, random);
|
||||||
final long endTime = System.currentTimeMillis();
|
final long endTime = System.currentTimeMillis();
|
||||||
|
|
||||||
System.out.println(((double)(endTime - startTime))/1000.0);
|
System.out.println(((double)(endTime - startTime))/1000.0);
|
||||||
|
|
437
src/test/resources/test_single_split.csv
Normal file
437
src/test/resources/test_single_split.csv
Normal file
|
@ -0,0 +1,437 @@
|
||||||
|
"T","J","x1","x2","x3","set","C","u","delta"
|
||||||
|
2.36878896318231,2,-0.940736926269951,-2.74741651651697,-0.664166655908226,"d1",5.29132863866294,2.36878896318231,2
|
||||||
|
0.0400548702796549,2,-0.22357985281977,-2.6784315261127,-1.45393397969899,"d1",24.0450198381188,0.0400548702796549,2
|
||||||
|
6.07273173432729,1,-0.541321943849921,-2.61982060211246,-0.313865486168637,"d1",73.2294178857516,6.07273173432729,1
|
||||||
|
0.0586427948437631,2,-4.08384650953597,-2.57905490896322,-1.94148492991394,"d1",29.575672428309,0.0586427948437631,2
|
||||||
|
1.12241411577435,2,-0.343115442654736,-2.5261239240197,-0.568482592792157,"d1",10.7716199103743,1.12241411577435,2
|
||||||
|
7.17758750180007,1,-0.0549158329059284,-2.49595311098652,0.777187867970255,"d1",0.770628582686186,0.770628582686186,0
|
||||||
|
5.87972604899089,1,-0.417519608027854,-2.32569598105725,-1.23410968014014,"d1",21.7603224188032,5.87972604899089,1
|
||||||
|
6.09850069496217,1,-0.624229581484001,-2.20950230906333,0.847654716653119,"d1",47.9509777923055,6.09850069496217,1
|
||||||
|
5.24709419887559,1,-0.494413435039913,-2.1881842156793,-0.530500950041165,"d1",9.29604623673615,5.24709419887559,1
|
||||||
|
5.49139738108154,1,-0.399023904593903,-2.17411513837698,-0.886241025366943,"d1",4.66279121115804,4.66279121115804,0
|
||||||
|
7.49679934937549,1,-1.503172816431,-2.11416482594655,-0.784022459577515,"d1",38.599446339715,7.49679934937549,1
|
||||||
|
0.120167720597237,2,-0.0111153155803973,-2.07922849793458,-0.0864173413157577,"d1",8.30861929266284,0.120167720597237,2
|
||||||
|
0.0120866466313601,2,-1.13246179303068,-2.07388986542802,-0.108705951800557,"d1",74.5770950200868,0.0120866466313601,2
|
||||||
|
1.93336439869347,2,-0.953063484590791,-2.06875275630198,0.391474935780971,"d1",8.68413874879479,1.93336439869347,2
|
||||||
|
0.193771776743233,2,-2.09780872632678,-2.06600379672067,0.481439459620942,"d1",11.4459616225213,0.193771776743233,2
|
||||||
|
0.684051165357232,2,-1.2506320380666,-2.05742095431252,0.254373142408372,"d1",27.2641535281184,0.684051165357232,2
|
||||||
|
2.67318147171264,1,-0.895097422928461,-2.04228406320874,0.880998661569412,"d1",7.24411055445671,2.67318147171264,1
|
||||||
|
6.28834176835203,1,-0.78864447554692,-1.96217525934728,-0.163789285265814,"d1",27.6986681102755,6.28834176835203,1
|
||||||
|
4.62668493336862,1,-0.381536878928848,-1.92665388805734,-0.290580353016676,"d1",7.24744734354317,4.62668493336862,1
|
||||||
|
0.0195419555529952,2,-0.453640870109268,-1.9241779608709,-0.458499569719527,"d1",0.790413445705888,0.0195419555529952,2
|
||||||
|
5.52686329920565,1,-1.35281077656466,-1.92380314891533,0.00358885830164929,"d1",34.5150513185148,5.52686329920565,1
|
||||||
|
0.0338792934082568,2,-0.137226420194861,-1.92177375675587,0.303819485323308,"d1",4.49422365985811,0.0338792934082568,2
|
||||||
|
0.489470157306641,2,-0.00443898833912055,-1.91738220316821,0.325411778513068,"d1",7.40209592506289,0.489470157306641,2
|
||||||
|
2.46352284875266,1,-0.343935987670365,-1.91503628904925,0.263891018343932,"d1",5.46459940262139,2.46352284875266,1
|
||||||
|
1.91431453212664,1,-0.646938145621328,-1.8443918568905,0.198442464738305,"d1",6.95764179200271,1.91431453212664,1
|
||||||
|
3.34306721665146,2,-0.521888135986598,-1.81633085792332,0.140235064973441,"d1",13.305580355227,3.34306721665146,2
|
||||||
|
2.25421412226762,2,-0.237135702707983,-1.8035308340996,-0.0273032797726184,"d1",4.4884777849039,2.25421412226762,2
|
||||||
|
5.32683386651568,1,-0.383757190847992,-1.78869536882293,-0.500253710429788,"d1",13.8389095757157,5.32683386651568,1
|
||||||
|
0.389743744395673,2,-1.02671802816671,-1.76818749571248,-0.25956459070352,"d1",6.89092403936742,0.389743744395673,2
|
||||||
|
5.71650745526166,1,-0.377604179930099,-1.76584618649961,-0.158829141188165,"d1",16.4490152316151,5.71650745526166,1
|
||||||
|
1.67705107844415,2,-1.14700688399577,-1.75637277902045,0.655267799539731,"d1",48.0127680363638,1.67705107844415,2
|
||||||
|
0.592473545577377,2,-1.11326150693183,-1.7527097359872,-1.13722476306219,"d1",7.56208908218571,0.592473545577377,2
|
||||||
|
0.93774029515208,2,-0.549454171154571,-1.71226440732097,-0.339685392053216,"d1",1.84914546087384,0.93774029515208,2
|
||||||
|
0.40062484703958,2,-0.104855806316002,-1.67335276942983,-0.426138874612545,"d1",6.27608065493405,0.40062484703958,2
|
||||||
|
0.159861234016716,2,-0.931567097747794,-1.67219451475428,-0.870460505814775,"d1",3.55606431638744,0.159861234016716,2
|
||||||
|
5.8492162264662,1,-1.87452364236991,-1.66159908881996,-1.38113124744767,"d1",4.04938737861812,4.04938737861812,0
|
||||||
|
5.70065559417847,1,-3.14276614908329,-1.65611164142717,0.352264508089579,"d1",3.77463447861373,3.77463447861373,0
|
||||||
|
0.224718576839926,2,-0.226827411558332,-1.62539155314324,-0.505322271031184,"d1",6.61533754318953,0.224718576839926,2
|
||||||
|
0.0435942329366584,2,-0.875238415727581,-1.61399017351239,0.577880520091048,"d1",1.98178011927421,0.0435942329366584,2
|
||||||
|
0.872705549891007,2,-0.178995556137531,-1.57936046676629,0.108625526623102,"d1",22.7864865764024,0.872705549891007,2
|
||||||
|
6.36851677387452,1,-0.367724579424765,-1.57738544236245,-0.626225591399495,"d1",17.2717156252804,6.36851677387452,1
|
||||||
|
2.43392219195578,2,-0.707116976325429,-1.56335701495115,0.965751242534558,"d1",14.4206041461768,2.43392219195578,2
|
||||||
|
0.330720949053871,2,-0.445553502838385,-1.56202621765436,-0.249510097888011,"d1",7.44351300329184,0.330720949053871,2
|
||||||
|
5.93261099061297,1,-1.81658308280611,-1.5514135530076,0.362911703061769,"d1",20.9917188054862,5.93261099061297,1
|
||||||
|
2.21842301810596,2,-0.942928659225199,-1.49327481765058,0.838989993453762,"d1",1.62975564390585,1.62975564390585,0
|
||||||
|
6.17321580899134,1,-0.846667767066977,-1.4929371315781,-1.55721907237787,"d1",1.9526223000139,1.9526223000139,0
|
||||||
|
0.058051934465766,2,-0.0398973838021135,-1.49119700174392,0.095087134856549,"d1",42.142936350546,0.058051934465766,2
|
||||||
|
6.08617126479093,1,-1.39762186112439,-1.48412697347617,-0.270011324155031,"d1",11.1088740918785,6.08617126479093,1
|
||||||
|
3.18876150978689,2,-2.13842961471416,-1.47309707638112,-0.755451309039423,"d1",36.4314661530738,3.18876150978689,2
|
||||||
|
0.0172548928457301,2,-0.174059321462742,-1.41845535076939,0.363575496287814,"d1",20.7911967105212,0.0172548928457301,2
|
||||||
|
1.33514567274125,2,-0.66874948622225,-1.37014049288289,0.15420576439085,"d1",3.69772279635072,1.33514567274125,2
|
||||||
|
6.70443202813046,1,-0.274400088040043,-1.36283138996168,-0.203087231534127,"d1",15.5954272850397,6.70443202813046,1
|
||||||
|
5.48304553044083,1,-0.0184418688789402,-1.35412193807632,-0.265115429781722,"d1",6.22560746967793,5.48304553044083,1
|
||||||
|
3.98201646621768,1,-1.3201407272101,-1.34604086981472,0.85419508410079,"d1",12.3219889681786,3.98201646621768,1
|
||||||
|
1.10954519196367,2,-1.2942947236508,-1.30241257662124,-0.0737564121156477,"d1",3.75448394108866,1.10954519196367,2
|
||||||
|
0.333034928888083,2,-0.0361982109653429,-1.2962650039174,0.800292309814105,"d1",5.89722495526075,0.333034928888083,2
|
||||||
|
5.5067986823978,1,-1.81526927963113,-1.29369838086625,-0.716845568650473,"d1",33.3969767747407,5.5067986823978,1
|
||||||
|
0.236702047288418,2,-0.174192985316702,-1.29045902266205,0.710109174264196,"d1",35.659496791079,0.236702047288418,2
|
||||||
|
0.00543433148413897,2,-1.49217629504083,-1.27755373020195,-0.153009947789431,"d1",15.6081267240572,0.00543433148413897,2
|
||||||
|
0.392974628135562,2,-0.672731030589471,-1.27711238763253,0.259632568995488,"d1",0.989711219444871,0.392974628135562,2
|
||||||
|
3.33453140390997,2,-0.28231681794934,-1.27615970205156,0.580553117107873,"d1",13.8484762236476,3.33453140390997,2
|
||||||
|
0.745801116086655,2,-0.814855584673265,-1.26261618297827,0.532327960608554,"d1",26.3732809192481,0.745801116086655,2
|
||||||
|
1.93039115696194,2,-0.523752466176473,-1.25308854838447,-0.779166441487765,"d1",16.4774892664736,1.93039115696194,2
|
||||||
|
3.46145374880599,1,-0.104575175258664,-1.25222662675546,0.730793621250424,"d1",11.2728726584464,3.46145374880599,1
|
||||||
|
0.622301510402748,2,-0.799354312298097,-1.20712709767553,0.82915949311628,"d1",31.7985615907917,0.622301510402748,2
|
||||||
|
4.36399552071179,1,-0.377585614252292,-1.20262382265337,-1.05942486854663,"d1",9.88032352179289,4.36399552071179,1
|
||||||
|
0.315932573628431,2,-1.54614147291695,-1.19736350592567,-0.282221806464306,"d1",12.5319989770651,0.315932573628431,2
|
||||||
|
6.30066548295561,1,-0.217638413548828,-1.17871899318606,0.57224481822844,"d1",15.5058489656678,6.30066548295561,1
|
||||||
|
0.134716821071798,2,-0.289929666166654,-1.14709612408807,-0.438929712319987,"d1",93.6292425492659,0.134716821071798,2
|
||||||
|
2.07553452617469,2,-0.871246560563739,-1.13599352100253,-1.54798197797058,"d1",5.40198363363743,2.07553452617469,2
|
||||||
|
0.397368354257196,2,-0.464944141245776,-1.11689431557799,-0.153395631317365,"d1",16.4783747618805,0.397368354257196,2
|
||||||
|
5.99384605375399,1,-1.01390645601822,-1.11564616812347,-0.950790366577052,"d1",10.201620683074,5.99384605375399,1
|
||||||
|
5.95161350419295,1,-1.00207112709375,-1.10335537016156,0.0280083965309446,"d1",1.14143405233437,1.14143405233437,0
|
||||||
|
6.33303235415056,1,-2.19297968581012,-1.10132320061089,0.555145710586123,"d1",8.98656466975808,6.33303235415056,1
|
||||||
|
0.172320284880698,2,-1.32364156638484,-1.09928045326075,-0.0198070388067981,"d1",0.764144429684099,0.172320284880698,2
|
||||||
|
0.0204675737768412,2,-1.64183103554089,-1.07929942510633,-0.445163795267712,"d1",35.097954085279,0.0204675737768412,2
|
||||||
|
5.71120658667394,1,-0.706142520192073,-1.07327991315842,-1.32929693533771,"d1",10.5845972150564,5.71120658667394,1
|
||||||
|
0.44132914301008,2,-1.60463558024696,-1.07041582836413,0.179801609496641,"d1",14.7133602007272,0.44132914301008,2
|
||||||
|
0.0221813134849072,2,-0.454605537530624,-1.06572328986086,-0.685320659922523,"d1",4.51061540283263,0.0221813134849072,2
|
||||||
|
1.81137038013878,2,-0.634982565171419,-1.06273841001991,0.099763296921695,"d1",5.77572761103511,1.81137038013878,2
|
||||||
|
6.26432244579951,1,-0.0273481508097327,-1.04825639026013,-1.60892311094708,"d1",6.82882342448108,6.26432244579951,1
|
||||||
|
6.04862054714964,1,-0.738613856144511,-1.0342835781739,-0.59498556050642,"d1",15.9343750580194,6.04862054714964,1
|
||||||
|
7.48636650652995,1,-0.326223712666721,-1.03354050308388,0.348234778700151,"d1",0.758487256614161,0.758487256614161,0
|
||||||
|
5.55062340284452,1,-0.400885490811939,-1.02535023183075,0.400246834043774,"d1",17.0179952128796,5.55062340284452,1
|
||||||
|
0.518573008943349,2,-0.0273083549434431,-1.01262506134754,-0.930184572213555,"d1",2.10150590812186,0.518573008943349,2
|
||||||
|
3.46053574217444,2,-0.794177329449999,-0.999008445323631,-0.658993837250615,"d1",14.0706040959429,3.46053574217444,2
|
||||||
|
0.486459741623382,2,-0.0869982635676569,-0.997759562698134,-1.14920595721707,"d1",4.59333625883186,0.486459741623382,2
|
||||||
|
0.315952830302968,2,-1.61520106845425,-0.974002982411684,0.432369032532503,"d1",15.566208568786,0.315952830302968,2
|
||||||
|
3.12192197551741,1,-1.30407322958316,-0.966557165502383,0.51673530990843,"d1",38.3739643836897,3.12192197551741,1
|
||||||
|
0.166353042138176,2,-1.25189433042384,-0.95349718228182,0.173527003414866,"d1",1.78076698444784,0.166353042138176,2
|
||||||
|
5.14947918722961,1,-0.348134398501211,-0.949771064641547,0.842167145501435,"d1",10.0344473868608,5.14947918722961,1
|
||||||
|
0.61755093701298,2,-1.20220733855003,-0.940807269422338,0.669507751445202,"d1",81.1423001768899,0.61755093701298,2
|
||||||
|
0.774340918245626,2,-1.79386239234471,-0.936480765229449,-0.386657715263962,"d1",10.2844402287155,0.774340918245626,2
|
||||||
|
1.18503246731581,2,-1.62566462366753,-0.924943886647788,-1.09544735384729,"d1",27.3488828345182,1.18503246731581,2
|
||||||
|
5.81430168938689,1,-1.36562690447452,-0.911173236644446,-1.09133594052886,"d1",23.086135415659,5.81430168938689,1
|
||||||
|
0.0582360443007296,2,-0.334693872287563,-0.908885279255003,0.894420816860302,"d1",19.8876115931426,0.0582360443007296,2
|
||||||
|
6.67562862428162,1,-0.320758358348144,-0.906136581293013,-0.62204490108631,"d1",3.95447020418942,3.95447020418942,0
|
||||||
|
5.62609493242318,1,-0.342004151583766,-0.904463968233442,0.93567149953094,"d1",16.6209467678311,5.62609493242318,1
|
||||||
|
0.224124095402658,2,-1.80489989908745,-0.897620346487348,-1.14866233536842,"d1",10.9962219744921,0.224124095402658,2
|
||||||
|
5.07161450929288,1,-1.04719234274716,-0.882424518189252,-0.679290525085992,"d1",69.6467088082248,5.07161450929288,1
|
||||||
|
0.536435312125832,2,-0.425266035641447,-0.880708384373669,-0.605260699678918,"d1",51.3515850934174,0.536435312125832,2
|
||||||
|
0.712225435259652,2,-1.01317907039129,-0.880364756492861,0.799448704038158,"d1",7.95205843634903,0.712225435259652,2
|
||||||
|
2.20243284019238,1,-0.0612420173925512,-0.867470410367046,0.359002148193652,"d1",9.25134299322963,2.20243284019238,1
|
||||||
|
0.605893896427006,2,-1.04822994915312,-0.846173148741664,-0.901844342725123,"d1",19.4895937285366,0.605893896427006,2
|
||||||
|
6.46572696633957,1,-0.395668788335314,-0.84271443456443,-0.550602798752161,"d1",0.209037251770496,0.209037251770496,0
|
||||||
|
0.487000552937388,2,-1.46401306735521,-0.836512183168418,0.173597441595392,"d1",6.77927704167621,0.487000552937388,2
|
||||||
|
1.51509302101078,2,-0.0412407968604744,-0.834982086349831,0.525673645724282,"d1",34.5675922540908,1.51509302101078,2
|
||||||
|
6.02731790506686,1,-0.882989817626795,-0.834798925439948,-0.834803917000752,"d1",5.93346848471039,5.93346848471039,0
|
||||||
|
0.381546576756047,2,-0.131390142151624,-0.832849601899911,-0.120359877783258,"d1",1.41744351014495,0.381546576756047,2
|
||||||
|
0.00760392192751169,2,-0.383924028857785,-0.828126721930831,-0.0587775279070268,"d1",26.4171911395135,0.00760392192751169,2
|
||||||
|
6.85879283492523,1,-1.49318471777496,-0.820526788889496,-0.374675059074199,"d1",2.85277323708454,2.85277323708454,0
|
||||||
|
0.0342933693900704,2,-0.823077108668868,-0.815970182520681,-0.715242420590766,"d1",28.5419499857311,0.0342933693900704,2
|
||||||
|
0.617406914941967,2,-0.781115112888234,-0.800445475005252,-1.28039807314278,"d1",11.6443356871605,0.617406914941967,2
|
||||||
|
3.74171116644939,1,-0.0684740865411551,-0.780325173540396,-1.30117863747707,"d1",29.2131662351971,3.74171116644939,1
|
||||||
|
2.12804690328918,2,-1.05479508853852,-0.769838765813365,0.403812256923429,"d1",16.0360205043719,2.12804690328918,2
|
||||||
|
4.09780351235117,1,-0.0193241721415964,-0.768715647254528,0.0748831382783931,"d1",9.43803951144218,4.09780351235117,1
|
||||||
|
0.0217920186910804,2,-0.559239535829182,-0.73934495429406,0.353443306116614,"d1",5.2491182461381,0.0217920186910804,2
|
||||||
|
0.394180545583367,2,-0.0118641769292016,-0.738198607201708,-0.688623668491378,"d1",2.26109574536297,0.394180545583367,2
|
||||||
|
1.32289936389298,2,-0.0387650901849373,-0.728247447556326,0.0674068712586103,"d1",2.98578164101508,1.32289936389298,2
|
||||||
|
0.302159678656608,2,-1.44186893732442,-0.72744919444054,-1.06860676120492,"d1",4.14901913143694,0.302159678656608,2
|
||||||
|
0.708418690834115,2,-0.285741501654332,-0.726075872408598,-0.507188183920061,"d1",16.6256199040427,0.708418690834115,2
|
||||||
|
0.0241285795345902,2,-0.0260930090449579,-0.717564843944006,-0.374181116030244,"d1",34.6676181985025,0.0241285795345902,2
|
||||||
|
0.870312893721175,2,-0.000363395655838854,-0.711398171424794,0.351965732858065,"d1",20.0971285967741,0.870312893721175,2
|
||||||
|
5.28564457229326,1,-0.614476643770374,-0.708606987497861,-1.37559225313687,"d1",1.81252158246934,1.81252158246934,0
|
||||||
|
0.941750313113344,2,-1.03720924392128,-0.70592154760638,0.0282725230040198,"d1",46.611236940243,0.941750313113344,2
|
||||||
|
2.44006958777521,2,-0.809699231995388,-0.704070374217583,-0.0566796527137429,"d1",20.2155850074234,2.44006958777521,2
|
||||||
|
0.246147812767859,2,-1.39286438513178,-0.696916600582024,0.723455131796638,"d1",10.4792898520827,0.246147812767859,2
|
||||||
|
6.46105088284385,1,-0.0584333542653784,-0.677443901317481,-0.347832512964975,"d1",11.2590421535523,6.46105088284385,1
|
||||||
|
0.830613736952555,2,-0.472779134493958,-0.666382796158839,0.106316605714906,"d1",10.7149247918278,0.830613736952555,2
|
||||||
|
1.27080103285135,2,-0.943014149166745,-0.660182675036647,-0.296569752660686,"d1",10.2358338516206,1.27080103285135,2
|
||||||
|
1.6344318868214,2,-1.15851492740154,-0.659363022297778,-0.519761238348733,"d1",24.3289563610199,1.6344318868214,2
|
||||||
|
3.41197561381413,1,-0.114318963624616,-0.65618260348354,-0.167158679317667,"d1",1.2596212202486,1.2596212202486,0
|
||||||
|
5.83460786148936,1,-0.0303705017867669,-0.655140358879648,-0.705817680811048,"d1",10.3931054691499,5.83460786148936,1
|
||||||
|
0.589666957966983,2,-1.59057886445477,-0.654263401747602,0.637993715185194,"d1",5.51040226593614,0.589666957966983,2
|
||||||
|
4.54696150229568,1,-1.86139470133512,-0.651617617594723,0.392269058987265,"d1",2.98995271325111,2.98995271325111,0
|
||||||
|
7.26930846394147,1,-0.0308394170638917,-0.638362034477254,0.250417060256469,"d1",7.80484799608692,7.26930846394147,1
|
||||||
|
0.406479293480515,2,-0.997250721445793,-0.634435430455023,0.314635955402795,"d1",10.8758389414521,0.406479293480515,2
|
||||||
|
6.20537110173297,1,-1.34447668217377,-0.628064331449498,0.275705167937989,"d1",0.913132007038143,0.913132007038143,0
|
||||||
|
1.1413343520415,2,-0.541319960936245,-0.610769730062258,-0.837394943418138,"d1",25.6323812334778,1.1413343520415,2
|
||||||
|
6.5012017255228,1,-1.76555624350856,-0.605580811571845,-0.535693414416799,"d1",2.81374442207194,2.81374442207194,0
|
||||||
|
0.320266132708639,2,-1.58757047236722,-0.600017897571358,0.737238047653923,"d1",2.60571850154193,0.320266132708639,2
|
||||||
|
6.60670570162074,1,-1.77995131860148,-0.587362519071825,-0.399805463971556,"d1",15.09625551091,6.60670570162074,1
|
||||||
|
0.494166820775717,2,-1.42328395128162,-0.583983730286862,0.445604883307791,"d1",15.4901144016316,0.494166820775717,2
|
||||||
|
1.2916429349481,2,-0.0136814571187584,-0.561248827441379,-0.679609559979761,"d1",31.1157296575536,1.2916429349481,2
|
||||||
|
6.84719911605157,1,-0.991333253080982,-0.536840302369252,-0.329207585539367,"d1",31.3672893105035,6.84719911605157,1
|
||||||
|
3.33573240393048,1,-0.232024208356925,-0.52957313175545,0.3297707960891,"d1",3.84123377395356,3.33573240393048,1
|
||||||
|
0.293787405826151,2,-1.57869348984733,-0.52290224046694,-0.858451414496243,"d1",13.5298108309507,0.293787405826151,2
|
||||||
|
2.59829062769625,2,-1.03413272510194,-0.520306220041396,-0.0947103549299787,"d1",24.2958168304505,2.59829062769625,2
|
||||||
|
1.15069140396537,2,-0.7692543960691,-0.514917254695601,-0.0498114216751121,"d1",15.06683004936,1.15069140396537,2
|
||||||
|
0.546846426587379,2,-1.08590377397733,-0.51073540461372,0.559865391230521,"d1",6.54946511611342,0.546846426587379,2
|
||||||
|
5.06505271674886,1,-0.667965724979494,-0.506722121641543,-0.477852765839133,"d1",10.645618988201,5.06505271674886,1
|
||||||
|
4.5711114569665,1,-1.27769811178029,-0.500479722824924,0.674078243067952,"d1",29.9835772795563,4.5711114569665,1
|
||||||
|
0.9548158202933,2,-0.0243746767241474,-0.5000677377122,-0.140677704414042,"d1",25.8506448185983,0.9548158202933,2
|
||||||
|
0.303704824764282,2,-0.57875083356825,-0.499882058039656,-0.103959338458585,"d1",17.4203944570365,0.303704824764282,2
|
||||||
|
0.568540091544093,2,-0.244519612797395,-0.494741102467464,-0.896176056492635,"d1",13.2353435084224,0.568540091544093,2
|
||||||
|
0.210479910019785,2,-1.51738850112856,-0.492184841665298,-0.86024334169026,"d1",52.87170368926,0.210479910019785,2
|
||||||
|
3.88505572785084,1,-0.495911543972495,-0.492149973041001,0.612775086639207,"d1",3.92974231392145,3.88505572785084,1
|
||||||
|
6.60548957054962,1,-1.00258266755843,-0.491774081169479,-1.78593148360063,"d1",14.8081099713895,6.60548957054962,1
|
||||||
|
1.39085324275344,2,-1.62677928324155,-0.489806966081124,-0.753648276656162,"d1",1.49955506421369,1.39085324275344,2
|
||||||
|
0.227768044192674,2,-0.589333520820825,-0.489183660065085,-0.728407316512854,"d1",47.03465077774,0.227768044192674,2
|
||||||
|
6.11630072080504,1,-0.626318140514488,-0.487935904504218,-0.605005623202529,"d1",11.6748199984431,6.11630072080504,1
|
||||||
|
0.0783678251318634,2,-1.8345771286241,-0.48469296452704,-1.19122687804207,"d1",97.106801004787,0.0783678251318634,2
|
||||||
|
0.0753125636838377,2,-0.438810514105078,-0.466849872263636,-0.639803324919198,"d1",13.7100772652775,0.0753125636838377,2
|
||||||
|
1.30011751591684,2,-1.71754032358037,-0.459453147067006,-1.72050403507059,"d1",85.162896984439,1.30011751591684,2
|
||||||
|
4.80113809032709,1,-0.370922305602338,-0.455289890327413,0.461100688628078,"d1",4.69688176482536,4.69688176482536,0
|
||||||
|
5.90888620164702,1,-1.30813817903797,-0.455234944124943,-1.7766120289902,"d1",11.7342197801918,5.90888620164702,1
|
||||||
|
0.372085412365962,2,-1.33242203676526,-0.444675568969578,0.61659731035441,"d1",48.2229322542377,0.372085412365962,2
|
||||||
|
4.89059350679706,1,-0.725492522106697,-0.443060772439573,0.762229718534035,"d1",39.5469368604903,4.89059350679706,1
|
||||||
|
2.04659481151941,2,-0.777806586832909,-0.440025014389601,-0.872890458444863,"d1",50.4553057600684,2.04659481151941,2
|
||||||
|
2.03897058582845,2,-0.0378012490430374,-0.429027012368145,-1.31597708285001,"d1",15.4083807848072,2.03897058582845,2
|
||||||
|
1.01758827078612,2,-1.28016548673871,-0.425688468851661,0.699129138140606,"d1",4.60447026416659,1.01758827078612,2
|
||||||
|
6.25879912495179,1,-0.583077192951759,-0.422108191588108,0.0475003603155665,"d1",31.2591543404346,6.25879912495179,1
|
||||||
|
7.25336918043015,1,-0.565741103403003,-0.419714741743597,-0.734974041468522,"d1",2.90408703498542,2.90408703498542,0
|
||||||
|
2.14003248551437,1,-0.170888399904471,-0.416478265204679,0.0800414014582476,"d1",0.441465461626649,0.441465461626649,0
|
||||||
|
0.545938095077872,2,-0.341691685411867,-0.414544246005865,0.550218488360563,"d1",34.5256463656698,0.545938095077872,2
|
||||||
|
6.22629632259517,1,-0.950085098058274,-0.414444964650831,-0.819619600597609,"d1",21.263416352773,6.22629632259517,1
|
||||||
|
1.08605028219045,2,-0.927645636285453,-0.410109974720035,-0.990394906860903,"d1",20.0148759773912,1.08605028219045,2
|
||||||
|
1.41585406466367,2,-0.478110211767677,-0.387844311940163,0.185119111369212,"d1",2.43890167762988,1.41585406466367,2
|
||||||
|
5.12777096471775,1,-2.52723629897812,-0.383344167234604,0.325516175397701,"d1",23.3256739742103,5.12777096471775,1
|
||||||
|
0.560892237350345,2,-1.55213972791835,-0.364768126745658,-0.374599489635217,"d1",18.5055401726606,0.560892237350345,2
|
||||||
|
4.00012938074326,1,-0.625444758007576,-0.36449594663103,0.504193738683109,"d1",17.2802503896699,4.00012938074326,1
|
||||||
|
4.8660578734478,1,-0.0571390786270154,-0.362794779999219,-0.74444704195158,"d1",12.4678146466613,4.8660578734478,1
|
||||||
|
0.870262232567084,2,-0.740357105365835,-0.362352634774993,-0.021975758077144,"d1",21.0608527614715,0.870262232567084,2
|
||||||
|
5.85748684824363,1,-0.73430371198211,-0.354218553154874,-0.360712942308638,"d1",26.2455050811864,5.85748684824363,1
|
||||||
|
1.71520997575464,2,-1.28384066134343,-0.353137962846624,0.267434135957981,"d1",8.44167739699644,1.71520997575464,2
|
||||||
|
2.99897972238633,1,-0.0370489535228247,-0.352019527608096,-0.733369800107882,"d1",2.39286359521427,2.39286359521427,0
|
||||||
|
3.79124856532967,2,-0.497280459282847,-0.333511238390777,-0.513272422071774,"d1",13.5526807513088,3.79124856532967,2
|
||||||
|
5.68305890342214,1,-0.0915648931614195,-0.332238948153213,-0.716289045784358,"d1",9.98184344731271,5.68305890342214,1
|
||||||
|
4.67288406222034,1,-0.162736049870991,-0.32731702562614,0.286540429366584,"d1",48.898998906178,4.67288406222034,1
|
||||||
|
0.635374410077929,2,-0.231344174018691,-0.324751888155364,0.7514928121089,"d1",4.75083186220402,0.635374410077929,2
|
||||||
|
4.82523018536497,1,-2.25382843672391,-0.308134050996533,0.684642990800304,"d1",4.97351374477148,4.82523018536497,1
|
||||||
|
0.698897804944637,2,-2.04417478061325,-0.30742952185735,-0.350541787161071,"d1",19.5704999176368,0.698897804944637,2
|
||||||
|
2.69758547643635,2,-2.17762152778411,-0.296597035145938,0.63151026534109,"d1",12.4046426918358,2.69758547643635,2
|
||||||
|
1.22892010114611,2,-1.60339015367895,-0.293990862525308,-0.558091874929821,"d1",34.6282499525166,1.22892010114611,2
|
||||||
|
5.17046629766408,1,-1.38546889263298,-0.293741661899216,0.194112993041771,"d1",1.4586137261771,1.4586137261771,0
|
||||||
|
0.420978290494531,2,-1.16909774876107,-0.289663519938945,0.418149566145471,"d1",54.4853870172925,0.420978290494531,2
|
||||||
|
4.36868775149244,1,-0.932978190119501,-0.282577723978344,-0.910276634414815,"d1",31.9927606997422,4.36868775149244,1
|
||||||
|
7.98445943237803,1,-0.423099155479472,-0.277331403953082,-1.59328207832002,"d1",34.372527336884,7.98445943237803,1
|
||||||
|
0.0872131232172251,2,-0.589209970904944,-0.272921114164637,-1.24812214185219,"d1",6.92712775431573,0.0872131232172251,2
|
||||||
|
4.89948574837939,2,-2.04558968393088,-0.269720647129868,0.665740327363631,"d1",14.1824684656205,4.89948574837939,2
|
||||||
|
0.452674105763435,2,-1.14175469878091,-0.262297372865071,0.596613949892108,"d1",0.90421103645153,0.452674105763435,2
|
||||||
|
4.49393515009568,1,-1.33606342511923,-0.259031929327579,-0.0240266628567508,"d1",72.6530231120897,4.49393515009568,1
|
||||||
|
2.7628836519612,1,-0.922372422702525,-0.256039761288398,-0.326428713900489,"d1",17.6612464702668,2.7628836519612,1
|
||||||
|
0.128867549875937,2,-0.841653846919651,-0.251973298435469,-0.0799318923553138,"d1",16.679678968245,0.128867549875937,2
|
||||||
|
1.09437750124167,2,-0.83093371183565,-0.235645864139423,-0.751775005953434,"d1",6.07498504221439,1.09437750124167,2
|
||||||
|
5.01430296947328,1,-2.31349204180314,-0.231648585854677,-1.00880720255202,"d1",39.3432762084489,5.01430296947328,1
|
||||||
|
8.10443498337973,1,-1.29712825475968,-0.229235800240512,0.0655517475838227,"d1",21.7556364639642,8.10443498337973,1
|
||||||
|
0.0699868539383135,2,-0.0775446833230767,-0.226729881265217,0.962019154924424,"d1",14.4438741218377,0.0699868539383135,2
|
||||||
|
6.17862852256154,1,-0.0437558320017703,-0.211729615346597,0.108223052099617,"d1",12.0335108236263,6.17862852256154,1
|
||||||
|
0.87984413928808,2,-0.431918978299504,-0.211129919507911,-0.558881138696703,"d1",0.467277266673554,0.467277266673554,0
|
||||||
|
0.136477382321468,2,-0.44259561928884,-0.198995073599147,-1.81001753413273,"d1",25.1430924228373,0.136477382321468,2
|
||||||
|
0.977906032200701,2,-1.91458642581036,-0.190101004082374,-0.783724251066022,"d1",10.3735212993588,0.977906032200701,2
|
||||||
|
0.0720774149522185,2,-0.263432080404804,-0.186467676597087,0.140427611838382,"d1",22.6656837753,0.0720774149522185,2
|
||||||
|
1.16731388689374,2,-0.243812528656655,-0.182162330076107,0.447931079110005,"d1",5.82658766768873,1.16731388689374,2
|
||||||
|
0.375108917243779,2,-0.229425474699161,-0.17298351083161,0.292388790440601,"d1",10.6790307722986,0.375108917243779,2
|
||||||
|
5.58316209072442,1,-0.196080429024872,-0.170424347180835,-0.801611899427801,"d1",3.96324042230844,3.96324042230844,0
|
||||||
|
6.69155498878302,1,-0.584458516026767,-0.16833753232526,-0.670005276166808,"d1",13.5679189302027,6.69155498878302,1
|
||||||
|
8.28377197077854,2,-0.048537177420854,-0.163910167801201,0.933283811856958,"d1",1.63224523127975,1.63224523127975,0
|
||||||
|
5.72401086676987,1,-1.17331821101943,-0.135615460917648,0.29467876727236,"d1",13.5379760805517,5.72401086676987,1
|
||||||
|
6.40072929629242,1,-0.657938217886743,-0.128783794648646,0.104509569527309,"d1",8.35762904956937,6.40072929629242,1
|
||||||
|
0.977889570354316,2,-1.61841161764785,-0.12853204245501,0.491784950848769,"d1",11.085272654891,0.977889570354316,2
|
||||||
|
0.0578334999240497,2,-0.334673532830905,-0.125322416424141,-0.624928518199846,"d1",9.53996538184583,0.0578334999240497,2
|
||||||
|
4.34135326556701,1,-0.260852933223967,-0.118588526399068,-0.218453117494544,"d1",7.51603904180229,4.34135326556701,1
|
||||||
|
0.60686046956107,2,-0.492588130860743,-0.10889271737476,0.817522611788629,"d1",18.0379314898493,0.60686046956107,2
|
||||||
|
0.162941626273096,2,-1.81114375836125,-0.105321508415227,-1.42738056875459,"d1",24.5070006317439,0.162941626273096,2
|
||||||
|
3.31173850579147,2,-0.529985392228882,-0.101173798699334,-1.11157256769151,"d1",36.3182022405748,3.31173850579147,2
|
||||||
|
5.66346344762411,1,-0.748746237356739,-0.096601414474617,-0.405850222686152,"d1",15.9121074033094,5.66346344762411,1
|
||||||
|
4.68899200271863,1,-0.598564386203868,-0.0928716906862502,0.347963982991107,"d1",7.61127825020251,4.68899200271863,1
|
||||||
|
1.20244742832602,2,-0.0297087580471651,-0.0903532182607695,-0.266418055024767,"d1",0.150110619901013,0.150110619901013,0
|
||||||
|
3.34570996598837,1,-1.5687628201419,-0.089816493570453,-0.241909417700233,"d1",1.18506729434209,1.18506729434209,0
|
||||||
|
6.10817109996549,1,-0.301572559674886,-0.0868356202056287,0.995789936662304,"d1",2.33373955823481,2.33373955823481,0
|
||||||
|
2.91461278767682,2,-0.514369184862923,-0.0810713462712984,-0.46285159058721,"d1",21.4213166750016,2.91461278767682,2
|
||||||
|
5.30071527233756,1,-1.81190949172934,-0.0716856549395218,-0.421014009560247,"d1",10.7334928680211,5.30071527233756,1
|
||||||
|
4.7089065139189,1,-0.628743853942056,-0.0693777239428382,-0.471650853606041,"d1",49.3702662338443,4.7089065139189,1
|
||||||
|
2.03937177165392,2,-1.39676836507781,-0.0608927217245306,0.368449894786603,"d1",2.66825927421451,2.03937177165392,2
|
||||||
|
0.207571438979357,2,-0.51684155611588,-0.0607293782301824,0.894313299593346,"d1",10.689409840852,0.207571438979357,2
|
||||||
|
0.851749686482263,2,-0.691115109166931,-0.0544992133306127,-0.0484490250175027,"d1",1.82849034667015,0.851749686482263,2
|
||||||
|
0.232213203795254,2,-1.29182474066886,-0.053047642486113,-0.813036486192363,"d1",19.8839293445704,0.232213203795254,2
|
||||||
|
5.01115417838178,1,-0.117918599350613,-0.0500544949888002,-0.55616354221462,"d1",51.9530932977507,5.01115417838178,1
|
||||||
|
0.181447059847414,2,-2.56453984926282,-0.039613173225119,-0.397859153781527,"d1",2.48961834236979,0.181447059847414,2
|
||||||
|
0.11701835406542,2,-1.04679555121175,-0.0244555289561008,-0.155387309205149,"d1",2.42753457278013,0.11701835406542,2
|
||||||
|
5.7707601293299,1,-1.27312188020529,-0.0238995320970482,-0.638483028102753,"d1",11.136468835175,5.7707601293299,1
|
||||||
|
1.31091332338275,2,-2.35647965467172,-0.0227612809714379,0.100033755184394,"d1",16.8639056003633,1.31091332338275,2
|
||||||
|
0.921248114973047,2,-0.980831488883218,-0.0165767330976238,-0.112567090295151,"d1",14.6494188083282,0.921248114973047,2
|
||||||
|
2.67004715221394,1,-0.434219991663494,-0.0156170697794335,-0.709188205273621,"d1",18.9970961018446,2.67004715221394,1
|
||||||
|
1.74592395490947,2,-1.68412440582249,-0.00576934686426262,-0.987227990286872,"d1",28.6467378942256,1.74592395490947,2
|
||||||
|
2.64318511808727,2,-0.526162593331332,-0.0015792334045885,0.0702184048673455,"d1",5.30908570624888,2.64318511808727,2
|
||||||
|
1.98613662450554,2,-0.439327093923725,-0.00117076714454385,0.894166171770393,"d1",1.9642498344183,1.9642498344183,0
|
||||||
|
0.0156997491587898,2,-0.324590600340434,0.0085674899950346,0.278632113218294,"d2",23.0319896518233,0.0156997491587898,2
|
||||||
|
1.02483786078651,2,-0.705483652281766,0.0123037075553583,0.686753165145983,"d2",17.788258821517,1.02483786078651,2
|
||||||
|
0.190481021691876,2,-1.48053579157808,0.0329377319464771,0.95860980835632,"d2",39.1881406611171,0.190481021691876,2
|
||||||
|
0.406864898728095,2,-0.66287821842055,0.0343209962054567,-1.02405850677521,"d2",30.9564450397899,0.406864898728095,2
|
||||||
|
1.24682781383287,2,-0.206994907568211,0.0394609839921361,-0.413993603720292,"d2",1.21858393183652,1.21858393183652,0
|
||||||
|
0.0343753263940729,2,-0.734767522424756,0.0524276443319716,0.0135826138541787,"d2",1.46569629199803,0.0343753263940729,2
|
||||||
|
4.16808855185547,1,-0.766143951110549,0.0547849675128103,-1.18134679661031,"d2",20.3632338602493,4.16808855185547,1
|
||||||
|
0.929139493129326,2,-1.80933914217456,0.0592599023808696,-0.9718829610288,"d2",49.7898622164546,0.929139493129326,2
|
||||||
|
0.448792203907764,2,-0.346966559951587,0.065908035853716,-0.387931926801275,"d2",8.50533039257842,0.448792203907764,2
|
||||||
|
1.5034935817504,2,-1.1326643150283,0.0810871170507968,0.251651137168998,"d2",26.1456839918139,1.5034935817504,2
|
||||||
|
1.15272829468786,2,-1.73341990854013,0.0921999410787411,0.0638680919173616,"d2",14.6578028417172,1.15272829468786,2
|
||||||
|
0.0640956317643552,2,-0.176244976288114,0.0977731862145538,-0.597952944635792,"d2",14.4380191146376,0.0640956317643552,2
|
||||||
|
1.10818157401867,2,-0.550046668781957,0.10209917568942,0.561809431951072,"d2",1.80839700967214,1.10818157401867,2
|
||||||
|
0.711445530043703,2,-0.894750424865124,0.104539115832322,0.215282952133479,"d2",11.0349307954311,0.711445530043703,2
|
||||||
|
0.227361694532769,1,-0.586925365791681,0.111569516315137,0.256833226759068,"d2",4.03843670386761,0.227361694532769,1
|
||||||
|
1.02353190359486,2,-1.53488769798728,0.113666164888074,-0.559846386629048,"d2",12.8939849883318,1.02353190359486,2
|
||||||
|
0.201588912102931,2,-2.14778624209232,0.114402728772923,-0.869975831946883,"d2",6.32016687653959,0.201588912102931,2
|
||||||
|
0.35892161067405,2,-0.206584750678768,0.120368830434315,0.0340683721764806,"d2",47.696836327476,0.35892161067405,2
|
||||||
|
0.142049523157072,2,-0.0546562841688546,0.12379343786166,-0.166814616349012,"d2",18.971409536058,0.142049523157072,2
|
||||||
|
0.0202328132171846,2,-0.0790216575399896,0.124846142340095,-1.30144562018104,"d2",5.14249449595809,0.0202328132171846,2
|
||||||
|
0.407534678143771,2,-0.412896572881849,0.126644980736647,0.415595320080395,"d2",3.21758340112865,0.407534678143771,2
|
||||||
|
0.503944600689501,2,-0.0132964259727509,0.130083715217701,0.0561063708308658,"d2",14.7065426789384,0.503944600689501,2
|
||||||
|
0.927551671647512,2,-2.04323446243185,0.135941565014185,0.689818777626378,"d2",14.0821513338926,0.927551671647512,2
|
||||||
|
1.45185523215195,2,-0.623455432968406,0.138238064444506,-0.409104872416987,"d2",65.6392365660439,1.45185523215195,2
|
||||||
|
0.872874716691619,2,-0.93717363941917,0.138404754662287,-1.23231212029417,"d2",15.6777038540441,0.872874716691619,2
|
||||||
|
1.49423749793154,2,-1.00636013357011,0.14659161786089,0.230327121134075,"d2",20.0820929362419,1.49423749793154,2
|
||||||
|
0.238842260978686,2,-0.25195440151874,0.175367442963731,-0.337792925110212,"d2",15.6895111792501,0.238842260978686,2
|
||||||
|
0.0692366053041504,2,-0.128961112845409,0.181704124470178,0.397332015907095,"d2",8.93658963384632,0.0692366053041504,2
|
||||||
|
0.779855987136579,2,-1.36487007647493,0.187464799776689,0.261358415505223,"d2",4.31801372207701,0.779855987136579,2
|
||||||
|
0.699886751185329,1,-0.751978562314961,0.191547491011504,-1.30215930354653,"d2",4.30929420515895,0.699886751185329,1
|
||||||
|
0.734088949033802,2,-0.664306453699544,0.193185283365211,0.235430697829153,"d2",3.21511986450921,0.734088949033802,2
|
||||||
|
0.223446971225934,2,-1.06169195170276,0.195643307666265,0.988882724739337,"d2",7.6680544577539,0.223446971225934,2
|
||||||
|
0.132826782517244,2,-0.736732250144602,0.204531663956041,-1.07696093866452,"d2",65.4219031300316,0.132826782517244,2
|
||||||
|
0.457251724424565,2,-0.975335617397184,0.204746526181366,-0.876693515212773,"d2",13.5662342328578,0.457251724424565,2
|
||||||
|
1.15717776080299,1,-0.315316175860469,0.253997160756786,-1.84999130643452,"d2",6.5199363976717,1.15717776080299,1
|
||||||
|
0.0304567135613987,2,-0.860899337097807,0.254397215310231,-0.870147075426326,"d2",19.1963952771368,0.0304567135613987,2
|
||||||
|
1.2713881665644,2,-0.416275629227561,0.26218061260624,0.685245699185711,"d2",23.0228867373409,1.2713881665644,2
|
||||||
|
0.88070006990238,2,-1.30851193899984,0.263458810762776,-0.0200957553850963,"d2",7.9112268704921,0.88070006990238,2
|
||||||
|
1.05395862039481,2,-1.75884886146508,0.267056776137007,0.843915107919986,"d2",21.4724540888312,1.05395862039481,2
|
||||||
|
0.380675969003663,2,-0.303811899969935,0.272658089169541,0.797759579087635,"d2",13.3209120389074,0.380675969003663,2
|
||||||
|
2.42948952352086,1,-1.07489880765383,0.278702417226384,-1.51295156544464,"d2",12.1582691092044,2.42948952352086,1
|
||||||
|
0.600418660031393,2,-0.640588994825643,0.282065591061298,-0.348353787473505,"d2",12.9015555977821,0.600418660031393,2
|
||||||
|
0.302928842308858,2,-1.43287992077704,0.28779517855791,0.711478037662267,"d2",17.7399990878334,0.302928842308858,2
|
||||||
|
1.50431569009576,2,-0.312502673028209,0.29918817355219,-0.99296592194076,"d2",4.01419310030979,1.50431569009576,2
|
||||||
|
1.65858306569878,2,-0.369034800692599,0.301640587484432,-1.01351122577763,"d2",10.9375634603202,1.65858306569878,2
|
||||||
|
1.19819218608353,2,-2.67584023613399,0.301768818579558,0.898785945271837,"d2",3.1764625114323,1.19819218608353,2
|
||||||
|
0.150994675234743,2,-1.95949443521336,0.308011223386714,0.504335995167867,"d2",14.9881349495592,0.150994675234743,2
|
||||||
|
0.822017495316411,2,-1.47769926070047,0.309661202184633,0.497002444263502,"d2",39.1943697987084,0.822017495316411,2
|
||||||
|
0.94527422272349,2,-0.00461325103619969,0.309896009945637,-2.98645501125237,"d2",5.78721852227098,0.94527422272349,2
|
||||||
|
0.199807342913703,2,-0.38620419743011,0.311196357510849,0.312436682894612,"d2",4.6801216353283,0.199807342913703,2
|
||||||
|
0.889043862681067,2,-0.695602530522189,0.312830266026359,0.169754562008535,"d2",23.4441302850879,0.889043862681067,2
|
||||||
|
0.192823870936713,2,-1.85439904536673,0.319086571126395,0.943369152308209,"d2",50.2285562513391,0.192823870936713,2
|
||||||
|
0.0825401463738917,2,-1.03142898609927,0.332938918764079,-0.228717865898126,"d2",63.5443845357666,0.0825401463738917,2
|
||||||
|
1.09116313524583,2,-1.07825759111025,0.345784561650072,-0.328082878852172,"d2",3.14877358994821,1.09116313524583,2
|
||||||
|
0.0801036016237605,2,-0.148250669113573,0.358363550071329,-1.37053623644768,"d2",53.5321588416524,0.0801036016237605,2
|
||||||
|
1.51637719348801,2,-0.410000676134566,0.364165154422149,0.245043498851267,"d2",2.02786128204309,1.51637719348801,2
|
||||||
|
0.223112276888441,2,-0.065270207612493,0.372946842014624,-0.767952406889159,"d2",18.6229881264173,0.223112276888441,2
|
||||||
|
0.892192278669641,2,-2.00757599196328,0.387486731073923,-0.856864656243337,"d2",6.50838260538876,0.892192278669641,2
|
||||||
|
0.841689597409288,2,-0.32653792839894,0.395922892941343,-1.345570225377,"d2",35.9126912435451,0.841689597409288,2
|
||||||
|
2.64520937247143,2,-0.195331899221975,0.427539014250251,-0.159010111031083,"d2",17.8068248732927,2.64520937247143,2
|
||||||
|
0.678166794441409,2,-1.14664983983835,0.429946619589537,-0.917289119688311,"d2",2.95270613575119,0.678166794441409,2
|
||||||
|
0.0242340336581891,2,-1.86512651123246,0.433931575881324,-1.31937198712435,"d2",9.62859936058521,0.0242340336581891,2
|
||||||
|
0.225544889552071,2,-1.81349649204381,0.446273358425133,-0.97893475725148,"d2",9.11545751616359,0.225544889552071,2
|
||||||
|
1.32126555703243,2,-2.17562202579492,0.446777621989057,-0.927371331077784,"d2",3.64970873109996,1.32126555703243,2
|
||||||
|
1.09788825524287,2,-0.473616603308054,0.452614065184748,-1.70286783824426,"d2",14.2008710665683,1.09788825524287,2
|
||||||
|
0.0407427016024968,2,-0.383157587000771,0.459439996351849,-0.301669993217876,"d2",1.06110211082059,0.0407427016024968,2
|
||||||
|
0.410326504864281,2,-1.54590745690689,0.461490341834014,-0.747675595773206,"d2",60.5675432052384,0.410326504864281,2
|
||||||
|
0.983796912832362,2,-0.703903202384028,0.4748015562724,0.0498484937143415,"d2",16.860832440758,0.983796912832362,2
|
||||||
|
1.28876403124804,2,-1.54624787871463,0.476270185954688,0.0346778838074355,"d2",7.07456577307847,1.28876403124804,2
|
||||||
|
0.11062920823862,2,-0.46230787319003,0.478347594082418,0.927534138368758,"d2",46.2824380000062,0.11062920823862,2
|
||||||
|
0.372899983721366,1,-0.613960890713074,0.480142446457778,-0.312547409750764,"d2",59.4584211673508,0.372899983721366,1
|
||||||
|
1.68192675816703,2,-0.916665744977255,0.484894451696334,-1.26991668174902,"d2",10.9923213627189,1.68192675816703,2
|
||||||
|
0.363768025567915,2,-0.452810033897698,0.492260284434662,-1.22144399605841,"d2",3.893798654899,0.363768025567915,2
|
||||||
|
0.770954940607939,2,-0.146013150710654,0.496694842550797,-1.1847484984477,"d2",3.93110281787813,0.770954940607939,2
|
||||||
|
0.702569675001579,2,-1.74262306266049,0.497365116238882,-0.0708118818763832,"d2",13.7317931372672,0.702569675001579,2
|
||||||
|
0.552321837103311,2,-1.46551912536993,0.517918254055016,0.842656893998976,"d2",25.4166308782044,0.552321837103311,2
|
||||||
|
1.51943766857141,2,-0.0324994758301393,0.521687294088326,-0.695674316562543,"d2",8.95308271485998,1.51943766857141,2
|
||||||
|
0.0143793687926801,2,-0.489300704678702,0.549156338240166,0.68485755666067,"d2",30.7497045008426,0.0143793687926801,2
|
||||||
|
0.196925432688972,2,-0.776115740427093,0.575435440108272,-0.104856856920984,"d2",18.9580009496751,0.196925432688972,2
|
||||||
|
0.397994932841351,2,-2.30148415329675,0.592726656812008,0.528916524898275,"d2",20.9906420289519,0.397994932841351,2
|
||||||
|
0.443605839368832,2,-0.442879615439267,0.60317081486281,-0.493556135862726,"d2",31.9349645061379,0.443605839368832,2
|
||||||
|
0.595047413773727,2,-0.041421786784315,0.613222349631286,0.942855179621111,"d2",113.545362644627,0.595047413773727,2
|
||||||
|
0.851778335536802,2,-0.692551688779352,0.618840767936134,-0.280481561963061,"d2",67.584654089428,0.851778335536802,2
|
||||||
|
0.0850131563678969,2,-0.351087533933564,0.63115172337206,-1.08703450937858,"d2",23.3850651598516,0.0850131563678969,2
|
||||||
|
0.546620696062235,2,-1.20797835030583,0.632977991529251,0.687097616289009,"d2",24.9407819942911,0.546620696062235,2
|
||||||
|
0.651966739701176,2,-0.155676646156619,0.633973940877502,-0.195116434787854,"d2",9.50914178974926,0.651966739701176,2
|
||||||
|
0.706971230359489,2,-0.291607673458914,0.672999338279278,-0.611676752142638,"d2",29.2759011296516,0.706971230359489,2
|
||||||
|
0.0946099703987008,2,-0.828390769734915,0.673022992266887,-0.0807462778117569,"d2",43.4866768469043,0.0946099703987008,2
|
||||||
|
1.23917359298254,2,-0.217083476563538,0.68117387507849,-2.27419916140393,"d2",9.65838972479105,1.23917359298254,2
|
||||||
|
1.39318028148559,2,-1.42331170158666,0.68321407696828,0.415548254106349,"d2",39.4098542986398,1.39318028148559,2
|
||||||
|
0.2887412686546,2,-0.216293134212122,0.684669076031555,0.54324012070439,"d2",36.7100610194688,0.2887412686546,2
|
||||||
|
0.747401769988024,2,-0.994934380543088,0.685217633998772,-0.553592904982075,"d2",2.55605911309923,0.747401769988024,2
|
||||||
|
1.55450392733402,2,-1.64317677850932,0.689216356610522,0.953505009843059,"d2",11.8831441458315,1.55450392733402,2
|
||||||
|
0.278926110328084,2,-0.509682189786163,0.727075361174734,-0.00517616250699605,"d2",41.3761439902668,0.278926110328084,2
|
||||||
|
0.558099948956484,2,-0.801257294848326,0.733410908527555,0.901317289352153,"d2",24.7530005863848,0.558099948956484,2
|
||||||
|
0.217691863979412,2,-0.0780556663003881,0.734820990980883,-7.74213028044464e-05,"d2",4.25654166378081,0.217691863979412,2
|
||||||
|
0.168765739088355,2,-0.524476363949861,0.737472157084385,-0.967529722246776,"d2",74.1931508066964,0.168765739088355,2
|
||||||
|
0.491175473306273,2,-0.338410953642002,0.746192491683312,-1.20939846483088,"d2",18.2602968819883,0.491175473306273,2
|
||||||
|
0.570280873077232,2,-0.82496807991851,0.755100400895145,-2.47165452825858,"d2",47.8723819156118,0.570280873077232,2
|
||||||
|
1.18847230144455,2,-2.44815755626931,0.771050378387112,0.349725998603989,"d2",8.68409346789122,1.18847230144455,2
|
||||||
|
2.08675113026237,2,-0.555687847563078,0.773575162368019,-2.55538526793035,"d2",3.62196432426572,2.08675113026237,2
|
||||||
|
1.64358284619001,2,-0.57106547169757,0.775276024082534,0.567090265161285,"d2",17.3387034539534,1.64358284619001,2
|
||||||
|
1.16387882660293,2,-0.6632811005556,0.778534449256291,-0.902621057209603,"d2",12.5933971069753,1.16387882660293,2
|
||||||
|
0.486642608119449,2,-1.26675938425176,0.785257053606859,-0.0887537463864184,"d2",24.870695619935,0.486642608119449,2
|
||||||
|
0.368862796531493,2,-0.0157734526113872,0.794597993716167,-1.54681819490358,"d2",48.0052247245736,0.368862796531493,2
|
||||||
|
0.955473331135381,2,-0.137800750340034,0.797004524974926,-0.378617176416411,"d2",32.9089857993608,0.955473331135381,2
|
||||||
|
3.12676574071716,2,-1.06368645492879,0.821687817198826,-0.0407811990387977,"d2",3.61957159824669,3.12676574071716,2
|
||||||
|
0.306348220749424,2,-0.147516803016227,0.841656293816402,-0.191520760863928,"d2",114.886943989231,0.306348220749424,2
|
||||||
|
0.905700703697593,2,-0.54143339886706,0.854324899126672,0.179139127594265,"d2",15.1024301341715,0.905700703697593,2
|
||||||
|
0.840685973234864,1,-0.303020462384095,0.882585070758093,0.289440144014759,"d2",11.4592190645635,0.840685973234864,1
|
||||||
|
0.073732312038499,2,-0.0717389572445063,0.888796858018411,-0.00118514725515559,"d2",31.3144977983426,0.073732312038499,2
|
||||||
|
0.714105402914262,1,-1.26727360969057,0.902324548233499,-0.206786821001746,"d2",37.532997984839,0.714105402914262,1
|
||||||
|
0.361447165457703,1,-0.308342680111544,0.914316291620421,-0.93039023459829,"d2",1.28684038296342,0.361447165457703,1
|
||||||
|
0.353413267947933,2,-0.617883410116297,0.920869361254689,-0.0852879281172563,"d2",7.88297220425304,0.353413267947933,2
|
||||||
|
0.742702086148416,2,-0.215443146498359,0.942205130591864,0.0981486648503957,"d2",1.74852036355542,0.742702086148416,2
|
||||||
|
0.932685261116003,2,-0.604698915349817,0.959656990846885,0.740922119652381,"d2",49.9165404935308,0.932685261116003,2
|
||||||
|
1.17763442513466,2,-0.122413893812872,0.965895507983667,0.258230824925122,"d2",8.1961564719677,1.17763442513466,2
|
||||||
|
2.401912919796,2,-0.849189313239924,0.969385765833604,-0.93281592514594,"d2",16.0375468238237,2.401912919796,2
|
||||||
|
0.587283215181692,2,-0.810493531629883,0.979673331930529,-0.598449061117795,"d2",12.9091547522694,0.587283215181692,2
|
||||||
|
2.41779795430406,1,-0.105147401862829,0.993446936499585,-1.65275149300319,"d2",4.58744315430522,2.41779795430406,1
|
||||||
|
1.29595096677794,2,-1.01243925750055,0.995408451418187,-1.33106394220616,"d2",9.05835108831525,1.29595096677794,2
|
||||||
|
0.0470700442629491,2,-0.209557800735267,1.00872627071948,-0.698056690769953,"d2",15.2551715716842,0.0470700442629491,2
|
||||||
|
1.16996056595139,2,-0.823512228938982,1.01258569626263,-1.01554090362161,"d2",6.35657354823829,1.16996056595139,2
|
||||||
|
1.57326372446757,2,-1.34150088324194,1.02887539791865,0.306288469753485,"d2",17.8610146037283,1.57326372446757,2
|
||||||
|
1.30043000087772,2,-0.705141749468459,1.03975340016813,0.251567713615197,"d2",6.52474461614365,1.30043000087772,2
|
||||||
|
1.14779420432604,2,-0.398892092007413,1.04179100519446,-1.83243497532061,"d2",2.10324127227068,1.14779420432604,2
|
||||||
|
0.505076958616528,2,-0.718370901724561,1.0421866506265,-0.246372073902359,"d2",5.0625859759748,0.505076958616528,2
|
||||||
|
0.925537763632789,2,-1.89987394421315,1.05397987352466,-0.563189170153506,"d2",26.255743074322,0.925537763632789,2
|
||||||
|
0.563820722455024,2,-0.938740016875237,1.06440807794544,0.62455787714372,"d2",18.7673846251311,0.563820722455024,2
|
||||||
|
1.85860266904046,2,-2.38644796518593,1.07517319771127,-0.460895461291849,"d2",10.3336658608168,1.85860266904046,2
|
||||||
|
0.555464183436573,2,-0.366945396154961,1.07963410980129,0.213645079959669,"d2",4.5025734912216,0.555464183436573,2
|
||||||
|
0.377637671893438,2,-0.77056335491118,1.08078074730182,0.379244608337682,"d2",13.3972088620067,0.377637671893438,2
|
||||||
|
0.773916903893329,2,-1.18062114223285,1.09078221998766,-0.781635129946549,"d2",26.3333267710152,0.773916903893329,2
|
||||||
|
0.331737034780138,2,-0.160422114606273,1.09520677325215,0.160559358901957,"d2",4.12589312531054,0.331737034780138,2
|
||||||
|
0.485487492784924,2,-0.291266012182764,1.12717653577567,0.539864617309839,"d2",47.509861027164,0.485487492784924,2
|
||||||
|
0.567644769068142,2,-1.87254604275478,1.13325607246989,0.0826067085001744,"d2",2.37201266922057,0.567644769068142,2
|
||||||
|
0.128928408406694,2,-1.16872646419766,1.14497886458327,0.765159746122596,"d2",60.4491259901709,0.128928408406694,2
|
||||||
|
0.214665382817188,2,-0.854540099210319,1.14705135091975,0.524188467815794,"d2",15.3455503796344,0.214665382817188,2
|
||||||
|
0.158244769503046,2,-0.888209644538255,1.14773768082969,-1.72163007302602,"d2",11.9385945331305,0.158244769503046,2
|
||||||
|
0.820958648049928,2,-0.0742931937039507,1.15221222139056,-0.477004924723435,"d2",3.22380216148211,0.820958648049928,2
|
||||||
|
0.0157959223057368,2,-0.764405046898142,1.16096745917705,-1.0106418628181,"d2",29.397890230823,0.0157959223057368,2
|
||||||
|
0.290203856103889,2,-3.04151467751598,1.19973111490997,-0.712247439601491,"d2",4.80517659336329,0.290203856103889,2
|
||||||
|
0.593791993901823,2,-0.330438750032875,1.21666360785384,0.43062865240794,"d2",4.83499114401639,0.593791993901823,2
|
||||||
|
0.164843803074047,2,-1.81192343134569,1.22559435231621,-2.72334725048105,"d2",10.9742081258446,0.164843803074047,2
|
||||||
|
11.9055269684581,1,-0.665960725671452,1.23627006640145,-0.419590161182336,"d2",40.9294332547073,11.9055269684581,1
|
||||||
|
0.671221861686162,2,-0.188346464217139,1.24489674668011,0.120267590757923,"d2",21.7115019562509,0.671221861686162,2
|
||||||
|
0.0942544131064994,2,-0.194634894363973,1.26346005224947,-0.76423468210315,"d2",19.021411601182,0.0942544131064994,2
|
||||||
|
0.615549209477342,2,-1.30356479689051,1.27806596638121,0.0640178772196265,"d2",21.8324093325975,0.615549209477342,2
|
||||||
|
0.0822799006980319,2,-1.67752507912405,1.28565827077808,0.519919803005842,"d2",24.2950110687854,0.0822799006980319,2
|
||||||
|
1.20406221344319,2,-0.000881577351194493,1.29095413317533,0.433991471288344,"d2",24.5576635001074,1.20406221344319,2
|
||||||
|
1.98874620101502,2,-0.644968559624807,1.32777721569994,-0.292529718561191,"d2",34.2133376358037,1.98874620101502,2
|
||||||
|
0.341627149662264,2,-0.934673636743636,1.34125496553996,-1.28162167614483,"d2",8.69551958147219,0.341627149662264,2
|
||||||
|
0.0168732562030819,2,-0.210832477089006,1.36284677624668,-0.453173609985677,"d2",2.57886065170169,0.0168732562030819,2
|
||||||
|
0.682544737920231,2,-0.358420115001672,1.36413038692697,0.786961394842606,"d2",67.8731216456661,0.682544737920231,2
|
||||||
|
0.194210974722535,2,-1.21395407363839,1.37247900322005,-1.57965792628652,"d2",16.7389732590857,0.194210974722535,2
|
||||||
|
0.01067929878569,2,-0.711737659603335,1.44367806227615,0.494679511609896,"d2",6.50548443823837,0.01067929878569,2
|
||||||
|
2.59280701155528,2,-0.346289734374787,1.46877736894458,-2.12354851451589,"d2",9.08401713706553,2.59280701155528,2
|
||||||
|
0.393467740871632,2,-0.210868519696887,1.48825220794357,-0.631635204679698,"d2",8.3222406450659,0.393467740871632,2
|
||||||
|
1.42224337449556,2,-0.826462920995468,1.50577479114554,0.826902277304424,"d2",5.40322990307394,1.42224337449556,2
|
||||||
|
1.33433690652175,2,-0.60950954295317,1.5242736002613,0.33221624648781,"d2",77.9066298487497,1.33433690652175,2
|
||||||
|
0.675625026289235,1,-0.104581864758384,1.56402723058933,-0.4456494141151,"d2",5.37353254369528,0.675625026289235,1
|
||||||
|
1.18800689892756,2,-0.290691809048107,1.59737990139469,-0.731489984714945,"d2",5.13775296509266,1.18800689892756,2
|
||||||
|
0.5610430217052,2,-0.121951712549261,1.5989351907612,-0.700489895929108,"d2",45.7034039099641,0.5610430217052,2
|
||||||
|
0.111499842106917,2,-0.760578628109173,1.61891116180103,-0.250533988404267,"d2",110.892675848384,0.111499842106917,2
|
||||||
|
1.28394211109323,2,-0.644905975513065,1.65165972345351,-0.277973230483964,"d2",0.271660890430212,0.271660890430212,0
|
||||||
|
0.36046102215795,2,-2.32017185740586,1.65353387790046,-0.501632803317992,"d2",70.4052646043611,0.36046102215795,2
|
||||||
|
0.575273370031256,2,-0.157124890997325,1.71599907279609,-1.11580353751111,"d2",132.810415878781,0.575273370031256,2
|
||||||
|
1.29121478953708,2,-1.97627600833374,1.73179518934575,-2.19550526142741,"d2",32.2724051756744,1.29121478953708,2
|
||||||
|
0.989072998401391,2,-0.215092388017547,1.73640052621478,-1.50678176080062,"d2",29.9476638033679,0.989072998401391,2
|
||||||
|
1.81867962127306,2,-0.382786696918515,1.77220325772621,0.41090714894628,"d2",15.2582436605337,1.81867962127306,2
|
||||||
|
0.424640509247266,2,-0.215550700328914,1.79151276909653,0.441547365758035,"d2",0.867104083299637,0.424640509247266,2
|
||||||
|
0.580463302371877,2,-0.421522579181269,1.84948662280667,-0.107403839804066,"d2",2.88768693425267,0.580463302371877,2
|
||||||
|
0.502226830768129,2,-0.184369339246996,1.85961621310361,0.62023606747576,"d2",35.8524207008963,0.502226830768129,2
|
||||||
|
0.651407346396547,2,-0.660513075272549,1.87386755678387,-0.621004930445427,"d2",46.1402620675145,0.651407346396547,2
|
||||||
|
0.0394596677280844,2,-0.26993942506916,1.87959315129064,-0.252190317127652,"d2",9.79061218909919,0.0394596677280844,2
|
||||||
|
0.970595889828562,2,-1.04510802337548,1.92602217715534,0.0902929063065855,"d2",74.9303023102594,0.970595889828562,2
|
||||||
|
0.338564266144649,2,-1.44714357951978,1.94423463188431,0.529239935450155,"d2",2.5988173019141,0.338564266144649,2
|
||||||
|
0.712761910235137,2,-0.739306835285532,1.97934994466332,0.26138571303491,"d2",119.479093246891,0.712761910235137,2
|
||||||
|
1.50524800791071,2,-0.420983335208244,2.07430232771404,-0.689347335029629,"d2",29.0102935411009,1.50524800791071,2
|
||||||
|
5.41910071472478,1,-0.298425154173344,2.10023557915584,-1.42893867631025,"d2",3.66633635014296,3.66633635014296,0
|
||||||
|
1.46110213895148,2,-1.21522178800769,2.12465840393492,0.127826188208986,"d2",18.0288890368285,1.46110213895148,2
|
||||||
|
0.349740831339943,2,-1.31635776880358,2.19888709961714,-0.665520965123348,"d2",2.49173296399998,0.349740831339943,2
|
||||||
|
0.109654119891548,2,-1.94336977065312,2.28885287387926,-0.0227376072732241,"d2",66.2348312105904,0.109654119891548,2
|
||||||
|
0.32694707880959,2,-0.33070420771385,2.35284611368282,-0.332760456709095,"d2",27.993805320824,0.32694707880959,2
|
||||||
|
0.455847657299084,2,-1.1613741180384,2.39631298153787,-0.337671586008395,"d2",14.6055440523148,0.455847657299084,2
|
||||||
|
0.805503301057283,2,-0.749292679007588,2.76291539134761,0.0700291458091432,"d2",6.93319054320455,0.805503301057283,2
|
||||||
|
0.559331617555047,2,-1.37332226052715,2.80201217822241,0.783135997663391,"d2",26.3137999541106,0.559331617555047,2
|
||||||
|
1.06530495836604,2,-1.11764024237778,3.2926528297212,0.020510640396302,"d2",6.90590973407556,1.06530495836604,2
|
|
422
src/test/resources/test_split_data.csv
Normal file
422
src/test/resources/test_split_data.csv
Normal file
|
@ -0,0 +1,422 @@
|
||||||
|
"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
|
|
Loading…
Reference in a new issue