From fbbad2edba07be5e27da1ae27e2d058afaa76d06 Mon Sep 17 00:00:00 2001 From: Villu Ruusmann Date: Tue, 2 Oct 2018 19:57:21 +0300 Subject: [PATCH 01/19] Updated version information --- README.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index 21e2e633..d863b7f7 100644 --- a/README.md +++ b/README.md @@ -66,13 +66,13 @@ Java library and command-line application for converting Apache Spark ML pipelin JPMML-SparkML library JAR file (together with accompanying Java source and Javadocs JAR files) is released via [Maven Central Repository](http://repo1.maven.org/maven2/org/jpmml/). -The current version is **1.1.20** (26 June, 2018). +The current version is **1.1.21** (2 October, 2018). ```xml org.jpmml jpmml-sparkml - 1.1.20 + 1.1.21 ``` @@ -82,7 +82,7 @@ Compatibility matrix: |-----------------------|----------------------|--------------| | 1.0.0 through 1.0.9 | 1.5.X and 1.6.X | 4.2 | | 1.1.0 | 2.0.X | 4.2 | -| 1.1.1 through 1.1.20 | 2.0.X | 4.3 | +| 1.1.1 through 1.1.21 | 2.0.X | 4.3 | JPMML-SparkML depends on the latest and greatest version of the [JPMML-Model](https://github.com/jpmml/jpmml-model) library, which is in conflict with the legacy version that is part of the Apache Spark distribution. From 47facab70aa2152bcfbf7744a699ed9698dc0892 Mon Sep 17 00:00:00 2001 From: Villu Ruusmann Date: Tue, 2 Oct 2018 20:22:06 +0300 Subject: [PATCH 02/19] Updated version information --- README.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index 761c152b..3b4f6bed 100644 --- a/README.md +++ b/README.md @@ -66,13 +66,13 @@ Java library and command-line application for converting Apache Spark ML pipelin JPMML-SparkML library JAR file (together with accompanying Java source and Javadocs JAR files) is released via [Maven Central Repository](http://repo1.maven.org/maven2/org/jpmml/). -The current version is **1.2.12** (26 June, 2018). +The current version is **1.2.13** (2 October, 2018). ```xml org.jpmml jpmml-sparkml - 1.2.12 + 1.2.13 ``` @@ -82,8 +82,8 @@ Compatibility matrix: |-----------------------|----------------------|--------------| | 1.0.0 through 1.0.9 | 1.5.X and 1.6.X | 4.2 | | 1.1.0 | 2.0.X | 4.2 | -| 1.1.1 through 1.1.20 | 2.0.X | 4.3 | -| 1.2.0 through 1.2.12 | 2.1.X | 4.3 | +| 1.1.1 through 1.1.21 | 2.0.X | 4.3 | +| 1.2.0 through 1.2.13 | 2.1.X | 4.3 | JPMML-SparkML depends on the latest and greatest version of the [JPMML-Model](https://github.com/jpmml/jpmml-model) library, which is in conflict with the legacy version that is part of the Apache Spark distribution. From 8c885538a29fe0222d75b6e3a6d9ed801ab7ad53 Mon Sep 17 00:00:00 2001 From: Villu Ruusmann Date: Tue, 2 Oct 2018 21:03:11 +0300 Subject: [PATCH 03/19] Updated version information --- README.md | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/README.md b/README.md index c869d2ce..21371811 100644 --- a/README.md +++ b/README.md @@ -67,13 +67,13 @@ Java library and command-line application for converting Apache Spark ML pipelin JPMML-SparkML library JAR file (together with accompanying Java source and Javadocs JAR files) is released via [Maven Central Repository](http://repo1.maven.org/maven2/org/jpmml/). -The current version is **1.3.8** (26 June, 2018). +The current version is **1.3.9** (2 October, 2018). ```xml org.jpmml jpmml-sparkml - 1.3.8 + 1.3.9 ``` @@ -83,9 +83,9 @@ Compatibility matrix: |-----------------------|----------------------|--------------| | 1.0.0 through 1.0.9 | 1.5.X and 1.6.X | 4.2 | | 1.1.0 | 2.0.X | 4.2 | -| 1.1.1 through 1.1.20 | 2.0.X | 4.3 | -| 1.2.0 through 1.2.12 | 2.1.X | 4.3 | -| 1.3.0 through 1.3.8 | 2.2.X | 4.3 | +| 1.1.1 through 1.1.21 | 2.0.X | 4.3 | +| 1.2.0 through 1.2.13 | 2.1.X | 4.3 | +| 1.3.0 through 1.3.9 | 2.2.X | 4.3 | JPMML-SparkML depends on the latest and greatest version of the [JPMML-Model](https://github.com/jpmml/jpmml-model) library, which is in conflict with the legacy version that is part of the Apache Spark distribution. From 122f5503d070486fa2d9ce85e4b945cd289d5383 Mon Sep 17 00:00:00 2001 From: Villu Ruusmann Date: Tue, 11 Dec 2018 00:13:35 +0200 Subject: [PATCH 04/19] Updated JPMML-Converter dependency --- pom.xml | 6 +-- .../org/jpmml/sparkml/ModelConverter.java | 2 +- .../java/org/jpmml/sparkml/PMMLBuilder.java | 41 ++++--------------- .../java/org/jpmml/sparkml/TermFeature.java | 12 +----- .../feature/RegexTokenizerConverter.java | 2 +- .../feature/StandardScalerModelConverter.java | 18 +++----- 6 files changed, 19 insertions(+), 62 deletions(-) diff --git a/pom.xml b/pom.xml index a40b34a8..fdb0a817 100644 --- a/pom.xml +++ b/pom.xml @@ -77,7 +77,7 @@ org.jpmml jpmml-converter - 1.3.3 + 1.3.4 @@ -90,13 +90,13 @@ org.jpmml pmml-evaluator - 1.4.3 + 1.4.4 test org.jpmml pmml-evaluator-test - 1.4.3 + 1.4.4 test diff --git a/src/main/java/org/jpmml/sparkml/ModelConverter.java b/src/main/java/org/jpmml/sparkml/ModelConverter.java index c38ebbb1..3e402a91 100644 --- a/src/main/java/org/jpmml/sparkml/ModelConverter.java +++ b/src/main/java/org/jpmml/sparkml/ModelConverter.java @@ -85,7 +85,7 @@ public Schema encodeSchema(SparkMLEncoder encoder){ if(feature instanceof CategoricalFeature){ CategoricalFeature categoricalFeature = (CategoricalFeature)feature; - DataField dataField = encoder.getDataField(categoricalFeature.getName()); + DataField dataField = (DataField)categoricalFeature.getField(); label = new CategoricalLabel(dataField); } else diff --git a/src/main/java/org/jpmml/sparkml/PMMLBuilder.java b/src/main/java/org/jpmml/sparkml/PMMLBuilder.java index 8277ab7a..f3c55345 100644 --- a/src/main/java/org/jpmml/sparkml/PMMLBuilder.java +++ b/src/main/java/org/jpmml/sparkml/PMMLBuilder.java @@ -59,10 +59,8 @@ import org.dmg.pmml.PMML; import org.dmg.pmml.ResultFeature; import org.dmg.pmml.VerificationField; -import org.dmg.pmml.mining.MiningModel; import org.jpmml.converter.Feature; import org.jpmml.converter.ModelUtil; -import org.jpmml.converter.Schema; import org.jpmml.converter.mining.MiningModelUtil; import org.jpmml.model.MetroJAXBUtil; @@ -149,39 +147,14 @@ public PMML build(){ List postProcessorNames = new ArrayList<>(derivedFields.keySet()); postProcessorNames.removeAll(preProcessorNames); - org.dmg.pmml.Model rootModel; + org.dmg.pmml.Model model; if(models.size() == 1){ - rootModel = Iterables.getOnlyElement(models); + model = Iterables.getOnlyElement(models); } else if(models.size() > 1){ - List targetMiningFields = new ArrayList<>(); - - for(org.dmg.pmml.Model model : models){ - MiningSchema miningSchema = model.getMiningSchema(); - - List miningFields = miningSchema.getMiningFields(); - for(MiningField miningField : miningFields){ - MiningField.UsageType usageType = miningField.getUsageType(); - - switch(usageType){ - case PREDICTED: - case TARGET: - targetMiningFields.add(miningField); - break; - default: - break; - } - } - } - - MiningSchema miningSchema = new MiningSchema(targetMiningFields); - - MiningModel miningModel = MiningModelUtil.createModelChain(models, new Schema(null, Collections.emptyList())) - .setMiningSchema(miningSchema); - - rootModel = miningModel; + model = MiningModelUtil.createModelChain(models); } else { @@ -193,7 +166,7 @@ public PMML build(){ encoder.removeDerivedField(postProcessorName); - Output output = ModelUtil.ensureOutput(rootModel); + Output output = ModelUtil.ensureOutput(model); OutputField outputField = new OutputField(derivedField.getName(), derivedField.getDataType()) .setOpType(derivedField.getOpType()) @@ -203,7 +176,7 @@ public PMML build(){ output.addOutputFields(outputField); } - PMML pmml = encoder.encodePMML(rootModel); + PMML pmml = encoder.encodePMML(model); if((predictionColumns.size() > 0 || probabilityColumns.size() > 0) && (verification != null)){ Dataset dataset = verification.getDataset(); @@ -213,7 +186,7 @@ public PMML build(){ List inputColumns = new ArrayList<>(); - MiningSchema miningSchema = rootModel.getMiningSchema(); + MiningSchema miningSchema = model.getMiningSchema(); List miningFields = miningSchema.getMiningFields(); for(MiningField miningField : miningFields){ @@ -262,7 +235,7 @@ public PMML build(){ } } - rootModel.setModelVerification(ModelUtil.createModelVerification(data)); + model.setModelVerification(ModelUtil.createModelVerification(data)); } return pmml; diff --git a/src/main/java/org/jpmml/sparkml/TermFeature.java b/src/main/java/org/jpmml/sparkml/TermFeature.java index 4e88974d..a4894077 100644 --- a/src/main/java/org/jpmml/sparkml/TermFeature.java +++ b/src/main/java/org/jpmml/sparkml/TermFeature.java @@ -26,7 +26,6 @@ import org.dmg.pmml.Constant; import org.dmg.pmml.DataType; import org.dmg.pmml.DefineFunction; -import org.dmg.pmml.DerivedField; import org.dmg.pmml.FieldName; import org.dmg.pmml.FieldRef; import org.dmg.pmml.OpType; @@ -57,16 +56,7 @@ public TermFeature(PMMLEncoder encoder, DefineFunction defineFunction, Feature f @Override public ContinuousFeature toContinuousFeature(){ - PMMLEncoder encoder = ensureEncoder(); - - DerivedField derivedField = encoder.getDerivedField(getName()); - if(derivedField == null){ - Apply apply = createApply(); - - derivedField = encoder.createDerivedField(getName(), OpType.CONTINUOUS, getDataType(), apply); - } - - return new ContinuousFeature(encoder, derivedField); + return toContinuousFeature(getName(), getDataType(), () -> createApply()); } public WeightedTermFeature toWeightedTermFeature(Number weight){ diff --git a/src/main/java/org/jpmml/sparkml/feature/RegexTokenizerConverter.java b/src/main/java/org/jpmml/sparkml/feature/RegexTokenizerConverter.java index e908bd8c..2aad0079 100644 --- a/src/main/java/org/jpmml/sparkml/feature/RegexTokenizerConverter.java +++ b/src/main/java/org/jpmml/sparkml/feature/RegexTokenizerConverter.java @@ -53,7 +53,7 @@ public List encodeFeatures(SparkMLEncoder encoder){ Feature feature = encoder.getOnlyFeature(transformer.getInputCol()); - Field field = encoder.getField(feature.getName()); + Field field = feature.getField(); if(transformer.getToLowercase()){ Apply apply = PMMLUtil.createApply("lowercase", feature.ref()); diff --git a/src/main/java/org/jpmml/sparkml/feature/StandardScalerModelConverter.java b/src/main/java/org/jpmml/sparkml/feature/StandardScalerModelConverter.java index b0735c46..fd455c5e 100644 --- a/src/main/java/org/jpmml/sparkml/feature/StandardScalerModelConverter.java +++ b/src/main/java/org/jpmml/sparkml/feature/StandardScalerModelConverter.java @@ -20,9 +20,11 @@ import java.util.ArrayList; import java.util.List; +import java.util.function.Supplier; import org.apache.spark.ml.feature.StandardScalerModel; import org.apache.spark.ml.linalg.Vector; +import org.dmg.pmml.Apply; import org.dmg.pmml.DataType; import org.dmg.pmml.DerivedField; import org.dmg.pmml.Expression; @@ -30,7 +32,6 @@ import org.dmg.pmml.OpType; import org.jpmml.converter.ContinuousFeature; import org.jpmml.converter.Feature; -import org.jpmml.converter.PMMLEncoder; import org.jpmml.converter.PMMLUtil; import org.jpmml.converter.ProductFeature; import org.jpmml.converter.ValueUtil; @@ -93,21 +94,14 @@ public List encodeFeatures(SparkMLEncoder encoder){ @Override public ContinuousFeature toContinuousFeature(){ - PMMLEncoder encoder = ensureEncoder(); - - DerivedField derivedField = encoder.getDerivedField(name); - if(derivedField == null){ + Supplier applySupplier = () -> { Feature feature = getFeature(); Number factor = getFactor(); - ContinuousFeature continuousFeature = feature.toContinuousFeature(); - - Expression expression = PMMLUtil.createApply("*", continuousFeature.ref(), PMMLUtil.createConstant(factor)); - - derivedField = encoder.createDerivedField(name, OpType.CONTINUOUS, DataType.DOUBLE, expression); - } + return PMMLUtil.createApply("*", (feature.toContinuousFeature()).ref(), PMMLUtil.createConstant(factor)); + }; - return new ContinuousFeature(encoder, derivedField); + return toContinuousFeature(name, DataType.DOUBLE, applySupplier); } }; } From 473c518e925027dbb5ec1f3edaf30e291d864a63 Mon Sep 17 00:00:00 2001 From: Villu Ruusmann Date: Wed, 12 Dec 2018 22:56:55 +0200 Subject: [PATCH 05/19] Improved support for the 'SQLTransformer' feature type. HT: Alex Krash. Fixes #53, fixes #54 --- .../java/org/jpmml/sparkml/DatasetUtil.java | 59 ++++++++++++++ .../org/jpmml/sparkml/ExpressionMapping.java | 17 ++++ .../jpmml/sparkml/ExpressionTranslator.java | 79 ++++++------------- .../feature/SQLTransformerConverter.java | 77 ++++-------------- .../sparkml/ExpressionTranslatorTest.java | 51 ++++-------- 5 files changed, 133 insertions(+), 150 deletions(-) create mode 100644 src/main/java/org/jpmml/sparkml/DatasetUtil.java diff --git a/src/main/java/org/jpmml/sparkml/DatasetUtil.java b/src/main/java/org/jpmml/sparkml/DatasetUtil.java new file mode 100644 index 00000000..ecc21bd2 --- /dev/null +++ b/src/main/java/org/jpmml/sparkml/DatasetUtil.java @@ -0,0 +1,59 @@ +/* + * Copyright (c) 2018 Villu Ruusmann + * + * This file is part of JPMML-SparkML + * + * JPMML-SparkML is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * JPMML-SparkML is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with JPMML-SparkML. If not, see . + */ +package org.jpmml.sparkml; + +import java.util.Collections; +import java.util.concurrent.atomic.AtomicInteger; + +import org.apache.spark.sql.Dataset; +import org.apache.spark.sql.Row; +import org.apache.spark.sql.SparkSession; +import org.apache.spark.sql.catalog.Catalog; +import org.apache.spark.sql.catalyst.plans.logical.LogicalPlan; +import org.apache.spark.sql.execution.QueryExecution; +import org.apache.spark.sql.types.StructType; + +public class DatasetUtil { + + private DatasetUtil(){ + } + + static + public LogicalPlan createAnalyzedLogicalPlan(SparkSession sparkSession, StructType schema, String statement){ + String tableName = "sql2pmml_" + DatasetUtil.ID.getAndIncrement(); + + statement = statement.replace("__THIS__", tableName); + + Dataset dataset = sparkSession.createDataFrame(Collections.emptyList(), schema); + + dataset.createOrReplaceTempView(tableName); + + try { + QueryExecution queryExecution = sparkSession.sql(statement).queryExecution(); + + return queryExecution.analyzed(); + } finally { + Catalog catalog = sparkSession.catalog(); + + catalog.dropTempView(tableName); + } + } + + private static final AtomicInteger ID = new AtomicInteger(1); +} \ No newline at end of file diff --git a/src/main/java/org/jpmml/sparkml/ExpressionMapping.java b/src/main/java/org/jpmml/sparkml/ExpressionMapping.java index ab3f7afa..3c9432d1 100644 --- a/src/main/java/org/jpmml/sparkml/ExpressionMapping.java +++ b/src/main/java/org/jpmml/sparkml/ExpressionMapping.java @@ -20,6 +20,7 @@ import org.apache.spark.sql.catalyst.expressions.Expression; import org.dmg.pmml.DataType; +import org.dmg.pmml.OpType; public class ExpressionMapping { @@ -59,4 +60,20 @@ public DataType getDataType(){ private void setDataType(DataType dataType){ this.dataType = dataType; } + + public OpType getOpType(){ + DataType dataType = getDataType(); + + switch(dataType){ + case STRING: + return OpType.CATEGORICAL; + case INTEGER: + case DOUBLE: + return OpType.CONTINUOUS; + case BOOLEAN: + return OpType.CATEGORICAL; + default: + throw new IllegalArgumentException(); + } + } } \ No newline at end of file diff --git a/src/main/java/org/jpmml/sparkml/ExpressionTranslator.java b/src/main/java/org/jpmml/sparkml/ExpressionTranslator.java index 056bdf36..0cb67153 100644 --- a/src/main/java/org/jpmml/sparkml/ExpressionTranslator.java +++ b/src/main/java/org/jpmml/sparkml/ExpressionTranslator.java @@ -20,12 +20,10 @@ import java.util.List; -import org.apache.spark.sql.catalyst.FunctionIdentifier; -import org.apache.spark.sql.catalyst.analysis.UnresolvedAlias; -import org.apache.spark.sql.catalyst.analysis.UnresolvedAttribute; -import org.apache.spark.sql.catalyst.analysis.UnresolvedFunction; import org.apache.spark.sql.catalyst.expressions.Add; +import org.apache.spark.sql.catalyst.expressions.Alias; import org.apache.spark.sql.catalyst.expressions.And; +import org.apache.spark.sql.catalyst.expressions.AttributeReference; import org.apache.spark.sql.catalyst.expressions.BinaryArithmetic; import org.apache.spark.sql.catalyst.expressions.BinaryComparison; import org.apache.spark.sql.catalyst.expressions.BinaryOperator; @@ -60,48 +58,25 @@ public class ExpressionTranslator { static - public ExpressionMapping translate(Expression expression, DataTypeResolver dataTypeResolver){ + public ExpressionMapping translate(Expression expression){ - if(expression instanceof UnresolvedAlias){ - UnresolvedAlias unresolvedAlias = (UnresolvedAlias)expression; + if(expression instanceof Alias){ + Alias alias = (Alias)expression; - Expression child = unresolvedAlias.child(); + Expression child = alias.child(); - return translate(child, dataTypeResolver); - } else - - if(expression instanceof UnresolvedAttribute){ - UnresolvedAttribute unresolvedAttribute = (UnresolvedAttribute)expression; - - String name = unresolvedAttribute.name(); - - return new ExpressionMapping(unresolvedAttribute, new FieldRef(FieldName.create(name)), dataTypeResolver.getDataType(name)); - } else - - if(expression instanceof UnresolvedFunction){ - UnresolvedFunction unresolvedFunction = (UnresolvedFunction)expression; - - FunctionIdentifier name = unresolvedFunction.name(); - List children = JavaConversions.seqAsJavaList(unresolvedFunction.children()); - - String identifier = name.identifier(); + return translate(child); + } // End if - if("IF".equalsIgnoreCase(identifier) && children.size() == 3){ - return translate(new If(children.get(0), children.get(1), children.get(2)), dataTypeResolver); - } else + if(expression instanceof AttributeReference){ + AttributeReference attributeReference = (AttributeReference)expression; - if("ISNOTNULL".equalsIgnoreCase(identifier) && children.size() == 1){ - return translate(new IsNotNull(children.get(0)), dataTypeResolver); - } else + String name = attributeReference.name(); - if("ISNULL".equalsIgnoreCase(identifier) && children.size() == 1){ - return translate(new IsNull(children.get(0)), dataTypeResolver); - } else + DataType dataType = translateDataType(attributeReference.dataType()); - { - throw new IllegalArgumentException(String.valueOf(unresolvedFunction)); - } - } // End if + return new ExpressionMapping(attributeReference, new FieldRef(FieldName.create(name)), dataType); + } else if(expression instanceof BinaryOperator){ BinaryOperator binaryOperator = (BinaryOperator)expression; @@ -165,7 +140,7 @@ public ExpressionMapping translate(Expression expression, DataTypeResolver dataT throw new IllegalArgumentException(String.valueOf(binaryOperator)); } - return new ExpressionMapping(binaryOperator, PMMLUtil.createApply(symbol, translateChild(left, dataTypeResolver), translateChild(right, dataTypeResolver)), dataType); + return new ExpressionMapping(binaryOperator, PMMLUtil.createApply(symbol, translateChild(left), translateChild(right)), dataType); } else if(expression instanceof If){ @@ -182,8 +157,8 @@ public ExpressionMapping translate(Expression expression, DataTypeResolver dataT DataType dataType = translateDataType(trueValue.dataType()); - Apply apply = PMMLUtil.createApply("if", translateChild(predicate, dataTypeResolver)) - .addExpressions(translateChild(trueValue, dataTypeResolver), translateChild(falseValue, dataTypeResolver)); + Apply apply = PMMLUtil.createApply("if", translateChild(predicate)) + .addExpressions(translateChild(trueValue), translateChild(falseValue)); return new ExpressionMapping(_if, apply, dataType); } else @@ -195,10 +170,10 @@ public ExpressionMapping translate(Expression expression, DataTypeResolver dataT List elements = JavaConversions.seqAsJavaList(in.list()); - Apply apply = PMMLUtil.createApply("isIn", translateChild(value, dataTypeResolver)); + Apply apply = PMMLUtil.createApply("isIn", translateChild(value)); for(Expression element : elements){ - apply.addExpressions(translateChild(element, dataTypeResolver)); + apply.addExpressions(translateChild(element)); } return new ExpressionMapping(in, apply, DataType.BOOLEAN); @@ -219,7 +194,7 @@ public ExpressionMapping translate(Expression expression, DataTypeResolver dataT Expression child = not.child(); - return new ExpressionMapping(not, PMMLUtil.createApply("not", translateChild(child, dataTypeResolver)), DataType.BOOLEAN); + return new ExpressionMapping(not, PMMLUtil.createApply("not", translateChild(child)), DataType.BOOLEAN); } else if(expression instanceof UnaryExpression){ @@ -228,11 +203,11 @@ public ExpressionMapping translate(Expression expression, DataTypeResolver dataT Expression child = unaryExpression.child(); if(expression instanceof IsNotNull){ - return new ExpressionMapping(unaryExpression, PMMLUtil.createApply("isNotMissing", translateChild(child, dataTypeResolver)), DataType.BOOLEAN); + return new ExpressionMapping(unaryExpression, PMMLUtil.createApply("isNotMissing", translateChild(child)), DataType.BOOLEAN); } else if(expression instanceof IsNull){ - return new ExpressionMapping(unaryExpression, PMMLUtil.createApply("isMissing", translateChild(child, dataTypeResolver)), DataType.BOOLEAN); + return new ExpressionMapping(unaryExpression, PMMLUtil.createApply("isMissing", translateChild(child)), DataType.BOOLEAN); } else { @@ -246,8 +221,8 @@ public ExpressionMapping translate(Expression expression, DataTypeResolver dataT } static - private org.dmg.pmml.Expression translateChild(Expression expression, DataTypeResolver dataTypeResolver){ - ExpressionMapping expressionMapping = translate(expression, dataTypeResolver); + private org.dmg.pmml.Expression translateChild(Expression expression){ + ExpressionMapping expressionMapping = translate(expression); return expressionMapping.getTo(); } @@ -275,10 +250,4 @@ private DataType translateDataType(org.apache.spark.sql.types.DataType sparkData throw new IllegalArgumentException("Expected string, integral, double or boolean type, got " + sparkDataType.typeName() + " type"); } } - - static - public interface DataTypeResolver { - - DataType getDataType(String name); - } } \ No newline at end of file diff --git a/src/main/java/org/jpmml/sparkml/feature/SQLTransformerConverter.java b/src/main/java/org/jpmml/sparkml/feature/SQLTransformerConverter.java index 93b8683b..1c9c016a 100644 --- a/src/main/java/org/jpmml/sparkml/feature/SQLTransformerConverter.java +++ b/src/main/java/org/jpmml/sparkml/feature/SQLTransformerConverter.java @@ -23,21 +23,19 @@ import org.apache.spark.ml.feature.SQLTransformer; import org.apache.spark.sql.SparkSession; -import org.apache.spark.sql.catalyst.analysis.UnresolvedAlias; -import org.apache.spark.sql.catalyst.analysis.UnresolvedStar; import org.apache.spark.sql.catalyst.expressions.Alias; +import org.apache.spark.sql.catalyst.expressions.AttributeReference; import org.apache.spark.sql.catalyst.expressions.Expression; -import org.apache.spark.sql.catalyst.parser.ParserInterface; import org.apache.spark.sql.catalyst.plans.logical.LogicalPlan; -import org.apache.spark.sql.internal.SessionState; +import org.apache.spark.sql.types.StructType; import org.dmg.pmml.DataType; import org.dmg.pmml.DerivedField; import org.dmg.pmml.FieldName; -import org.dmg.pmml.OpType; import org.jpmml.converter.BooleanFeature; import org.jpmml.converter.ContinuousFeature; import org.jpmml.converter.Feature; import org.jpmml.converter.StringFeature; +import org.jpmml.sparkml.DatasetUtil; import org.jpmml.sparkml.ExpressionMapping; import org.jpmml.sparkml.ExpressionTranslator; import org.jpmml.sparkml.FeatureConverter; @@ -59,26 +57,23 @@ public List encodeFeatures(SparkMLEncoder encoder){ SparkSession sparkSession = SparkSession.builder() .getOrCreate(); - SessionState sessionState = sparkSession.sessionState(); + StructType schema = encoder.getSchema(); - ParserInterface parserInterface = sessionState.sqlParser(); + LogicalPlan logicalPlan = DatasetUtil.createAnalyzedLogicalPlan(sparkSession, schema, statement); - LogicalPlan logicalPlan = parserInterface.parsePlan(statement); + List result = new ArrayList<>(); - ExpressionTranslator.DataTypeResolver dataTypeResolver = new ExpressionTranslator.DataTypeResolver(){ + List expressions = JavaConversions.seqAsJavaList(logicalPlan.expressions()); + for(Expression expression : expressions){ - @Override - public DataType getDataType(String name){ - Feature feature = encoder.getOnlyFeature(name); + if(expression instanceof AttributeReference){ + AttributeReference attributeReference = (AttributeReference)expression; - return feature.getDataType(); - } - }; + String name = attributeReference.name(); - List result = new ArrayList<>(); + encoder.getOnlyFeature(name); + } - List expressions = JavaConversions.seqAsJavaList(logicalPlan.expressions()); - for(Expression expression : expressions){ String name; if(expression instanceof Alias){ @@ -89,55 +84,17 @@ public DataType getDataType(String name){ name = alias.name(); } else - if(expression instanceof UnresolvedAlias){ - UnresolvedAlias unresolvedAlias = (UnresolvedAlias)expression; - - expression = unresolvedAlias.child(); - - // XXX - name = "(" + (expression.toString()).replace("\'", "") + ")"; - } else - - if(expression instanceof UnresolvedStar){ - UnresolvedStar unresolvedStar = (UnresolvedStar)expression; - - List features = encoder.getSchemaFeatures(); - - result.addAll(features); - - continue; - } else - { - throw new IllegalArgumentException(String.valueOf(expression)); - } - - ExpressionMapping expressionMapping = ExpressionTranslator.translate(expression, dataTypeResolver); - - OpType opType; - - DataType dataType = expressionMapping.getDataType(); - switch(dataType){ - case STRING: - opType = OpType.CATEGORICAL; - break; - case INTEGER: - case DOUBLE: - opType = OpType.CONTINUOUS; - break; - case BOOLEAN: - opType = OpType.CATEGORICAL; - break; - default: - throw new IllegalArgumentException(); + name = "sql(" + expression.toString() + ")"; } - org.dmg.pmml.Expression pmmlExpression = expressionMapping.getTo(); + ExpressionMapping expressionMapping = ExpressionTranslator.translate(expression); - DerivedField derivedField = encoder.createDerivedField(FieldName.create(name), opType, dataType, pmmlExpression); + DerivedField derivedField = encoder.createDerivedField(FieldName.create(name), expressionMapping.getOpType(), expressionMapping.getDataType(), expressionMapping.getTo()); Feature feature; + DataType dataType = derivedField.getDataType(); switch(dataType){ case STRING: feature = new StringFeature(encoder, derivedField); diff --git a/src/test/java/org/jpmml/sparkml/ExpressionTranslatorTest.java b/src/test/java/org/jpmml/sparkml/ExpressionTranslatorTest.java index aa1cf715..f9865d90 100644 --- a/src/test/java/org/jpmml/sparkml/ExpressionTranslatorTest.java +++ b/src/test/java/org/jpmml/sparkml/ExpressionTranslatorTest.java @@ -22,13 +22,13 @@ import org.apache.spark.sql.SparkSession; import org.apache.spark.sql.catalyst.expressions.And; +import org.apache.spark.sql.catalyst.expressions.Divide; import org.apache.spark.sql.catalyst.expressions.Expression; import org.apache.spark.sql.catalyst.expressions.If; -import org.apache.spark.sql.catalyst.expressions.Multiply; import org.apache.spark.sql.catalyst.expressions.Or; -import org.apache.spark.sql.catalyst.parser.ParserInterface; import org.apache.spark.sql.catalyst.plans.logical.LogicalPlan; -import org.apache.spark.sql.internal.SessionState; +import org.apache.spark.sql.types.DataTypes; +import org.apache.spark.sql.types.StructType; import org.dmg.pmml.Apply; import org.dmg.pmml.DataType; import org.junit.AfterClass; @@ -42,64 +42,45 @@ public class ExpressionTranslatorTest { @Test public void translateLogicalExpression(){ - ExpressionTranslator.DataTypeResolver dataTypeResolver = new ExpressionTranslator.DataTypeResolver(){ - - @Override - public DataType getDataType(String name){ - return DataType.DOUBLE; - } - }; - - ExpressionMapping expressionMapping = translate("SELECT (isnull(x1) and not(isnotnull(x2))) FROM __THIS__", dataTypeResolver); + ExpressionMapping expressionMapping = translate("SELECT (isnull(x1) and not(isnotnull(x2))) FROM __THIS__"); checkExpressionMapping(expressionMapping, And.class, Apply.class, DataType.BOOLEAN); - expressionMapping = translate("SELECT ((x1 <= x2) or (x1 >= x3)) FROM __THIS__", dataTypeResolver); + expressionMapping = translate("SELECT ((x1 <= x3) or (x2 >= x3)) FROM __THIS__"); checkExpressionMapping(expressionMapping, Or.class, Apply.class, DataType.BOOLEAN); } @Test public void translateArithmeticExpression(){ - ExpressionMapping expressionMapping = translate("SELECT 2 * ((0 + 1) / (0 - 1)) FROM __THIS__", null); + ExpressionMapping expressionMapping = translate("SELECT ((x1 - x3) / (x2 + x3)) FROM __THIS__"); - checkExpressionMapping(expressionMapping, Multiply.class, Apply.class, DataType.INTEGER); + checkExpressionMapping(expressionMapping, Divide.class, Apply.class, DataType.DOUBLE); } @Test public void translateIfExpression(){ - ExpressionTranslator.DataTypeResolver dataTypeResolver = new ExpressionTranslator.DataTypeResolver(){ - - @Override - public DataType getDataType(String name){ - - if(("status").equals(name)){ - return DataType.INTEGER; - } - - return DataType.DOUBLE; - } - }; - - ExpressionMapping expressionMapping = translate("SELECT if(status in (1, 2, 3), x1 < 0, x2 > 0)", dataTypeResolver); + ExpressionMapping expressionMapping = translate("SELECT if(flag, x1 != x3, x2 != x3) FROM __THIS__"); checkExpressionMapping(expressionMapping, If.class, Apply.class, DataType.BOOLEAN); } static - private ExpressionMapping translate(String statement, ExpressionTranslator.DataTypeResolver dataTypeResolver){ - SessionState sessionState = ExpressionTranslatorTest.sparkSession.sessionState(); - - ParserInterface parserInterface = sessionState.sqlParser(); + private ExpressionMapping translate(String statement){ + StructType schema = new StructType() + .add("flag", DataTypes.BooleanType) + .add("x1", DataTypes.DoubleType) + .add("x2", DataTypes.DoubleType) + .add("x3", DataTypes.DoubleType); - LogicalPlan logicalPlan = parserInterface.parsePlan(statement); + LogicalPlan logicalPlan = DatasetUtil.createAnalyzedLogicalPlan(ExpressionTranslatorTest.sparkSession, schema, statement); List expressions = JavaConversions.seqAsJavaList(logicalPlan.expressions()); if(expressions.size() != 1){ throw new IllegalArgumentException(); } - return ExpressionTranslator.translate(expressions.get(0), dataTypeResolver); + return ExpressionTranslator.translate(expressions.get(0)); } static From db9edd1a895369771fcd8a3222cbd15f93c8b198 Mon Sep 17 00:00:00 2001 From: Villu Ruusmann Date: Thu, 13 Dec 2018 18:58:42 +0200 Subject: [PATCH 06/19] Added support for the cast expression --- .../jpmml/sparkml/ExpressionTranslator.java | 29 +++++++++++++++++++ .../sparkml/ExpressionTranslatorTest.java | 9 +++--- 2 files changed, 33 insertions(+), 5 deletions(-) diff --git a/src/main/java/org/jpmml/sparkml/ExpressionTranslator.java b/src/main/java/org/jpmml/sparkml/ExpressionTranslator.java index 0cb67153..7d0a7db4 100644 --- a/src/main/java/org/jpmml/sparkml/ExpressionTranslator.java +++ b/src/main/java/org/jpmml/sparkml/ExpressionTranslator.java @@ -27,6 +27,7 @@ import org.apache.spark.sql.catalyst.expressions.BinaryArithmetic; import org.apache.spark.sql.catalyst.expressions.BinaryComparison; import org.apache.spark.sql.catalyst.expressions.BinaryOperator; +import org.apache.spark.sql.catalyst.expressions.Cast; import org.apache.spark.sql.catalyst.expressions.Divide; import org.apache.spark.sql.catalyst.expressions.EqualTo; import org.apache.spark.sql.catalyst.expressions.Expression; @@ -52,6 +53,7 @@ import org.dmg.pmml.DataType; import org.dmg.pmml.FieldName; import org.dmg.pmml.FieldRef; +import org.dmg.pmml.HasDataType; import org.jpmml.converter.PMMLUtil; import scala.collection.JavaConversions; @@ -143,6 +145,33 @@ public ExpressionMapping translate(Expression expression){ return new ExpressionMapping(binaryOperator, PMMLUtil.createApply(symbol, translateChild(left), translateChild(right)), dataType); } else + if(expression instanceof Cast){ + Cast cast = (Cast)expression; + + Expression child = cast.child(); + + DataType dataType = translateDataType(cast.dataType()); + + ExpressionMapping expressionMapping = translate(child); + + Expression from = expressionMapping.getFrom(); + org.dmg.pmml.Expression to = expressionMapping.getTo(); + + if(to instanceof HasDataType){ + HasDataType hasDataType = (HasDataType)to; + + hasDataType.setDataType(dataType); + + expressionMapping = new ExpressionMapping(from, to, dataType); + } else + + { + throw new IllegalArgumentException(String.valueOf(cast)); + } + + return expressionMapping; + } else + if(expression instanceof If){ If _if = (If)expression; diff --git a/src/test/java/org/jpmml/sparkml/ExpressionTranslatorTest.java b/src/test/java/org/jpmml/sparkml/ExpressionTranslatorTest.java index f9865d90..c7eab2c8 100644 --- a/src/test/java/org/jpmml/sparkml/ExpressionTranslatorTest.java +++ b/src/test/java/org/jpmml/sparkml/ExpressionTranslatorTest.java @@ -46,21 +46,21 @@ public void translateLogicalExpression(){ checkExpressionMapping(expressionMapping, And.class, Apply.class, DataType.BOOLEAN); - expressionMapping = translate("SELECT ((x1 <= x3) or (x2 >= x3)) FROM __THIS__"); + expressionMapping = translate("SELECT ((x1 <= 0) or (x2 >= 0)) FROM __THIS__"); checkExpressionMapping(expressionMapping, Or.class, Apply.class, DataType.BOOLEAN); } @Test public void translateArithmeticExpression(){ - ExpressionMapping expressionMapping = translate("SELECT ((x1 - x3) / (x2 + x3)) FROM __THIS__"); + ExpressionMapping expressionMapping = translate("SELECT ((x1 - 1) / (x2 + 1)) FROM __THIS__"); checkExpressionMapping(expressionMapping, Divide.class, Apply.class, DataType.DOUBLE); } @Test public void translateIfExpression(){ - ExpressionMapping expressionMapping = translate("SELECT if(flag, x1 != x3, x2 != x3) FROM __THIS__"); + ExpressionMapping expressionMapping = translate("SELECT if(flag, x1 != 0, x2 != 0) FROM __THIS__"); checkExpressionMapping(expressionMapping, If.class, Apply.class, DataType.BOOLEAN); } @@ -70,8 +70,7 @@ private ExpressionMapping translate(String statement){ StructType schema = new StructType() .add("flag", DataTypes.BooleanType) .add("x1", DataTypes.DoubleType) - .add("x2", DataTypes.DoubleType) - .add("x3", DataTypes.DoubleType); + .add("x2", DataTypes.DoubleType); LogicalPlan logicalPlan = DatasetUtil.createAnalyzedLogicalPlan(ExpressionTranslatorTest.sparkSession, schema, statement); From 2557c5205684509e2e3d8d472aecfbe0c8ed1b2e Mon Sep 17 00:00:00 2001 From: Villu Ruusmann Date: Thu, 13 Dec 2018 23:32:30 +0200 Subject: [PATCH 07/19] Improved expression parsing --- .../java/org/jpmml/sparkml/DatasetUtil.java | 29 +++++ .../org/jpmml/sparkml/ExpressionMapping.java | 79 ------------ .../jpmml/sparkml/ExpressionTranslator.java | 120 ++++++------------ .../feature/SQLTransformerConverter.java | 26 +++- .../sparkml/ExpressionTranslatorTest.java | 43 ++++--- 5 files changed, 109 insertions(+), 188 deletions(-) delete mode 100644 src/main/java/org/jpmml/sparkml/ExpressionMapping.java diff --git a/src/main/java/org/jpmml/sparkml/DatasetUtil.java b/src/main/java/org/jpmml/sparkml/DatasetUtil.java index ecc21bd2..18bc9e17 100644 --- a/src/main/java/org/jpmml/sparkml/DatasetUtil.java +++ b/src/main/java/org/jpmml/sparkml/DatasetUtil.java @@ -27,7 +27,12 @@ import org.apache.spark.sql.catalog.Catalog; import org.apache.spark.sql.catalyst.plans.logical.LogicalPlan; import org.apache.spark.sql.execution.QueryExecution; +import org.apache.spark.sql.types.BooleanType; +import org.apache.spark.sql.types.DoubleType; +import org.apache.spark.sql.types.IntegralType; +import org.apache.spark.sql.types.StringType; import org.apache.spark.sql.types.StructType; +import org.dmg.pmml.DataType; public class DatasetUtil { @@ -55,5 +60,29 @@ public LogicalPlan createAnalyzedLogicalPlan(SparkSession sparkSession, StructTy } } + static + public DataType translateDataType(org.apache.spark.sql.types.DataType sparkDataType){ + + if(sparkDataType instanceof StringType){ + return DataType.STRING; + } else + + if(sparkDataType instanceof IntegralType){ + return DataType.INTEGER; + } else + + if(sparkDataType instanceof DoubleType){ + return DataType.DOUBLE; + } else + + if(sparkDataType instanceof BooleanType){ + return DataType.BOOLEAN; + } else + + { + throw new IllegalArgumentException("Expected string, integral, double or boolean type, got " + sparkDataType.typeName() + " type"); + } + } + private static final AtomicInteger ID = new AtomicInteger(1); } \ No newline at end of file diff --git a/src/main/java/org/jpmml/sparkml/ExpressionMapping.java b/src/main/java/org/jpmml/sparkml/ExpressionMapping.java deleted file mode 100644 index 3c9432d1..00000000 --- a/src/main/java/org/jpmml/sparkml/ExpressionMapping.java +++ /dev/null @@ -1,79 +0,0 @@ -/* - * Copyright (c) 2018 Villu Ruusmann - * - * This file is part of JPMML-SparkML - * - * JPMML-SparkML is free software: you can redistribute it and/or modify - * it under the terms of the GNU Affero General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * JPMML-SparkML is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with JPMML-SparkML. If not, see . - */ -package org.jpmml.sparkml; - -import org.apache.spark.sql.catalyst.expressions.Expression; -import org.dmg.pmml.DataType; -import org.dmg.pmml.OpType; - -public class ExpressionMapping { - - private Expression from = null; - - private org.dmg.pmml.Expression to = null; - - private DataType dataType = null; - - - public ExpressionMapping(Expression from, org.dmg.pmml.Expression to, DataType dataType){ - setFrom(from); - setTo(to); - setDataType(dataType); - } - - public Expression getFrom(){ - return this.from; - } - - private void setFrom(Expression from){ - this.from = from; - } - - public org.dmg.pmml.Expression getTo(){ - return this.to; - } - - private void setTo(org.dmg.pmml.Expression to){ - this.to = to; - } - - public DataType getDataType(){ - return this.dataType; - } - - private void setDataType(DataType dataType){ - this.dataType = dataType; - } - - public OpType getOpType(){ - DataType dataType = getDataType(); - - switch(dataType){ - case STRING: - return OpType.CATEGORICAL; - case INTEGER: - case DOUBLE: - return OpType.CONTINUOUS; - case BOOLEAN: - return OpType.CATEGORICAL; - default: - throw new IllegalArgumentException(); - } - } -} \ No newline at end of file diff --git a/src/main/java/org/jpmml/sparkml/ExpressionTranslator.java b/src/main/java/org/jpmml/sparkml/ExpressionTranslator.java index 7d0a7db4..01448b8c 100644 --- a/src/main/java/org/jpmml/sparkml/ExpressionTranslator.java +++ b/src/main/java/org/jpmml/sparkml/ExpressionTranslator.java @@ -45,10 +45,6 @@ import org.apache.spark.sql.catalyst.expressions.Or; import org.apache.spark.sql.catalyst.expressions.Subtract; import org.apache.spark.sql.catalyst.expressions.UnaryExpression; -import org.apache.spark.sql.types.BooleanType; -import org.apache.spark.sql.types.DoubleType; -import org.apache.spark.sql.types.IntegralType; -import org.apache.spark.sql.types.StringType; import org.dmg.pmml.Apply; import org.dmg.pmml.DataType; import org.dmg.pmml.FieldName; @@ -60,7 +56,7 @@ public class ExpressionTranslator { static - public ExpressionMapping translate(Expression expression){ + public org.dmg.pmml.Expression translate(Expression expression){ if(expression instanceof Alias){ Alias alias = (Alias)expression; @@ -75,9 +71,7 @@ public ExpressionMapping translate(Expression expression){ String name = attributeReference.name(); - DataType dataType = translateDataType(attributeReference.dataType()); - - return new ExpressionMapping(attributeReference, new FieldRef(FieldName.create(name)), dataType); + return new FieldRef(FieldName.create(name)); } else if(expression instanceof BinaryOperator){ @@ -88,27 +82,31 @@ public ExpressionMapping translate(Expression expression){ Expression left = binaryOperator.left(); Expression right = binaryOperator.right(); - DataType dataType; - if(expression instanceof And || expression instanceof Or){ - symbol = symbol.toLowerCase(); - dataType = DataType.BOOLEAN; + switch(symbol){ + case "&&": + symbol = "and"; + break; + case "||": + symbol = "or"; + break; + default: + throw new IllegalArgumentException(String.valueOf(binaryOperator)); + } } else if(expression instanceof Add || expression instanceof Divide || expression instanceof Multiply || expression instanceof Subtract){ BinaryArithmetic binaryArithmetic = (BinaryArithmetic)binaryOperator; - if((left.dataType()).acceptsType(right.dataType())){ - dataType = translateDataType(left.dataType()); - } else - - if((right.dataType()).acceptsType(left.dataType())){ - dataType = translateDataType(right.dataType()); - } else - - { - throw new IllegalArgumentException(String.valueOf(binaryArithmetic)); + switch(symbol){ + case "+": + case "/": + case "*": + case "-": + break; + default: + throw new IllegalArgumentException(String.valueOf(binaryArithmetic)); } } else @@ -134,15 +132,13 @@ public ExpressionMapping translate(Expression expression){ default: throw new IllegalArgumentException(String.valueOf(binaryComparison)); } - - dataType = DataType.BOOLEAN; } else { throw new IllegalArgumentException(String.valueOf(binaryOperator)); } - return new ExpressionMapping(binaryOperator, PMMLUtil.createApply(symbol, translateChild(left), translateChild(right)), dataType); + return PMMLUtil.createApply(symbol, translate(left), translate(right)); } else if(expression instanceof Cast){ @@ -150,26 +146,21 @@ public ExpressionMapping translate(Expression expression){ Expression child = cast.child(); - DataType dataType = translateDataType(cast.dataType()); + DataType dataType = DatasetUtil.translateDataType(cast.dataType()); - ExpressionMapping expressionMapping = translate(child); + org.dmg.pmml.Expression pmmlExpression = translate(child); - Expression from = expressionMapping.getFrom(); - org.dmg.pmml.Expression to = expressionMapping.getTo(); - - if(to instanceof HasDataType){ - HasDataType hasDataType = (HasDataType)to; + if(pmmlExpression instanceof HasDataType){ + HasDataType hasDataType = (HasDataType)pmmlExpression; hasDataType.setDataType(dataType); - expressionMapping = new ExpressionMapping(from, to, dataType); + return pmmlExpression; } else { throw new IllegalArgumentException(String.valueOf(cast)); } - - return expressionMapping; } else if(expression instanceof If){ @@ -180,16 +171,8 @@ public ExpressionMapping translate(Expression expression){ Expression trueValue = _if.trueValue(); Expression falseValue = _if.falseValue(); - if(!(trueValue.dataType()).sameType(falseValue.dataType())){ - throw new IllegalArgumentException(String.valueOf(_if)); - } - - DataType dataType = translateDataType(trueValue.dataType()); - - Apply apply = PMMLUtil.createApply("if", translateChild(predicate)) - .addExpressions(translateChild(trueValue), translateChild(falseValue)); - - return new ExpressionMapping(_if, apply, dataType); + return PMMLUtil.createApply("if", translate(predicate)) + .addExpressions(translate(trueValue), translate(falseValue)); } else if(expression instanceof In){ @@ -199,13 +182,13 @@ public ExpressionMapping translate(Expression expression){ List elements = JavaConversions.seqAsJavaList(in.list()); - Apply apply = PMMLUtil.createApply("isIn", translateChild(value)); + Apply apply = PMMLUtil.createApply("isIn", translate(value)); for(Expression element : elements){ - apply.addExpressions(translateChild(element)); + apply.addExpressions(translate(element)); } - return new ExpressionMapping(in, apply, DataType.BOOLEAN); + return apply; } else if(expression instanceof Literal){ @@ -213,9 +196,9 @@ public ExpressionMapping translate(Expression expression){ Object value = literal.value(); - DataType dataType = translateDataType(literal.dataType()); + DataType dataType = DatasetUtil.translateDataType(literal.dataType()); - return new ExpressionMapping(literal, PMMLUtil.createConstant(value, dataType), dataType); + return PMMLUtil.createConstant(value, dataType); } else if(expression instanceof Not){ @@ -223,7 +206,7 @@ public ExpressionMapping translate(Expression expression){ Expression child = not.child(); - return new ExpressionMapping(not, PMMLUtil.createApply("not", translateChild(child)), DataType.BOOLEAN); + return PMMLUtil.createApply("not", translate(child)); } else if(expression instanceof UnaryExpression){ @@ -232,11 +215,11 @@ public ExpressionMapping translate(Expression expression){ Expression child = unaryExpression.child(); if(expression instanceof IsNotNull){ - return new ExpressionMapping(unaryExpression, PMMLUtil.createApply("isNotMissing", translateChild(child)), DataType.BOOLEAN); + return PMMLUtil.createApply("isNotMissing", translate(child)); } else if(expression instanceof IsNull){ - return new ExpressionMapping(unaryExpression, PMMLUtil.createApply("isMissing", translateChild(child)), DataType.BOOLEAN); + return PMMLUtil.createApply("isMissing", translate(child)); } else { @@ -248,35 +231,4 @@ public ExpressionMapping translate(Expression expression){ throw new IllegalArgumentException(String.valueOf(expression)); } } - - static - private org.dmg.pmml.Expression translateChild(Expression expression){ - ExpressionMapping expressionMapping = translate(expression); - - return expressionMapping.getTo(); - } - - static - private DataType translateDataType(org.apache.spark.sql.types.DataType sparkDataType){ - - if(sparkDataType instanceof StringType){ - return DataType.STRING; - } else - - if(sparkDataType instanceof IntegralType){ - return DataType.INTEGER; - } else - - if(sparkDataType instanceof DoubleType){ - return DataType.DOUBLE; - } else - - if(sparkDataType instanceof BooleanType){ - return DataType.BOOLEAN; - } else - - { - throw new IllegalArgumentException("Expected string, integral, double or boolean type, got " + sparkDataType.typeName() + " type"); - } - } } \ No newline at end of file diff --git a/src/main/java/org/jpmml/sparkml/feature/SQLTransformerConverter.java b/src/main/java/org/jpmml/sparkml/feature/SQLTransformerConverter.java index 1c9c016a..93d33272 100644 --- a/src/main/java/org/jpmml/sparkml/feature/SQLTransformerConverter.java +++ b/src/main/java/org/jpmml/sparkml/feature/SQLTransformerConverter.java @@ -31,12 +31,12 @@ import org.dmg.pmml.DataType; import org.dmg.pmml.DerivedField; import org.dmg.pmml.FieldName; +import org.dmg.pmml.OpType; import org.jpmml.converter.BooleanFeature; import org.jpmml.converter.ContinuousFeature; import org.jpmml.converter.Feature; import org.jpmml.converter.StringFeature; import org.jpmml.sparkml.DatasetUtil; -import org.jpmml.sparkml.ExpressionMapping; import org.jpmml.sparkml.ExpressionTranslator; import org.jpmml.sparkml.FeatureConverter; import org.jpmml.sparkml.SparkMLEncoder; @@ -76,6 +76,8 @@ public List encodeFeatures(SparkMLEncoder encoder){ String name; + DataType dataType = DatasetUtil.translateDataType(expression.dataType()); + if(expression instanceof Alias){ Alias alias = (Alias)expression; @@ -88,13 +90,29 @@ public List encodeFeatures(SparkMLEncoder encoder){ name = "sql(" + expression.toString() + ")"; } - ExpressionMapping expressionMapping = ExpressionTranslator.translate(expression); + OpType opType; + + switch(dataType){ + case STRING: + opType = OpType.CATEGORICAL; + break; + case INTEGER: + case DOUBLE: + opType = OpType.CONTINUOUS; + break; + case BOOLEAN: + opType = OpType.CATEGORICAL; + break; + default: + throw new IllegalArgumentException(); + } + + org.dmg.pmml.Expression pmmlExpression = ExpressionTranslator.translate(expression); - DerivedField derivedField = encoder.createDerivedField(FieldName.create(name), expressionMapping.getOpType(), expressionMapping.getDataType(), expressionMapping.getTo()); + DerivedField derivedField = encoder.createDerivedField(FieldName.create(name), opType, dataType, pmmlExpression); Feature feature; - DataType dataType = derivedField.getDataType(); switch(dataType){ case STRING: feature = new StringFeature(encoder, derivedField); diff --git a/src/test/java/org/jpmml/sparkml/ExpressionTranslatorTest.java b/src/test/java/org/jpmml/sparkml/ExpressionTranslatorTest.java index c7eab2c8..805db241 100644 --- a/src/test/java/org/jpmml/sparkml/ExpressionTranslatorTest.java +++ b/src/test/java/org/jpmml/sparkml/ExpressionTranslatorTest.java @@ -21,16 +21,11 @@ import java.util.List; import org.apache.spark.sql.SparkSession; -import org.apache.spark.sql.catalyst.expressions.And; -import org.apache.spark.sql.catalyst.expressions.Divide; import org.apache.spark.sql.catalyst.expressions.Expression; -import org.apache.spark.sql.catalyst.expressions.If; -import org.apache.spark.sql.catalyst.expressions.Or; import org.apache.spark.sql.catalyst.plans.logical.LogicalPlan; import org.apache.spark.sql.types.DataTypes; import org.apache.spark.sql.types.StructType; import org.dmg.pmml.Apply; -import org.dmg.pmml.DataType; import org.junit.AfterClass; import org.junit.BeforeClass; import org.junit.Test; @@ -42,35 +37,36 @@ public class ExpressionTranslatorTest { @Test public void translateLogicalExpression(){ - ExpressionMapping expressionMapping = translate("SELECT (isnull(x1) and not(isnotnull(x2))) FROM __THIS__"); + Apply apply = (Apply)translate("SELECT (isnull(x1) and not(isnotnull(x2))) FROM __THIS__"); - checkExpressionMapping(expressionMapping, And.class, Apply.class, DataType.BOOLEAN); + checkApply(apply, "and", Apply.class, Apply.class); - expressionMapping = translate("SELECT ((x1 <= 0) or (x2 >= 0)) FROM __THIS__"); + apply = (Apply)translate("SELECT ((x1 <= 0) or (x2 >= 0)) FROM __THIS__"); - checkExpressionMapping(expressionMapping, Or.class, Apply.class, DataType.BOOLEAN); + checkApply(apply, "or", Apply.class, Apply.class); } @Test public void translateArithmeticExpression(){ - ExpressionMapping expressionMapping = translate("SELECT ((x1 - 1) / (x2 + 1)) FROM __THIS__"); + Apply apply = (Apply)translate("SELECT ((x1 - 1) / (x2 + 1)) FROM __THIS__"); - checkExpressionMapping(expressionMapping, Divide.class, Apply.class, DataType.DOUBLE); + checkApply(apply, "/", Apply.class, Apply.class); } @Test public void translateIfExpression(){ - ExpressionMapping expressionMapping = translate("SELECT if(flag, x1 != 0, x2 != 0) FROM __THIS__"); + Apply apply = (Apply)translate("SELECT if(status in (0, 1), x1 != 0, x2 != 0) FROM __THIS__"); - checkExpressionMapping(expressionMapping, If.class, Apply.class, DataType.BOOLEAN); + checkApply(apply, "if", Apply.class, Apply.class, Apply.class); } static - private ExpressionMapping translate(String statement){ + private org.dmg.pmml.Expression translate(String statement){ StructType schema = new StructType() .add("flag", DataTypes.BooleanType) .add("x1", DataTypes.DoubleType) - .add("x2", DataTypes.DoubleType); + .add("x2", DataTypes.DoubleType) + .add("status", DataTypes.IntegerType); LogicalPlan logicalPlan = DatasetUtil.createAnalyzedLogicalPlan(ExpressionTranslatorTest.sparkSession, schema, statement); @@ -83,13 +79,18 @@ private ExpressionMapping translate(String statement){ } static - private void checkExpressionMapping(ExpressionMapping expressionMapping, Class fromClazz, Class toClazz, DataType dataType){ - Expression from = expressionMapping.getFrom(); - org.dmg.pmml.Expression to = expressionMapping.getTo(); + private void checkApply(Apply apply, String function, Class... pmmlExpressionClazzes){ + assertEquals(function, apply.getFunction()); - assertEquals(fromClazz, from.getClass()); - assertEquals(toClazz, to.getClass()); - assertEquals(dataType, expressionMapping.getDataType()); + List pmmlExpressions = apply.getExpressions(); + assertEquals(pmmlExpressionClazzes.length, pmmlExpressions.size()); + + for(int i = 0; i < pmmlExpressionClazzes.length; i++){ + Class expressionClazz = pmmlExpressionClazzes[i]; + org.dmg.pmml.Expression pmmlExpression = pmmlExpressions.get(i); + + assertEquals(expressionClazz, pmmlExpression.getClass()); + } } @BeforeClass From 90c8942730d9fed506c9ff464eadd08f1e550c24 Mon Sep 17 00:00:00 2001 From: Villu Ruusmann Date: Fri, 14 Dec 2018 18:50:07 +0200 Subject: [PATCH 08/19] Activated the compaction of expressions --- .../jpmml/sparkml/ExpressionTranslator.java | 39 ++++++++++++++----- 1 file changed, 29 insertions(+), 10 deletions(-) diff --git a/src/main/java/org/jpmml/sparkml/ExpressionTranslator.java b/src/main/java/org/jpmml/sparkml/ExpressionTranslator.java index 01448b8c..989ae5a2 100644 --- a/src/main/java/org/jpmml/sparkml/ExpressionTranslator.java +++ b/src/main/java/org/jpmml/sparkml/ExpressionTranslator.java @@ -51,19 +51,38 @@ import org.dmg.pmml.FieldRef; import org.dmg.pmml.HasDataType; import org.jpmml.converter.PMMLUtil; +import org.jpmml.converter.visitors.ExpressionCompactor; import scala.collection.JavaConversions; public class ExpressionTranslator { static public org.dmg.pmml.Expression translate(Expression expression){ + return translate(expression, true); + } + + static + public org.dmg.pmml.Expression translate(Expression expression, boolean compact){ + org.dmg.pmml.Expression pmmlExpression = translateInternal(expression); + + if(compact){ + ExpressionCompactor expressionCompactor = new ExpressionCompactor(); + + expressionCompactor.applyTo(pmmlExpression); + } + + return pmmlExpression; + } + + static + private org.dmg.pmml.Expression translateInternal(Expression expression){ if(expression instanceof Alias){ Alias alias = (Alias)expression; Expression child = alias.child(); - return translate(child); + return translateInternal(child); } // End if if(expression instanceof AttributeReference){ @@ -138,7 +157,7 @@ public org.dmg.pmml.Expression translate(Expression expression){ throw new IllegalArgumentException(String.valueOf(binaryOperator)); } - return PMMLUtil.createApply(symbol, translate(left), translate(right)); + return PMMLUtil.createApply(symbol, translateInternal(left), translateInternal(right)); } else if(expression instanceof Cast){ @@ -148,7 +167,7 @@ public org.dmg.pmml.Expression translate(Expression expression){ DataType dataType = DatasetUtil.translateDataType(cast.dataType()); - org.dmg.pmml.Expression pmmlExpression = translate(child); + org.dmg.pmml.Expression pmmlExpression = translateInternal(child); if(pmmlExpression instanceof HasDataType){ HasDataType hasDataType = (HasDataType)pmmlExpression; @@ -171,8 +190,8 @@ public org.dmg.pmml.Expression translate(Expression expression){ Expression trueValue = _if.trueValue(); Expression falseValue = _if.falseValue(); - return PMMLUtil.createApply("if", translate(predicate)) - .addExpressions(translate(trueValue), translate(falseValue)); + return PMMLUtil.createApply("if", translateInternal(predicate)) + .addExpressions(translateInternal(trueValue), translateInternal(falseValue)); } else if(expression instanceof In){ @@ -182,10 +201,10 @@ public org.dmg.pmml.Expression translate(Expression expression){ List elements = JavaConversions.seqAsJavaList(in.list()); - Apply apply = PMMLUtil.createApply("isIn", translate(value)); + Apply apply = PMMLUtil.createApply("isIn", translateInternal(value)); for(Expression element : elements){ - apply.addExpressions(translate(element)); + apply.addExpressions(translateInternal(element)); } return apply; @@ -206,7 +225,7 @@ public org.dmg.pmml.Expression translate(Expression expression){ Expression child = not.child(); - return PMMLUtil.createApply("not", translate(child)); + return PMMLUtil.createApply("not", translateInternal(child)); } else if(expression instanceof UnaryExpression){ @@ -215,11 +234,11 @@ public org.dmg.pmml.Expression translate(Expression expression){ Expression child = unaryExpression.child(); if(expression instanceof IsNotNull){ - return PMMLUtil.createApply("isNotMissing", translate(child)); + return PMMLUtil.createApply("isNotMissing", translateInternal(child)); } else if(expression instanceof IsNull){ - return PMMLUtil.createApply("isMissing", translate(child)); + return PMMLUtil.createApply("isMissing", translateInternal(child)); } else { From 48775cd0da820b7cd61f427d160c07d5269f7e19 Mon Sep 17 00:00:00 2001 From: Villu Ruusmann Date: Fri, 14 Dec 2018 19:27:20 +0200 Subject: [PATCH 09/19] Added support for the case statement --- .../jpmml/sparkml/ExpressionTranslator.java | 46 +++++++++++++++++++ .../sparkml/ExpressionTranslatorTest.java | 21 ++++++++- 2 files changed, 66 insertions(+), 1 deletion(-) diff --git a/src/main/java/org/jpmml/sparkml/ExpressionTranslator.java b/src/main/java/org/jpmml/sparkml/ExpressionTranslator.java index 989ae5a2..8314d053 100644 --- a/src/main/java/org/jpmml/sparkml/ExpressionTranslator.java +++ b/src/main/java/org/jpmml/sparkml/ExpressionTranslator.java @@ -18,6 +18,7 @@ */ package org.jpmml.sparkml; +import java.util.Iterator; import java.util.List; import org.apache.spark.sql.catalyst.expressions.Add; @@ -27,6 +28,7 @@ import org.apache.spark.sql.catalyst.expressions.BinaryArithmetic; import org.apache.spark.sql.catalyst.expressions.BinaryComparison; import org.apache.spark.sql.catalyst.expressions.BinaryOperator; +import org.apache.spark.sql.catalyst.expressions.CaseWhen; import org.apache.spark.sql.catalyst.expressions.Cast; import org.apache.spark.sql.catalyst.expressions.Divide; import org.apache.spark.sql.catalyst.expressions.EqualTo; @@ -52,6 +54,8 @@ import org.dmg.pmml.HasDataType; import org.jpmml.converter.PMMLUtil; import org.jpmml.converter.visitors.ExpressionCompactor; +import scala.Option; +import scala.Tuple2; import scala.collection.JavaConversions; public class ExpressionTranslator { @@ -160,6 +164,48 @@ private org.dmg.pmml.Expression translateInternal(Expression expression){ return PMMLUtil.createApply(symbol, translateInternal(left), translateInternal(right)); } else + if(expression instanceof CaseWhen){ + CaseWhen caseWhen = (CaseWhen)expression; + + List> branches = JavaConversions.seqAsJavaList(caseWhen.branches()); + + Option elseValue = caseWhen.elseValue(); + + Apply apply = null; + + Iterator> branchIt = branches.iterator(); + + Apply prevBranchApply = null; + + do { + Tuple2 branch = branchIt.next(); + + Expression predicate = branch._1(); + Expression value = branch._2(); + + Apply branchApply = PMMLUtil.createApply("if") + .addExpressions(translateInternal(predicate), translateInternal(value)); + + if(apply == null){ + apply = branchApply; + } // End if + + if(prevBranchApply != null){ + prevBranchApply.addExpressions(branchApply); + } + + prevBranchApply = branchApply; + } while(branchIt.hasNext()); + + if(elseValue.isDefined()){ + Expression value = elseValue.get(); + + prevBranchApply.addExpressions(translateInternal(value)); + } + + return apply; + } else + if(expression instanceof Cast){ Cast cast = (Cast)expression; diff --git a/src/test/java/org/jpmml/sparkml/ExpressionTranslatorTest.java b/src/test/java/org/jpmml/sparkml/ExpressionTranslatorTest.java index 805db241..6b99a309 100644 --- a/src/test/java/org/jpmml/sparkml/ExpressionTranslatorTest.java +++ b/src/test/java/org/jpmml/sparkml/ExpressionTranslatorTest.java @@ -26,6 +26,8 @@ import org.apache.spark.sql.types.DataTypes; import org.apache.spark.sql.types.StructType; import org.dmg.pmml.Apply; +import org.dmg.pmml.Constant; +import org.dmg.pmml.FieldRef; import org.junit.AfterClass; import org.junit.BeforeClass; import org.junit.Test; @@ -53,6 +55,21 @@ public void translateArithmeticExpression(){ checkApply(apply, "/", Apply.class, Apply.class); } + @Test + public void translateCaseWhenExpression(){ + Apply apply = (Apply)translate("SELECT (CASE WHEN x1 < 0 THEN x1 WHEN x2 > 0 THEN x2 ELSE 0 END) FROM __THIS__"); + + List pmmlExpressions = checkApply(apply, "if", Apply.class, FieldRef.class, Apply.class); + + apply = (Apply)pmmlExpressions.get(0); + + checkApply(apply, "lessThan", FieldRef.class, Constant.class); + + apply = (Apply)pmmlExpressions.get(2); + + checkApply(apply, "if", Apply.class, FieldRef.class, Constant.class); + } + @Test public void translateIfExpression(){ Apply apply = (Apply)translate("SELECT if(status in (0, 1), x1 != 0, x2 != 0) FROM __THIS__"); @@ -79,7 +96,7 @@ private org.dmg.pmml.Expression translate(String statement){ } static - private void checkApply(Apply apply, String function, Class... pmmlExpressionClazzes){ + private List checkApply(Apply apply, String function, Class... pmmlExpressionClazzes){ assertEquals(function, apply.getFunction()); List pmmlExpressions = apply.getExpressions(); @@ -91,6 +108,8 @@ private void checkApply(Apply apply, String function, Class Date: Fri, 14 Dec 2018 19:53:39 +0200 Subject: [PATCH 10/19] Added support for the unary minus expression --- .../jpmml/sparkml/ExpressionTranslator.java | 20 +++++++++++++++++++ .../sparkml/ExpressionTranslatorTest.java | 8 ++++++-- 2 files changed, 26 insertions(+), 2 deletions(-) diff --git a/src/main/java/org/jpmml/sparkml/ExpressionTranslator.java b/src/main/java/org/jpmml/sparkml/ExpressionTranslator.java index 8314d053..443c3d92 100644 --- a/src/main/java/org/jpmml/sparkml/ExpressionTranslator.java +++ b/src/main/java/org/jpmml/sparkml/ExpressionTranslator.java @@ -47,7 +47,9 @@ import org.apache.spark.sql.catalyst.expressions.Or; import org.apache.spark.sql.catalyst.expressions.Subtract; import org.apache.spark.sql.catalyst.expressions.UnaryExpression; +import org.apache.spark.sql.catalyst.expressions.UnaryMinus; import org.dmg.pmml.Apply; +import org.dmg.pmml.Constant; import org.dmg.pmml.DataType; import org.dmg.pmml.FieldName; import org.dmg.pmml.FieldRef; @@ -287,6 +289,24 @@ private org.dmg.pmml.Expression translateInternal(Expression expression){ return PMMLUtil.createApply("isMissing", translateInternal(child)); } else + if(expression instanceof UnaryMinus){ + UnaryMinus unaryMinus = (UnaryMinus)unaryExpression; + + org.dmg.pmml.Expression pmmlExpression = translateInternal(child); + + if(pmmlExpression instanceof Constant){ + Constant constant = (Constant)pmmlExpression; + + constant.setValue("-" + constant.getValue()); + + return constant; + } else + + { + return PMMLUtil.createApply("*", PMMLUtil.createConstant(-1), pmmlExpression); + } + } else + { throw new IllegalArgumentException(String.valueOf(unaryExpression)); } diff --git a/src/test/java/org/jpmml/sparkml/ExpressionTranslatorTest.java b/src/test/java/org/jpmml/sparkml/ExpressionTranslatorTest.java index 6b99a309..f2ec8349 100644 --- a/src/test/java/org/jpmml/sparkml/ExpressionTranslatorTest.java +++ b/src/test/java/org/jpmml/sparkml/ExpressionTranslatorTest.java @@ -50,7 +50,11 @@ public void translateLogicalExpression(){ @Test public void translateArithmeticExpression(){ - Apply apply = (Apply)translate("SELECT ((x1 - 1) / (x2 + 1)) FROM __THIS__"); + Apply apply = (Apply)translate("SELECT -((x1 - 1) / (x2 + 1)) FROM __THIS__"); + + List pmmlExpressions = checkApply(apply, "*", Constant.class, Apply.class); + + apply = (Apply)pmmlExpressions.get(1); checkApply(apply, "/", Apply.class, Apply.class); } @@ -72,7 +76,7 @@ public void translateCaseWhenExpression(){ @Test public void translateIfExpression(){ - Apply apply = (Apply)translate("SELECT if(status in (0, 1), x1 != 0, x2 != 0) FROM __THIS__"); + Apply apply = (Apply)translate("SELECT if(status in (-1, 1), x1 != 0, x2 != 0) FROM __THIS__"); checkApply(apply, "if", Apply.class, Apply.class, Apply.class); } From 0ae167652606a8bd217a3e82e0356f686b3b15c5 Mon Sep 17 00:00:00 2001 From: Villu Ruusmann Date: Sat, 15 Dec 2018 18:10:02 +0200 Subject: [PATCH 11/19] Improved support for the 'Interaction' feature type --- .../sparkml/feature/InteractionConverter.java | 24 +++++++++++++++---- .../feature/OneHotEncoderConverter.java | 10 ++++++-- 2 files changed, 28 insertions(+), 6 deletions(-) diff --git a/src/main/java/org/jpmml/sparkml/feature/InteractionConverter.java b/src/main/java/org/jpmml/sparkml/feature/InteractionConverter.java index 4ff47fb8..f1231155 100644 --- a/src/main/java/org/jpmml/sparkml/feature/InteractionConverter.java +++ b/src/main/java/org/jpmml/sparkml/feature/InteractionConverter.java @@ -25,6 +25,7 @@ import org.apache.spark.ml.feature.Interaction; import org.dmg.pmml.DataType; import org.dmg.pmml.FieldName; +import org.jpmml.converter.CategoricalFeature; import org.jpmml.converter.Feature; import org.jpmml.converter.InteractionFeature; import org.jpmml.sparkml.FeatureConverter; @@ -40,7 +41,7 @@ public InteractionConverter(Interaction transformer){ public List encodeFeatures(SparkMLEncoder encoder){ Interaction transformer = getTransformer(); - String name = ""; + StringBuilder sb = new StringBuilder(); List result = new ArrayList<>(); @@ -50,14 +51,29 @@ public List encodeFeatures(SparkMLEncoder encoder){ List features = encoder.getFeatures(inputCol); + if(features.size() == 1){ + Feature feature = features.get(0); + + if(feature instanceof CategoricalFeature){ + CategoricalFeature categoricalFeature = (CategoricalFeature)feature; + + FieldName name = categoricalFeature.getName(); + + // XXX + inputCol = name.getValue(); + + features = OneHotEncoderConverter.encodeFeature(categoricalFeature.getEncoder(), categoricalFeature, categoricalFeature.getValues()); + } + } // End if + if(i == 0){ - name = inputCol; + sb.append(inputCol); result = features; } else { - name += (":" + inputCol); + sb.append(':').append(inputCol); List interactionFeatures = new ArrayList<>(); @@ -66,7 +82,7 @@ public List encodeFeatures(SparkMLEncoder encoder){ for(Feature left : result){ for(Feature right : features){ - interactionFeatures.add(new InteractionFeature(encoder, FieldName.create(name + "[" + index + "]"), DataType.DOUBLE, Arrays.asList(left, right))); + interactionFeatures.add(new InteractionFeature(encoder, FieldName.create(sb.toString() + "[" + index + "]"), DataType.DOUBLE, Arrays.asList(left, right))); index++; } diff --git a/src/main/java/org/jpmml/sparkml/feature/OneHotEncoderConverter.java b/src/main/java/org/jpmml/sparkml/feature/OneHotEncoderConverter.java index badb7dd6..fc676a9b 100644 --- a/src/main/java/org/jpmml/sparkml/feature/OneHotEncoderConverter.java +++ b/src/main/java/org/jpmml/sparkml/feature/OneHotEncoderConverter.java @@ -25,6 +25,7 @@ import org.jpmml.converter.BinaryFeature; import org.jpmml.converter.CategoricalFeature; import org.jpmml.converter.Feature; +import org.jpmml.converter.PMMLEncoder; import org.jpmml.sparkml.FeatureConverter; import org.jpmml.sparkml.SparkMLEncoder; import scala.Option; @@ -39,9 +40,9 @@ public OneHotEncoderConverter(OneHotEncoder transformer){ public List encodeFeatures(SparkMLEncoder encoder){ OneHotEncoder transformer = getTransformer(); - CategoricalFeature feature = (CategoricalFeature)encoder.getOnlyFeature(transformer.getInputCol()); + CategoricalFeature categoricalFeature = (CategoricalFeature)encoder.getOnlyFeature(transformer.getInputCol()); - List values = feature.getValues(); + List values = categoricalFeature.getValues(); boolean dropLast = true; @@ -54,6 +55,11 @@ public List encodeFeatures(SparkMLEncoder encoder){ values = values.subList(0, values.size() - 1); } + return encodeFeature(encoder, categoricalFeature, values); + } + + static + public List encodeFeature(PMMLEncoder encoder, Feature feature, List values){ List result = new ArrayList<>(); for(String value : values){ From e2d03e00816dd5b9c96cb80868adddff13a2c015 Mon Sep 17 00:00:00 2001 From: Villu Ruusmann Date: Wed, 19 Dec 2018 20:13:28 +0200 Subject: [PATCH 12/19] Updated documentation --- README.md | 30 +++++++++++++++--------------- 1 file changed, 15 insertions(+), 15 deletions(-) diff --git a/README.md b/README.md index d863b7f7..f05702a6 100644 --- a/README.md +++ b/README.md @@ -9,19 +9,19 @@ Java library and command-line application for converting Apache Spark ML pipelin * Feature extractors, transformers and selectors: * [`feature.Binarizer`](https://spark.apache.org/docs/latest/api/java/org/apache/spark/ml/feature/Binarizer.html) * [`feature.Bucketizer`](https://spark.apache.org/docs/latest/api/java/org/apache/spark/ml/feature/Bucketizer.html) - * [`feature.ChiSqSelectorModel`](http://spark.apache.org/docs/latest/api/java/org/apache/spark/ml/feature/ChiSqSelectorModel.html) (the result of fitting a `feature.ChiSqSelector`) + * [`feature.ChiSqSelectorModel`](https://spark.apache.org/docs/latest/api/java/org/apache/spark/ml/feature/ChiSqSelectorModel.html) (the result of fitting a `feature.ChiSqSelector`) * [`feature.ColumnPruner`](https://spark.apache.org/docs/latest/api/java/org/apache/spark/ml/feature/ColumnPruner.html) * [`feature.CountVectorizerModel`](https://spark.apache.org/docs/latest/api/java/org/apache/spark/ml/feature/CountVectorizerModel.html) (the result of fitting a `feature.CountVectorizer`) * [`feature.IDFModel`](https://spark.apache.org/docs/latest/api/java/org/apache/spark/ml/feature/IDFModel.html) (the result of fitting a `feature.IDF`) * [`feature.IndexToString`](https://spark.apache.org/docs/latest/api/java/org/apache/spark/ml/feature/IndexToString.html) - * [`feature.Interaction`](http://spark.apache.org/docs/latest/api/java/org/apache/spark/ml/feature/Interaction.html) - * [`feature.MaxAbsScalerModel`](http://spark.apache.org/docs/latest/api/java/org/apache/spark/ml/feature/MaxAbsScalerModel.html) (the result of fitting a `feature.MaxAbsScaler`) - * [`feature.MinMaxScalerModel`](http://spark.apache.org/docs/latest/api/java/org/apache/spark/ml/feature/MinMaxScalerModel.html) (the result of fitting a `feature.MinMaxScaler`) + * [`feature.Interaction`](https://spark.apache.org/docs/latest/api/java/org/apache/spark/ml/feature/Interaction.html) + * [`feature.MaxAbsScalerModel`](https://spark.apache.org/docs/latest/api/java/org/apache/spark/ml/feature/MaxAbsScalerModel.html) (the result of fitting a `feature.MaxAbsScaler`) + * [`feature.MinMaxScalerModel`](https://spark.apache.org/docs/latest/api/java/org/apache/spark/ml/feature/MinMaxScalerModel.html) (the result of fitting a `feature.MinMaxScaler`) * [`feature.NGram`](https://spark.apache.org/docs/latest/api/java/org/apache/spark/ml/feature/NGram.html) * [`feature.OneHotEncoder`](https://spark.apache.org/docs/latest/api/java/org/apache/spark/ml/feature/OneHotEncoder.html) * [`feature.PCAModel`](https://spark.apache.org/docs/latest/api/java/org/apache/spark/ml/feature/PCAModel.html) (the result of fitting a `feature.PCA`) - * [`feature.QuantileDiscretizer`](http://spark.apache.org/docs/latest/api/java/org/apache/spark/ml/feature/QuantileDiscretizer.html) - * [`feature.RegexTokenizer`](http://spark.apache.org/docs/latest/api/java/org/apache/spark/ml/feature/RegexTokenizer.html) + * [`feature.QuantileDiscretizer`](https://spark.apache.org/docs/latest/api/java/org/apache/spark/ml/feature/QuantileDiscretizer.html) + * [`feature.RegexTokenizer`](https://spark.apache.org/docs/latest/api/java/org/apache/spark/ml/feature/RegexTokenizer.html) * [`feature.RFormulaModel`](https://spark.apache.org/docs/latest/api/java/org/apache/spark/ml/feature/RFormulaModel.html) (the result of fitting a `feature.RFormula`) * [`feature.SQLTransformer`](https://spark.apache.org/docs/latest/api/java/org/apache/spark/ml/feature/SQLTransformer.html) * [`feature.StandardScalerModel`](https://spark.apache.org/docs/latest/api/java/org/apache/spark/ml/feature/StandardScalerModel.html) (the result of fitting a `feature.StandardScaler`) @@ -31,15 +31,15 @@ Java library and command-line application for converting Apache Spark ML pipelin * [`feature.VectorAssembler`](https://spark.apache.org/docs/latest/api/java/org/apache/spark/ml/feature/VectorAssembler.html) * [`feature.VectorAttributeRewriter`](https://spark.apache.org/docs/latest/api/java/org/apache/spark/ml/feature/VectorAttributeRewriter.html) * [`feature.VectorIndexerModel`](https://spark.apache.org/docs/latest/api/java/org/apache/spark/ml/feature/VectorIndexerModel.html) (the result of fitting a `feature.VectorIndexer`) - * [`feature.VectorSlicer`](http://spark.apache.org/docs/latest/api/java/org/apache/spark/ml/feature/VectorSlicer.html) + * [`feature.VectorSlicer`](https://spark.apache.org/docs/latest/api/java/org/apache/spark/ml/feature/VectorSlicer.html) * Prediction models: * [`classification.DecisionTreeClassificationModel`](https://spark.apache.org/docs/latest/api/java/org/apache/spark/ml/classification/DecisionTreeClassificationModel.html) - * [`classification.GBTClassificationModel`](http://spark.apache.org/docs/latest/api/java/org/apache/spark/ml/classification/GBTClassificationModel.html) + * [`classification.GBTClassificationModel`](https://spark.apache.org/docs/latest/api/java/org/apache/spark/ml/classification/GBTClassificationModel.html) * [`classification.LogisticRegressionModel`](https://spark.apache.org/docs/latest/api/java/org/apache/spark/ml/classification/LogisticRegressionModel.html) - * [`classification.MultilayerPerceptronClassificationModel`](http://spark.apache.org/docs/latest/api/java/org/apache/spark/ml/classification/MultilayerPerceptronClassificationModel.html) - * [`classification.NaiveBayesModel`](http://spark.apache.org/docs/latest/api/java/org/apache/spark/ml/classification/NaiveBayesModel.html) + * [`classification.MultilayerPerceptronClassificationModel`](https://spark.apache.org/docs/latest/api/java/org/apache/spark/ml/classification/MultilayerPerceptronClassificationModel.html) + * [`classification.NaiveBayesModel`](https://spark.apache.org/docs/latest/api/java/org/apache/spark/ml/classification/NaiveBayesModel.html) * [`classification.RandomForestClassificationModel`](https://spark.apache.org/docs/latest/api/java/org/apache/spark/ml/classification/RandomForestClassificationModel.html) - * [`clustering.KMeansModel`](http://spark.apache.org/docs/latest/api/java/org/apache/spark/ml/clustering/KMeansModel.html) + * [`clustering.KMeansModel`](https://spark.apache.org/docs/latest/api/java/org/apache/spark/ml/clustering/KMeansModel.html) * [`regression.DecisionTreeRegressionModel`](https://spark.apache.org/docs/latest/api/java/org/apache/spark/ml/regression/DecisionTreeRegressionModel.html) * [`regression.GBTRegressionModel`](https://spark.apache.org/docs/latest/api/java/org/apache/spark/ml/regression/GBTRegressionModel.html) * [`regression.GeneralizedLinearRegressionModel`](https://spark.apache.org/docs/latest/api/java/org/apache/spark/ml/regression/GeneralizedLinearRegressionModel.html) @@ -64,7 +64,7 @@ Java library and command-line application for converting Apache Spark ML pipelin ## Library ## -JPMML-SparkML library JAR file (together with accompanying Java source and Javadocs JAR files) is released via [Maven Central Repository](http://repo1.maven.org/maven2/org/jpmml/). +JPMML-SparkML library JAR file (together with accompanying Java source and Javadocs JAR files) is released via [Maven Central Repository](https://repo1.maven.org/maven2/org/jpmml/). The current version is **1.1.21** (2 October, 2018). @@ -150,7 +150,7 @@ The downside of shading is that such relocated classes are incompatible with oth ## Example application ## -Enter the project root directory and build using [Apache Maven](http://maven.apache.org/): +Enter the project root directory and build using [Apache Maven](https://maven.apache.org/): ``` mvn clean install ``` @@ -193,7 +193,7 @@ JAXBUtil.marshalPMML(pmml, new StreamResult(System.out)); Please refer to the following resources for more ideas and code examples: -* [Converting Apache Spark ML pipeline models to PMML](http://openscoring.io/blog/2018/07/09/converting_sparkml_pipeline_pmml/) +* [Converting Apache Spark ML pipeline models to PMML](https://openscoring.io/blog/2018/07/09/converting_sparkml_pipeline_pmml/) ## Example application ## @@ -213,7 +213,7 @@ spark-submit --master local --class org.jpmml.sparkml.Main target/jpmml-sparkml- # License # -JPMML-SparkML is dual-licensed under the [GNU Affero General Public License (AGPL) version 3.0](http://www.gnu.org/licenses/agpl-3.0.html), and a commercial license. +JPMML-SparkML is dual-licensed under the [GNU Affero General Public License (AGPL) version 3.0](https://www.gnu.org/licenses/agpl-3.0.html), and a commercial license. # Additional information # From 2103b3786b6932015a57de2ce0dbf0ceda2cb43f Mon Sep 17 00:00:00 2001 From: Villu Ruusmann Date: Thu, 20 Dec 2018 23:01:45 +0200 Subject: [PATCH 13/19] Updated test resources --- .../org/jpmml/sparkml/ClassificationTest.java | 2 +- .../resources/csv/LogisticRegressionAudit.csv | 3798 ++++++++--------- .../pipeline/LogisticRegressionAudit.zip | Bin 29241 -> 19156 bytes 3 files changed, 1900 insertions(+), 1900 deletions(-) diff --git a/src/test/java/org/jpmml/sparkml/ClassificationTest.java b/src/test/java/org/jpmml/sparkml/ClassificationTest.java index 6897612e..24b8e882 100644 --- a/src/test/java/org/jpmml/sparkml/ClassificationTest.java +++ b/src/test/java/org/jpmml/sparkml/ClassificationTest.java @@ -40,7 +40,7 @@ public void evaluateGLMAudit() throws Exception { @Test public void evaluateLogisticRegressionAudit() throws Exception { - evaluate("LogisticRegression", "Audit"); + evaluate("LogisticRegression", "Audit", new PMMLEquivalence(5e-10, 5e-10)); } @Test diff --git a/src/test/resources/csv/LogisticRegressionAudit.csv b/src/test/resources/csv/LogisticRegressionAudit.csv index cd7eed6e..d80e62ae 100644 --- a/src/test/resources/csv/LogisticRegressionAudit.csv +++ b/src/test/resources/csv/LogisticRegressionAudit.csv @@ -1,1900 +1,1900 @@ Adjusted,probability(0),probability(1) -0,0.9852517857693757,0.014748214230624324 -0,0.9915686679063811,0.008431332093618977 -0,0.9756055496125006,0.024394450387499322 -1,0.47898360957505726,0.5210163904249427 -1,0.3143129490524115,0.6856870509475884 -0,0.9446055892301489,0.05539441076985108 -1,0.21505216143338515,0.7849478385666149 -0,0.7072127417321178,0.2927872582678822 -0,0.9767138673098477,0.02328613269015226 -0,0.9862342890972676,0.013765710902732323 -0,0.9943752786087005,0.005624721391299542 -0,0.9254664961770497,0.07453350382295026 -0,0.9980301581084442,0.00196984189155576 -0,0.97532795133177,0.024672048668230015 -1,0.13193064223713222,0.8680693577628678 -0,0.9802505880462388,0.019749411953761196 -0,0.9789502437872507,0.021049756212749206 -0,0.8037479558707626,0.19625204412923739 -1,0.4505309192523312,0.5494690807476689 -1,0.48071120777652115,0.5192887922234789 -0,0.9114128440610808,0.08858715593891929 -0,0.7852887158807934,0.21471128411920656 -0,0.9982925071313251,0.0017074928686749199 -0,0.7817956955631841,0.21820430443681602 -0,0.9366358790827718,0.06336412091722822 -0,0.8951061953121514,0.10489380468784852 -0,0.9515987337788447,0.048401266221155294 -0,0.7542016942931397,0.24579830570686043 -0,0.5874188284478882,0.4125811715521119 -0,0.8103215155110008,0.18967848448899918 -0,0.7557515867854276,0.24424841321457239 -0,0.71242992849797,0.28757007150203 -0,0.9965366442304783,0.0034633557695218477 -0,0.9691524071920429,0.030847592807957104 -0,0.9752114128268459,0.024788587173154047 -0,0.9460288901581099,0.05397110984189013 -0,0.9106958109875434,0.08930418901245656 -0,0.9481563073004395,0.05184369269956043 -0,0.6763202671122233,0.32367973288777674 -0,0.9549929716163087,0.0450070283836914 -1,0.22052262303268505,0.779477376967315 -0,0.9394417579958517,0.060558242004148166 -0,0.7167180982691265,0.28328190173087353 -0,0.9684151696772602,0.031584830322739815 -0,0.7895310767162725,0.21046892328372743 -1,0.290350422298776,0.7096495777012239 -0,0.9751540044813686,0.0248459955186314 -1,0.22098366778250217,0.7790163322174978 -0,0.8931026828455809,0.10689731715441911 -1,0.4691986071139684,0.5308013928860317 -0,0.9668348325525962,0.03316516744740381 -1,0.10164069868444565,0.8983593013155543 -0,0.8776013008363821,0.12239869916361791 -0,0.997369703919304,0.0026302960806959554 -0,0.8027411221060098,0.19725887789399016 -0,0.8112852949881697,0.18871470501183038 -0,0.9397973218094464,0.060202678190553714 -0,0.9801075354178247,0.019892464582175435 -0,0.9569038995713165,0.0430961004286836 -0,0.555513806154512,0.444486193845488 -0,0.8801122827340979,0.11988771726590211 -1,0.48191199740984303,0.518088002590157 -0,0.9667215209204016,0.03327847907959834 -1,0.49491910268651695,0.505080897313483 -0,0.9233917939734324,0.07660820602656764 -0,0.9809392701599994,0.0190607298400006 -1,0.18356763308807122,0.8164323669119289 -0,0.8163253780402787,0.18367462195972126 -0,0.9769759970539661,0.023024002946033992 -0,0.9760065213476075,0.023993478652392524 -0,0.6829985887207751,0.3170014112792248 -0,0.6409822394648531,0.3590177605351469 -0,0.9922190136489671,0.007780986351032831 -0,0.6186175888283925,0.3813824111716076 -1,0.4776282986543629,0.5223717013456372 -0,0.9981686649451588,0.001831335054841342 -0,0.9973960690684217,0.0026039309315783357 -1,0.18226932610865834,0.8177306738913417 -0,0.9513413498358625,0.04865865016413747 -0,0.9804738432638375,0.019526156736162568 -0,0.9597633864325611,0.040236613567438975 -0,0.7556018834856206,0.24439811651437948 -0,0.9915006837170184,0.008499316282981504 -1,0.21799433975170973,0.7820056602482902 -0,0.9944841368764546,0.0055158631235452515 -0,0.8467169638035328,0.15328303619646724 -0,0.9948812288623722,0.005118771137627902 -0,0.6673950089348122,0.3326049910651878 -0,0.9941146132073351,0.005885386792664968 -0,0.9653850825869156,0.03461491741308436 -0,0.5311472091710804,0.4688527908289196 -0,0.6121988670624404,0.3878011329375595 -0,0.9935243401429619,0.006475659857038071 -1,0.10466806881218235,0.8953319311878176 -1,0.4753434247170245,0.5246565752829756 -1,0.4413479123428486,0.5586520876571514 -0,0.7537386456436542,0.24626135435634577 -0,0.7048139430055526,0.2951860569944475 -0,0.7752367720155987,0.2247632279844013 -1,0.47654297136397133,0.5234570286360287 -0,0.977494641167534,0.02250535883246595 -0,0.7895994528804301,0.21040054711957007 -0,0.5156060781160173,0.4843939218839827 -0,0.9469531326811893,0.053046867318810705 -1,0.3640066414512922,0.6359933585487079 -0,0.9786029808317273,0.021397019168272816 -0,0.9789736258385352,0.02102637416146491 -0,0.5700989477300747,0.4299010522699252 -0,0.9212825709215102,0.07871742907848969 -0,0.6970263828108784,0.3029736171891217 -0,0.9448416846049538,0.055158315395046155 -0,0.9624455426379225,0.03755445736207751 -1,0.23265643980327952,0.7673435601967205 -0,0.976547437367129,0.023452562632870915 -0,0.9744589048566976,0.02554109514330249 -1,0.44328627822482514,0.5567137217751749 -0,0.9623369960982298,0.03766300390177026 -0,0.9988031963197128,0.0011968036802872599 -1,0.4886462727371735,0.5113537272628265 -0,0.7354202577116709,0.2645797422883292 -0,0.9933796595290542,0.0066203404709457205 -0,0.9956808321445358,0.004319167855464254 -0,0.786434511787811,0.21356548821218904 -0,0.9693259288648969,0.03067407113510312 -0,0.6328923162043296,0.36710768379567044 -0,0.9788686712992531,0.02113132870074685 -0,0.9905575751594556,0.009442424840544496 -1,0.1796340100414536,0.8203659899585464 -0,0.7483618841036349,0.2516381158963651 -0,0.9348350114687897,0.06516498853121032 -0,0.9785308901181258,0.0214691098818743 -0,0.695292489524697,0.3047075104753029 -1,0.2383030884045869,0.7616969115954132 -0,0.8700903199285268,0.1299096800714732 -1,0.4244800523982463,0.5755199476017536 -0,0.9843801324732817,0.015619867526718324 -0,0.9673367876986232,0.03266321230137685 -0,0.9935945441746707,0.006405455825329383 -0,0.9954267864192216,0.004573213580778429 -0,0.9709155402254135,0.029084459774586513 -0,0.8216467818213951,0.17835321817860503 -0,0.9771698204351503,0.02283017956484973 -0,0.8006168475233408,0.19938315247665908 -0,0.949502357599536,0.05049764240046406 -0,0.7938673698879676,0.20613263011203245 -0,0.8734790798918136,0.12652092010818644 -1,0.2534930501920949,0.7465069498079051 -0,0.8085734707671915,0.19142652923280845 -0,0.9693681641150362,0.0306318358849638 -1,0.24341487106328935,0.7565851289367106 -0,0.8539439897123319,0.14605601028766801 -1,0.21397522888394696,0.7860247711160531 -0,0.8028801327911762,0.19711986720882382 -0,0.9792770892081334,0.02072291079186657 -0,0.9119747373745736,0.0880252626254265 -1,0.20740797626670712,0.792592023733293 -0,0.7179238327269247,0.2820761672730752 -0,0.6734003213329564,0.32659967866704365 -0,0.5287217847884451,0.47127821521155494 -0,0.7793328614700217,0.22066713852997835 -0,0.5293284135387011,0.470671586461299 -0,0.5430140065303949,0.45698599346960517 -0,0.7330394994211856,0.26696050057881426 -0,0.8621290942545051,0.1378709057454949 -0,0.9945615001507043,0.00543849984929562 -1,0.4152648179838122,0.5847351820161878 -0,0.9347703994307048,0.06522960056929505 -0,0.7239632319919179,0.2760367680080821 -1,0.30317080436611216,0.6968291956338878 -0,0.8359222236848406,0.16407777631515943 -0,0.8450735994131479,0.15492640058685211 -0,0.9985861055088195,0.0014138944911805417 -0,0.9802454673234972,0.01975453267650278 -0,0.9788086493439716,0.021191350656028476 -0,0.9980481120783833,0.001951887921616685 -0,0.6147055185169303,0.38529448148306966 -0,0.9699487156832943,0.030051284316705642 -0,0.8720934179990263,0.12790658200097368 -1,0.08808556429237394,0.911914435707626 -1,0.40993095644154104,0.590069043558459 -0,0.9255078087272239,0.07449219127277594 -0,0.9824191510501317,0.017580848949868343 -0,0.9429872786494453,0.057012721350554796 -0,0.6684709405701078,0.3315290594298922 -0,0.9062459247699985,0.09375407523000136 -0,0.9747014271885087,0.0252985728114914 -0,0.7176678973365722,0.28233210266342784 -0,0.9972447640049641,0.0027552359950358354 -1,0.23656470391978793,0.763435296080212 -0,0.7602571799429364,0.2397428200570636 -0,0.9728381204313461,0.027161879568653784 -0,0.7350513030796949,0.26494869692030504 -0,0.9758802413143148,0.02411975868568514 -0,0.9812214600058199,0.01877853999418013 -0,0.8037968904499485,0.19620310955005138 -0,0.793918193435758,0.20608180656424194 -0,0.9435087612216552,0.0564912387783448 -0,0.7342976032278077,0.2657023967721923 -0,0.973043482752569,0.02695651724743087 -0,0.9941156179275029,0.005884382072497095 -0,0.7400615146218453,0.2599384853781547 -0,0.770640357119386,0.22935964288061397 -0,0.938710004493034,0.06128999550696602 -0,0.9990358296547774,9.641703452225222E-4 -0,0.8001988190182073,0.19980118098179275 -0,0.9917865836518093,0.008213416348190705 -1,0.15585397386926847,0.8441460261307316 -0,0.9060610992344437,0.0939389007655563 -0,0.9795142809836122,0.02048571901638786 -1,0.13426296404053478,0.8657370359594653 -0,0.9487980813685158,0.05120191863148406 -0,0.9772119926365896,0.022788007363410315 -0,0.9171847286338756,0.08281527136612438 -0,0.9647090691822658,0.03529093081773414 -1,0.3303224508443032,0.6696775491556968 -0,0.994188143543036,0.005811856456964012 -0,0.9718309934861601,0.028169006513839866 -0,0.9859654407160877,0.014034559283912278 -0,0.9955272064515837,0.004472793548416302 -0,0.6445727144772451,0.35542728552275493 -0,0.6694386811112532,0.33056131888874685 -0,0.6943165711794843,0.3056834288205157 -0,0.7202981668952693,0.2797018331047306 -0,0.9817383228431041,0.01826167715689599 -0,0.7059416948402495,0.29405830515975045 -0,0.9983936370054046,0.0016063629945952864 -0,0.9374450080283271,0.06255499197167287 -0,0.8153563586015071,0.18464364139849296 -0,0.6830204600330047,0.31697953996699535 -0,0.740709173577754,0.25929082642224593 -0,0.6325363597535415,0.3674636402464585 -0,0.7918255342165631,0.20817446578343693 -0,0.9754952310519113,0.02450476894808876 -0,0.7088318072103542,0.29116819278964584 -0,0.9796620473659555,0.020337952634044452 -0,0.7070445355022547,0.29295546449774545 -1,0.2949703822496853,0.7050296177503147 -1,0.16295920712514866,0.8370407928748513 -0,0.9743487669510269,0.02565123304897309 -0,0.9848320459999501,0.015167954000049862 -1,0.11702169721294006,0.8829783027870599 -0,0.6901088917598656,0.30989110824013444 -0,0.9725382292680163,0.02746177073198381 -1,0.42178772708746215,0.5782122729125379 -0,0.531077821831869,0.46892217816813103 -1,0.35400170731271663,0.6459982926872834 -0,0.7182319280533072,0.2817680719466929 -0,0.9421587879307681,0.057841212069231894 -1,0.08082347592871499,0.919176524071285 -0,0.8143531929339616,0.18564680706603848 -0,0.557435880448364,0.44256411955163605 -0,0.9877344517701271,0.012265548229873005 -0,0.7463403486100794,0.2536596513899207 -0,0.9720974406783938,0.027902559321606298 -0,0.9723699316996046,0.0276300683003955 -1,0.38182179960424323,0.6181782003957568 -0,0.9717805770683788,0.02821942293162127 -0,0.9293671814011891,0.07063281859881078 -1,0.4022056775311615,0.5977943224688385 -0,0.7084246521889788,0.2915753478110212 -1,0.2946714290438384,0.7053285709561616 -0,0.8994303652284632,0.10056963477153671 -0,0.7630945631216719,0.23690543687832805 -0,0.9630955249017539,0.03690447509824603 -0,0.9681865950605036,0.03181340493949644 -0,0.6514100703928165,0.34858992960718344 -0,0.5599600749160927,0.4400399250839072 -0,0.8888716794474757,0.11112832055252421 -0,0.9752790400959527,0.024720959904047362 -0,0.9945377304207199,0.005462269579280081 -0,0.6248592099973925,0.3751407900026076 -0,0.6944667210982973,0.3055332789017027 -0,0.9332482325080519,0.06675176749194818 -0,0.7002445844476937,0.29975541555230634 -0,0.5495393571631281,0.4504606428368719 -0,0.7783171888117278,0.22168281118827216 -1,0.2973345535864584,0.7026654464135417 -1,0.326238598834981,0.673761401165019 -0,0.8652294500697114,0.13477054993028853 -1,0.14085661820405063,0.8591433817959493 -1,0.341843864935556,0.6581561350644439 -1,0.1918769506062636,0.8081230493937364 -1,0.21071477318688253,0.7892852268131175 -0,0.5839931142446728,0.4160068857553272 -1,0.47454332370674235,0.5254566762932577 -0,0.9950333237446041,0.004966676255396037 -0,0.9910279266578582,0.008972073342141815 -0,0.8894323803172458,0.11056761968275422 -0,0.9917390904650439,0.008260909534956175 -0,0.9827096687571646,0.017290331242835494 -0,0.9286410017608421,0.0713589982391579 -0,0.9799551699579696,0.02004483004203046 -1,0.10968357986049959,0.8903164201395004 -0,0.9795475180066769,0.020452481993323026 -0,0.9264269629370792,0.07357303706292086 -0,0.9906285707944952,0.009371429205504838 -0,0.9719867383822116,0.02801326161778842 -0,0.9515545266036379,0.04844547339636197 -1,0.3513626071016943,0.6486373928983057 -0,0.9779904081601081,0.022009591839892012 -0,0.996091433416011,0.003908566583988909 -0,0.7149501557638376,0.28504984423616253 -0,0.598055875673954,0.40194412432604604 -0,0.9693547919850775,0.030645208014922626 -0,0.9639819613269044,0.03601803867309562 -1,0.1509751321424874,0.8490248678575126 -0,0.9417077973441654,0.05829220265583455 -0,0.9818107352503169,0.01818926474968315 -0,0.9497771083250496,0.050222891674950414 -0,0.8773319087869887,0.12266809121301127 -0,0.9944391970796806,0.005560802920319377 -0,0.8844468408547866,0.11555315914521326 -1,0.176336795594672,0.823663204405328 -0,0.6544106328394566,0.3455893671605434 -0,0.9936573945720182,0.006342605427981898 -0,0.9885828211626345,0.011417178837365522 -0,0.9894027564496718,0.010597243550328185 -0,0.7631244514035522,0.23687554859644777 -0,0.967316478354052,0.032683521645948094 -0,0.5732180112989024,0.42678198870109757 -0,0.9563151167319495,0.04368488326805051 -1,0.23812919630181506,0.7618708036981849 -0,0.7803523320398679,0.2196476679601321 -0,0.892179729931274,0.10782027006872597 -0,0.9483819964703304,0.05161800352966971 -1,0.28418273347932194,0.715817266520678 -0,0.9337411780884374,0.06625882191156256 -0,0.9829264172925697,0.017073582707430292 -0,0.8987030949133273,0.10129690508667274 -0,0.8163690621874812,0.1836309378125188 -0,0.7067906109493917,0.29320938905060834 -1,0.2563466423925204,0.7436533576074796 -0,0.7962097718829021,0.20379022811709793 -0,0.9017947779910059,0.09820522200899401 -0,0.9444854201390985,0.0555145798609014 -0,0.7679211908918181,0.2320788091081819 -0,0.8368402976669557,0.16315970233304425 -0,0.9598056286855619,0.040194371314438114 -0,0.769300697458573,0.23069930254142693 -0,0.9012920727746544,0.09870792722534572 -1,0.1425593929980097,0.8574406070019902 -0,0.9908690835410303,0.009130916458969586 -1,0.3292582038842794,0.6707417961157206 -0,0.9791650140834173,0.02083498591658278 -0,0.8299065099914039,0.17009349000859608 -0,0.9577967588392023,0.04220324116079757 -0,0.7485120317624475,0.25148796823755254 -0,0.9682179602279994,0.03178203977200048 -0,0.9815347386878684,0.0184652613121315 -0,0.7339997043873577,0.26600029561264227 -0,0.6811908913310958,0.3188091086689042 -0,0.6275823706396351,0.3724176293603648 -0,0.9930206859995576,0.006979314000442285 -0,0.9911415816555929,0.008858418344407204 -0,0.9131522378073872,0.08684776219261275 -0,0.7635019246485262,0.2364980753514738 -0,0.6022515232114826,0.3977484767885175 -0,0.9803717231745144,0.019628276825485527 -0,0.9228263702915244,0.07717362970847562 -0,0.925220638873925,0.07477936112607508 -0,0.8131204338437519,0.18687956615624812 -0,0.7598592399704794,0.24014076002952053 -0,0.9650803623725921,0.03491963762740798 -0,0.9788126335841141,0.02118736641588589 -0,0.7937137236151447,0.20628627638485525 -0,0.9912674244068161,0.008732575593183828 -0,0.6610829300772035,0.3389170699227965 -0,0.7203811165409187,0.2796188834590812 -1,0.29637611375151846,0.7036238862484816 -0,0.5354693731188545,0.4645306268811456 -0,0.9532793874085119,0.04672061259148804 -0,0.9353695816823413,0.06463041831765873 -0,0.5266716985976171,0.47332830140238297 -0,0.992925102542978,0.0070748974570218936 -0,0.5324148151320609,0.46758518486793904 -0,0.95950403182278,0.040495968177220024 -0,0.9715513254749572,0.028448674525042718 -0,0.9104486791534773,0.08955132084652272 -0,0.9984910390623403,0.0015089609376596474 -0,0.9720027439158403,0.02799725608415977 -0,0.749236180700746,0.2507638192992539 -0,0.926357978629571,0.07364202137042906 -0,0.9939557990825222,0.00604420091747778 -0,0.6544262633221439,0.345573736677856 -0,0.7138567787857558,0.2861432212142441 -1,0.29706929071253435,0.7029307092874657 -0,0.9793201394205164,0.02067986057948349 -0,0.759315706371347,0.2406842936286529 -0,0.8726942329398525,0.12730576706014748 -0,0.9928686235340958,0.0071313764659042145 -0,0.9652967489424411,0.03470325105755887 -0,0.5367679861174657,0.4632320138825343 -0,0.9915588236734789,0.008441176326521072 -0,0.9205391415423768,0.07946085845762331 -0,0.9907178104042755,0.00928218959572449 -1,0.15879766707782872,0.8412023329221712 -0,0.7004630698078277,0.2995369301921722 -0,0.8550400821040836,0.14495991789591645 -0,0.965486071566677,0.03451392843332293 -0,0.988563666653263,0.011436333346737009 -0,0.9741141899926109,0.025885810007389085 -0,0.5433893497773093,0.4566106502226907 -0,0.5889414793441202,0.4110585206558797 -0,0.9921948248642627,0.0078051751357372775 -0,0.8168429154778184,0.18315708452218157 -0,0.9094978835688384,0.09050211643116148 -0,0.9849664110046028,0.015033588995397138 -0,0.6225842753107681,0.37741572468923207 -0,0.6380398681725565,0.3619601318274435 -0,0.9488885360805175,0.0511114639194825 -0,0.680526762288999,0.31947323771100106 -1,0.4254683462094632,0.5745316537905367 -0,0.6893725966715881,0.31062740332841193 -0,0.7298633684588878,0.2701366315411123 -0,0.9910134572843907,0.008986542715609213 -0,0.7150020445707465,0.2849979554292536 -0,0.9835030032642027,0.01649699673579727 -0,0.7509170570993641,0.24908294290063598 -1,0.34671260967388223,0.6532873903261178 -0,0.925345732778226,0.07465426722177404 -0,0.9834906039923026,0.016509396007697342 -1,0.2174590179569691,0.7825409820430309 -1,0.16641559276548773,0.8335844072345122 -1,0.37574125359292093,0.6242587464070791 -0,0.8178002041338039,0.182199795866196 -0,0.9523382323747188,0.04766176762528125 -0,0.8469610461550722,0.15303895384492777 -1,0.4791290111598596,0.5208709888401404 -0,0.6264381014102207,0.37356189858977923 -0,0.8220424195640116,0.17795758043598842 -0,0.8277179068250944,0.17228209317490556 -0,0.6902156209268904,0.30978437907310963 -0,0.7906565806460538,0.20934341935394618 -0,0.7729412952870649,0.22705870471293507 -1,0.4730571541875913,0.5269428458124087 -0,0.9796975731819727,0.020302426818027377 -0,0.6196863979828904,0.38031360201710956 -0,0.991241830377675,0.00875816962232511 -0,0.7703796014447991,0.2296203985552008 -0,0.803633977344865,0.1963660226551351 -0,0.9684994391378156,0.03150056086218452 -0,0.9977503056972842,0.0022496943027158992 -0,0.7318507584881927,0.2681492415118073 -1,0.26726348374980746,0.7327365162501924 -1,0.1730402263929075,0.8269597736070924 -0,0.9982584982074155,0.0017415017925845639 -1,0.46205076108709503,0.5379492389129049 -1,0.1754675805132918,0.8245324194867081 -0,0.9494374204766436,0.05056257952335645 -0,0.9736510796698582,0.02634892033014185 -0,0.9930076972940636,0.006992302705936508 -0,0.9903700517317615,0.009629948268238497 -0,0.7287182417281296,0.2712817582718704 -0,0.9548517638704604,0.045148236129539644 -1,0.4915227506245502,0.5084772493754498 -0,0.9240780504530356,0.07592194954696431 -0,0.5844933866794582,0.4155066133205419 -1,0.46533773792778915,0.5346622620722108 -1,0.24244855286233843,0.7575514471376615 -0,0.9978466042941776,0.002153395705822459 -1,0.4021557596672168,0.5978442403327832 -0,0.8177248242596268,0.1822751757403731 -0,0.6642633715968788,0.3357366284031212 -0,0.737698387848542,0.2623016121514579 -0,0.9933194194857854,0.00668058051421457 -0,0.8894556623475685,0.11054433765243149 -0,0.9805575983580196,0.01944240164198046 -0,0.9261089997944073,0.07389100020559268 -0,0.9800676466641941,0.019932353335805984 -1,0.30299221414640304,0.697007785853597 -0,0.9290622906141984,0.07093770938580166 -0,0.8285232030453902,0.17147679695460977 -0,0.9191730566735203,0.08082694332647956 -0,0.9942854519170173,0.0057145480829826 -0,0.5339417389186566,0.46605826108134346 -1,0.3763604830983394,0.6236395169016605 -1,0.423112505067615,0.576887494932385 -1,0.37361347416672475,0.6263865258332753 -0,0.696724564303815,0.303275435696185 -0,0.9968670645438374,0.0031329354561626193 -0,0.7516427187996727,0.2483572812003274 -0,0.9983180268507169,0.0016819731492831941 -1,0.40839350031561367,0.5916064996843863 -0,0.7768117458710426,0.22318825412895735 -1,0.2821807505129384,0.7178192494870617 -1,0.4514435289270868,0.5485564710729132 -0,0.970956623257885,0.02904337674211496 -0,0.7871552254510958,0.21284477454890413 -0,0.7773439657183487,0.22265603428165118 -0,0.9689201670667171,0.031079832933282973 -1,0.42042300422301715,0.5795769957769829 -0,0.9722799379512969,0.027720062048703094 -0,0.9688706796956521,0.031129320304347962 -0,0.5297334315276657,0.4702665684723343 -0,0.7708560703523768,0.2291439296476232 -0,0.5793155432076066,0.4206844567923933 -1,0.2709743986885437,0.7290256013114562 -0,0.9954812052490407,0.004518794750959328 -0,0.9971004495829223,0.0028995504170777073 -0,0.6845970603576715,0.31540293964232846 -0,0.7974543193209108,0.20254568067908915 -0,0.7266720846165725,0.27332791538342743 -0,0.99362014954948,0.006379850450519918 -0,0.9572901232396863,0.042709876760313674 -0,0.9778893968894068,0.022110603110593197 -0,0.6874065781818677,0.3125934218181323 -0,0.9854780192864517,0.01452198071354825 -0,0.9655205783148362,0.034479421685163845 -0,0.9937166569377569,0.00628334306224305 -1,0.2543337364316055,0.7456662635683945 -0,0.8913810090999803,0.10861899090001964 -0,0.9739035098218417,0.026096490178158224 -0,0.9792953118846696,0.020704688115330452 -0,0.7104935335980951,0.2895064664019049 -0,0.9944913239922172,0.005508676007782821 -0,0.963552052610907,0.03644794738909295 -0,0.9826009446083614,0.017399055391638652 -0,0.9928261114345852,0.007173888565414808 -0,0.8614640971136662,0.1385359028863338 -1,0.20838382052499194,0.7916161794750081 -0,0.5727493044719869,0.4272506955280131 -0,0.7240250466626971,0.27597495333730304 -0,0.9282532584820684,0.07174674151793167 -0,0.8179140313335277,0.18208596866647228 -0,0.9931482156225574,0.006851784377442601 -0,0.742031816075474,0.257968183924526 -0,0.792886819251624,0.20711318074837606 -0,0.7824452665038815,0.2175547334961186 -0,0.6363337783729961,0.3636662216270039 -0,0.5202518494667054,0.4797481505332945 -0,0.881679096592955,0.11832090340704506 -0,0.9685691224951609,0.03143087750483914 -1,0.2561748446541208,0.7438251553458791 -0,0.995004269985025,0.004995730014974943 -0,0.978127560139499,0.021872439860501025 -0,0.8332808047503285,0.16671919524967152 -0,0.9291399787850229,0.0708600212149772 -0,0.7900711425811543,0.2099288574188458 -0,0.9811867473455281,0.01881325265447184 -0,0.9866225623929692,0.013377437607030931 -0,0.7240785310965925,0.2759214689034075 -0,0.7236952794550632,0.2763047205449369 -1,0.25305176257693324,0.7469482374230667 -0,0.7471161276669731,0.25288387233302684 -1,0.36170305802075137,0.6382969419792487 -0,0.9927736026416898,0.007226397358310223 -0,0.9923302122676556,0.007669787732344342 -1,0.14848858554908365,0.8515114144509163 -0,0.982766154637957,0.017233845362042963 -0,0.5808089299359652,0.41919107006403483 -0,0.5370457795442583,0.46295422045574175 -0,0.8682631082104405,0.1317368917895595 -1,0.46690476458520724,0.5330952354147928 -0,0.995274438360993,0.004725561639006834 -0,0.6390777100606361,0.36092228993936387 -0,0.7548486584527403,0.24515134154725976 -0,0.5377025940444372,0.4622974059555628 -0,0.6166073179848992,0.3833926820151008 -0,0.8951409914980906,0.10485900850190938 -1,0.32714252407520156,0.6728574759247985 -0,0.9408213101998056,0.05917868980019433 -0,0.9292489379208976,0.07075106207910231 -1,0.3654412241737064,0.6345587758262936 -1,0.1498967528849749,0.8501032471150252 -1,0.47987874905593164,0.5201212509440684 -0,0.7467084577250781,0.253291542274922 -1,0.1101968137496294,0.8898031862503707 -0,0.9335129964290586,0.0664870035709414 -0,0.9504975927883641,0.04950240721163597 -0,0.8314492678825257,0.16855073211747426 -0,0.711906892358743,0.28809310764125706 -0,0.9186861843589668,0.0813138156410333 -0,0.9980209796103745,0.00197902038962539 -0,0.9385691751555704,0.06143082484442961 -0,0.9890965331018322,0.010903466898167888 -1,0.20136520623576676,0.7986347937642332 -0,0.9895575145770985,0.010442485422901512 -0,0.7349593137856663,0.2650406862143337 -0,0.9764772164188185,0.023522783581181612 -0,0.7172481596685991,0.28275184033140094 -0,0.9931392067095817,0.006860793290418313 -0,0.9866845212866211,0.013315478713378934 -0,0.9874318803549051,0.012568119645094992 -0,0.606745183830739,0.393254816169261 -0,0.7042824085639912,0.2957175914360088 -0,0.9744239125094615,0.025576087490538534 -0,0.7200002400972595,0.27999975990274056 -0,0.9430785855937945,0.05692141440620546 -0,0.8673487095995001,0.13265129040050005 -0,0.9308996779549293,0.06910032204507077 -0,0.9918923990918368,0.00810760090816324 -1,0.29383082529681875,0.7061691747031813 -0,0.5985364208746138,0.4014635791253863 -0,0.6130593172651426,0.3869406827348573 -0,0.9984088938744885,0.0015911061255113844 -0,0.8968325868037452,0.10316741319625489 -1,0.33607749388210006,0.6639225061178998 -0,0.6312395506349571,0.368760449365043 -0,0.7003939414026936,0.2996060585973063 -1,0.21470472187483688,0.7852952781251632 -0,0.9667823596876807,0.03321764031231933 -0,0.922455697942572,0.07754430205742807 -0,0.9768515005349896,0.02314849946501044 -1,0.40380893778996385,0.5961910622100361 -0,0.9541500962547746,0.04584990374522541 -0,0.8332546433325024,0.16674535666749757 -0,0.9215167998934214,0.0784832001065786 -1,0.23478665396003817,0.7652133460399618 -0,0.6329175272449676,0.36708247275503236 -0,0.7547597807389579,0.24524021926104214 -0,0.655308970645821,0.34469102935417895 -1,0.3676364604214619,0.6323635395785381 -0,0.7566568685319978,0.2433431314680023 -0,0.9171292369324487,0.08287076306755123 -0,0.9334339703311165,0.06656602966888339 -0,0.8851993745452107,0.11480062545478924 -0,0.9846249483760275,0.015375051623972458 -0,0.9264320984476564,0.07356790155234368 -0,0.7647629596040066,0.23523704039599344 -0,0.8967484951860722,0.10325150481392768 -0,0.903608722684181,0.09639127731581901 -0,0.9388601038437346,0.0611398961562654 -0,0.8923127831551808,0.10768721684481908 -0,0.9152547788465493,0.08474522115345082 -1,0.38641456107763356,0.6135854389223664 -0,0.9759655532616639,0.024034446738335977 -0,0.975523359727071,0.024476640272929027 -0,0.9949822358834178,0.005017764116582144 -0,0.9726576085854111,0.02734239141458889 -0,0.7184737346985354,0.2815262653014645 -0,0.7886081254564953,0.21139187454350483 -0,0.9934864716668363,0.0065135283331636575 -0,0.8567619069863529,0.14323809301364715 -0,0.5629739660444462,0.43702603395555384 -0,0.9423711056887669,0.05762889431123303 -0,0.8676972043737144,0.13230279562628566 -0,0.8754710878663097,0.12452891213369033 -0,0.7158367410477127,0.2841632589522874 -0,0.9497235465207293,0.05027645347927073 -0,0.6833923006861798,0.31660769931382016 -0,0.815072497746117,0.184927502253883 -1,0.03513225588084148,0.9648677441191585 -0,0.9921770675806592,0.007822932419340869 -0,0.9952247096377076,0.004775290362292393 -0,0.7716408982848871,0.22835910171511298 -0,0.9721080545870917,0.027891945412908264 -0,0.992835496302169,0.007164503697830895 -0,0.9724425501634126,0.027557449836587474 -1,0.492649592575047,0.5073504074249531 -1,0.058250732581515315,0.9417492674184847 -0,0.9738471352893239,0.026152864710676134 -0,0.9983671631531984,0.001632836846801694 -0,0.9230505789345255,0.07694942106547459 -1,0.036117214157587355,0.9638827858424127 -0,0.9848444401414234,0.015155559858576648 -0,0.9737020303997723,0.026297969600227664 -1,0.14677723982613716,0.8532227601738629 -1,0.22849528419011164,0.7715047158098883 -0,0.7207564887407001,0.2792435112592999 -0,0.9693973795799716,0.03060262042002841 -0,0.7129300389279508,0.28706996107204924 -0,0.958812156892873,0.04118784310712702 -0,0.9903479240037353,0.009652075996264727 -0,0.9712392344437178,0.02876076555628226 -0,0.7781909153215987,0.22180908467840135 -0,0.9721273873589017,0.027872612641098294 -1,0.24266046964447804,0.7573395303555219 -0,0.7288110205297392,0.27118897947026077 -1,0.3541905060322019,0.6458094939677981 -0,0.9605569645932897,0.039443035406710375 -0,0.9431222212175268,0.056877778782473305 -0,0.7987366876232393,0.2012633123767606 -1,0.4013650285383877,0.5986349714616124 -0,0.9966308905535501,0.00336910944644978 -0,0.9885953484606068,0.01140465153939315 -0,0.9798495307672264,0.020150469232773627 -0,0.8328066543479301,0.16719334565206986 -1,0.28910834355352355,0.7108916564464766 -0,0.9722873133057401,0.027712686694259806 -0,0.9705269420048386,0.029473057995161468 -0,0.9860481223026603,0.01395187769733984 -0,0.5526946124049711,0.44730538759502897 -0,0.9791256595092253,0.020874340490774634 -0,0.6211017133122133,0.37889828668778675 -0,0.8989509817418619,0.1010490182581381 -0,0.6039005379812771,0.3960994620187229 -0,0.9642138471115128,0.03578615288848714 -0,0.9985327913879,0.001467208612099903 -1,0.4994916732713125,0.5005083267286876 -0,0.9351375871895684,0.06486241281043166 -0,0.6918115737942564,0.3081884262057436 -0,0.783959673587726,0.216040326412274 -0,0.6565371720493741,0.3434628279506258 -0,0.987476690962075,0.012523309037924979 -0,0.9927646270263538,0.007235372973646063 -0,0.6442047818225305,0.3557952181774695 -0,0.7995821888203752,0.20041781117962484 -0,0.8221683909889346,0.17783160901106548 -0,0.9279098811126636,0.07209011888733638 -0,0.7059473960797221,0.294052603920278 -1,0.24633425251082727,0.7536657474891727 -1,0.4954251945115791,0.504574805488421 -0,0.7925225583437067,0.20747744165629334 -0,0.6369902144200008,0.3630097855799992 -0,0.7991027026903269,0.20089729730967318 -0,0.9521164999788533,0.0478835000211467 -0,0.9186207021572608,0.08137929784273926 -0,0.7109591526378085,0.2890408473621915 -1,0.42356715506788806,0.5764328449321119 -1,0.22012908809341758,0.7798709119065824 -0,0.7325654491611616,0.2674345508388383 -0,0.6966129101316881,0.30338708986831187 -0,0.9724155063796001,0.027584493620400052 -0,0.5284634360938885,0.4715365639061116 -0,0.5845871514416419,0.41541284855835814 -1,0.22203302667546573,0.7779669733245343 -0,0.9912902203293047,0.008709779670695183 -0,0.9954470605464885,0.004552939453511446 -0,0.9748354930466387,0.02516450695336127 -0,0.9182776689947071,0.08172233100529289 -0,0.9537213013861424,0.04627869861385765 -0,0.9655620707550527,0.03443792924494719 -0,0.8841057001306784,0.1158942998693216 -0,0.9651959184156458,0.034804081584354093 -0,0.9719261226039903,0.028073877396009816 -1,0.38136588723720444,0.6186341127627956 -1,0.27912832615857497,0.720871673841425 -0,0.9978620974231392,0.002137902576860726 -1,0.2476114199365347,0.7523885800634653 -0,0.9055512455326146,0.09444875446738546 -0,0.892257281349434,0.10774271865056603 -0,0.6808963201886814,0.3191036798113186 -0,0.9787375392340945,0.02126246076590557 -0,0.8820209924635816,0.11797900753641832 -0,0.9643517463975395,0.035648253602460545 -1,0.3727476182993714,0.6272523817006286 -0,0.7447129893096948,0.25528701069030524 -1,0.27332560786223714,0.7266743921377629 -1,0.46099446510634773,0.5390055348936523 -1,0.14225619059945283,0.8577438094005472 -0,0.9759352123854567,0.024064787614543285 -0,0.9931276843368693,0.006872315663130632 -1,0.4854494040642817,0.5145505959357183 -1,0.4771294831156005,0.5228705168843996 -0,0.9781087288016473,0.02189127119835261 -0,0.9817657718438846,0.018234228156115397 -0,0.975115732987035,0.024884267012964992 -0,0.910500298177501,0.08949970182249901 -0,0.9630712467259882,0.036928753274011746 -0,0.8053393083098691,0.1946606916901309 -0,0.9168013226526005,0.08319867734739958 -0,0.959242938891636,0.040757061108363975 -0,0.9982480253579387,0.0017519746420612701 -0,0.9980317853437076,0.0019682146562924325 -0,0.697596444702148,0.30240355529785207 -0,0.7454901387744608,0.2545098612255392 -1,0.20218534891048778,0.7978146510895121 -1,0.4443286575742882,0.5556713424257117 -0,0.9979152382311292,0.002084761768870871 -0,0.8036361368916548,0.19636386310834533 -0,0.8716405080165257,0.1283594919834743 -1,0.34257901491759246,0.6574209850824076 -0,0.9458738068014972,0.05412619319850276 -0,0.9925064268879888,0.007493573112011179 -0,0.9273594889245929,0.07264051107540723 -0,0.9973037642038962,0.0026962357961039093 -0,0.6996228960267062,0.30037710397329376 -1,0.2619452454848999,0.7380547545151002 -1,0.25217798291762106,0.7478220170823789 -0,0.9790156889707757,0.020984311029224274 -0,0.640152863480048,0.3598471365199521 -0,0.7233230930435788,0.27667690695642116 -0,0.5717569045219187,0.4282430954780813 -0,0.8228731311227296,0.17712686887727025 -0,0.8864446914895923,0.1135553085104077 -1,0.3687109991875601,0.6312890008124398 -1,0.3116878145227045,0.6883121854772954 -0,0.9763114182889746,0.023688581711025537 -0,0.9757641886714132,0.02423581132858685 -0,0.735147723093198,0.2648522769068021 -0,0.9717019924762942,0.028298007523705836 -0,0.9867046795203113,0.0132953204796887 -0,0.9747697094398455,0.025230290560154408 -0,0.9960905342406776,0.003909465759322412 -0,0.5597080765754077,0.4402919234245924 -0,0.7370478012151334,0.26295219878486664 -0,0.6574756855417371,0.342524314458263 -1,0.35151294432488583,0.6484870556751141 -0,0.9947185910589182,0.005281408941081691 -0,0.9931940267691124,0.006805973230887543 -0,0.9519068140473063,0.04809318595269387 -1,0.40566826850934734,0.5943317314906527 -1,0.24644281074330204,0.7535571892566979 -0,0.9743606874205496,0.025639312579450346 -0,0.9804160240449237,0.019583975955076282 -0,0.99521965603403,0.0047803439659700004 -0,0.9366403967396778,0.06335960326032226 -0,0.8848939188740418,0.11510608112595809 -0,0.9921768397333022,0.007823160266697776 -0,0.5923832583147124,0.40761674168528755 -0,0.6721381010133648,0.32786189898663526 -0,0.9766789190813127,0.023321080918687315 -1,0.2603763439138043,0.7396236560861957 -0,0.9728511126510168,0.027148887348983245 -0,0.792701834013598,0.20729816598640202 -0,0.7032976748357576,0.29670232516424244 -0,0.9809694171461943,0.019030582853805742 -0,0.9342618683582554,0.06573813164174465 -0,0.6354409254002445,0.36455907459975545 -0,0.8018638781082216,0.1981361218917784 -0,0.978506299458375,0.021493700541625013 -0,0.837907807788823,0.1620921922111769 -0,0.5092922108529047,0.49070778914709534 -1,0.3681517199893687,0.6318482800106313 -0,0.5091074750127529,0.4908925249872472 -0,0.9753291668409652,0.02467083315903472 -0,0.6475266659378941,0.3524733340621059 -0,0.9065218792336135,0.09347812076638651 -0,0.9196791428744336,0.0803208571255664 -0,0.9982460345511485,0.0017539654488515075 -0,0.953401042376081,0.04659895762391902 -0,0.9892968966962081,0.010703103303791811 -0,0.7366449907471383,0.26335500925286176 -0,0.8397200007691804,0.1602799992308195 -0,0.9948558562847274,0.005144143715272638 -0,0.8021325035609871,0.19786749643901283 -0,0.5916646903306516,0.4083353096693483 -0,0.9747332213473907,0.025266778652609182 -0,0.7286211289017634,0.27137887109823655 -0,0.9958553021455999,0.004144697854399988 -0,0.9788762720852974,0.021123727914702576 -0,0.9827033999055805,0.017296600094419586 -0,0.9915410752459365,0.008458924754063445 -1,0.43360951064044495,0.5663904893595549 -0,0.7140494115315,0.2859505884684999 -0,0.6627983787021243,0.3372016212978757 -0,0.9805877091471733,0.01941229085282669 -0,0.9488534561050629,0.051146543894937044 -1,0.36741728893204684,0.6325827110679532 -0,0.9731372880516358,0.026862711948364263 -0,0.9982528157737262,0.0017471842262739077 -1,0.06201115011285169,0.9379888498871484 -0,0.9930269810297011,0.006973018970298964 -0,0.8172968098148229,0.18270319018517717 -0,0.9983125138503987,0.0016874861496014733 -0,0.9790665510559587,0.02093344894404123 -1,0.25591189401183567,0.7440881059881643 -0,0.6564024836772366,0.34359751632276336 -1,0.3902820028708786,0.6097179971291213 -1,0.13805538753254304,0.8619446124674569 -0,0.6706249979535839,0.32937500204641607 -0,0.9711381373632826,0.028861862636717375 -0,0.5749690030435611,0.42503099695643887 -0,0.9600989026489911,0.039901097351008843 -0,0.8951464197992882,0.10485358020071175 -0,0.6548188641316659,0.3451811358683341 -1,0.4310424292767378,0.5689575707232621 -1,0.34304286989489285,0.6569571301051071 -0,0.9748668055664683,0.025133194433531535 -1,0.23038700842953752,0.7696129915704625 -0,0.8129996323580145,0.18700036764198552 -1,0.3069792636468008,0.6930207363531992 -1,0.20401469980023954,0.7959853001997605 -1,0.2651371825383057,0.7348628174616944 -0,0.971422629947492,0.028577370052507982 -0,0.7612144282657355,0.2387855717342644 -1,0.21569375368802637,0.7843062463119735 -0,0.9941027620481139,0.005897237951886168 -0,0.5393600611468535,0.46063993885314647 -1,0.16914034158348626,0.8308596584165138 -0,0.9634784212663094,0.036521578733690475 -0,0.9770811756687946,0.022918824331205335 -0,0.9734224166335772,0.026577583366422835 -0,0.5257407766852324,0.47425922331476755 -0,0.9609847835869193,0.03901521641308077 -1,0.46700743898937813,0.5329925610106218 -0,0.8221127592086508,0.17788724079134924 -0,0.9618566023486111,0.038143397651388855 -0,0.8058877505145033,0.19411224948549666 -0,0.9742330745210964,0.025766925478903514 -0,0.9507134042727163,0.04928659572728376 -0,0.776453934739227,0.22354606526077306 -0,0.9112704166256198,0.08872958337438017 -0,0.8864774581810527,0.11352254181894726 -0,0.563154206182014,0.436845793817986 -0,0.973109121759422,0.026890878240577905 -1,0.39519473178393516,0.6048052682160648 -0,0.5663501589048671,0.4336498410951329 -0,0.8875170373520044,0.1124829626479956 -0,0.8878384369103114,0.11216156308968858 -1,0.2900328361609227,0.7099671638390773 -1,0.1420168971023988,0.8579831028976013 -0,0.9853768906225211,0.014623109377478771 -1,0.38439736360395793,0.6156026363960421 -0,0.9705898265620452,0.02941017343795476 -0,0.7524460841854225,0.24755391581457745 -1,0.1624306041011548,0.8375693958988452 -1,0.47289423659675084,0.5271057634032491 -0,0.9935954963874969,0.006404503612503141 -0,0.927001120215114,0.07299887978488585 -0,0.9763626004863926,0.023637399513607493 -0,0.9717857460928994,0.028214253907100622 -1,0.20502581754965507,0.7949741824503449 -0,0.9980597255255071,0.0019402744744929903 -0,0.7561552056255632,0.24384479437443687 -0,0.7955040182970619,0.20449598170293823 -1,0.18306351712568336,0.8169364828743166 -0,0.5866542582596377,0.4133457417403623 -1,0.47334930729252106,0.5266506927074789 -0,0.9932636643046435,0.006736335695356517 -0,0.9973983792520882,0.002601620747911673 -0,0.9375951879224272,0.06240481207757282 -0,0.9810673564979371,0.018932643502062824 -0,0.8682570413711257,0.13174295862887428 -0,0.9446929339920966,0.055307066007903416 -1,0.39899041862369605,0.6010095813763039 -0,0.6146760527626902,0.3853239472373099 -1,0.1263951534892716,0.8736048465107284 -0,0.9979768555417938,0.002023144458206254 -0,0.9780749217720099,0.02192507822799016 -0,0.7046219906381597,0.2953780093618403 -0,0.9978362476515149,0.002163752348485077 -0,0.9101706754638917,0.0898293245361083 -0,0.8557225590904969,0.14427744090950306 -0,0.9960650646402578,0.003934935359742092 -1,0.12131188911342163,0.8786881108865785 -1,0.33896571821515525,0.6610342817848448 -0,0.6779028148039954,0.32209718519600455 -0,0.9722729306818456,0.027727069318154416 -1,0.4121697121647647,0.5878302878352353 -0,0.5583553944193125,0.4416446055806875 -0,0.9661541091066455,0.03384589089335449 -0,0.9906970750645204,0.00930292493547966 -0,0.6272215881446069,0.37277841185539307 -0,0.6230356300487228,0.3769643699512772 -0,0.8467883519234256,0.1532116480765743 -0,0.9979243656018154,0.0020756343981845316 -0,0.6662178980746726,0.33378210192532753 -0,0.9829722732015838,0.01702772679841622 -0,0.98161218620747,0.01838781379252989 -1,0.4956815544619754,0.5043184455380245 -1,0.3355927483786306,0.6644072516213694 -0,0.9985125922623903,0.001487407737609703 -0,0.9801674247326423,0.019832575267357704 -0,0.8925190025485629,0.10748099745143716 -0,0.654208839366842,0.34579116063315796 -0,0.9982279479837097,0.0017720520162901971 -0,0.950316224607733,0.049683775392266885 -0,0.7669656790381972,0.2330343209618028 -0,0.9751760339186744,0.024823966081325716 -1,0.28853260939458275,0.7114673906054173 -0,0.9980973484298783,0.0019026515701216322 -0,0.9585160396375166,0.04148396036248335 -1,0.4087194605337158,0.5912805394662842 -0,0.7975157715581747,0.20248422844182543 -1,0.2461620488657825,0.7538379511342175 -0,0.9754201896867151,0.02457981031328498 -0,0.953879252422636,0.04612074757736387 -1,0.23487134266001206,0.765128657339988 -0,0.9458438963621357,0.05415610363786426 -0,0.9113946357986177,0.08860536420138235 -0,0.9703838135276722,0.02961618647232784 -0,0.5304199591786565,0.4695800408213435 -0,0.9516539708456767,0.04834602915432332 -1,0.4679984987717034,0.5320015012282966 -1,0.4806587764252964,0.5193412235747036 -0,0.7029593704303577,0.2970406295696423 -1,0.2553534391194108,0.7446465608805892 -0,0.9775026630031645,0.022497336996835524 -0,0.8327332880606131,0.16726671193938694 -0,0.9782132696033315,0.021786730396668383 -0,0.7950286586326738,0.2049713413673262 -0,0.9938211331303038,0.006178866869696207 -0,0.9600366007428135,0.039963399257186415 -0,0.9934535084317482,0.006546491568251885 -0,0.7328686185282541,0.26713138147174587 -0,0.7412524448706875,0.25874755512931247 -0,0.9774378565639912,0.02256214343600875 -1,0.20101871422448192,0.7989812857755181 -0,0.971153259639007,0.028846740360993033 -0,0.8014076341536963,0.19859236584630366 -0,0.6497662009966143,0.35023379900338564 -0,0.8748694499447681,0.12513055005523185 -1,0.38309850460515465,0.6169014953948454 -0,0.9758354387568537,0.02416456124314622 -0,0.9746512950327055,0.02534870496729455 -0,0.9513168172216754,0.0486831827783247 -0,0.6287623842172908,0.37123761578270925 -0,0.9590114463186749,0.04098855368132517 -1,0.30635773364189245,0.6936422663581076 -0,0.9505543646739815,0.049445635326018506 -0,0.9898050478145144,0.010194952185485537 -1,0.46631541869761767,0.5336845813023823 -1,0.2346456758296166,0.7653543241703834 -0,0.9900203065740755,0.009979693425924443 -0,0.944591303276362,0.055408696723638115 -0,0.7240829299231456,0.27591707007685445 -0,0.9733016082994824,0.026698391700517635 -1,0.10099451001262111,0.8990054899873788 -1,0.4869905071901308,0.5130094928098692 -0,0.9646510129942913,0.03534898700570873 -0,0.7206081893075387,0.2793918106924614 -0,0.9929517189574523,0.007048281042547732 -0,0.9715490053675723,0.02845099463242775 -0,0.9685156217136539,0.03148437828634604 -0,0.6175152083682464,0.38248479163175353 -0,0.5895292706540218,0.4104707293459783 -0,0.9233995934220127,0.0766004065779873 -0,0.9515535564708693,0.048446443529130655 -0,0.9755270002039168,0.024472999796083136 -0,0.6450634011875622,0.35493659881243766 -0,0.8120774333343056,0.18792256666569437 -0,0.6663498565816963,0.3336501434183037 -0,0.748381637133851,0.251618362866149 -0,0.9947430361041919,0.0052569638958081255 -1,0.1530389755271846,0.8469610244728154 -0,0.9628547036181077,0.03714529638189247 -0,0.7392995236622247,0.2607004763377752 -1,0.40105137637124777,0.5989486236287522 -0,0.7495324539979074,0.2504675460020927 -0,0.9641839286982473,0.03581607130175272 -0,0.5258507599385501,0.4741492400614499 -0,0.7215046090603167,0.2784953909396834 -0,0.9801293485722757,0.019870651427724234 -1,0.28290686533960663,0.7170931346603934 -0,0.9931943159527411,0.006805684047258816 -0,0.8998637538033085,0.10013624619669155 -0,0.7159549175978652,0.2840450824021348 -0,0.6224568137980072,0.37754318620199284 -0,0.7873100945799073,0.2126899054200927 -0,0.8370939635097348,0.16290603649026533 -0,0.9589444439004295,0.04105555609957054 -0,0.9872303268300134,0.012769673169986605 -0,0.9261703099543529,0.07382969004564713 -0,0.592456615966446,0.40754338403355395 -0,0.526233851053339,0.4737661489466611 -1,0.4324126281574888,0.5675873718425112 -0,0.9824757911608619,0.01752420883913816 -0,0.7990148695470032,0.20098513045299687 -1,0.42171032503923506,0.5782896749607649 -0,0.9622329573044857,0.03776704269551446 -0,0.9147200722782117,0.08527992772178822 -0,0.9209688917416103,0.07903110825838976 -0,0.7979445121143688,0.20205548788563124 -1,0.38648535611271084,0.613514643887289 -0,0.9915031215249221,0.008496878475077947 -0,0.9930731182750228,0.00692688172497721 -1,0.4745661655080944,0.5254338344919056 -0,0.8502030152050927,0.14979698479490736 -0,0.9905402670289062,0.00945973297109377 -0,0.9693989043374394,0.030601095662560578 -0,0.9672877941109315,0.03271220588906844 -0,0.9614418522531176,0.03855814774688243 -0,0.9807467262282153,0.01925327377178474 -0,0.9885085397617664,0.011491460238233548 -0,0.9625181958960785,0.037481804103921504 -0,0.8281103381173432,0.1718896618826567 -0,0.9975126508276566,0.0024873491723434392 -1,0.499939412205156,0.5000605877948441 -1,0.41420306799787304,0.585796932002127 -0,0.9259222442285003,0.07407775577149968 -1,0.028741771379286924,0.971258228620713 -0,0.9982294880959476,0.0017705119040523636 -1,0.48893079848734106,0.5110692015126589 -0,0.9981445376032286,0.0018554623967713172 -0,0.9772402150190213,0.022759784980978647 -0,0.9205895176741432,0.07941048232585671 -0,0.9663716030469665,0.033628396953033594 -0,0.6624406201207297,0.3375593798792703 -0,0.9945629285631045,0.005437071436895576 -0,0.9979486616584652,0.002051338341534757 -0,0.6648350716477104,0.33516492835228956 -0,0.7117270507973317,0.2882729492026684 -0,0.9932678468243725,0.006732153175627412 -0,0.994765728452085,0.0052342715479149786 -0,0.8300293928327895,0.16997060716721044 -1,0.20459207247494804,0.795407927525052 -1,0.2719319340320198,0.7280680659679802 -0,0.9786939031767389,0.021306096823261175 -1,0.2074196442358734,0.7925803557641267 -0,0.9902403308062935,0.009759669193706478 -0,0.9981436483918671,0.0018563516081328841 -0,0.9817314562557983,0.018268543744201827 -0,0.8148466785871787,0.1851533214128213 -0,0.9943632096133189,0.00563679038668105 -1,0.21454566490785118,0.7854543350921488 -0,0.910230360507468,0.08976963949253192 -0,0.7736186761516419,0.22638132384835816 -0,0.8130572559879721,0.18694274401202796 -0,0.8888812313175011,0.11111876868249898 -1,0.2005077959691083,0.7994922040308917 -0,0.9722934508689954,0.027706549131004503 -0,0.8021111930870573,0.19788880691294275 -0,0.7231413012821405,0.27685869871785945 -0,0.96099290326144,0.03900709673855982 -0,0.9911100989415422,0.008889901058457843 -1,0.2982815393689707,0.7017184606310293 -0,0.9975511893330282,0.002448810666971713 -0,0.5647840839195185,0.4352159160804814 -0,0.8025068168262565,0.1974931831737436 -0,0.6750328739451403,0.32496712605485967 -1,0.3259043786657552,0.6740956213342447 -0,0.9556897495717049,0.044310250428295186 -0,0.9787240129026342,0.021275987097365816 -0,0.746696441944514,0.25330355805548593 -0,0.9954920599301957,0.0045079400698042815 -0,0.9215254300910788,0.07847456990892124 -0,0.9645338427002818,0.03546615729971828 -0,0.9934850046493052,0.0065149953506948065 -0,0.6389413014059054,0.36105869859409456 -0,0.5485661093051039,0.4514338906948962 -0,0.9675235609465546,0.03247643905344551 -0,0.6415704066924914,0.3584295933075086 -0,0.580961010600921,0.419038989399079 -0,0.9776464686298009,0.022353531370198996 -0,0.9744423252831528,0.02555767471684721 -0,0.7977169300933183,0.20228306990668177 -0,0.9713348985244004,0.028665101475599506 -0,0.8561420844767046,0.14385791552329533 -0,0.9667310081668684,0.033268991833131714 -0,0.9973538790843132,0.002646120915686759 -0,0.920963323766702,0.07903667623329796 -0,0.9669530854390831,0.03304691456091693 -0,0.8154414378894137,0.18455856211058633 -1,0.174041523959212,0.825958476040788 -1,0.3522222205291981,0.6477777794708018 -0,0.5850985783426982,0.41490142165730176 -0,0.8621773421193086,0.13782265788069148 -0,0.6861873230261989,0.31381267697380105 -0,0.6514503215624032,0.34854967843759677 -0,0.5689032009361478,0.43109679906385223 -0,0.9777217680835916,0.02227823191640847 -0,0.9960228309085957,0.003977169091404272 -1,0.1823644222019176,0.8176355777980825 -0,0.9546521605414533,0.04534783945854672 -1,0.4161358903772387,0.5838641096227614 -0,0.9615805618306753,0.03841943816932459 -0,0.5132380242552717,0.4867619757447283 -0,0.7829128800774239,0.2170871199225762 -0,0.9404816804332057,0.05951831956679439 -1,0.23890362177124932,0.7610963782287508 -0,0.9733598830136296,0.0266401169863703 -1,0.33058536875978556,0.6694146312402144 -0,0.8886038271885797,0.1113961728114204 -0,0.8664902068174655,0.13350979318253448 -0,0.9747743418803013,0.02522565811969869 -0,0.8124691480965514,0.18753085190344865 -0,0.9986257437282732,0.0013742562717267883 -0,0.9504573336792401,0.0495426663207598 -0,0.989144486549476,0.010855513450523999 -0,0.9583438946112374,0.041656105388762715 -0,0.9941023995828678,0.005897600417132237 -0,0.7045940083794979,0.2954059916205021 -0,0.7675952560905637,0.23240474390943633 -0,0.9912194732366655,0.008780526763334478 -0,0.9742504393083921,0.0257495606916079 -0,0.9425562645544371,0.05744373544556289 -0,0.9942209464219495,0.005779053578050611 -0,0.7481738676614055,0.2518261323385944 -1,0.4996143807101943,0.5003856192898056 -0,0.8157576684420422,0.1842423315579578 -0,0.8272002470993239,0.17279975290067606 -1,0.13278051315704986,0.8672194868429501 -0,0.9684272338850859,0.03157276611491404 -0,0.9774364692645016,0.022563530735498567 -0,0.7051556201598883,0.29484437984011175 -0,0.9515205567498389,0.048479443250161076 -0,0.9923467418154135,0.00765325818458642 -0,0.6573237251173818,0.3426762748826182 -0,0.9918718014320768,0.008128198567923265 -1,0.38386569230050765,0.6161343076994923 -0,0.9174643149903036,0.08253568500969638 -0,0.8178198407477509,0.182180159252249 -0,0.7235775486248565,0.27642245137514354 -0,0.9833940694922059,0.016605930507794207 -0,0.9937161201198116,0.006283879880188368 -0,0.8820697470446038,0.11793025295539611 -1,0.15835324257708216,0.8416467574229178 -1,0.1839409897403034,0.8160590102596967 -1,0.4064972087060157,0.5935027912939844 -0,0.9608977829313635,0.03910221706863652 -0,0.7443382176535159,0.25566178234648407 -0,0.6739657072249418,0.32603429277505824 -0,0.9294941803856303,0.07050581961436972 -1,0.14553390782569287,0.854466092174307 -0,0.703713671860435,0.29628632813956507 -0,0.6255197713781756,0.37448022862182445 -0,0.9914306768856345,0.008569323114365474 -0,0.9930731907261799,0.006926809273820084 -0,0.982028427641345,0.01797157235865508 -0,0.9615350335551935,0.03846496644480649 -0,0.998194235400527,0.0018057645994731272 -1,0.2293270758290097,0.7706729241709903 -0,0.9972737299018027,0.002726270098197271 -0,0.9897098887089262,0.010290111291073756 -0,0.9669538022557524,0.03304619774424756 -0,0.9989082428094738,0.00109175719052632 -0,0.6125238151499519,0.38747618485004803 -0,0.994578241853029,0.005421758146971078 -0,0.9803901571377,0.019609842862300005 -0,0.972990116938061,0.02700988306193909 -0,0.9102884097257717,0.08971159027422827 -0,0.904373900953738,0.09562609904626204 -0,0.98230372129475,0.017696278705250108 -0,0.965637457569504,0.034362542430496 -0,0.8200151586787463,0.17998484132125367 -0,0.6361280163717412,0.36387198362825873 -0,0.9711540003141798,0.02884599968582026 -0,0.9979564052500072,0.002043594749992955 -0,0.7275152154646145,0.27248478453538544 -0,0.5644403865550163,0.43555961344498373 -0,0.9754004391743097,0.024599560825690148 -0,0.9412359057450346,0.05876409425496539 -0,0.9904149329048265,0.00958506709517349 -0,0.985481948659304,0.014518051340696038 -1,0.24307979710854705,0.7569202028914529 -0,0.7356346683370948,0.26436533166290527 -1,0.12719252028909261,0.8728074797109074 -0,0.979120712528925,0.02087928747107503 -0,0.94667605921011,0.05332394078988999 -1,0.2218514436433087,0.7781485563566913 -0,0.8693701768753095,0.13062982312469051 -0,0.9948449997192246,0.005155000280775313 -0,0.9822835218216338,0.017716478178366146 -1,0.4821942178637379,0.517805782136262 -0,0.6010193505494712,0.3989806494505288 -0,0.979751690786255,0.020248309213744955 -0,0.9805421324318183,0.019457867568181696 -0,0.5662772304481434,0.43372276955185657 -0,0.9760197210843531,0.023980278915646993 -0,0.7153429298940025,0.28465707010599745 -1,0.46089427949299694,0.539105720507003 -0,0.9590451440842624,0.04095485591573759 -0,0.9516919515730913,0.04830804842690873 -0,0.9584194530548767,0.04158054694512319 -0,0.9925932650215714,0.007406734978428608 -1,0.334953502532379,0.665046497467621 -1,0.22941257117715638,0.7705874288228437 -0,0.9938980882536426,0.006101911746357495 -0,0.9813566643649436,0.018643335635056293 -0,0.964130664715804,0.03586933528419589 -0,0.8090399722712133,0.19096002772878673 -1,0.10877515239309339,0.8912248476069067 -0,0.9176162164898805,0.08238378351011942 -0,0.7157468908184055,0.28425310918159447 -0,0.9909564245043706,0.009043575495629466 -0,0.8127953301396256,0.18720466986037443 -1,0.39827834375236354,0.6017216562476365 -1,0.4074347223466744,0.5925652776533256 -0,0.8138547596156481,0.18614524038435193 -0,0.5062830798987615,0.4937169201012384 -0,0.9946839425056494,0.005316057494350544 -0,0.9598167352735782,0.040183264726421704 -1,0.21514398463163556,0.7848560153683644 -0,0.781891431378343,0.2181085686216569 -0,0.8881861239615232,0.11181387603847681 -0,0.8021235270513228,0.19787647294867716 -0,0.807359228784195,0.1926407712158051 -0,0.7377589756959825,0.2622410243040176 -1,0.4933013989927432,0.5066986010072567 -1,0.48861257387922974,0.5113874261207703 -0,0.9850093079644711,0.014990692035529019 -0,0.6742825358058967,0.32571746419410325 -0,0.7628861837246417,0.23711381627535844 -0,0.9833019955444774,0.016698004455522636 -0,0.5474981478259109,0.4525018521740891 -1,0.4227929760316338,0.5772070239683662 -0,0.9939987590063187,0.006001240993681372 -1,0.4182846749994824,0.5817153250005176 -0,0.979643234771866,0.02035676522813408 -0,0.9951230462780468,0.0048769537219531325 -0,0.9710516017773206,0.028948398222679337 -0,0.6882604360386246,0.31173956396137537 -0,0.9602379571960387,0.03976204280396133 -0,0.5202686255298599,0.4797313744701401 -0,0.8686869422813005,0.1313130577186995 -0,0.9798569210049471,0.020143078995052775 -0,0.9288597251547598,0.07114027484524015 -0,0.7341820413696231,0.26581795863037705 -0,0.9544067471789013,0.04559325282109867 -0,0.8383515495693482,0.1616484504306518 -0,0.7690736830710475,0.23092631692895244 -1,0.37978077206071403,0.620219227939286 -0,0.8043082794957942,0.19569172050420583 -0,0.5721889976995314,0.42781100230046865 -0,0.8173713800491367,0.1826286199508634 -0,0.641460421516959,0.3585395784830409 -0,0.9684850903449966,0.03151490965500336 -1,0.3304036891398536,0.6695963108601464 -0,0.6798444473235474,0.3201555526764525 -0,0.9724516071868454,0.027548392813154545 -0,0.9682767601640072,0.03172323983599284 -1,0.07014295438013937,0.9298570456198607 -0,0.9744558643536821,0.025544135646317735 -0,0.9953187488887808,0.004681251111219106 -0,0.8950875472654619,0.10491245273453817 -0,0.9145359904674578,0.08546400953254225 -0,0.9764092586550766,0.023590741344923477 -0,0.9583405805040166,0.04165941949598348 -0,0.8688090151597386,0.13119098484026132 -0,0.9123749366472272,0.08762506335277272 -0,0.6497951692059121,0.350204830794088 -0,0.9414570619499618,0.05854293805003812 -0,0.6131410817615075,0.38685891823849244 -0,0.9941386632283099,0.0058613367716899645 -0,0.9786175902980606,0.021382409701939355 -1,0.45003651585518956,0.5499634841448104 -1,0.17872611117338671,0.8212738888266132 -0,0.6420053349684052,0.35799466503159477 -0,0.9862154517209303,0.013784548279069612 -0,0.9542774458065212,0.04572255419347884 -0,0.9739132357297389,0.026086764270261107 -0,0.9980896267202434,0.0019103732797566373 -0,0.9954961028946491,0.004503897105350937 -0,0.9472594715122238,0.05274052848777626 -0,0.9720933471780855,0.02790665282191458 -0,0.924877727899171,0.07512227210082895 -0,0.5516146590533493,0.4483853409466507 -1,0.39941683181192145,0.6005831681880786 -0,0.7958292023152622,0.20417079768473784 -0,0.813479658135665,0.18652034186433492 -0,0.9658925843920751,0.03410741560792475 -0,0.9942416534114353,0.0057583465885646945 -0,0.5567969799185962,0.4432030200814038 -0,0.7479771461633633,0.25202285383663664 -0,0.992608437725197,0.007391562274802942 -0,0.9928202925103353,0.007179707489664729 -0,0.599834340654389,0.40016565934561105 -0,0.8141559052606699,0.18584409473933006 -0,0.7179146177306605,0.28208538226933955 -0,0.8268945231819793,0.17310547681802066 -0,0.9969518153612013,0.0030481846387986206 -0,0.9798052032071243,0.02019479679287569 -0,0.9739584106738123,0.02604158932618778 -0,0.9779706055053485,0.022029394494651428 -0,0.9942936957192421,0.005706304280757998 -1,0.3621405834148494,0.6378594165851507 -0,0.8072765794908423,0.19272342050915758 -0,0.994550030553971,0.005449969446028931 -0,0.9798226458697477,0.02017735413025238 -0,0.9129263308860055,0.0870736691139945 -0,0.9937074931309249,0.006292506869075173 -1,0.1428364508161537,0.8571635491838462 -0,0.7934415637309596,0.20655843626904036 -0,0.9305864875279857,0.06941351247201434 -0,0.5867400787377588,0.4132599212622413 -0,0.9996911291721136,3.088708278864013E-4 -1,0.07011797902654768,0.9298820209734524 -0,0.9936376024358349,0.006362397564165075 -1,0.291548131591709,0.708451868408291 -0,0.9010823708407161,0.09891762915928398 -0,0.9783157100991329,0.021684289900867126 -0,0.7811702945210047,0.2188297054789953 -0,0.8337339687296961,0.1662660312703039 -0,0.819154410641531,0.1808455893584689 -0,0.9364229241069303,0.06357707589306974 -0,0.988664100894965,0.011335899105034944 -0,0.844560681624632,0.15543931837536792 -0,0.8792159789046278,0.12078402109537233 -0,0.9680153742667196,0.03198462573328035 -0,0.6127490789612231,0.38725092103877684 -0,0.955292470510982,0.044707529489017996 -0,0.8609047213107129,0.13909527868928706 -0,0.977697990488167,0.022302009511832966 -0,0.7407021435662469,0.25929785643375325 -0,0.7664819974859429,0.23351800251405708 -0,0.981975783889072,0.018024216110927995 -1,0.20039137565684995,0.79960862434315 -0,0.9702816359213293,0.029718364078670654 -1,0.047443401396929756,0.9525565986030703 -0,0.9702652982972473,0.029734701702752716 -0,0.9812479234861828,0.018752076513817075 -0,0.8497406624427977,0.15025933755720236 -0,0.9773814416544027,0.02261855834559736 -1,0.2012825251244023,0.7987174748755977 -0,0.5983593285350307,0.4016406714649693 -0,0.9238856721801849,0.07611432781981523 -0,0.6760817955705077,0.3239182044294922 -1,0.3751720405603839,0.6248279594396161 -0,0.9610332152140836,0.03896678478591644 -0,0.9090238400021178,0.09097615999788228 -0,0.8005415604017633,0.19945843959823673 -0,0.7344397966775311,0.26556020332246894 -0,0.9860207535271546,0.013979246472845392 -0,0.960635027498666,0.03936497250133407 -0,0.9812651877915191,0.018734812208480875 -0,0.9743682778650606,0.02563172213493925 -0,0.9783639326458454,0.021636067354154614 -0,0.979491773869784,0.02050822613021593 -0,0.7564046873081276,0.24359531269187237 -0,0.941371095685016,0.05862890431498405 -0,0.9619845043292018,0.03801549567079823 -0,0.9620366549699384,0.03796334503006148 -0,0.6128326171641861,0.38716738283581387 -1,0.4120915130958303,0.5879084869041696 -0,0.9983234520969233,0.001676547903076649 -0,0.9915516444935634,0.008448355506436673 -0,0.9508217792798668,0.049178220720133226 -1,0.16616225650988606,0.833837743490114 -0,0.7364261750441689,0.2635738249558312 -0,0.7232823667326741,0.27671763326732585 -1,0.26332516738843653,0.7366748326115635 -0,0.7341648315091117,0.26583516849088823 -1,0.23808164772589108,0.7619183522741089 -0,0.9722839022234554,0.027716097776544477 -0,0.7895386621098625,0.21046133789013763 -0,0.967854481292574,0.03214551870742602 -0,0.9825055535800296,0.01749444641997055 -0,0.8683672670923572,0.13163273290764288 -0,0.8983270122783302,0.10167298772166983 -0,0.97981105348788,0.020188946512119894 -0,0.6813634609936339,0.3186365390063662 -0,0.9789655329576427,0.021034467042357327 -0,0.9306846041193971,0.06931539588060281 -1,0.06823874360498783,0.9317612563950122 -0,0.5540292128494951,0.4459707871505049 -0,0.9823149493938884,0.017685050606111523 -0,0.9925698787699162,0.007430121230083875 -0,0.9732334905476927,0.02676650945230736 -0,0.9651061238490277,0.03489387615097231 -0,0.8010218193597115,0.1989781806402884 -0,0.6734705346571701,0.32652946534282995 -0,0.7273108652532088,0.27268913474679135 -0,0.6824896967472477,0.3175103032527523 -0,0.9755729349785216,0.024427065021478345 -1,0.4321124032148912,0.5678875967851087 -0,0.7056603913024204,0.2943396086975796 -0,0.7628664693732008,0.23713353062679923 -0,0.9974371001514264,0.0025628998485736844 -0,0.8204888073255727,0.17951119267442722 -0,0.9771207338578334,0.022879266142166718 -0,0.9853084129854967,0.014691587014503427 -0,0.8292637260414858,0.17073627395851415 -1,0.42025995437538666,0.5797400456246132 -0,0.8365400334998988,0.16345996650010128 -0,0.9738512660923841,0.026148733907615875 -0,0.9806180340658762,0.019381965934123908 -0,0.6104795355992308,0.3895204644007692 -0,0.8804081934634683,0.11959180653653165 -0,0.9656259649103591,0.03437403508964085 -0,0.8515325584238331,0.14846744157616698 -0,0.9935895167833237,0.006410483216676287 -0,0.8583875763216102,0.14161242367838975 -0,0.7571720463450309,0.24282795365496915 -0,0.9200636486854507,0.07993635131454929 -0,0.9297621510782115,0.07023784892178847 -0,0.991383485313452,0.008616514686548067 -0,0.5524364866008914,0.44756351339910866 -0,0.9981521321650398,0.0018478678349602333 -0,0.9572553881284975,0.04274461187150245 -0,0.7477063963916686,0.2522936036083315 -1,0.14581315880093787,0.8541868411990622 -0,0.7293278595845468,0.27067214041545323 -1,0.45488492381966816,0.5451150761803318 -0,0.7051796846083058,0.2948203153916942 -0,0.7274578220519025,0.2725421779480975 -0,0.6388792754837206,0.3611207245162794 -0,0.7897991928221421,0.21020080717785802 -0,0.682102751937296,0.317897248062704 -0,0.9767861241974626,0.023213875802537275 -0,0.994428818753774,0.005571181246226016 -1,0.28578494349618044,0.7142150565038196 -0,0.9110430106132701,0.0889569893867299 -0,0.8983222635412863,0.10167773645871364 -0,0.9670700383244543,0.032929961675545655 -0,0.9942315839065261,0.005768416093473873 -1,0.22192033162254968,0.7780796683774504 -1,0.24020551746830593,0.759794482531694 -1,0.15960643723642418,0.8403935627635758 -1,0.2387852064869885,0.7612147935130115 -0,0.6975744643716267,0.3024255356283732 -0,0.9901969665206167,0.009803033479383135 -0,0.8661002322021834,0.13389976779781665 -0,0.8959880081119307,0.10401199188806937 -0,0.9694193521312358,0.030580647868764205 -1,0.40677248783624015,0.5932275121637598 -1,0.04073326110338847,0.9592667388966116 -0,0.9227354454566534,0.07726455454334659 -0,0.9815293296188627,0.018470670381137286 -0,0.9935221770894734,0.00647782291052657 -0,0.7477887505247308,0.25221124947526924 -0,0.9780044571401778,0.02199554285982225 -0,0.5191012410192624,0.4808987589807377 -1,0.15324864682828326,0.8467513531717168 -0,0.5759099051604628,0.4240900948395372 -0,0.9823769077288309,0.017623092271169136 -0,0.9687683390197548,0.03123166098024524 -1,0.22238173002476366,0.7776182699752364 -0,0.7351560032898097,0.2648439967101903 -0,0.9908605408208309,0.009139459179169168 -0,0.8994635723637278,0.10053642763627234 -0,0.994435996085353,0.005564003914646955 -0,0.7655938109810101,0.23440618901898988 -0,0.9843002503610041,0.015699749638995973 -0,0.7902912471440132,0.20970875285598675 -0,0.8647313200211478,0.13526867997885217 -0,0.7536231867767484,0.2463768132232515 -0,0.9978773899974828,0.0021226100025173366 -0,0.9339382417857697,0.06606175821423034 -0,0.734638058469819,0.265361941530181 -0,0.8525485116754986,0.1474514883245014 -0,0.9628811401941785,0.03711885980582162 -0,0.6438838990649501,0.3561161009350499 -0,0.759789219425171,0.24021078057482897 -1,0.4628822262422357,0.5371177737577643 -0,0.7905602228370509,0.20943977716294923 -1,0.4701367979846055,0.5298632020153945 -0,0.9740336350108513,0.025966364989148664 -0,0.7969921691241822,0.2030078308758178 -0,0.9865494545768501,0.01345054542314996 -0,0.8646625741810573,0.13533742581894267 -0,0.533013563952074,0.466986436047926 -0,0.5772375968674266,0.42276240313257346 -0,0.7156349790756948,0.2843650209243051 -0,0.9765898634712012,0.02341013652879875 -0,0.9279582517135232,0.07204174828647686 -0,0.8777623658369588,0.12223763416304129 -0,0.759272188555638,0.240727811444362 -1,0.40927651910142954,0.5907234808985704 -0,0.9936981818344292,0.00630181816557093 -0,0.981278401050547,0.0187215989494531 -0,0.9777103636250076,0.022289636374992396 -0,0.7620935503122945,0.2379064496877055 -1,0.23352713971863373,0.7664728602813662 -0,0.8459189398620972,0.15408106013790274 -0,0.9614583744090643,0.03854162559093559 -0,0.9715714114882538,0.02842858851174619 -0,0.89099563427117,0.10900436572882996 -1,0.040674134741114754,0.9593258652588853 -0,0.9067454758485742,0.09325452415142574 -0,0.8013828704369804,0.1986171295630196 -0,0.9494265184358922,0.050573481564107764 -0,0.7778567240294385,0.22214327597056155 -0,0.8189887156146312,0.1810112843853689 -0,0.8034195776569228,0.19658042234307707 -0,0.6252705882991311,0.3747294117008689 -0,0.9946300197825746,0.005369980217425485 -1,0.26046861102859464,0.7395313889714055 -1,0.3685061647001178,0.6314938352998821 -0,0.993883461294168,0.006116538705831932 -0,0.9421723507574523,0.05782764924254774 -0,0.6383515903703435,0.36164840962965655 -0,0.7124096147025206,0.2875903852974793 -0,0.7641180851348732,0.2358819148651268 -0,0.9926224967461703,0.007377503253829683 -0,0.9562085305489261,0.043791469451074004 -0,0.9764131672233239,0.023586832776676007 -0,0.9803558002841116,0.01964419971588846 -0,0.9722040339249869,0.02779596607501308 -1,0.41032056881173634,0.5896794311882637 -0,0.9394695968261002,0.060530403173899794 -0,0.811700560032591,0.18829943996740903 -0,0.923357297587082,0.07664270241291804 -1,0.3617860294266286,0.6382139705733715 -0,0.8219017457859227,0.17809825421407732 -0,0.93818052048683,0.061819479513170045 -0,0.9531097868775804,0.046890213122419644 -0,0.9670587387772052,0.032941261222794824 -0,0.9750599913783669,0.02494000862163318 -0,0.9132061899903007,0.08679381000969943 -1,0.4088456905223469,0.5911543094776531 -0,0.9838617558064753,0.016138244193524855 -0,0.9806331394463941,0.01936686055360594 -0,0.8264881109296596,0.1735118890703404 -0,0.8329228451925623,0.1670771548074377 -1,0.31747118807115093,0.6825288119288491 -0,0.9231637946050002,0.07683620539499979 -1,0.30991060608271387,0.6900893939172862 -0,0.723814459781554,0.27618554021844605 -0,0.8240750226001929,0.17592497739980706 -0,0.6238837486669241,0.3761162513330758 -0,0.9981194745241725,0.0018805254758274546 -0,0.7362631610095256,0.26373683899047445 -1,0.45432317196610483,0.5456768280338952 -0,0.8807183474546346,0.11928165254536534 -0,0.9521915831867799,0.04780841681322021 -0,0.6983167269785078,0.30168327302149217 -0,0.9498117015518378,0.050188298448162194 -0,0.9065852218943831,0.093414778105617 -0,0.6528922774308342,0.3471077225691657 -0,0.9740506851318462,0.02594931486815383 -0,0.5356742332562103,0.4643257667437898 -0,0.9978156768218226,0.002184323178177284 -1,0.30471132978304943,0.6952886702169506 -0,0.9125500653891248,0.0874499346108752 -0,0.9983242186524109,0.0016757813475890644 -0,0.9579513157426162,0.04204868425738374 -0,0.9772782479442769,0.02272175205572316 -0,0.8156821702779953,0.1843178297220046 -0,0.9938186560412671,0.006181343958732928 -0,0.9977779191416575,0.0022220808583425754 -0,0.9925391556876125,0.007460844312387484 -0,0.9941075978761263,0.005892402123873705 -0,0.8784535716472303,0.12154642835276973 -0,0.9009903992302591,0.09900960076974086 -0,0.9935588629623912,0.006441137037608887 -0,0.980604127152178,0.01939587284782189 -0,0.7967712564937673,0.2032287435062327 -0,0.7813237327050376,0.21867626729496237 -1,0.40599858637420094,0.5940014136257991 -0,0.8229933004399835,0.17700669956001655 -0,0.99432071952898,0.005679280471019856 -0,0.7511963215482668,0.2488036784517332 -0,0.9784990561134,0.021500943886599972 -0,0.993348578606378,0.006651421393621933 -0,0.9744778606362869,0.025522139363713083 -0,0.6423208831049049,0.35767911689509513 -0,0.624891509919127,0.375108490080873 -0,0.993066337456723,0.006933662543276871 -0,0.8324428951864726,0.16755710481352734 -0,0.6077006817260157,0.3922993182739843 -0,0.6692294870593474,0.3307705129406527 -0,0.7102657957133162,0.28973420428668384 -0,0.991785405076815,0.008214594923185055 -0,0.9929671048966263,0.007032895103373774 -0,0.9112915744465799,0.08870842555342 -0,0.6957691872697425,0.3042308127302575 -1,0.15809870137282497,0.841901298627175 -0,0.924601889242769,0.07539811075723094 -0,0.8264731236962025,0.1735268763037974 -1,0.2622083878602621,0.7377916121397379 -0,0.9534455363165875,0.04655446368341256 -0,0.9580567046634219,0.041943295336578215 -0,0.7121060549092452,0.2878939450907549 -0,0.7652267771287411,0.2347732228712589 -0,0.9801730175261024,0.019826982473897626 -0,0.7968085900587137,0.20319140994128632 -0,0.9723154809515264,0.02768451904847366 -0,0.9765698279579522,0.023430172042047732 -0,0.7683574007349925,0.2316425992650075 -0,0.9828065497238456,0.01719345027615436 -0,0.9234523065056156,0.07654769349438448 -0,0.977143216876738,0.022856783123262094 -0,0.8960646001979854,0.10393539980201463 -0,0.9894099969351448,0.01059000306485519 -0,0.8645058901080391,0.1354941098919608 -1,0.4925861473266088,0.5074138526733912 -0,0.6630218384020742,0.3369781615979259 -0,0.9678045135431896,0.03219548645681031 -0,0.7081403494054213,0.29185965059457875 -0,0.9925045726390278,0.007495427360972125 -0,0.9103038453138873,0.0896961546861128 -0,0.7995665042551398,0.20043349574486022 -0,0.702361536535724,0.29763846346427597 -0,0.8801000772699286,0.11989992273007155 -0,0.6844212090114886,0.3155787909885114 -1,0.34723472253742205,0.6527652774625781 -0,0.6459692869386564,0.35403071306134354 -0,0.8612697598318295,0.1387302401681704 -0,0.7109947464792896,0.28900525352071027 -0,0.9012471448336168,0.09875285516638319 -0,0.9627307718305061,0.037269228169493726 -0,0.9839906398607401,0.01600936013925996 -0,0.9826857889795868,0.01731421102041317 -0,0.8404646832424982,0.15953531675750177 -0,0.7278229720844485,0.2721770279155515 -0,0.9063600043160839,0.09363999568391622 -0,0.6232863293304954,0.3767136706695047 -0,0.7962062342144659,0.2037937657855341 -0,0.6761506508303461,0.32384934916965386 -0,0.7203049604011933,0.27969503959880676 -0,0.9766555471511841,0.023344452848815856 -1,0.22975192107780518,0.7702480789221948 -0,0.9955067098887053,0.004493290111294736 -0,0.961465083122592,0.038534916877408044 -0,0.8901005252253446,0.10989947477465542 -1,0.24102443213344857,0.7589755678665513 -1,0.16053526324942888,0.8394647367505711 -0,0.7120215759876188,0.28797842401238116 -1,0.3317562886023735,0.6682437113976266 -1,0.4512866567253401,0.5487133432746599 -0,0.7200743185245682,0.27992568147543184 -0,0.950900950446576,0.04909904955342401 -0,0.6925142186928361,0.3074857813071639 -1,0.33326271852916717,0.6667372814708329 -0,0.7336181369275163,0.26638186307248374 -1,0.3536279453973883,0.6463720546026117 -0,0.997726230107081,0.002273769892919011 -0,0.9921351435050745,0.00786485649492547 -0,0.6453334105522232,0.3546665894477768 -0,0.957439942333338,0.04256005766666198 -0,0.9854695510359265,0.014530448964073414 -0,0.8782467352330581,0.1217532647669419 -0,0.9787453934297239,0.021254606570276002 -0,0.9792629994260238,0.0207370005739762 -0,0.795411294346707,0.2045887056532931 -0,0.8441091868345464,0.15589081316545367 -0,0.8957044234526171,0.10429557654738292 -0,0.9559242053605886,0.04407579463941128 -0,0.7890446924117531,0.2109553075882468 -0,0.732902017090399,0.26709798290960096 -1,0.2361159668714584,0.7638840331285416 -0,0.5662915947264622,0.4337084052735378 -0,0.9085482576919308,0.09145174230806931 -0,0.978380299340159,0.021619700659840955 -0,0.9708843073209331,0.029115692679066753 -0,0.9030497197087233,0.09695028029127671 -0,0.9716665791326614,0.028333420867338532 -1,0.4295620538117378,0.5704379461882622 -0,0.9650284313254488,0.03497156867455127 -0,0.9097022792867367,0.09029772071326332 -1,0.3706127948487678,0.6293872051512323 -0,0.8099600286457199,0.19003997135428005 -0,0.9512598040583228,0.048740195941677264 -0,0.9521017283579486,0.04789827164205151 -1,0.13387495994039458,0.8661250400596054 -0,0.9580076273942381,0.04199237260576198 -0,0.9908929627587744,0.009107037241225574 -0,0.8197375472672586,0.18026245273274152 -0,0.9970465247798939,0.0029534752201062454 -0,0.8011696998390436,0.19883030016095637 -0,0.7066386388536475,0.2933613611463525 -0,0.9000319536708824,0.09996804632911759 -0,0.9929177174333076,0.0070822825666922865 -0,0.9597265744196685,0.04027342558033158 -0,0.8453501876759033,0.15464981232409666 -1,0.28354940814377894,0.7164505918562211 -0,0.9940515494591997,0.005948450540800321 -0,0.8380927082796386,0.16190729172036153 -0,0.792102417459071,0.20789758254092905 -0,0.9397336905287144,0.06026630947128566 -0,0.7690224962204318,0.23097750377956822 -0,0.9117229883714584,0.08827701162854155 -0,0.9307752736454099,0.06922472635459016 -0,0.9556720074402966,0.04432799255970349 -1,0.29095981983117214,0.7090401801688277 -0,0.698809501518947,0.301190498481053 -1,0.1612251786082589,0.8387748213917411 -0,0.9284207008702331,0.07157929912976688 -0,0.8999542383811902,0.10004576161880979 -0,0.6148835940322639,0.3851164059677361 -0,0.974426101520472,0.02557389847952802 -0,0.5176885072694133,0.4823114927305868 -0,0.5852409709542048,0.4147590290457952 -0,0.6277804957874534,0.3722195042125465 -0,0.7690036984128852,0.23099630158711482 -0,0.994821045008102,0.005178954991898009 -0,0.8589961472420662,0.1410038527579338 -0,0.973376141097325,0.026623858902675046 -0,0.9669636283943991,0.033036371605601016 -0,0.5357797855715699,0.46422021442843014 -0,0.9923054225617888,0.007694577438211238 -0,0.9195263920750385,0.0804736079249614 -0,0.9491344243115611,0.050865575688438774 -0,0.9821115087813331,0.017888491218666775 -1,0.15070576816638476,0.8492942318336153 -0,0.5349578088632531,0.46504219113674694 -0,0.9799163521186214,0.020083647881378664 -1,0.1595825877846258,0.8404174122153742 -0,0.6796514767055671,0.32034852329443286 -0,0.8853824937747186,0.1146175062252814 -0,0.7992093748843393,0.2007906251156608 -0,0.9880006829284336,0.011999317071566479 -1,0.39606557983634477,0.6039344201636553 -0,0.9976056564212289,0.0023943435787710447 -0,0.7505868118960954,0.24941318810390448 -0,0.99817007601967,0.0018299239803300572 -0,0.8964689788444751,0.10353102115552497 -0,0.6252888445898979,0.3747111554101021 -0,0.9696173090495477,0.030382690950452422 -1,0.3827952332856937,0.6172047667143062 -0,0.8931143575625263,0.10688564243747373 -0,0.9572831090470134,0.042716890952986614 -0,0.9732492748039984,0.02675072519600152 -0,0.9918375389407651,0.008162461059234809 -0,0.9809125911449222,0.019087408855077686 -0,0.7174514331282182,0.28254856687178176 -0,0.78361661549854,0.21638338450146 -0,0.652707890604629,0.34729210939537114 -1,0.17569541896457846,0.8243045810354216 -0,0.8444633385598234,0.15553666144017664 -0,0.7762900047130604,0.22370999528693952 -1,0.42728311326071194,0.572716886739288 -0,0.9929065735619518,0.007093426438048307 -0,0.9220412886765106,0.0779587113234894 -1,0.17850006526303716,0.8214999347369628 -1,0.25682650608275154,0.7431734939172485 -1,0.12882107253378866,0.8711789274662114 -0,0.9944657481469233,0.005534251853076551 -0,0.9718100409670469,0.028189959032953026 -1,0.21642758302443532,0.7835724169755647 -0,0.9731131247226711,0.026886875277328765 -0,0.7464425216267729,0.253557478373227 -0,0.8198030826371789,0.18019691736282106 -0,0.9585207625761483,0.041479237423851845 -0,0.9393190666043972,0.06068093339560263 -0,0.7455557450994812,0.25444425490051875 -1,0.45078392835914705,0.549216071640853 -0,0.5818599836272432,0.4181400163727568 -0,0.5202777662378048,0.47972223376219525 -0,0.9654071589510017,0.034592841048998256 -0,0.9768109952612294,0.023189004738770672 -0,0.6097425857922113,0.39025741420778876 -1,0.1129337550836987,0.8870662449163013 -0,0.8991900076416953,0.10080999235830461 -0,0.615311903427868,0.384688096572132 -0,0.9941053772851646,0.005894622714835397 -0,0.7391192576913459,0.2608807423086541 -1,0.26879477373102306,0.7312052262689769 -0,0.9915828468936352,0.008417153106364667 -0,0.9389156975753787,0.061084302424621234 -0,0.9811069281816839,0.018893071818316134 -1,0.3786163349282488,0.6213836650717512 -1,0.4866812850630946,0.5133187149369054 -0,0.6836108772316467,0.3163891227683533 -1,0.4443849972538091,0.5556150027461909 -1,0.22843853698411068,0.7715614630158893 -0,0.984963971872703,0.015036028127296977 -0,0.6599054915686599,0.34009450843134026 -0,0.8896541546600738,0.11034584533992618 -0,0.9962915669373525,0.00370843306264746 -1,0.37420901373442994,0.6257909862655701 -0,0.8855527926445965,0.11444720735540355 -0,0.9757868673950928,0.024213132604907116 -0,0.9922387095056416,0.007761290494358308 -0,0.9545490700637084,0.04545092993629171 -0,0.980409412248068,0.019590587751932106 -0,0.733590353314757,0.2664096466852431 -0,0.9284122472098633,0.07158775279013668 -0,0.7581639816498866,0.24183601835011337 -0,0.7800392911742324,0.21996070882576754 -0,0.782329539673693,0.21767046032630694 -0,0.7087237882632983,0.29127621173670176 -1,0.4729699860677163,0.5270300139322838 -0,0.9536423518959442,0.04635764810405586 -0,0.7451299231004516,0.25487007689954844 -1,0.21207911839260238,0.7879208816073976 -0,0.9757779298792559,0.024222070120744094 -0,0.6162552205768373,0.38374477942316265 -0,0.7480519554803452,0.2519480445196548 -0,0.7985610482461885,0.20143895175381146 -0,0.9934568520633887,0.006543147936611329 -0,0.6655071143220068,0.33449288567799323 -1,0.232005108446365,0.7679948915536351 -0,0.6757085996871681,0.3242914003128318 -0,0.6824447654397034,0.31755523456029655 -1,0.4893362843914984,0.5106637156085017 -0,0.5742547970198445,0.4257452029801555 -0,0.8900652088397994,0.10993479116020051 -0,0.9816853905747961,0.0183146094252039 -0,0.9979038965617079,0.002096103438292097 -0,0.9143161020701258,0.08568389792987428 -0,0.9917346496817806,0.008265350318219355 -0,0.9687998390746121,0.031200160925387858 -0,0.9800369963266394,0.019963003673360603 -0,0.7066694075301051,0.2933305924698949 -0,0.9227202002665312,0.07727979973346873 -1,0.16567480228316137,0.8343251977168387 -0,0.8903225305974498,0.10967746940255006 -1,0.2159662247940203,0.7840337752059796 -0,0.598766934590403,0.40123306540959697 -0,0.671972132518927,0.328027867481073 -0,0.8179782307407767,0.18202176925922342 -0,0.9730863023477508,0.02691369765224918 -0,0.9763253969718112,0.023674603028188867 -0,0.5552219833474411,0.4447780166525589 -0,0.9229849320506908,0.07701506794930917 -1,0.3244251965774705,0.6755748034225295 -0,0.9760506367321298,0.023949363267870175 -1,0.31155745145096375,0.6884425485490362 -0,0.9945263927640531,0.005473607235946819 -1,0.44263441025167455,0.5573655897483254 -0,0.7406044713650948,0.2593955286349052 -0,0.9944261726977347,0.0055738273022653525 -0,0.9417336458251153,0.058266354174884745 -0,0.9750092137466303,0.02499078625336975 -0,0.8602607638790829,0.13973923612091713 -0,0.6864181337772559,0.31358186622274414 -0,0.9565435338427266,0.04345646615727342 -0,0.7974695411817155,0.2025304588182844 -0,0.5639424625138824,0.43605753748611764 -0,0.6756757067800225,0.3243242932199774 -0,0.7412599812145193,0.2587400187854807 -1,0.35436096162951575,0.6456390383704842 -1,0.49076304713660684,0.5092369528633931 -0,0.9970437317264769,0.0029562682735231193 -0,0.9692155259626544,0.03078447403734566 -1,0.3897519471324167,0.6102480528675833 -0,0.6983212925892283,0.30167870741077174 -0,0.9979380692993346,0.0020619307006654306 -0,0.9450070326278249,0.0549929673721751 -0,0.7467793999362319,0.2532206000637682 -1,0.4320357456440134,0.5679642543559865 -1,0.2131686791989578,0.7868313208010422 -0,0.9852242748830881,0.014775725116911805 -0,0.9625767017596658,0.03742329824033427 -0,0.9984441945935792,0.0015558054064206646 -0,0.8279026734108949,0.1720973265891051 -0,0.9941797997651106,0.005820200234889505 -0,0.9472270815641194,0.05277291843588051 -0,0.9594735533157845,0.04052644668421541 -1,0.1079226032057971,0.892077396794203 -0,0.9981096872449973,0.0018903127550026775 -0,0.7462483944973765,0.2537516055026235 -0,0.656786682757039,0.34321331724296095 -0,0.6382942958772556,0.36170570412274444 -0,0.5555315542829176,0.44446844571708244 -0,0.9472183283908827,0.05278167160911728 -0,0.9946062053253731,0.00539379467462685 +0,0.8938713162799828,0.1061286837200172 +0,0.9999992451527233,7.548472765684312E-7 +0,0.9400686241585264,0.059931375841473476 +0,0.7166302124242075,0.28336978757579245 +1,0.3666971802087202,0.6333028197912798 +0,0.7856453089691574,0.21435469103084265 +1,0.16037455138209175,0.8396254486179082 +0,0.9999803404818476,1.9659518152433665E-5 +0,0.9884288316394892,0.011571168360510765 +0,0.9940570804604743,0.0059429195395257674 +0,0.9992585023284142,7.414976715856692E-4 +0,0.9999949256989428,5.074301057249974E-6 +0,0.9986994953039913,0.0013005046960087676 +0,0.9948599584189692,0.005140041581030784 +1,0.1486486733775488,0.8513513266224512 +0,0.9562008846879739,0.04379911531202606 +0,0.984012781697915,0.015987218302085097 +0,0.7460102815176312,0.25398971848236884 +0,0.53467898918337,0.4653210108166301 +0,0.5111399771136718,0.48886002288632824 +0,0.9803796985078462,0.019620301492153748 +0,0.7528827966727566,0.24711720332724346 +0,0.9966080665406071,0.003391933459392796 +0,0.7697405677476872,0.23025943225231285 +0,0.9999681058148725,3.189418512741953E-5 +0,0.9727002536459347,0.027299746354065277 +0,0.9751925737030752,0.024807426296924843 +0,0.6185731334307591,0.3814268665692409 +1,0.2647766068985471,0.7352233931014528 +0,0.8101360621946154,0.1898639378053845 +0,0.9999973514960394,2.648503960681112E-6 +0,0.7573613541115302,0.24263864588846984 +0,0.9998817056968032,1.1829430319679737E-4 +0,0.9857849478373135,0.014215052162686589 +0,0.9744666834025728,0.025533316597427132 +0,0.9999959333285524,4.066671447605855E-6 +0,0.8828155471919413,0.11718445280805877 +0,0.8421938143813159,0.15780618561868406 +0,0.8106469377910808,0.18935306220891918 +0,0.9841456807957173,0.015854319204282794 +1,0.20110782257398535,0.7988921774260147 +0,0.8267985622350775,0.17320143776492236 +1,0.32333778848320865,0.6766622115167914 +0,0.9999999705792177,2.9420782319118646E-8 +0,0.911928453027327,0.08807154697267304 +1,0.3361942505252632,0.6638057494747367 +0,0.9909415684817842,0.009058431518215755 +1,0.3406596718829161,0.6593403281170839 +0,0.9999999967713762,3.228623844866335E-9 +0,0.5629376984308058,0.4370623015691943 +0,0.9855061961345375,0.014493803865462576 +1,0.08379775859458606,0.9162022414054138 +1,0.3344731755212037,0.6655268244787964 +0,0.9985929736740794,0.0014070263259206505 +0,0.7556920437266422,0.24430795627335775 +0,0.8686306425645486,0.1313693574354515 +0,0.9630709106623027,0.036929089337697285 +0,0.9073536345484287,0.09264636545157134 +0,0.9773864573608737,0.022613542639126395 +0,0.5336956385214562,0.46630436147854387 +0,0.9672566444092512,0.032743355590748785 +0,0.9999973503219619,2.6496780380452654E-6 +0,0.9999986335318894,1.3664681107049914E-6 +0,0.6376009460025419,0.36239905399745814 +0,0.93845688629052,0.061543113709479916 +0,0.9877832251397516,0.012216774860248303 +1,0.20345326260178867,0.7965467373982112 +0,0.9297315748683797,0.0702684251316204 +0,0.9999999819209685,1.8079031444075812E-8 +0,0.9916692070870867,0.008330792912913271 +0,0.7101226651616157,0.2898773348383843 +0,0.8956381179855505,0.10436188201444957 +0,0.9535811538722693,0.04641884612773077 +0,0.7581674820071913,0.24183251799280875 +1,0.24888067800116762,0.7511193219988324 +0,0.9978287263634277,0.002171273636572326 +0,0.9999173640971947,8.263590280548851E-5 +1,0.14784529727640944,0.8521547027235906 +0,0.9649846179929837,0.03501538200701632 +0,0.9704802654463653,0.029519734553634772 +0,0.9845356311415712,0.015464368858428895 +0,0.9999971214268859,2.8785731142573023E-6 +0,0.9783857044538731,0.021614295546126962 +1,0.2075248366733731,0.7924751633266269 +0,0.9966668390791186,0.0033331609208815225 +0,0.8641193095166784,0.13588069048332155 +0,0.9999999147566824,8.524331747297454E-8 +0,0.6640031514079794,0.33599684859202067 +0,0.9839338861102727,0.016066113889727368 +0,0.9999810550772756,1.8944922724349396E-5 +1,0.13876380276519115,0.8612361972348089 +0,0.5968570759144031,0.4031429240855968 +0,0.9662586504212196,0.033741349578780444 +1,0.08356142161644634,0.9164385783835536 +1,0.42587868768108944,0.5741213123189105 +0,0.5841611068451675,0.41583889315483236 +0,0.7632632233978952,0.2367367766021048 +0,0.5581881849517868,0.44181181504821326 +1,0.2878341114511486,0.7121658885488514 +1,0.16729272174622267,0.8327072782537773 +0,0.518892522527761,0.48110747747223903 +0,0.7807791414335383,0.2192208585664616 +1,0.4755568378916518,0.5244431621083482 +0,0.8920643835539349,0.10793561644606513 +0,0.8692508706687396,0.13074912933126034 +0,0.9425501718717009,0.05744982812829921 +0,0.9148591633184922,0.08514083668150779 +1,0.49604205007983915,0.5039579499201609 +0,0.9961294072908051,0.0038705927091949323 +0,0.604548153702524,0.39545184629747593 +0,0.8954738432482449,0.10452615675175515 +0,0.9368190853011188,0.06318091469888114 +1,0.10691780829949593,0.8930821917005042 +0,0.9935580024476969,0.006441997552303178 +0,0.9764879737758237,0.02351202622417616 +0,0.5836846049771097,0.4163153950228903 +0,0.8666834566511663,0.1333165433488337 +0,0.9986122664793616,0.001387733520638314 +1,0.3102723069784027,0.6897276930215973 +0,0.7646426786325629,0.23535732136743717 +0,0.9999999976484641,2.3515359479974692E-9 +0,0.9990005740561104,9.99425943889469E-4 +1,0.4625834794668155,0.5374165205331844 +0,0.96220890747726,0.03779109252274005 +1,0.21646264954168276,0.7835373504583173 +0,0.9999989731403942,1.026859605750527E-6 +0,0.9999999999123237,8.767637462695683E-11 +1,0.22332660342660168,0.7766733965733983 +0,0.6537218866758608,0.3462781133241392 +0,0.9980825324370808,0.0019174675629193055 +0,0.9957876717911417,0.004212328208858373 +0,0.7252326855050957,0.2747673144949043 +1,0.2026961288425305,0.7973038711574695 +1,0.34197225022738703,0.658027749772613 +0,0.8415635607830938,0.1584364392169062 +0,0.9766494257462551,0.023350574253745 +0,0.9957584588211054,0.004241541178894599 +0,0.9999984853219684,1.5146780316654048E-6 +0,0.998659041778579,0.001340958221421088 +0,0.9794687499169709,0.020531250083029116 +0,0.7816329344784437,0.2183670655215562 +0,0.9999999853275425,1.46724575796728E-8 +0,0.6717147080207562,0.32828529197924383 +0,0.8905551852500111,0.10944481474998893 +0,0.9859747049496569,0.014025295050343202 +0,0.9641391203265967,0.035860879673403345 +1,0.39060551315759173,0.6093944868424083 +0,0.7665571478394376,0.23344285216056235 +0,0.9999861211801777,1.3878819822303502E-5 +1,0.20534375513459688,0.7946562448654031 +0,0.6922516245713769,0.3077483754286231 +1,0.3258134611509453,0.6741865388490547 +0,0.8645077337854722,0.13549226621452787 +0,0.9749089467584549,0.025091053241545206 +0,0.996560758277811,0.0034392417221891275 +1,0.22608469964340963,0.7739153003565904 +1,0.32972950479061436,0.6702704952093858 +0,0.679236210346616,0.320763789653384 +1,0.4679891760612115,0.5320108239387885 +0,0.9317969271971017,0.0682030728028982 +0,0.6299191452538215,0.37008085474617847 +0,0.6704969075645222,0.32950309243547776 +0,0.5929109504498868,0.40708904955011316 +1,3.8363745106162766E-7,0.9999996163625491 +0,0.9978411337997353,0.0021588662002647195 +1,0.2511068921397797,0.7488931078602202 +0,0.9999999970103639,2.9896360561452476E-9 +0,0.6819897103688197,0.3180102896311803 +0,0.5918939397085589,0.40810606029144114 +0,0.911412534064943,0.0885874659350569 +0,0.9999965309467806,3.4690532194297945E-6 +0,0.9999866904441911,1.3309555808856131E-5 +0,0.9999827746474447,1.7225352555240954E-5 +0,0.9234047374328257,0.07659526256717426 +0,0.9980486040806663,0.0019513959193337013 +0,0.7713157457319253,0.22868425426807468 +0,0.8954453626158144,0.10455463738418555 +0,0.9292172219165099,0.07078277808349019 +1,0.07780949989515437,0.9221905001048455 +1,0.3488230247595856,0.6511769752404144 +0,0.9999705692017238,2.9430798276255802E-5 +0,0.9997860531618574,2.1394683814261956E-4 +0,0.9832846713675639,0.01671532863243622 +0,0.7228278575878988,0.2771721424121012 +0,0.6942667593296905,0.30573324067030944 +0,0.9508859316178724,0.049114068382127514 +0,0.9999965766261618,3.423373838114177E-6 +0,0.9990891050123041,9.108949876959686E-4 +1,0.12407525034875472,0.8759247496512452 +0,0.9117641530843718,0.08823584691562827 +0,0.9821841750066261,0.017815824993373867 +0,0.6990222506089607,0.3009777493910392 +0,0.9960222469977049,0.003977753002295162 +0,0.9999999809978114,1.900218858862667E-8 +0,0.8231634246470655,0.17683657535293462 +0,0.9374540582460685,0.06254594175393144 +0,0.956582655018356,0.04341734498164393 +1,0.3299886847183333,0.6700113152816667 +0,0.9999999395980316,6.040196837107149E-8 +0,0.9892317110564347,0.010768288943565256 +0,0.7731325985847073,0.22686740141529274 +0,0.9757460056120257,0.024253994387974355 +0,0.5394138552392156,0.4605861447607844 +0,0.9982941680009242,0.0017058319990757272 +0,0.7036583248505252,0.29634167514947485 +0,0.9929291027018536,0.007070897298146351 +1,0.13365204092582997,0.86634795907417 +0,0.9678256876535248,0.03217431234647517 +0,0.9675641784622598,0.032435821537740064 +1,0.2484804832192145,0.7515195167807855 +0,0.9112832493603905,0.08871675063960956 +0,0.9574565686194517,0.0425434313805483 +0,0.9963736635043199,0.003626336495680058 +0,0.9817588193367554,0.018241180663244583 +1,0.45952116517700003,0.5404788348229999 +0,0.9999998602047697,1.3979523017862456E-7 +0,0.9999999185835096,8.141649046564965E-8 +0,0.9999746471772019,2.535282279811747E-5 +0,0.9961776560155879,0.003822343984411914 +1,0.3907424032066012,0.6092575967933987 +0,0.717949165550515,0.28205083444948503 +0,0.6218052335423498,0.3781947664576501 +0,0.9999915102125841,8.489787415858112E-6 +0,0.9872482080593792,0.01275179194062079 +1,0.4363001449580546,0.5636998550419454 +0,0.9998406447187221,1.5935528127779665E-4 +0,0.8994494693757584,0.10055053062424155 +0,0.7809107239827332,0.21908927601726677 +0,0.9191612947095072,0.08083870529049288 +0,0.7010361615493632,0.29896383845063673 +0,0.5647213798459019,0.43527862015409813 +0,0.7658356905530729,0.23416430944692707 +0,0.96911697624837,0.03088302375163009 +0,0.8505821166060623,0.14941788339393763 +0,0.9933667693358176,0.006633230664182341 +0,0.8220415724802138,0.1779584275197863 +0,0.5761304705857146,0.42386952941428546 +1,0.41495034980791673,0.5850496501920833 +0,0.9923500748787399,0.0076499251212601045 +0,0.9899223037681782,0.010077696231821764 +1,0.16650585430661013,0.8334941456933899 +0,0.8090269168572897,0.19097308314271033 +0,0.9842493005148448,0.015750699485155204 +0,0.9036200983669286,0.09637990163307134 +0,0.5229475770962713,0.4770524229037287 +1,0.35130184832028344,0.6486981516797166 +0,0.910559533451876,0.08944046654812406 +0,0.9867806264199995,0.013219373580000566 +1,0.10067966602696635,0.8993203339730337 +0,0.8339310632399018,0.16606893676009818 +0,0.6044575691637766,0.3955424308362234 +0,0.9999966602444623,3.3397555375501934E-6 +0,0.721501643410838,0.27849835658916205 +0,0.9999999604053584,3.95946416179729E-8 +0,0.9931994391508695,0.00680056084913057 +1,0.24377415995377943,0.7562258400462206 +0,0.9531323923518934,0.04686760764810673 +0,0.9890092102439328,0.010990789756067165 +0,0.7520981918486811,0.24790180815131896 +0,0.6188845234141694,0.3811154765858305 +0,0.8139256623280204,0.18607433767197956 +0,0.9562917484204763,0.043708251579523634 +0,0.9999992553840993,7.446159006341032E-7 +0,0.9903212750049725,0.009678724995027612 +0,0.9928225945800113,0.007177405419988584 +0,0.5692225790153729,0.430777420984627 +0,0.6031477295067844,0.39685227049321564 +0,0.5477070509972602,0.4522929490027397 +0,0.9903836732918221,0.00961632670817784 +0,0.8290276477715102,0.17097235222848992 +1,0.3394677871282142,0.6605322128717858 +1,0.18528684664721126,0.8147131533527887 +0,0.999987981627669,1.201837233090459E-5 +0,0.5691597729783257,0.4308402270216744 +0,0.999999523103212,4.768967880399297E-7 +1,0.24369790524271065,0.7563020947572894 +1,0.3844507688742536,0.6155492311257463 +1,0.21860753985552459,0.7813924601444755 +0,0.7130187280014307,0.2869812719985694 +1,0.2421537026395857,0.7578462973604144 +0,0.626319569528416,0.373680430471584 +0,0.609763231155727,0.3902367688442731 +1,0.32467727370896426,0.6753227262910357 +0,0.5879437106680993,0.4120562893319008 +0,0.5000895902743169,0.4999104097256832 +0,0.9982256942167511,0.0017743057832488804 +0,0.9953964631390048,0.00460353686099527 +0,0.8732005724572596,0.12679942754274032 +0,0.9916693997261109,0.00833060027388909 +0,0.9727366405282555,0.027263359471744474 +0,0.9330101722017023,0.06698982779829779 +0,0.9946868296383093,0.005313170361690767 +1,0.12761523518102855,0.8723847648189715 +0,0.9146875774436725,0.0853124225563276 +0,0.9367764533325855,0.0632235466674145 +0,0.9683875741271692,0.03161242587283067 +0,0.9452096285364859,0.054790371463514086 +0,0.9943486588500322,0.005651341149967846 +1,0.4263439144064693,0.5736560855935308 +0,0.9450446894355223,0.054955310564477756 +0,0.9970331489457182,0.0029668510542817978 +0,0.668133186411646,0.3318668135883539 +1,0.27876615617413086,0.7212338438258692 +0,0.9668423840729045,0.03315761592709545 +0,0.999898364408389,1.0163559161112508E-4 +1,0.19311593004480623,0.8068840699551938 +0,0.9999999972257314,2.7742685169646233E-9 +0,0.905592100660832,0.09440789933916802 +0,0.9664903549863427,0.03350964501365723 +0,0.9998423053197804,1.5769468021966483E-4 +0,0.9999957922429513,4.207757048644588E-6 +0,0.9494710185850206,0.050528981414979524 +1,0.2411686161162025,0.7588313838837975 +0,0.9999997015984472,2.9840155275325686E-7 +0,0.9999985911194736,1.4088805263777746E-6 +0,0.9823864466457908,0.01761355335420932 +0,0.9999649404076931,3.50595923068498E-5 +0,0.6781265471131945,0.3218734528868055 +0,0.9989732634241932,0.0010267365758068099 +0,0.8574867726097624,0.14251322739023756 +0,0.9520446797742438,0.047955320225756125 +1,0.21925545866205912,0.7807445413379408 +0,0.7445701846095356,0.2554298153904644 +0,0.9062133208904639,0.09378667910953617 +0,0.9586493571100584,0.04135064288994163 +1,0.30481189373320844,0.6951881062667916 +0,0.9662603637669602,0.03373963623303966 +0,0.9734250875827087,0.026574912417291183 +0,0.9515081904116758,0.048491809588324226 +0,0.7264942216047467,0.27350577839525325 +0,0.9355864190924426,0.06441358090755739 +1,6.815632564292003E-26,1.0 +0,0.8625022845132174,0.13749771548678266 +0,0.9839495664493229,0.01605043355067712 +0,0.9769393772092122,0.02306062279078772 +0,0.8772886969471737,0.12271130305282639 +0,0.8893126551023366,0.11068734489766345 +0,0.9999928195148048,7.180485195153726E-6 +1,2.05603249731345E-5,0.9999794396750268 +0,0.7074247120782581,0.2925752879217419 +1,0.17964912856141377,0.8203508714385862 +0,0.9999976329979395,2.3670020605187105E-6 +1,0.33297475813714855,0.6670252418628515 +0,0.9650715632358181,0.03492843676418198 +0,0.8948544620831914,0.10514553791680856 +0,0.9883826754775352,0.011617324522464865 +0,0.7623496711183178,0.23765032888168222 +0,0.9993437700883914,6.562299116086753E-4 +0,0.9999804314010833,1.9568598916697496E-5 +0,0.8761891472658779,0.12381085273412197 +0,0.6899177765056083,0.3100822234943918 +0,0.63741828362427,0.36258171637573 +0,0.9854352052390579,0.014564794760942142 +0,0.9999982794561966,1.7205438034672001E-6 +0,0.9723600983164972,0.027639901683502822 +0,0.7421324960589002,0.25786750394109986 +0,0.7986834066907805,0.20131659330921944 +0,0.9803254316812257,0.019674568318774264 +0,0.9774274848450172,0.022572515154982715 +0,0.9999999994820268,5.179732299648327E-10 +0,0.8158365549617781,0.18416344503822185 +0,0.8050012291904587,0.19499877080954126 +0,0.9866646834147,0.013335316585300095 +0,0.9441780644743002,0.055821935525699765 +0,0.8989089042892742,0.10109109571072575 +0,0.9999999998733802,1.2661975931735174E-10 +0,0.6561071245680681,0.3438928754319319 +0,0.6248054341625656,0.3751945658374343 +1,0.3195960389993278,0.6804039610006721 +0,0.6959190562550878,0.30408094374491224 +0,0.9627860162469106,0.03721398375308947 +0,0.9459959828575383,0.05400401714246172 +1,0.49355904302864156,0.5064409569713585 +0,0.9999907340246417,9.265975358321626E-6 +0,0.6915503751952202,0.3084496248047797 +0,0.7788471862404449,0.2211528137595551 +0,0.9861874057680006,0.01381259423199939 +0,0.9931226505944523,0.0068773494055476446 +0,0.9999260203472309,7.3979652769224E-5 +0,0.9954291958187823,0.004570804181217723 +0,0.8372456063697921,0.16275439363020783 +0,0.9701270466397198,0.02987295336028014 +0,0.9999999999998084,1.9158554075411878E-13 +0,0.5860061438962844,0.41399385610371575 +0,0.6550568494587194,0.3449431505412805 +1,0.22755025908573623,0.7724497409142639 +0,0.9939201218802814,0.0060798781197186555 +0,0.6733058188365849,0.32669418116341514 +0,0.809571848834614,0.19042815116538603 +0,0.9999830435342137,1.6956465786136174E-5 +0,0.9997222476121662,2.7775238783366984E-4 +1,0.40994137396205227,0.5900586260379478 +0,0.9999863882683406,1.3611731659298786E-5 +1,4.78779622074996E-4,0.9995212203779249 +0,0.999999436030733,5.639692670298652E-7 +1,0.30650010218611184,0.6934998978138881 +0,0.5313313653567484,0.4686686346432516 +0,0.9555923640783113,0.04440763592168875 +0,0.9512033293872294,0.04879667061277054 +0,0.986749234532807,0.013250765467192912 +0,0.991794183008618,0.008205816991381917 +1,9.587538506240813E-6,0.9999904124614938 +0,0.9999933678468838,6.632153116282209E-6 +0,0.985978615744284,0.014021384255715943 +0,0.9999987525942365,1.2474057634044387E-6 +0,0.946397281665639,0.053602718334361116 +0,0.9960960052268933,0.003903994773106561 +0,0.6115292685488879,0.3884707314511121 +0,0.8515535152257486,0.14844648477425132 +0,0.9706950286750962,0.029304971324903766 +0,0.9152904803992147,0.08470951960078524 +1,0.26942679259139257,0.7305732074086074 +0,0.9999990765041156,9.234958843651067E-7 +0,0.7600459620440675,0.23995403795593245 +0,0.9959812456794909,0.004018754320509217 +0,0.6828410246787536,0.31715897532124643 +0,0.9999998277441325,1.7225586752736155E-7 +0,0.8814377729767493,0.11856222702325074 +1,0.33894788117746283,0.6610521188225371 +0,0.978287113547695,0.021712886452304975 +0,0.9564508683217573,0.04354913167824265 +1,0.22228770443017604,0.777712295569824 +1,0.2469175389694767,0.7530824610305232 +1,0.20241294881155375,0.7975870511884463 +0,0.9041506322869143,0.09584936771308576 +0,0.9272891081405903,0.07271089185940971 +0,0.9999978364950325,2.1635049676118793E-6 +0,0.5765633583317438,0.4234366416682563 +0,0.6874949436311207,0.3125050563688793 +0,0.827506496626148,0.17249350337385203 +0,0.7914718117559993,0.20852818824400066 +0,0.6801246950793854,0.3198753049206146 +0,0.7167219709384218,0.2832780290615781 +0,0.8694217748504289,0.13057822514957118 +1,0.2523248141327426,0.7476751858672573 +0,0.9508386147960506,0.049161385203949366 +0,0.9999883162164003,1.1683783599681907E-5 +0,0.9999995216072782,4.783927217647339E-7 +0,0.6584230198656522,0.3415769801343479 +0,0.7106572056723605,0.28934279432763965 +0,0.9999992065925876,7.934074124380784E-7 +0,0.9979654285472741,0.0020345714527258934 +0,0.6941430353203787,0.3058569646796213 +1,0.4186686271789387,0.5813313728210613 +1,0.3896168024459146,0.6103831975540853 +0,0.999858468940462,1.415310595380374E-4 +0,0.5594704206903339,0.44052957930966613 +1,0.2357773354986277,0.7642226645013722 +0,0.993454288969384,0.0065457110306159525 +0,0.9980861935986874,0.0019138064013125118 +0,0.9370747254605359,0.0629252745394641 +0,0.993906475802796,0.006093524197204085 +0,0.6893503159803678,0.3106496840196322 +0,0.9634204425280027,0.03657955747199731 +0,0.9999912236289742,8.77637102576874E-6 +0,0.978421386543485,0.021578613456515034 +0,0.6057095934132622,0.39429040658673775 +1,0.1515365420199471,0.848463457980053 +1,0.22042678299706164,0.7795732170029384 +0,0.9973780553844087,0.002621944615591145 +1,0.2628034408462184,0.7371965591537817 +0,0.7213504621918412,0.27864953780815876 +0,0.5208321573190865,0.47916784268091356 +0,0.8698606419943075,0.13013935800569248 +0,0.9757637138576926,0.024236286142307443 +0,0.8906559814214015,0.10934401857859857 +0,0.9983288602054344,0.0016711397945656954 +0,0.9747174789428505,0.025282521057149468 +0,0.9463487754407194,0.0536512245592806 +1,0.45045555964812384,0.5495444403518762 +0,0.9773745341307065,0.022625465869293482 +0,0.8223581876660288,0.17764181233397125 +0,0.9772507942674146,0.022749205732585466 +0,0.9999999980763656,1.9236344520840717E-9 +0,0.9999928714359144,7.128564085482986E-6 +1,0.2744015655789781,0.7255984344210219 +0,0.588537203817686,0.41146279618231396 +1,0.31877350242380154,0.6812264975761986 +0,0.6401967737804156,0.3598032262195845 +0,0.9995797352261341,4.2026477386582906E-4 +0,0.999510047298121,4.899527018791211E-4 +0,0.9993217752643804,6.782247356196644E-4 +0,0.5649508769574365,0.4350491230425636 +0,0.7621193232592542,0.23788067674074576 +1,0.24134868748467855,0.7586513125153215 +1,0.41059979358382337,0.5894002064161766 +0,0.9912358460548252,0.008764153945174822 +0,0.6233350155348455,0.37666498446515456 +0,0.9682973150596247,0.03170268494037528 +0,0.9963982564367329,0.003601743563267156 +0,0.7470335473589783,0.2529664526410217 +0,0.9554127516547724,0.044587248345227634 +0,0.9542951149105535,0.04570488508944652 +1,0.3867891261230672,0.6132108738769328 +0,0.6275683577951483,0.3724316422048517 +0,0.6236591947188307,0.3763408052811693 +1,0.18077344126183667,0.8192265587381633 +0,0.9895255760078413,0.010474423992158767 +0,0.9990373556105152,9.626443894847759E-4 +0,0.8009768284070583,0.19902317159294175 +0,0.8655450460503156,0.13445495394968437 +0,0.6548029366442992,0.3451970633557008 +0,0.9098020335832745,0.09019796641672555 +0,0.995846477275927,0.00415352272407306 +0,0.9820929066744738,0.01790709332552628 +0,0.5573733376742853,0.4426266623257147 +0,0.9984128717826768,0.0015871282173230657 +0,0.9999427401421351,5.72598578648433E-5 +0,0.9811623034831692,0.018837696516830857 +1,0.11965770855997912,0.8803422914400209 +1,0.1774932852058767,0.8225067147941233 +0,0.9972377438887559,0.0027622561112441257 +0,0.9832912882498052,0.016708711750194977 +1,0.22339908778890066,0.7766009122110994 +0,0.9999996443237743,3.5567622561058734E-7 +0,0.9447305084398341,0.05526949156016585 +0,0.9518093488952292,0.04819065110477093 +0,0.9895910778862294,0.010408922113770688 +0,0.9387848350124466,0.06121516498755344 +1,0.15113838862435364,0.8488616113756463 +1,0.08066904841114557,0.9193309515888545 +0,0.7527199455343014,0.2472800544656985 +0,0.9710985639138587,0.02890143608614129 +0,0.8778392462148046,0.12216075378519538 +0,0.9999999810249244,1.8975075554160443E-8 +0,0.7469909669773778,0.2530090330226223 +0,0.8371527663491187,0.16284723365088116 +0,0.9564170934692472,0.04358290653075285 +0,0.998955746309442,0.001044253690558163 +0,0.7433508661238768,0.25664913387612326 +0,0.9958840574901385,0.004115942509861429 +0,0.9973024817911695,0.002697518208830464 +1,0.20417643857514925,0.7958235614248508 +0,0.9908757205002696,0.009124279499730322 +0,0.9787821996947783,0.02121780030522182 +0,0.9447827119385194,0.05521728806148065 +0,0.9481870349602116,0.051812965039788314 +0,0.898831475525666,0.10116852447433389 +0,0.9772143546614653,0.022785645338534728 +0,0.9752321413643338,0.024767858635666145 +0,0.9999955865038197,4.413496180267224E-6 +0,0.9999961938546175,3.806145382508886E-6 +1,0.27317951987219147,0.7268204801278084 +0,0.8373142202895703,0.16268577971042986 +1,0.1956093841704781,0.8043906158295219 +0,0.9999979848805609,2.0151194390817314E-6 +0,0.9999995840568263,4.159431736330304E-7 +1,0.22514242520861458,0.7748575747913855 +0,0.9576886653415037,0.0423113346584963 +0,0.6512212521149537,0.34877874788504626 +1,0.4680644901281998,0.5319355098718003 +0,0.9268360165051441,0.07316398349485574 +0,0.9999955716031497,4.428396850257464E-6 +0,0.9993353324247034,6.646675752966606E-4 +0,0.69828281071715,0.3017171892828499 +0,0.7872817641916768,0.21271823580832316 +1,0.2982901739846885,0.7017098260153115 +0,0.9408951049569513,0.05910489504304863 +0,0.7366480565773331,0.2633519434226669 +0,0.5295176301849479,0.47048236981505204 +0,0.9321862145037906,0.06781378549620941 +0,0.9999945026075777,5.497392422296323E-6 +1,0.2392881158671868,0.7607118841328132 +1,0.15705874374953058,0.8429412562504695 +0,0.6225694325259478,0.3774305674740522 +1,0.4871243810671622,0.5128756189328377 +1,0.1723156844044561,0.8276843155955439 +0,0.9999799793060611,2.0020693939004334E-5 +0,0.9815058661374733,0.018494133862526883 +0,0.6625502233009118,0.3374497766990881 +0,0.8452773479441964,0.15472265205580357 +0,0.9947620681732333,0.005237931826766758 +0,0.9952200217991523,0.004779978200847664 +0,0.9911981248377754,0.00880187516222462 +0,0.9985156972228519,0.001484302777147976 +1,0.19941239536944771,0.8005876046305522 +0,0.9995500513353144,4.499486646857206E-4 +0,0.9802753839150763,0.019724616084923662 +0,0.983435556224044,0.016564443775955968 +0,0.6690916279581519,0.33090837204184814 +0,0.9989578748593735,0.0010421251406263884 +0,0.973778860250697,0.026221139749303055 +0,0.9999976997887879,2.3002112120343608E-6 +0,0.6477473138977053,0.3522526861022947 +0,0.9999996766782233,3.2332177683896384E-7 +0,0.9844725581235569,0.015527441876443004 +0,0.6575002426676382,0.3424997573323618 +0,0.9526051012331691,0.047394898766830784 +0,0.8310812261509113,0.16891877384908877 +0,0.9638883556468348,0.03611164435316518 +0,0.9943912779839323,0.005608722016067533 +1,0.28330057188885704,0.716699428111143 +0,0.6034605178164542,0.3965394821835459 +0,0.9999999736638454,2.6336154487973373E-8 +0,0.9992561145801966,7.438854198034032E-4 +0,0.9482096437583024,0.051790356241697574 +1,0.3867959208768044,0.6132040791231955 +1,0.2397969755214359,0.7602030244785641 +0,0.6209076052905947,0.37909239470940526 +1,0.15699609083895866,0.8430039091610414 +0,0.9992642548863426,7.357451136575104E-4 +0,0.9907640193999548,0.009235980600045239 +0,0.9792462741414201,0.020753725858579864 +1,0.4909699197622519,0.5090300802377481 +0,0.9998156894667757,1.843105332242695E-4 +0,0.9999909662064311,9.03379356894321E-6 +0,0.9546598162776365,0.045340183722363585 +0,0.999997749538962,2.2504610378904623E-6 +0,0.8398392553161478,0.16016074468385216 +0,0.8744534764578299,0.12554652354217005 +0,0.999999952681949,4.7318050965450876E-8 +1,0.17001271259890163,0.8299872874010984 +0,0.5654740681922319,0.434525931807768 +0,0.975994985202466,0.024005014797534023 +0,0.9999988006694982,1.1993305019034094E-6 +0,0.9999961269254057,3.873074594199113E-6 +0,0.9848780165486899,0.015121983451310047 +0,0.9535454851523307,0.046454514847669284 +0,0.7369023145366025,0.26309768546339746 +0,0.9999999864899434,1.351005671788234E-8 +0,0.7760763191768617,0.2239236808231383 +0,0.9340680922204332,0.0659319077795668 +0,0.8898339842994553,0.11016601570054474 +0,0.9609434266849964,0.03905657331500358 +1,0.32949637811228294,0.6705036218877171 +0,0.9994105207608819,5.894792391181283E-4 +0,0.9895028200711786,0.01049717992882139 +0,0.9917223464436408,0.008277653556359227 +0,0.9662220116909018,0.033777988309098124 +0,0.8909844280423259,0.1090155719576741 +0,0.9999994520992421,5.47900757842071E-7 +0,0.9999997979723183,2.0202768173033547E-7 +0,0.9797993569976693,0.02020064300233074 +0,0.6597606502348314,0.34023934976516856 +0,0.8401450187658723,0.15985498123412767 +1,0.34262528416600097,0.657374715833999 +0,0.8505580093938195,0.1494419906061805 +0,0.8497129471174457,0.15028705288255428 +0,0.9990688549407788,9.311450592212643E-4 +0,0.7576604296005611,0.2423395703994388 +0,0.8233485688101432,0.17665143118985688 +1,0.035691209159576257,0.9643087908404236 +0,0.9999999996330948,3.669050631132422E-10 +0,0.9924583807097737,0.007541619290226352 +0,0.7872668225009106,0.21273317749908938 +0,0.9648145139027857,0.035185486097214176 +0,0.9901111834874953,0.0098888165125047 +0,0.9779097976677026,0.022090202332297464 +1,0.4330979665179669,0.5669020334820332 +1,0.07469121365048376,0.9253087863495163 +0,0.9784647128094581,0.02153528719054182 +0,0.9944894491208417,0.005510550879158429 +0,0.830261764154194,0.169738235845806 +1,0.01921374092634416,0.9807862590736558 +0,0.9906314323721246,0.009368567627875472 +0,0.9768244627720323,0.02317553722796776 +1,0.17161446693492097,0.828385533065079 +1,0.10918219399014115,0.8908178060098589 +0,0.8199001454697972,0.1800998545302028 +0,0.8334446216188175,0.16655537838118248 +0,0.9158648735127788,0.08413512648722125 +0,0.9933510224702591,0.006648977529740983 +0,0.9665632456974786,0.03343675430252143 +0,0.9999992871380815,7.128619185289489E-7 +0,0.797725606192827,0.20227439380717308 +0,0.9910335405834273,0.008966459416572578 +1,0.24391528129246987,0.7560847187075301 +0,0.9261060551420996,0.07389394485790031 +1,0.14021286375686115,0.8597871362431388 +0,0.9547854114592643,0.045214588540735595 +0,0.9997019366040435,2.9806339595648515E-4 +0,0.8583420772047682,0.14165792279523176 +1,0.49188889990444734,0.5081111000955526 +0,0.9974516786682973,0.002548321331702752 +0,0.9999923617199338,7.638280066162587E-6 +0,0.9999961392268759,3.860773124044777E-6 +0,0.6797836276650138,0.3202163723349862 +1,3.524977244776509E-26,1.0 +0,0.9438464620892393,0.05615353791076079 +0,0.9845205962254584,0.01547940377454151 +0,0.9638976670657172,0.03610233293428276 +0,0.521575706466154,0.47842429353384597 +0,0.9989315919576465,0.001068408042353561 +0,0.9999966486431555,3.3513568444985635E-6 +0,0.6544527076197588,0.3455472923802411 +0,0.7339195795928868,0.2660804204071132 +0,0.9999995669450411,4.3305495877059274E-7 +0,0.9999988137511054,1.1862488945346312E-6 +0,0.64600614030936,0.35399385969064007 +0,0.8881494440294887,0.11185055597051133 +1,0.3274767285440046,0.6725232714559953 +0,0.9999922690058444,7.730994155544266E-6 +0,0.9999964853023745,3.5146976255374616E-6 +0,0.9999999997490665,2.509334116235064E-10 +0,0.9927110453575914,0.007288954642408757 +0,0.553235242535534,0.4467647574644659 +0,0.9824469891051676,0.01755301089483236 +0,0.8880675791369664,0.11193242086303352 +0,0.9828241533211001,0.017175846678899962 +0,0.5850524475524869,0.4149475524475132 +1,0.014474204859844244,0.9855257951401558 +0,0.6668834759203712,0.3331165240796288 +0,0.8170376952543095,0.1829623047456906 +1,0.4299369294017463,0.5700630705982537 +0,0.8493273603424615,0.1506726396575386 +0,0.9399190294125548,0.06008097058744515 +0,0.8694250428439432,0.13057495715605683 +0,0.6308919520730655,0.36910804792693447 +1,0.26834524249631403,0.7316547575036859 +1,0.31425506662179775,0.6857449333782022 +0,0.8444025456405508,0.15559745435944913 +0,0.7154681331368028,0.28453186686319726 +0,0.9999878856482907,1.2114351709331236E-5 +0,0.5986494859360116,0.4013505140639884 +1,0.0717469843862019,0.9282530156137981 +1,0.06904112823422388,0.9309588717657762 +0,0.9904341992244665,0.009565800775533486 +0,0.9984033590114939,0.0015966409885059668 +0,0.9984929019174715,0.001507098082528322 +0,0.990179727143253,0.009820272856747093 +0,0.5880652028159975,0.41193479718400255 +0,0.999998279055788,1.7209442120152769E-6 +0,0.9999993613654059,6.386345941285328E-7 +0,0.9909716577759805,0.009028342224019433 +0,0.9707826869586569,0.029217313041343035 +1,0.39985058208630975,0.6001494179136904 +0,0.5483661654877816,0.4516338345122184 +0,0.9999999911838809,8.816119044386031E-9 +1,0.3371989608755466,0.6628010391244534 +0,0.9999900512013326,9.94879866747353E-6 +0,0.7669768590124629,0.23302314098753701 +1,0.4553306550019851,0.5446693449980149 +0,0.9999910483760107,8.951623989194651E-6 +0,0.7336252602762174,0.26637473972378245 +0,0.9565644081885587,0.04343559181144141 +0,0.8795431106690996,0.12045688933090036 +1,0.3763301197281672,0.6236698802718328 +1,0.17051449108172756,0.8294855089182724 +0,0.6084047049626271,0.39159529503737284 +1,0.20863853196988785,0.7913614680301122 +0,0.9841913719388957,0.01580862806110424 +0,0.9987140223645922,0.001285977635407906 +1,0.1995107908966425,0.8004892091033574 +1,0.06614323619400471,0.9338567638059954 +0,0.9994067223085817,5.932776914181763E-4 +0,0.9771878437644064,0.022812156235593697 +0,0.9999999949254348,5.074565228727348E-9 +0,0.7026554747388912,0.2973445252611087 +0,0.9999976781445117,2.3218554884118355E-6 +0,0.8029944443773758,0.19700555562262417 +0,0.9999999588373941,4.116260584299864E-8 +0,0.9999999985128827,1.4871172570429657E-9 +0,0.9989881224568858,0.0010118775431141025 +0,0.9997861064915856,2.138935084143704E-4 +0,0.702873125712031,0.2971268742879691 +0,0.6089430256941771,0.3910569743058228 +1,0.17305313151357027,0.8269468684864297 +0,0.7097488320668066,0.2902511679331934 +0,0.9991597543450035,8.402456549964725E-4 +0,0.6884071189730814,0.31159288102691857 +0,0.986401174279344,0.013598825720655938 +0,0.5756130298339439,0.424386970166056 +0,0.9447422561252593,0.05525774387474076 +0,0.9999840913718849,1.5908628114981628E-5 +0,0.9975332703356456,0.002466729664354247 +0,0.9990805455376625,9.194544623375887E-4 +1,0.33767687883451675,0.6623231211654832 +1,0.11606198050907819,0.8839380194909218 +1,0.20526075118585493,0.794739248814145 +0,0.9834694239964417,0.016530576003558416 +0,0.5411654753782691,0.45883452462173097 +0,0.8325209453648886,0.1674790546351114 +0,0.999990130389807,9.869610193053725E-6 +0,0.7577750610134734,0.24222493898652664 +0,0.9796019601375553,0.020398039862444792 +1,0.29596215175944685,0.7040378482405532 +1,0.352151381399222,0.647848618600778 +0,0.9831518509799102,0.01684814902008988 +0,0.9899948834817495,0.01000511651825045 +0,0.8344534907388479,0.16554650926115214 +0,0.9993428683509561,6.571316490438653E-4 +0,0.9999999985120749,1.4879251588701325E-9 +0,0.999986951271828,1.3048728172035347E-5 +0,0.998777255434967,0.001222744565032918 +1,0.1852911380970215,0.8147088619029785 +0,0.9999984277016992,1.5722983007627084E-6 +0,0.6612050559126095,0.3387949440873905 +1,0.22558430700897636,0.7744156929910236 +0,0.9999999978439906,2.156009358896923E-9 +0,0.9928141690816064,0.00718583091839366 +0,0.9772995454632667,0.022700454536733184 +1,0.15109272924475808,0.8489072707552419 +1,0.23242490249110198,0.7675750975088981 +0,0.9829380884541129,0.01706191154588713 +0,0.99497106890693,0.005028931093070052 +0,0.9983854963758688,0.0016145036241310654 +0,0.9762767823877427,0.023723217612257135 +0,0.8723228822224717,0.12767711777752833 +0,0.9999998876487424,1.123512576657633E-7 +0,0.5543503254547392,0.4456496745452609 +1,0.436158452984632,0.5638415470153679 +0,0.9981390303655809,0.001860969634419024 +1,0.1836810190578913,0.8163189809421088 +0,0.9985384092299927,0.0014615907700073277 +0,0.7115346462380484,0.28846535376195165 +0,0.6502343288926167,0.34976567110738327 +0,0.9941414595365299,0.005858540463470065 +0,0.9869070293897937,0.013092970610206325 +1,0.44576677673509074,0.5542332232649093 +0,0.9222328585565145,0.07776714144348558 +0,0.9666329052904239,0.03336709470957617 +0,0.9573954320762602,0.04260456792373979 +0,0.5510519528894742,0.4489480471105257 +1,0.3173984555175885,0.6826015444824115 +1,0.15203260489646947,0.8479673951035306 +0,0.974544453441958,0.025455546558041945 +0,0.7328997791035704,0.2671002208964296 +0,0.9694076349740932,0.030592365025906877 +0,0.90735987181939,0.09264012818060995 +0,0.9981599258962429,0.0018400741037571154 +1,7.925593604762538E-7,0.9999992074406396 +0,0.9755156257647539,0.024484374235246145 +0,0.99998665825189,1.3341748109893104E-5 +0,0.9405220901719342,0.05947790982806576 +0,0.9999194472065546,8.055279344540057E-5 +0,0.9287180874770169,0.07128191252298301 +1,0.21283344557942832,0.7871665544205717 +0,0.996744852005988,0.0032551479940120705 +0,0.5457600644484625,0.4542399355515375 +0,0.9986334245506878,0.0013665754493120306 +0,0.9981381847301818,0.0018618152698181075 +0,0.9719525944262516,0.028047405573748355 +0,0.9949891618536425,0.005010838146357476 +1,1.76849013239959E-25,1.0 +0,0.9999554829593775,4.451704062240701E-5 +0,0.7171587918250498,0.28284120817495023 +0,0.9521668287640018,0.04783317123599816 +0,0.9830734861660869,0.016926513833913085 +0,0.5163525873126064,0.4836474126873937 +0,0.9999999965205457,3.479454304472605E-9 +0,0.9998206604396747,1.7933956032530158E-4 +1,0.10200331990376445,0.8979966800962357 +0,0.9855215452366486,0.01447845476335128 +0,0.999987866306428,1.2133693572022435E-5 +0,0.998714656682457,0.0012853433175430329 +0,0.9999973876971802,2.6123028197750776E-6 +1,0.1879433632307716,0.8120566367692285 +0,0.9999689752432717,3.102475672829772E-5 +1,0.15476677990264573,0.8452332200973542 +1,0.11442411710036095,0.885575882899639 +0,0.6796337640261135,0.3203662359738864 +0,0.9039116364952213,0.09608836350477878 +1,0.24008609290292462,0.7599139070970753 +0,0.9349433106739383,0.06505668932606158 +0,0.917739143314563,0.08226085668543708 +0,0.6475506961618979,0.3524493038381022 +1,0.40848307893031355,0.5915169210696865 +0,0.8632041339100271,0.13679586608997296 +0,0.899753348441372,0.10024665155862804 +1,0.29282113542537985,0.7071788645746202 +0,0.5586703287075906,0.4413296712924094 +1,0.2566765876557098,0.7433234123442902 +1,0.11103962261793522,0.8889603773820649 +1,0.21126696957506408,0.7887330304249359 +0,0.9318693832629212,0.06813061673707889 +0,0.8005403040047532,0.19945969599524677 +1,0.2083321946399685,0.7916678053600316 +0,0.9969793747076102,0.003020625292389792 +0,0.807535994641285,0.19246400535871505 +1,0.2635636668384214,0.7364363331615785 +0,0.9721979668720107,0.027802033127989224 +0,0.9828838837207584,0.017116116279241454 +0,0.9999995594669326,4.405330673734132E-7 +0,0.9999922751529248,7.724847075109138E-6 +0,0.9554529600912266,0.044547039908773484 +1,0.4326257051629203,0.5673742948370797 +0,0.926489788572763,0.07351021142723706 +0,0.9255250920447338,0.07447490795526625 +0,0.8338429896409211,0.16615701035907895 +0,0.9992003883280433,7.996116719567141E-4 +0,0.9716653484015111,0.028334651598488855 +0,0.8129934544958379,0.18700654550416212 +0,0.9962263447989107,0.0037736552010893903 +0,0.9024842470407425,0.0975157529592574 +1,0.4197081206894814,0.5802918793105186 +0,0.9470647065806387,0.05293529341936137 +0,0.9999969350480468,3.0649519532553927E-6 +0,0.9999880370604387,1.1962939561200909E-5 +0,0.7760142944150066,0.22398570558499348 +0,0.8187343185890489,0.18126568141095115 +1,0.03156558672975351,0.9684344132702465 +1,0.330332484704312,0.669667515295688 +0,0.999754979097408,2.4502090259203397E-4 +1,0.08504968822705768,0.9149503117729424 +0,0.9964491290472351,0.0035508709527649817 +1,0.3312460664357321,0.6687539335642678 +1,0.1465631162062789,0.8534368837937212 +1,0.22791708491257343,0.7720829150874265 +0,0.9948044746171986,0.0051955253828013795 +0,0.7482095032489408,0.2517904967510592 +0,0.9999982499303269,1.75006967300395E-6 +0,0.9999999409607639,5.903923597545975E-8 +1,0.31659444856264896,0.683405551437351 +0,0.9995333834646488,4.666165353512491E-4 +0,0.9999963196956034,3.6803043964940104E-6 +0,0.8390841216977432,0.16091587830225682 +1,0.044754691284451434,0.9552453087155485 +0,0.8121986487050185,0.18780135129498152 +0,0.9067607352465437,0.09323926475345633 +0,0.9973889717230542,0.0026110282769456943 +0,0.9985669755749635,0.0014330244250364513 +0,0.9339033079560096,0.06609669204399037 +0,0.9993389972787714,6.610027212286512E-4 +0,0.8340864278281561,0.1659135721718439 +0,0.9659923186239014,0.03400768137609852 +1,0.4637018985399236,0.5362981014600764 +0,0.836228133173649,0.16377186682635103 +1,0.1459744657794273,0.8540255342205727 +0,0.9863911481614281,0.013608851838571936 +0,0.9643218437344381,0.03567815626556189 +0,0.652330575251572,0.34766942474842805 +0,0.9999088506583239,9.114934167615984E-5 +0,0.9999616803652527,3.83196347473844E-5 +0,0.9676923334549894,0.03230766654501057 +0,0.9996097069166767,3.902930833233958E-4 +1,0.11262329016276641,0.8873767098372335 +1,0.14934594283827468,0.8506540571617254 +0,0.8055208197454756,0.19447918025452435 +0,0.9999994419552168,5.580447831774528E-7 +1,0.3923040828959417,0.6076959171040582 +0,0.6765240369729324,0.32347596302706755 +0,0.9999954447521026,4.555247897358323E-6 +0,0.971174839815714,0.02882516018428606 +0,0.5082021590184909,0.4917978409815091 +1,0.20437880822800827,0.7956211917719918 +0,0.9475627949861625,0.05243720501383742 +0,0.9997894955943544,2.1050440564554892E-4 +1,0.46753358878023255,0.5324664112197675 +0,0.9772947795133512,0.022705220486648917 +0,0.9794580345258913,0.020541965474108765 +0,0.6073141579665189,0.3926858420334811 +1,0.2778800119581768,0.7221199880418232 +0,0.9985104303837357,0.0014895696162642923 +0,0.9867887141417492,0.013211285858250809 +0,0.9457537900022079,0.05424620999779203 +0,0.9999723057148211,2.769428517896662E-5 +0,0.9934433896960392,0.00655661030396085 +0,0.9999958973769564,4.102623043616435E-6 +0,0.5134529697100696,0.4865470302899304 +0,0.9999915582969736,8.441703026431447E-6 +1,0.06490475269085307,0.935095247309147 +0,0.9996634165508714,3.3658344912852994E-4 +0,0.9622960525127549,0.037703947487245086 +0,0.5085695275502724,0.4914304724497275 +0,0.5962736789045354,0.40372632109546464 +1,0.21421664903508533,0.7857833509649146 +0,0.9106720301291992,0.08932796987080097 +0,0.9027464585673757,0.09725354143262438 +1,0.15668341737304753,0.8433165826269524 +0,0.9999993759671821,6.24032817929424E-7 +0,0.8457541652994103,0.15424583470058978 +0,0.9656514878959549,0.03434851210404516 +0,0.655480504141149,0.3445194958588509 +0,0.9880488551347891,0.011951144865210844 +1,0.17101601645718795,0.8289839835428121 +0,0.5430536130801162,0.45694638691988365 +0,0.7055757273153379,0.29442427268466204 +1,0.2449811850044649,0.755018814995535 +0,0.997450143367945,0.0025498566320549193 +0,0.9103503376500572,0.08964966234994272 +0,0.9603337005730546,0.039666299426945474 +0,0.9019783473721791,0.09802165262782093 +0,0.990900537174297,0.009099462825702878 +0,0.6789154661460033,0.3210845338539968 +0,0.9801910643563697,0.01980893564363018 +0,0.7442231110434456,0.2557768889565544 +0,0.7081830936417636,0.29181690635823637 +0,0.9717677856681157,0.02823221433188418 +1,0.1910175144461751,0.8089824855538249 +0,0.9427468304332948,0.057253169566705196 +0,0.9270788009658206,0.07292119903417944 +0,0.6162348767015949,0.383765123298405 +0,0.8833163838105921,0.11668361618940797 +1,0.4882624067719188,0.5117375932280812 +0,0.9875204915905097,0.012479508409490313 +0,0.9702298815216578,0.029770118478342128 +0,0.9734647210060645,0.02653527899393552 +1,0.38257814675064644,0.6174218532493536 +0,0.9267911691822065,0.07320883081779346 +1,0.17954412580158385,0.820455874198416 +0,0.9999994474286988,5.525713012351571E-7 +0,0.9491683823219332,0.050831617678066814 +1,0.2731437116589348,0.7268562883410652 +1,0.1242054043584848,0.8757945956415152 +0,0.9999916318483569,8.368151643004813E-6 +0,0.9862527118495358,0.013747288150464278 +0,0.6081461046567375,0.39185389534326254 +0,0.9766473472193931,0.02335265278060693 +1,0.21217604388730327,0.7878239561126967 +0,0.522877188980996,0.477122811019004 +0,0.984960627524817,0.015039372475182987 +0,0.9028476939631626,0.09715230603683747 +0,0.9859521798524188,0.014047820147581273 +0,0.9618867937789338,0.03811320622106624 +0,0.9673469936771929,0.032653006322807196 +0,0.6503514518002228,0.3496485481997772 +0,0.7583638827349373,0.24163611726506276 +0,0.9621967291548703,0.03780327084512958 +0,1.0,7.091617266997251E-17 +0,0.9736351274879811,0.026364872512018883 +1,0.2985398670890421,0.7014601329109579 +0,0.582486729531348,0.4175132704686521 +1,0.4656913397241329,0.5343086602758671 +1,0.45930831629923335,0.5406916837007667 +0,0.9959669058532687,0.004033094146731149 +1,0.0741146013643063,0.9258853986356937 +0,0.9996919448204792,3.080551795207667E-4 +0,0.9999991443161339,8.55683866051178E-7 +1,0.14767828454626958,0.8523217154537304 +0,0.6286450803929736,0.37135491960702627 +0,0.9999998432330995,1.5676690045718328E-7 +1,0.3659358435569254,0.6340641564430747 +0,0.5938314335197573,0.40616856648024274 +0,0.9999992989262264,7.010737736660706E-7 +1,0.39421667553748035,0.6057833244625196 +0,0.9999999981080674,1.8919326491938965E-9 +0,0.9095917811944552,0.0904082188055449 +0,0.94109054142751,0.05890945857249002 +1,0.39281647140413534,0.6071835285958647 +0,0.5976301925195272,0.40236980748047285 +0,0.9610786194131029,0.03892138058689707 +0,0.9961036037665342,0.0038963962334657874 +0,0.997828979352877,0.0021710206471229334 +0,0.923677537134815,0.076322462865185 +1,0.18176114116481099,0.818238858835189 +1,0.1754229572660841,0.8245770427339159 +1,0.12071959210960337,0.8792804078903966 +0,0.9963905546535206,0.0036094453464794152 +0,0.8574318346992321,0.14256816530076788 +1,0.2214179633425234,0.7785820366574766 +0,0.9999130800735928,8.691992640731669E-5 +0,0.9082875104086784,0.09171248959132164 +0,0.7322380732909414,0.26776192670905874 +0,0.999992969641061,7.030358938903085E-6 +1,0.48853684345993786,0.511463156540062 +0,0.9952519489075938,0.004748051092406198 +0,0.9956238469874491,0.004376153012550878 +0,0.6430816317001649,0.35691836829983514 +0,0.7969375020300882,0.20306249796991183 +0,0.9765125700956678,0.02348742990433203 +0,0.9646948208559772,0.035305179144022696 +0,0.9840783689938092,0.015921631006190783 +0,0.9316061813648574,0.06839381863514256 +0,0.9992141912376954,7.858087623046732E-4 +0,0.9587530910471154,0.0412469089528847 +0,0.9414001724913944,0.0585998275086056 +0,0.7333641032393511,0.2666358967606489 +0,0.9815210931051855,0.018478906894814413 +1,0.2526158112682089,0.7473841887317911 +0,0.7828929088191333,0.2171070911808667 +1,4.334306495795679E-13,0.9999999999995666 +1,0.024242381033837516,0.9757576189661624 +0,0.9992941205678209,7.058794321792263E-4 +0,0.538503446293846,0.4614965537061539 +0,0.9990136528834954,9.863471165045261E-4 +0,0.9574027444116565,0.04259725558834345 +0,0.9224595436958677,0.07754045630413227 +0,0.9859745232310121,0.014025476768987858 +0,0.5476692409146884,0.4523307590853117 +0,0.9552946241538692,0.04470537584613079 +0,0.9979019286751429,0.002098071324856988 +1,0.47627229997450937,0.5237277000254906 +0,0.9460962659590638,0.05390373404093614 +0,0.9999994816661042,5.183338957330965E-7 +0,0.9978780827099981,0.0021219172900019566 +0,0.8115847582356538,0.1884152417643462 +1,0.3092290137228672,0.6907709862771328 +1,4.93431604150693E-6,0.9999950656839585 +0,0.9999134759859177,8.652401408221296E-5 +1,0.3358482794399144,0.6641517205600855 +0,0.9987518145528841,0.001248185447115959 +0,0.998769080856593,0.0012309191434070725 +0,0.9999971283328879,2.8716671122207195E-6 +0,0.9582969199968617,0.041703080003138326 +0,0.9999999903754712,9.624528858241346E-9 +1,0.18640535261194066,0.8135946473880594 +0,0.9347581047586924,0.0652418952413076 +0,0.7894467300737781,0.21055326992622192 +0,0.8144227795410186,0.18557722045898145 +0,0.9762276037346567,0.023772396265343304 +1,0.07931855197073091,0.9206814480292691 +0,0.982655032477438,0.01734496752256197 +0,0.7990950683823616,0.20090493161763856 +0,0.9999987996394519,1.2003605481153392E-6 +0,0.9927224815552644,0.007277518444735614 +0,0.9957074993011679,0.0042925006988321236 +1,0.24793307152717492,0.7520669284728251 +0,0.9934305436122963,0.0065694563877037575 +1,0.32329372624755526,0.6767062737524449 +0,0.7579037159664368,0.24209628403356326 +1,0.4700255968372377,0.5299744031627623 +1,0.21738565220463504,0.782614347795365 +0,0.9068968741865918,0.09310312581340818 +0,0.9999997907579534,2.0924204652247512E-7 +0,0.8543670400416505,0.14563295995834952 +0,0.9995463153285371,4.5368467146296096E-4 +0,0.8817813063395229,0.11821869366047706 +0,0.9121693633315537,0.0878306366684463 +0,0.999996593854644,3.4061453558627295E-6 +1,0.4506925920093293,0.5493074079906707 +0,0.7761352598334492,0.2238647401665509 +0,0.9747464065976442,0.02525359340235587 +0,0.8973329782819083,0.10266702171809167 +1,0.062171628658718295,0.9378283713412817 +0,0.9946089372495464,0.005391062750453571 +0,0.9768211860573494,0.0231788139426507 +0,0.6522664177919675,0.3477335822080325 +0,0.9440848399135781,0.05591516008642199 +0,0.9600014334838028,0.039998566516197154 +0,0.9497656430522422,0.050234356947757804 +0,0.9908784489720427,0.009121551027957165 +0,0.8918695298431732,0.10813047015682677 +0,0.9795231081489527,0.020476891851047223 +0,0.7424333707956916,0.2575666292043084 +1,0.15836153143626028,0.8416384685637397 +1,0.23916528585202868,0.7608347141479714 +0,0.6866901005510596,0.31330989944894044 +0,0.9070278052025122,0.09297219479748771 +0,0.7010820730483934,0.2989179269516066 +0,0.8342650208323488,0.16573497916765123 +0,0.9999969558456537,3.0441543462574025E-6 +0,0.9738089151844714,0.02619108481552858 +0,0.9822147459043912,0.017785254095608757 +1,0.16596370641131117,0.8340362935886889 +0,0.9706850234067047,0.029314976593295194 +1,0.2919884852964984,0.7080115147035015 +0,0.9035541602940054,0.09644583970599462 +1,0.15718881191871498,0.842811188081285 +0,0.826869057421038,0.17313094257896203 +0,0.9945739486952199,0.00542605130478011 +0,0.7644934998081515,0.2355065001918486 +0,0.9691625786831434,0.030837421316856663 +0,0.7004825937589984,0.2995174062410017 +0,0.9820538377394736,0.01794616226052628 +0,0.9667231305335652,0.03327686946643473 +0,0.9820099823481672,0.017990017651832724 +0,0.8624369366873337,0.13756306331266638 +0,0.9988732904595002,0.0011267095404998014 +0,0.8996369502212828,0.10036304977871727 +0,0.9959588816033169,0.0040411183966832165 +0,0.9944809252347734,0.00551907476522661 +0,0.9978157450859496,0.002184254914050302 +0,0.7265591962734349,0.27344080372656504 +1,0.47411480435048364,0.5258851956495164 +0,0.9965113353164902,0.0034886646835098982 +0,0.9940319163819458,0.0059680836180542665 +0,0.9845470157377123,0.015452984262287769 +0,0.993615340790124,0.006384659209875979 +0,0.887942263592476,0.1120577364075241 +0,0.8522286000171774,0.14777139998282265 +0,0.7767008004758119,0.22329919952418797 +0,0.9999705326585691,2.9467341430966193E-5 +1,0.16265179491909743,0.8373482050809025 +0,0.9299961381459234,0.07000386185407657 +0,0.9810372103418676,0.018962789658132327 +1,0.4548196847139347,0.5451803152860654 +0,0.9768174997271774,0.02318250027282262 +0,0.9834866534993237,0.016513346500676315 +0,0.8310595378513712,0.16894046214862873 +0,0.9999999919711086,8.028891377096107E-9 +1,0.18856558594855416,0.8114344140514459 +0,0.9895886539955288,0.010411346004471371 +0,0.6986426773056379,0.30135732269436205 +0,0.7957069070101945,0.20429309298980547 +0,0.9744906901476882,0.025509309852311753 +0,0.9999999923375479,7.66245222812979E-9 +0,0.8294550850712591,0.17054491492874088 +1,0.17941166883315537,0.8205883311668446 +1,0.21557479397142243,0.7844252060285776 +1,0.2889743479312046,0.7110256520687954 +0,0.9930687408601808,0.006931259139819171 +0,0.9999938272575063,6.17274249375103E-6 +0,0.9999932261599568,6.7738400431823805E-6 +0,0.9746809918369471,0.025319008163052784 +1,0.27771679420128403,0.722283205798716 +0,0.7775525469251612,0.2224474530748389 +0,0.9999875847389254,1.2415261074635312E-5 +0,0.9939871324077015,0.006012867592298445 +0,0.9991802017103428,8.197982896570916E-4 +0,0.9976993564867744,0.0023006435132255625 +0,0.9852857497792893,0.014714250220710766 +0,0.997246468678934,0.002753531321066039 +1,0.2263594183380752,0.7736405816619248 +0,0.9990512844064845,9.487155935155958E-4 +0,0.9999999999994218,5.782914345877717E-13 +0,0.9999999947847016,5.215298463880641E-9 +0,0.9990073403854416,9.926596145583039E-4 +0,0.5060835247655936,0.4939164752344065 +0,0.9990742319199617,9.2576808003844E-4 +0,0.9832222330033722,0.016777766996627738 +0,0.9608911384069159,0.039108861593084035 +0,0.736355738290045,0.26364426170995503 +0,0.9134557166645335,0.08654428333546652 +0,0.9602022442650703,0.03979775573492981 +0,0.9420067260484267,0.05799327395157331 +0,0.8287828904726987,0.1712171095273013 +0,0.7795512383928321,0.22044876160716778 +0,0.9729823200727219,0.027017679927278108 +0,0.9994688007127837,5.31199287216334E-4 +0,0.7388202692379844,0.26117973076201567 +1,0.4451418635186161,0.5548581364813838 +0,0.9999999376526622,6.234733779478397E-8 +0,0.9995900097632886,4.09990236711309E-4 +0,0.9999995630904094,4.3690959062649766E-7 +0,0.9999941362734425,5.863726557569183E-6 +1,0.17963435079366008,0.8203656492063399 +0,0.5716738183417337,0.42832618165826625 +1,0.10255871864256891,0.8974412813574312 +0,0.9501939996286496,0.049806000371350356 +0,0.8006534809806087,0.19934651901939132 +1,0.2735207161914059,0.7264792838085942 +0,0.7266406077348094,0.2733593922651905 +0,0.999999895096454,1.0490354605764249E-7 +0,0.975518663342677,0.024481336657323084 +0,0.6965364697439026,0.30346353025609735 +0,0.6815014057243982,0.31849859427560173 +0,0.98011108116425,0.01988891883574993 +0,0.9999997739026567,2.2609734331467297E-7 +0,0.6595980362668082,0.3404019637331918 +0,0.9991015994011762,8.984005988238959E-4 +0,0.6721994349618464,0.3278005650381535 +0,0.911246491488703,0.08875350851129699 +0,0.8911925657859856,0.10880743421401441 +0,0.9336255646346969,0.06637443536530306 +0,0.9987658358228196,0.0012341641771804613 +0,0.968868607171511,0.031131392828488855 +1,0.07184310853981207,0.9281568914601879 +1,0.3756422956129042,0.6243577043870958 +0,0.9983299335527576,0.0016700664472423857 +0,0.9999994490735953,5.509264047897763E-7 +0,0.9999936613958406,6.338604159393402E-6 +0,0.8089461749923085,0.1910538250076915 +1,0.2205667540994829,0.7794332459005172 +0,0.9904917880652724,0.009508211934727605 +0,0.7166138512131842,0.28338614878681584 +0,0.9992820472595264,7.179527404736103E-4 +1,0.46571653798894874,0.5342834620110513 +1,0.41269518390613175,0.5873048160938683 +0,0.8691659259755716,0.13083407402442837 +0,0.8461248779636669,0.15387512203633316 +1,0.16406027023384856,0.8359397297661514 +0,0.9982083240730041,0.0017916759269958223 +0,0.9637252732169778,0.03627472678302214 +1,0.1139906182865424,0.8860093817134576 +0,0.5846964564176748,0.41530354358232513 +0,0.9311804194565102,0.06881958054348972 +0,0.7339354049501041,0.2660645950498959 +0,0.7491246174119364,0.2508753825880636 +0,0.5767158729307054,0.42328412706929475 +1,0.35749368065615594,0.642506319343844 +1,0.4056637799370363,0.5943362200629637 +0,0.9999001561868633,9.984381313660456E-5 +0,0.7423934095206687,0.2576065904793313 +0,0.705418733014972,0.2945812669850279 +0,0.9742819463878722,0.025718053612127662 +1,0.03613306083577809,0.9638669391642218 +0,0.5804970932877372,0.41950290671226287 +0,0.9999999404135254,5.958647465956835E-8 +0,0.5210804834137441,0.4789195165862559 +0,0.9489281572440605,0.051071842755939546 +0,0.99972522844742,2.7477155257998436E-4 +0,0.9753062491115227,0.02469375088847733 +1,0.3919240475872697,0.6080759524127303 +0,0.9999832683171413,1.6731682858688705E-5 +1,0.17310221214903487,0.8268977878509651 +0,0.934744800282346,0.06525519971765412 +0,0.966277172519326,0.03372282748067395 +0,0.9780885529794897,0.021911447020510427 +0,0.9901784717139503,0.009821528286049716 +0,0.9492916704921326,0.05070832950786742 +0,0.9999988149532112,1.185046788824987E-6 +0,0.9999984773643391,1.5226356609041744E-6 +1,0.41621664811786985,0.5837833518821302 +0,0.7823796097330121,0.21762039026698787 +0,0.7990733261623594,0.2009266738376407 +0,0.738101981650649,0.261898018349351 +1,0.4829305908560198,0.5170694091439803 +0,0.8562714729416853,0.1437285270583148 +0,0.5088461488321128,0.4911538511678872 +1,0.1608933358452204,0.8391066641547795 +0,0.9322073408130436,0.06779265918695648 +0,0.95220949676701,0.04779050323298996 +1,0.06650601793014298,0.9334939820698571 +0,0.9999999999854348,1.4565164429311744E-11 +0,0.9921917135325705,0.007808286467429599 +0,0.7870822434271254,0.21291775657287468 +0,0.9960337102853699,0.003966289714629963 +0,0.976714546228242,0.023285453771757888 +0,0.933454818817219,0.066545181182781 +0,0.8286059262140867,0.17139407378591334 +0,0.8538542376719308,0.14614576232806925 +0,0.6478307287478229,0.3521692712521771 +0,0.9999809065718013,1.909342819869047E-5 +0,0.5413121992439422,0.4586878007560578 +0,0.999999999975103,2.4897022798199085E-11 +0,0.993881813568005,0.0061181864319949965 +0,0.9999999373726477,6.262735221826361E-8 +1,0.1603339748983445,0.8396660251016554 +1,0.2175252285791096,0.7824747714208904 +0,0.9986164483669515,0.0013835516330485687 +0,0.9999983503243919,1.6496756080243548E-6 +0,0.9761723225773811,0.0238276774226189 +0,0.997814226300151,0.002185773699849068 +0,0.9981237899922362,0.0018762100077638275 +0,0.9389444017348393,0.061055598265160736 +0,0.9486381702025084,0.05136182979749156 +0,0.985728545469155,0.014271454530844992 +0,0.807997886914133,0.19200211308586704 +1,0.43214518114771083,0.5678548188522892 +0,0.8186173659617858,0.1813826340382142 +0,0.735330854467837,0.26466914553216303 +0,0.9672270894028476,0.0327729105971523 +0,0.9999240429309864,7.595706901359836E-5 +0,0.7769960446168134,0.22300395538318657 +0,0.9999703796370343,2.9620362965683562E-5 +0,0.9940983926746247,0.005901607325375213 +0,0.9857065711670494,0.014293428832950674 +1,0.3039404837246701,0.6960595162753299 +0,0.76359874957143,0.23640125042856985 +0,0.7509330727217346,0.24906692727826538 +0,0.899224485702683,0.10077551429731704 +0,0.9907653004402299,0.009234699559770106 +0,0.9901097715334308,0.0098902284665691 +0,0.9996888001796712,3.1119982032869295E-4 +0,0.9999974096223717,2.5903776282997107E-6 +0,0.9996810169166302,3.189830833696846E-4 +0,0.5097613514107293,0.4902386485892707 +0,0.9383168126414022,0.06168318735859771 +0,0.9983188292568591,0.0016811707431409926 +0,0.9877970394030378,0.012202960596962253 +0,0.732906718290384,0.267093281709616 +0,0.9996179115882103,3.8208841178962637E-4 +1,0.25295884541291946,0.7470411545870804 +0,0.900021036030742,0.09997896396925801 +0,0.7550764591542072,0.2449235408457928 +0,0.5603928530831951,0.439607146916805 +0,0.8502446838562185,0.14975531614378135 +1,0.04428905959369268,0.9557109404063073 +0,0.9920199988604359,0.007980001139564182 +1,0.23365451774859952,0.7663454822514004 +0,0.9999998479611203,1.5203887966599926E-7 +0,0.9999986121208122,1.3878791878087685E-6 +0,0.8904248981726135,0.1095751018273865 +0,0.8851046559751373,0.11489534402486272 +0,0.8233282416207913,0.1766717583792087 +0,0.9761211463621443,0.023878853637855624 +0,0.9999996812705777,3.187294222843547E-7 +0,0.9241429234248206,0.07585707657517926 +0,0.9999871692911295,1.2830708870518742E-5 +0,0.9872836980990742,0.01271630190092579 +0,0.5977915707683715,0.4022084292316284 +0,0.9692856141938365,0.03071438580616359 +0,0.9425077300657414,0.0574922699342586 +0,0.983284391601673,0.016715608398326955 +0,0.9999934434733166,6.55652668337514E-6 +0,0.7513533250855731,0.24864667491442694 +0,0.9999957165968546,4.283403145493038E-6 +1,0.17114130106988387,0.8288586989301161 +0,0.9887933937050893,0.011206606294910666 +1,0.029259507450866657,0.9707404925491333 +0,0.9989795584150006,0.00102044158499944 +0,0.9870914700745427,0.01290852992545732 +1,0.33201690403205514,0.6679830959679449 +0,0.9609267789065525,0.03907322109344749 +1,0.11950304812940044,0.8804969518705996 +0,0.5919540471485149,0.4080459528514852 +0,0.8570658394604925,0.14293416053950747 +0,0.8160417708578143,0.18395822914218574 +0,0.7041545897677056,0.29584541023229444 +0,0.8562733080358802,0.14372669196411988 +0,0.9775367217379958,0.02246327826200427 +0,0.8977365289618547,0.10226347103814516 +1,0.4371546169779643,0.5628453830220357 +0,0.9965627223307799,0.0034372776692200503 +0,0.9227298637808606,0.07727013621913931 +0,0.9921123934517843,0.007887606548215732 +0,0.9999183174215365,8.168257846356274E-5 +0,0.9063989985716796,0.09360100142832041 +0,0.9356798967020592,0.06432010329794079 +0,0.9818516566834893,0.01814834331651062 +0,0.9812917822841363,0.01870821771586375 +0,0.9811715951979916,0.018828404802008505 +0,0.9705591436702461,0.029440856329753844 +0,0.8926994939278031,0.10730050607219689 +0,0.5474526706128809,0.45254732938711906 +0,0.9994072468386049,5.927531613951062E-4 +0,0.9693958587357855,0.030604141264214485 +0,0.9279827840683823,0.07201721593161775 +1,0.17372103582538898,0.826278964174611 +0,0.7011733527699086,0.2988266472300914 +0,0.615627229916696,0.384372770083304 +1,0.05739114615308922,0.9426088538469107 +0,0.8484314609059566,0.1515685390940434 +1,0.2849543270498591,0.7150456729501409 +0,0.9999980791681286,1.920831871388175E-6 +0,0.6043849547734109,0.3956150452265891 +0,0.999999271081824,7.289181760158999E-7 +0,0.9627759097074494,0.03722409029255057 +0,0.7792808768354191,0.22071912316458092 +0,0.9227876011596463,0.07721239884035373 +0,0.9999802162678273,1.9783732172670583E-5 +0,0.6795536458729555,0.3204463541270445 +0,0.9491538078269033,0.05084619217309671 +0,0.8912765724611521,0.10872342753884802 +1,0.03638052289209176,0.9636194771079082 +0,0.7390796945959763,0.2609203054040236 +0,0.9972048016858512,0.00279519831414882 +0,0.9927872769955438,0.007212723004456043 +0,0.9999888928637891,1.1107136210936313E-5 +0,0.9469085585887012,0.05309144141129878 +0,0.9826999707761614,0.017300029223838494 +0,0.7681629230109341,0.23183707698906575 +0,0.7898231605839411,0.2101768394160589 +1,0.256322515720731,0.743677484279269 +0,0.9684074182549414,0.031592581745058614 +1,0.48677131376770894,0.5132286862322911 +0,0.6580253165813365,0.34197468341866344 +0,0.8999378676765205,0.10006213232347955 +0,0.9999991720029505,8.279970493531375E-7 +0,0.7143263587234857,0.28567364127651423 +0,0.9638957791501657,0.0361042208498344 +0,0.9885758233497303,0.011424176650269877 +0,0.9211105742602685,0.07888942573973141 +1,0.42940207368424255,0.5705979263157575 +0,0.9246683939769698,0.07533160602303021 +0,0.9772101077613947,0.02278989223860523 +0,0.9735554774167025,0.026444522583297523 +0,0.831000909779476,0.16899909022052398 +0,0.9533767059226834,0.04662329407731657 +0,0.9717897904466251,0.028210209553374888 +1,0.401396661818402,0.5986033381815979 +0,0.9797106637611546,0.020289336238845376 +0,0.9592870682955909,0.040712931704409025 +0,0.6636875130231146,0.33631248697688537 +0,0.9602463336986005,0.039753666301399586 +0,0.9831359933520987,0.016864006647901216 +0,0.9999999999971159,2.8842263726682664E-12 +1,0.3924171501526297,0.6075828498473703 +0,0.9999923421046886,7.657895311325106E-6 +0,0.9272289139593687,0.07277108604063137 +0,0.9088401900187068,0.09115980998129333 +1,0.12525214292320966,0.8747478570767904 +0,0.7898908983548004,0.2101091016451996 +1,0.37749238616851777,0.6225076138314822 +1,0.4835862140883916,0.5164137859116085 +0,0.6056807162988201,0.39431928370117997 +0,0.7505051929713673,0.24949480702863266 +0,0.9929355548518556,0.007064445148144429 +0,0.6956691706900145,0.30433082930998545 +0,0.9999993687938707,6.312061293964666E-7 +0,0.9869747863498637,0.013025213650136442 +1,0.2764231729965858,0.7235768270034142 +0,0.875565443132197,0.12443455686780303 +0,0.7729083389740405,0.22709166102595954 +0,0.989267419286924,0.01073258071307594 +0,0.9972809709149807,0.0027190290850193023 +1,0.2206572605722212,0.7793427394277788 +1,0.3718680131229851,0.6281319868770149 +1,0.21922374397029246,0.7807762560297076 +1,0.1601739235814989,0.839826076418501 +0,0.6069596367927479,0.39304036320725216 +0,0.9843275111296356,0.015672488870364508 +0,0.7721820959233103,0.22781790407668964 +0,0.8708087136009939,0.129191286399006 +0,0.9999995893098869,4.1069011302859866E-7 +1,0.47720980153203774,0.5227901984679623 +1,0.03417347230474496,0.9658265276952551 +0,0.9239484675054469,0.07605153249455304 +0,0.9720073363592051,0.02799266364079481 +0,0.9686348850551508,0.03136511494484923 +0,0.8400446006741785,0.15995539932582142 +0,0.9745024714751307,0.02549752852486941 +0,0.7991188003819248,0.20088119961807518 +1,0.132093492389995,0.867906507610005 +0,0.9999906724312153,9.327568784672465E-6 +0,0.9651498384225667,0.03485016157743318 +0,0.9378334209483005,0.06216657905169951 +1,0.178587043303505,0.8214129566964951 +0,0.8146445264446914,0.18535547355530863 +0,0.9999999300165228,6.998347715129044E-8 +0,0.9999999999359941,6.40058483486246E-11 +0,0.9980823029788497,0.0019176970211503437 +0,0.5697778809633723,0.43022211903662755 +0,0.9869577802309588,0.01304221976904113 +1,0.2161467809165926,0.7838532190834073 +0,0.5948068415866272,0.4051931584133728 +1,0.34983336002646337,0.6501666399735367 +0,0.9999433147858777,5.668521412226393E-5 +0,0.9443234004654202,0.05567659953457979 +1,0.48044166626107415,0.5195583337389258 +0,0.875459829266451,0.12454017073354888 +0,0.9999999999906104,9.389563591026028E-12 +1,0.2513289263198557,0.7486710736801443 +0,0.7853714889005765,0.2146285110994234 +0,0.7237579569107178,0.27624204308928235 +0,0.6695045259430816,0.33049547405691826 +0,0.5763091812394965,0.42369081876050346 +0,0.9961297829980825,0.0038702170019174484 +0,0.8014693633891512,0.1985306366108488 +0,0.9898591709268811,0.010140829073118793 +0,0.999229073079769,7.70926920230962E-4 +0,0.62765038009321,0.37234961990679005 +0,0.5224153225832059,0.4775846774167941 +0,0.6680309606673654,0.3319690393326345 +0,0.9999939741875082,6.025812491846852E-6 +0,0.8448014525712907,0.15519854742870928 +0,0.9881122251258807,0.011887774874119218 +0,0.8600519358219092,0.1399480641780908 +1,0.3759855113839146,0.6240144886160854 +0,0.9999503945934229,4.9605406577046536E-5 +0,0.9999747554356707,2.5244564329298746E-5 +0,0.9999998326004269,1.6739957308892937E-7 +0,0.7722638326888679,0.2277361673111321 +1,6.144805566673057E-6,0.9999938551944334 +0,0.9570895008693147,0.0429104991306854 +0,0.9125938750143113,0.08740612498568864 +0,0.9764077155492402,0.023592284450759764 +0,0.9887863975937532,0.011213602406246734 +1,0.04713083446869945,0.9528691655313005 +0,0.8215333222387854,0.1784666777612145 +0,0.8517006073416968,0.1482993926583031 +0,0.9999872860505793,1.27139494208165E-5 +0,0.8317124589432984,0.16828754105670157 +0,0.8403571295015276,0.1596428704984724 +0,0.7454340594697129,0.2545659405302872 +0,0.6498780870935315,0.35012191290646855 +0,0.9899233419875043,0.010076658012495606 +1,0.3392887051004894,0.6607112948995106 +1,0.4627337161793547,0.5372662838206453 +0,0.9980939839015146,0.0019060160984853722 +0,0.9749786477740331,0.02502135222596691 +0,0.9523042427986631,0.04769575720133687 +0,0.8176815127183563,0.18231848728164368 +0,0.6783190690318692,0.3216809309681308 +0,0.999999999459948,5.400520720666589E-10 +0,0.9601066952052628,0.03989330479473722 +0,0.9864098355483193,0.013590164451680752 +0,0.9999703788942893,2.96211057107418E-5 +0,0.9543070962280007,0.045692903771999235 +1,0.3366352364713052,0.6633647635286948 +0,0.9594597337654106,0.04054026623458946 +0,0.9999955143508344,4.4856491655214625E-6 +0,0.9919602694334305,0.008039730566569574 +0,0.5139674402273615,0.48603255977263854 +0,0.5673212952609428,0.4326787047390572 +0,0.9257385631053713,0.07426143689462873 +0,0.9725355083342,0.027464491665800145 +0,0.7954673559433252,0.20453264405667482 +0,0.981033493876443,0.0189665061235569 +0,0.9001641812888418,0.09983581871115818 +1,0.2585037809016701,0.74149621909833 +0,0.9999997403498265,2.596501734469063E-7 +0,0.9999989505543883,1.049445611829176E-6 +0,0.7670299631445373,0.2329700368554627 +0,0.6860095906247042,0.31399040937529576 +1,0.47666811479849824,0.5233318852015018 +0,0.9999970679117667,2.9320882333513944E-6 +1,0.2863860604833211,0.713613939516679 +0,0.7059865056270939,0.29401349437290614 +0,0.7932743106278798,0.20672568937212013 +1,0.489692968809732,0.5103070311902681 +0,0.9979048696396767,0.002095130360323184 +0,0.7680407037494273,0.2319592962505727 +0,0.5279357619758481,0.47206423802415187 +0,0.9851183764137224,0.01488162358627773 +0,0.9479969840071576,0.052003015992842336 +0,0.7351401198596768,0.26485988014032325 +0,0.971198142762796,0.028801857237204076 +0,0.9939801848019553,0.006019815198044749 +0,0.7215771403979592,0.2784228596020408 +0,0.9052353587035737,0.09476464129642623 +0,0.6591300742002218,0.3408699257997781 +0,0.9992702891446418,7.297108553581627E-4 +1,0.09481935677764192,0.9051806432223581 +0,0.8631148933135724,0.13688510668642767 +0,0.9993043811275615,6.956188724383769E-4 +0,0.8122398017796294,0.18776019822037068 +0,0.9880533687009593,0.011946631299040803 +0,0.863121238009145,0.13687876199085508 +0,1.0,1.6460219496999861E-18 +0,0.9943979588054078,0.005602041194592279 +0,0.9897493050120028,0.01025069498799725 +0,0.993597740998877,0.006402259001122974 +0,0.9021942868158961,0.09780571318410404 +0,0.7139403497168275,0.2860596502831725 +0,0.9994569234869501,5.430765130498434E-4 +0,0.9999836856293279,1.6314370671902772E-5 +0,0.8019351523928779,0.19806484760712195 +0,0.6913730714108832,0.3086269285891169 +1,0.3306370992316506,0.6693629007683494 +0,0.7225535417667588,0.27744645823324127 +0,0.9993616562321853,6.38343767814573E-4 +0,0.7293764413558385,0.27062355864416154 +0,0.9832269837354601,0.01677301626453974 +0,0.9994782017160885,5.217982839116283E-4 +0,0.9422204839468731,0.057779516053126825 +1,0.4055954243201809,0.5944045756798191 +0,0.553380641577346,0.446619358422654 +0,0.9931667769874711,0.006833223012529015 +0,0.720130349746573,0.2798696502534271 +0,0.6385292915445557,0.36147070845544416 +0,0.5366992401981228,0.46330075980187724 +0,0.7067937763300133,0.2932062236699868 +0,0.9987500342844924,0.0012499657155076343 +0,0.9997717958018929,2.2820419810709635E-4 +0,0.8437146356073059,0.15628536439269405 +0,0.7587053180070495,0.24129468199295048 +1,0.12417210519612028,0.8758278948038798 +0,0.952159784735756,0.047840215264243924 +0,0.5965841536547063,0.40341584634529365 +1,0.16331643166430784,0.8366835683356921 +0,0.9509842508408879,0.049015749159112186 +0,0.9996708890426848,3.291109573152831E-4 +0,0.6692436330245334,0.33075636697546656 +0,0.9999839245424295,1.607545757047158E-5 +0,0.7806483300602242,0.21935166993977587 +0,0.7911993109634097,0.20880068903659033 +0,0.9851316287836513,0.014868371216348594 +0,0.9985503088779019,0.0014496911220980323 +0,0.9320289902332772,0.06797100976672278 +0,0.9610042696603465,0.038995730339653464 +0,0.9315154174603751,0.06848458253962482 +0,0.9999968068707294,3.1931292704989694E-6 +0,0.9525831891086802,0.04741681089131969 +0,0.9671695128428891,0.03283048715711081 +0,0.719923480247478,0.28007651975252196 +1,0.18471098934037306,0.815289010659627 +0,0.8044877149554068,0.19551228504459317 +0,0.9127499899576423,0.08725001004235762 +0,0.7971263603577705,0.2028736396422294 +0,0.9656370105665497,0.03436298943345017 +0,0.9628412907216573,0.03715870927834274 +0,0.795108083689189,0.20489191631081105 +0,0.6383940526724164,0.36160594732758355 +0,0.9720038028726122,0.027996197127387813 +1,0.4693568128020915,0.5306431871979084 +1,0.3040834068097958,0.6959165931902042 +1,0.4908806570908657,0.5091193429091342 +0,0.7213628564450043,0.27863714355499564 +0,0.9999971183813889,2.8816186110609423E-6 +0,0.8098252585057576,0.1901747414942424 +0,0.9538937943773251,0.04610620562267488 +0,0.9999966563987208,3.343601279278206E-6 +0,0.999977478239714,2.2521760286015243E-5 +0,0.8809387755759643,0.11906122442403576 +1,1.625227246150057E-5,0.9999837477275385 +0,0.9839033647270004,0.016096635272999565 +0,0.7970976147622845,0.20290238523771553 +0,0.92690747007063,0.07309252992937003 +0,0.6636743799136704,0.3363256200863296 +0,0.7827363025908499,0.21726369740915005 +0,0.9970643379263846,0.0029356620736153425 +1,0.2848473638682608,0.7151526361317392 +0,0.9999239191687677,7.60808312322588E-5 +0,0.9442241906870645,0.05577580931293553 +0,0.775909429254041,0.2240905707459589 +1,0.24437088517867742,0.7556291148213226 +1,0.24455216524511694,0.7554478347548831 +0,0.6636911886124403,0.33630881138755986 +1,0.4409669097727538,0.5590330902272462 +1,0.06575108580699264,0.9342489141930074 +0,0.605381447481132,0.39461855251886796 +0,0.9507115022328408,0.04928849776715925 +1,0.31954411262562055,0.6804558873743795 +1,0.06230270273843793,0.937697297261562 +0,0.7736185899319944,0.22638141006800558 +1,0.4014497059532187,0.5985502940467813 +0,0.9999995061214234,4.938785765173569E-7 +0,1.0,2.2421167991227378E-20 +0,0.6964736668443773,0.3035263331556227 +0,0.8918235945711359,0.10817640542886406 +0,0.9913822252453407,0.008617774754659397 +0,0.5124445493836257,0.48755545061637434 +0,0.9845477811120943,0.015452218887905813 +0,0.9988556701619532,0.001144329838046704 +0,0.726463127240618,0.27353687275938204 +0,0.9147560932285533,0.08524390677144661 +0,0.8020301552011931,0.1979698447988068 +0,0.977762195850297,0.022237804149702955 +0,0.9999965923081356,3.407691864426204E-6 +0,0.9999922417485103,7.758251489757566E-6 +1,0.23661106432040313,0.7633889356795969 +0,0.6768106111623222,0.3231893888376778 +0,0.9999932570480942,6.742951905938438E-6 +0,0.9877355225351362,0.012264477464863855 +0,0.988084365018393,0.011915634981606863 +1,0.336005439788512,0.6639945602114881 +0,0.9718824274816524,0.028117572518347626 +1,0.07668890029583199,0.9233110997041679 +0,0.9707269846419898,0.02927301535801025 +0,0.9492899799313805,0.05071002006861955 +1,0.30292751155414316,0.6970724884458569 +0,0.6635502319152112,0.33644976808478877 +0,0.9085182422258721,0.09148175777412795 +0,0.9192748482470228,0.08072515175297722 +1,0.11596025590237723,0.8840397440976228 +0,0.993022311630901,0.0069776883690990535 +0,1.0,2.4518165146503946E-18 +0,0.9345818518360665,0.06541814816393367 +0,0.9999988508438381,1.1491561619051094E-6 +0,0.8705904028319725,0.12940959716802752 +0,0.6879895057486927,0.3120104942513073 +0,0.8541618736405228,0.14583812635947724 +0,0.9999956455404139,4.354459586071751E-6 +0,0.9999999999666582,3.334167080813573E-11 +0,0.9416699926128389,0.058330007387161 +1,0.274298739810895,0.7257012601891051 +0,0.9999999975636005,2.436399519778825E-9 +0,0.7385595498277965,0.2614404501722036 +0,0.618272666094558,0.38172733390544195 +0,0.9265604338481157,0.07343956615188424 +0,0.5618857981463394,0.4381142018536607 +0,0.932419748718029,0.06758025128197108 +0,0.9806610696643656,0.019338930335634472 +0,0.935217858373376,0.06478214162662387 +1,0.22746195237386466,0.7725380476261354 +0,0.6143361771082628,0.3856638228917372 +1,0.11527476057886799,0.884725239421132 +0,0.848318979274104,0.15168102072589595 +0,0.7214924083149171,0.2785075916850829 +0,0.6508940403245038,0.34910595967549624 +0,0.9504127309894795,0.04958726901052048 +1,0.23432749388800697,0.7656725061119931 +0,0.5438256165236119,0.45617438347638806 +0,0.6708429578269124,0.3291570421730876 +0,0.6975845686586294,0.30241543134137056 +0,0.999999996700569,3.2994309654647644E-9 +0,0.8578314003121081,0.14216859968789186 +0,0.9844015891909011,0.01559841080909884 +0,0.9998986751173893,1.013248826106947E-4 +0,0.6647505428330241,0.33524945716697585 +0,0.9999999999598552,4.0144828515827515E-11 +0,0.8601073617167659,0.13989263828323412 +0,0.8335924469493379,0.16640755305066213 +0,0.9844674697985657,0.015532530201434396 +1,0.12417621295066779,0.8758237870493323 +1,0.21042931165389925,0.7895706883461008 +0,0.9571804366770359,0.04281956332296419 +1,0.005463691651844486,0.9945363083481555 +0,0.9999994702025339,5.297974661003458E-7 +0,0.9999933529251729,6.647074827111113E-6 +0,0.7974551763565103,0.20254482364348964 +0,0.997649017599081,0.002350982400919091 +1,0.27863691795101503,0.721363082048985 +0,0.9977848698686387,0.0022151301313614222 +0,0.9999993081332936,6.918667064828422E-7 +0,0.9992701151374457,7.298848625543546E-4 +0,0.8186507060046251,0.18134929399537494 +0,0.9999944587932202,5.541206779700593E-6 +0,0.9965765606722808,0.003423439327719144 +0,0.5584391641195808,0.44156083588041917 +0,0.8414442443892702,0.1585557556107297 +0,0.8548349601741156,0.14516503982588436 +0,0.9646194655933229,0.035380534406677204 +0,0.9984613886477097,0.001538611352290318 +0,0.937338345795704,0.06266165420429613 +0,0.6357518208181437,0.36424817918185626 +0,0.9005542289585211,0.09944577104147878 +0,0.9509735362809402,0.049026463719059894 +1,0.11851113632029388,0.881488863679706 +1,0.468252847074654,0.531747152925346 +0,0.6883440538312992,0.3116559461687009 +0,0.5560311767912094,0.4439688232087906 +0,0.9723157902935621,0.027684209706437958 +0,0.9999749320867442,2.5067913255815138E-5 +1,0.2047502709904677,0.7952497290095324 +1,0.41179349635384677,0.5882065036461532 +1,0.12896566927708664,0.8710343307229134 +0,0.9728470844798023,0.027152915520197694 +0,0.9114369261183889,0.08856307388161101 +1,0.11687473195877972,0.8831252680412204 +0,0.9999911173157788,8.88268422127002E-6 +0,0.8455653455399216,0.15443465446007834 +1,0.27739607095529484,0.7226039290447052 +0,0.9889286065273286,0.01107139347267134 +0,0.9460165623502391,0.05398343764976079 +0,0.8398115910018725,0.16018840899812747 +0,0.6101228895449683,0.3898771104550317 +1,0.3913971138948383,0.6086028861051617 +0,0.6029914735175247,0.39700852648247537 +0,0.9591063469640714,0.0408936530359285 +0,0.9999994082189063,5.91781093674899E-7 +0,0.9999950894696048,4.910530395068483E-6 +1,0.16881801454913684,0.8311819854508632 +0,0.9999933180041622,6.681995837788204E-6 +0,0.7249215679642427,0.2750784320357573 +0,0.995065496030885,0.004934503969114956 +0,0.6087273949578956,0.3912726050421044 +1,0.13647307526820704,0.8635269247317928 +0,0.996710619816462,0.0032893801835379814 +0,0.9422806875680851,0.05771931243191485 +0,0.955903614273086,0.044096385726913864 +1,0.31860817349339565,0.6813918265066043 +1,0.18667027391650018,0.8133297260834998 +0,0.8655581421759436,0.13444185782405635 +0,0.5134402374744669,0.486559762525533 +1,0.18943912772578642,0.8105608722742136 +0,0.9999881873539734,1.1812646026583679E-5 +0,0.827185043205479,0.17281495679452105 +0,0.7486407173946686,0.2513592826053314 +0,0.9947588000855953,0.005241199914404844 +0,0.8244648672113936,0.1755351327886064 +0,0.8267772839188849,0.1732227160811152 +0,0.998818107230405,0.0011818927695950484 +0,0.9946321176037771,0.005367882396222824 +0,0.9840309464852568,0.015969053514743217 +0,0.8411377472636795,0.15886225273632054 +0,0.8465478701528425,0.15345212984715748 +0,0.8379683621408078,0.16203163785919217 +0,0.9728677008641577,0.02713229913584228 +0,0.6655284410535607,0.3344715589464393 +0,0.9999906824972015,9.317502798537982E-6 +0,0.5679813040388484,0.43201869596115156 +0,0.6044755442209767,0.39552445577902323 +0,0.9799787275952989,0.020021272404701022 +0,0.7427882639822556,0.25721173601774444 +1,0.15064719367225468,0.8493528063277453 +0,0.9999999988749764,1.1250235766508712E-9 +0,0.5932082846751664,0.40679171532483355 +0,0.7837383437381559,0.21626165626184407 +0,0.8325482700422266,0.16745172995777344 +0,0.9984277329954298,0.001572267004570269 +1,0.4349493391758848,0.5650506608241151 +1,0.2560823054130954,0.7439176945869046 +0,0.5788703769855914,0.4211296230144086 +1,0.43828486630571445,0.5617151336942855 +0,0.5847627596712959,0.4152372403287042 +0,0.8766372551228332,0.12336274487716677 +0,0.999998579919148,1.420080852069653E-6 +0,0.981738184556097,0.018261815443903005 +0,0.9994762313997098,5.237686002901225E-4 +0,0.9999999999373694,6.2630663062403E-11 +0,0.9699857653823397,0.030014234617660313 +0,0.9726743734084684,0.027325626591531576 +0,0.9999613770828262,3.8622917173745755E-5 +1,0.4504042558329455,0.5495957441670545 +0,0.8624593565896355,0.13754064341036448 +1,0.14449882053089774,0.8555011794691022 +0,0.9732434874476704,0.026756512552329526 +1,0.36983956453078304,0.630160435469217 +0,0.9412013024939593,0.05879869750604068 +1,0.48658047373127467,0.5134195262687253 +0,0.6489902147273466,0.3510097852726534 +0,0.9501888008170203,0.049811199182979694 +0,0.9833027981280495,0.016697201871950344 +1,0.3974982917335079,0.6025017082664921 +0,0.933919115798607,0.06608088420139291 +1,0.2752645429369257,0.7247354570630743 +0,0.9876834520423233,0.012316547957676774 +1,7.482768040154699E-6,0.9999925172319598 +0,0.999999992237771,7.762229032605561E-9 +0,0.6403745420420107,0.35962545795798934 +0,0.7071805740018248,0.2928194259981753 +0,0.9999999685752742,3.142472590844606E-8 +0,0.9975583827869168,0.0024416172130830973 +0,0.9999956932806474,4.306719352600182E-6 +0,0.736770302954499,0.26322969704550103 +0,0.9999951937588504,4.806241149599716E-6 +0,0.9848386384680166,0.015161361531983374 +0,0.7624331056139351,0.23756689438606496 +1,0.41687507416037567,0.5831249258396243 +0,0.8957684342715188,0.10423156572848134 +0,0.6161846623838517,0.38381533761614833 +1,0.1605952841161091,0.8394047158838909 +0,0.793614322297978,0.20638567770202199 +0,0.9877336222910301,0.012266377708969859 +0,0.9405341675988556,0.059465832401144496 +1,0.36568145333378116,0.6343185466662189 +0,0.8318772448871938,0.16812275511280614 +0,0.9996320439832266,3.6795601677336304E-4 +0,0.9783447693231411,0.021655230676858993 +0,0.7169765588679325,0.2830234411320675 +0,0.9999999605449512,3.945504882380024E-8 +1,0.12519707779335046,0.8748029222066495 +0,0.9999996186483116,3.8135168847548464E-7 +0,0.9765807684541707,0.023419231545829207 +0,0.9978280381405044,0.002171961859495703 +0,0.7161424926857682,0.2838575073142317 +0,0.9979421199898393,0.0020578800101607258 +0,0.9860328555564751,0.013967144443524903 +0,0.9019726151943123,0.09802738480568769 +1,0.14281338229018803,0.857186617709812 +0,0.9999999541390391,4.586096100029397E-8 +0,0.716016173190078,0.28398382680992196 +0,0.5783568372836767,0.4216431627163234 +0,0.6163165667239418,0.38368343327605825 +1,0.37646412436569704,0.6235358756343029 +0,0.9636737341032325,0.036326265896767435 +0,0.9864256638076782,0.013574336192321856 diff --git a/src/test/resources/pipeline/LogisticRegressionAudit.zip b/src/test/resources/pipeline/LogisticRegressionAudit.zip index 07326b7b282ff7c5bfb44b9790e3ec0e874074a5..f33dd84b9da79e374d41042e67a13b24461c752a 100644 GIT binary patch literal 19156 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 From 8bc8f40aed617df9daf199b5f2d0e3fe477e5db1 Mon Sep 17 00:00:00 2001 From: Villu Ruusmann Date: Fri, 21 Dec 2018 18:23:39 +0200 Subject: [PATCH 14/19] [maven-release-plugin] prepare release 1.1.22 --- pom.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pom.xml b/pom.xml index fdb0a817..4bf747a6 100644 --- a/pom.xml +++ b/pom.xml @@ -10,7 +10,7 @@ org.jpmml jpmml-sparkml - 1.1-SNAPSHOT + 1.1.22 JPMML-SparkML Java library and command-line application for converting Spark ML pipelines to PMML @@ -35,7 +35,7 @@ scm:git:git@github.com:jpmml/jpmml-sparkml.git scm:git:git@github.com:jpmml/jpmml-sparkml.git git://github.com/jpmml/jpmml-sparkml.git - HEAD + 1.1.22 GitHub From bb1ed886e6fc33576b71eebfc63769d8adc7f870 Mon Sep 17 00:00:00 2001 From: Villu Ruusmann Date: Fri, 21 Dec 2018 18:23:39 +0200 Subject: [PATCH 15/19] [maven-release-plugin] prepare for next development iteration --- pom.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pom.xml b/pom.xml index 4bf747a6..fdb0a817 100644 --- a/pom.xml +++ b/pom.xml @@ -10,7 +10,7 @@ org.jpmml jpmml-sparkml - 1.1.22 + 1.1-SNAPSHOT JPMML-SparkML Java library and command-line application for converting Spark ML pipelines to PMML @@ -35,7 +35,7 @@ scm:git:git@github.com:jpmml/jpmml-sparkml.git scm:git:git@github.com:jpmml/jpmml-sparkml.git git://github.com/jpmml/jpmml-sparkml.git - 1.1.22 + HEAD GitHub From ee16620f7aa79a6a0d21426a88b5247fce03e567 Mon Sep 17 00:00:00 2001 From: Villu Ruusmann Date: Fri, 21 Dec 2018 18:49:47 +0200 Subject: [PATCH 16/19] [maven-release-plugin] prepare release 1.2.14 --- pom.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pom.xml b/pom.xml index 06f68ef7..70e7f818 100644 --- a/pom.xml +++ b/pom.xml @@ -10,7 +10,7 @@ org.jpmml jpmml-sparkml - 1.2-SNAPSHOT + 1.2.14 JPMML-SparkML Java library and command-line application for converting Spark ML pipelines to PMML @@ -35,7 +35,7 @@ scm:git:git@github.com:jpmml/jpmml-sparkml.git scm:git:git@github.com:jpmml/jpmml-sparkml.git git://github.com/jpmml/jpmml-sparkml.git - HEAD + 1.2.14 GitHub From 7186650fa0dd93d01f094404dc3c3050fd6fc957 Mon Sep 17 00:00:00 2001 From: Villu Ruusmann Date: Fri, 21 Dec 2018 18:49:47 +0200 Subject: [PATCH 17/19] [maven-release-plugin] prepare for next development iteration --- pom.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pom.xml b/pom.xml index 70e7f818..06f68ef7 100644 --- a/pom.xml +++ b/pom.xml @@ -10,7 +10,7 @@ org.jpmml jpmml-sparkml - 1.2.14 + 1.2-SNAPSHOT JPMML-SparkML Java library and command-line application for converting Spark ML pipelines to PMML @@ -35,7 +35,7 @@ scm:git:git@github.com:jpmml/jpmml-sparkml.git scm:git:git@github.com:jpmml/jpmml-sparkml.git git://github.com/jpmml/jpmml-sparkml.git - 1.2.14 + HEAD GitHub From 514c4b5c1493f6e76086e96216674cca9ea05731 Mon Sep 17 00:00:00 2001 From: Villu Ruusmann Date: Fri, 21 Dec 2018 19:38:26 +0200 Subject: [PATCH 18/19] [maven-release-plugin] prepare release 1.3.10 --- pom.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pom.xml b/pom.xml index 222e5d6e..77a53142 100644 --- a/pom.xml +++ b/pom.xml @@ -10,7 +10,7 @@ org.jpmml jpmml-sparkml - 1.3-SNAPSHOT + 1.3.10 JPMML-SparkML Java library and command-line application for converting Spark ML pipelines to PMML @@ -35,7 +35,7 @@ scm:git:git@github.com:jpmml/jpmml-sparkml.git scm:git:git@github.com:jpmml/jpmml-sparkml.git git://github.com/jpmml/jpmml-sparkml.git - HEAD + 1.3.10 GitHub From c9bad5a658f9012352cfff4df13a5e9ccc35ede2 Mon Sep 17 00:00:00 2001 From: Villu Ruusmann Date: Fri, 21 Dec 2018 19:38:26 +0200 Subject: [PATCH 19/19] [maven-release-plugin] prepare for next development iteration --- pom.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pom.xml b/pom.xml index 77a53142..222e5d6e 100644 --- a/pom.xml +++ b/pom.xml @@ -10,7 +10,7 @@ org.jpmml jpmml-sparkml - 1.3.10 + 1.3-SNAPSHOT JPMML-SparkML Java library and command-line application for converting Spark ML pipelines to PMML @@ -35,7 +35,7 @@ scm:git:git@github.com:jpmml/jpmml-sparkml.git scm:git:git@github.com:jpmml/jpmml-sparkml.git git://github.com/jpmml/jpmml-sparkml.git - 1.3.10 + HEAD GitHub