diff --git a/.coverage b/.coverage new file mode 100644 index 0000000000000000000000000000000000000000..7bd62455cae2ec79af9cbc60f552afe43fca17d4 Binary files /dev/null and b/.coverage differ diff --git a/.idea/.gitignore b/.idea/.gitignore new file mode 100644 index 0000000000000000000000000000000000000000..13566b81b018ad684f3a35fee301741b2734c8f4 --- /dev/null +++ b/.idea/.gitignore @@ -0,0 +1,8 @@ +# Default ignored files +/shelf/ +/workspace.xml +# Editor-based HTTP Client requests +/httpRequests/ +# Datasource local storage ignored files +/dataSources/ +/dataSources.local.xml diff --git a/.idea/bayesvalidrox.iml b/.idea/bayesvalidrox.iml new file mode 100644 index 0000000000000000000000000000000000000000..fab03b6eca7d238814b681f1f06637c845bcc3f4 --- /dev/null +++ b/.idea/bayesvalidrox.iml @@ -0,0 +1,18 @@ +<?xml version="1.0" encoding="UTF-8"?> +<module type="PYTHON_MODULE" version="4"> + <component name="NewModuleRootManager"> + <content url="file://$MODULE_DIR$"> + <sourceFolder url="file://$MODULE_DIR$/src" isTestSource="false" /> + <sourceFolder url="file://$MODULE_DIR$/tests" isTestSource="true" /> + </content> + <orderEntry type="inheritedJdk" /> + <orderEntry type="sourceFolder" forTests="false" /> + </component> + <component name="PyDocumentationSettings"> + <option name="format" value="NUMPY" /> + <option name="myDocStringFormat" value="NumPy" /> + </component> + <component name="TestRunnerService"> + <option name="PROJECT_TEST_RUNNER" value="py.test" /> + </component> +</module> \ No newline at end of file diff --git a/.idea/inspectionProfiles/profiles_settings.xml b/.idea/inspectionProfiles/profiles_settings.xml new file mode 100644 index 0000000000000000000000000000000000000000..105ce2da2d6447d11dfe32bfb846c3d5b199fc99 --- /dev/null +++ b/.idea/inspectionProfiles/profiles_settings.xml @@ -0,0 +1,6 @@ +<component name="InspectionProjectProfileManager"> + <settings> + <option name="USE_PROJECT_PROFILE" value="false" /> + <version value="1.0" /> + </settings> +</component> \ No newline at end of file diff --git a/.idea/misc.xml b/.idea/misc.xml new file mode 100644 index 0000000000000000000000000000000000000000..a6218fed0aeb0cbb03b46a9064efeeda11861bf6 --- /dev/null +++ b/.idea/misc.xml @@ -0,0 +1,7 @@ +<?xml version="1.0" encoding="UTF-8"?> +<project version="4"> + <component name="Black"> + <option name="sdkName" value="Python 3.11" /> + </component> + <component name="ProjectRootManager" version="2" project-jdk-name="Python 3.11" project-jdk-type="Python SDK" /> +</project> \ No newline at end of file diff --git a/.idea/modules.xml b/.idea/modules.xml new file mode 100644 index 0000000000000000000000000000000000000000..482c611f35883d7c1998edbfac68f5b5b74300db --- /dev/null +++ b/.idea/modules.xml @@ -0,0 +1,8 @@ +<?xml version="1.0" encoding="UTF-8"?> +<project version="4"> + <component name="ProjectModuleManager"> + <modules> + <module fileurl="file://$PROJECT_DIR$/.idea/bayesvalidrox.iml" filepath="$PROJECT_DIR$/.idea/bayesvalidrox.iml" /> + </modules> + </component> +</project> \ No newline at end of file diff --git a/.idea/other.xml b/.idea/other.xml new file mode 100644 index 0000000000000000000000000000000000000000..2e75c2e2af6fe9ab3294dedf305ebb894bb324d7 --- /dev/null +++ b/.idea/other.xml @@ -0,0 +1,6 @@ +<?xml version="1.0" encoding="UTF-8"?> +<project version="4"> + <component name="PySciProjectComponent"> + <option name="PY_INTERACTIVE_PLOTS_SUGGESTED" value="true" /> + </component> +</project> \ No newline at end of file diff --git a/.idea/vcs.xml b/.idea/vcs.xml new file mode 100644 index 0000000000000000000000000000000000000000..35eb1ddfbbc029bcab630581847471d7f238ec53 --- /dev/null +++ b/.idea/vcs.xml @@ -0,0 +1,6 @@ +<?xml version="1.0" encoding="UTF-8"?> +<project version="4"> + <component name="VcsDirectoryMappings"> + <mapping directory="" vcs="Git" /> + </component> +</project> \ No newline at end of file diff --git a/CHANGELOG.md b/CHANGELOG.md new file mode 100644 index 0000000000000000000000000000000000000000..42c974fb5e5f8e31c58684551c68a4f55a74d621 --- /dev/null +++ b/CHANGELOG.md @@ -0,0 +1,48 @@ +# CHANGELOG + +## [Unreleased] +### Requirements +* numpy now at 1.23.3 +* .... + +### Added +Features +* PyLinkForwardModel has new link_type 'umbridge' for UM-Bridge type models +* class `InputSpace` as parent class to `ExpDesigns` +* `MetaModel` has option to train with OLS+constraints + +Examples +* Example `umbridge_tsunamitutorial` to show two options of using UM-Bridge type models +* Example `convergence_tests` for the constraints + +### Changed +General +* Independent functions moved out of classes +* Constructors of `PostProcessing`, `BayesInference`, `BayesModelComp` are to be given the engine instead of the metamodel +* Constructor of `Exploration` to be given `ExpDesigns` instead of `MetaModel` + +Engine +* `MetaModelEngine` renamed to `Engine` +* Split `run()` into `train_normal()` and `train_sequential()` +* `opt_SeqDesign()` renamed to `choose_next_sample()` + +MetaModel +* `MetaModel` fully independent of model +* `MetaModel` uses `InputSpace` instead of `ExpDesigns` +* `create_metamodel()` split into `build_metamodel()` and `fit()` +* `fit()` renamed to `regression()` +* `eval_metamodel()` only runs on given samples, full functionality retained in `Engine.eval_metamodel()` +* Polynomial related functions moved from `MetaModelEngine` to `MetaModel` + +PyLinkForwardModel +* Read-in of MC-references now performed by `PyLinkForwardModel.read_observation()` + +ExpDesigns +* Parameters related to sequential training were moved from `MetaModel` to `ExpDesigns` (`Seq*`, `valid_model_runs`) + +### Removed +* Class `SequentialDesign` +* `ExpDesigns.method` +* `MetaModel.create_basis_indices()` + + diff --git a/docs/diagrams/.$Structure_BayesInf.drawio.bkp b/docs/diagrams/.$Structure_BayesInf.drawio.bkp new file mode 100644 index 0000000000000000000000000000000000000000..3ba4ed26362c9fa2ea955f14d7ad3f05a15ab00a --- /dev/null +++ b/docs/diagrams/.$Structure_BayesInf.drawio.bkp @@ -0,0 +1,908 @@ +<mxfile host="Electron" modified="2024-04-19T15:13:43.060Z" agent="Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) draw.io/22.1.11 Chrome/114.0.5735.289 Electron/25.9.8 Safari/537.36" etag="DE_l5njUGrsyMG_jufaX" version="22.1.11" type="device" pages="3"> + <diagram name="Class and function structure" id="efOe0Jku58RX-i1bv-3b"> + <mxGraphModel dx="2718" dy="686" grid="1" gridSize="10" guides="1" tooltips="1" connect="1" arrows="1" fold="1" page="1" pageScale="1" pageWidth="850" pageHeight="1100" math="0" shadow="0"> + <root> + <mxCell id="0" /> + <mxCell id="1" parent="0" /> + <mxCell id="xary-zVek9Bg-A1b1ZmA-22" value="<p style="margin:0px;margin-top:4px;text-align:center;"><b>MCMC</b></p><hr size="1"><div style="height:2px;"></div>" style="verticalAlign=top;align=left;overflow=fill;fontSize=12;fontFamily=Helvetica;html=1;whiteSpace=wrap;" vertex="1" parent="1"> + <mxGeometry x="1270" y="360" width="770" height="380" as="geometry" /> + </mxCell> + <mxCell id="xary-zVek9Bg-A1b1ZmA-1" value="_kernel_rbf" style="rounded=0;whiteSpace=wrap;html=1;" vertex="1" parent="1"> + <mxGeometry x="1020" y="200" width="120" height="60" as="geometry" /> + </mxCell> + <mxCell id="xary-zVek9Bg-A1b1ZmA-2" value="_logpdf" style="rounded=0;whiteSpace=wrap;html=1;" vertex="1" parent="1"> + <mxGeometry x="820" y="140" width="120" height="60" as="geometry" /> + </mxCell> + <mxCell id="xary-zVek9Bg-A1b1ZmA-10" value="<p style="margin:0px;margin-top:4px;text-align:center;"><b>BayesInf</b></p><hr size="1"><div style="height:2px;"></div>" style="verticalAlign=top;align=left;overflow=fill;fontSize=12;fontFamily=Helvetica;html=1;whiteSpace=wrap;" vertex="1" parent="1"> + <mxGeometry x="-120" y="290" width="1310" height="680" as="geometry" /> + </mxCell> + <mxCell id="xary-zVek9Bg-A1b1ZmA-24" value="if self.bootstrap <br>or self.bayes_loocv <br>or self.just_analysis" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;entryX=1;entryY=0.5;entryDx=0;entryDy=0;labelBackgroundColor=#ffae00;exitX=0.5;exitY=0;exitDx=0;exitDy=0;" edge="1" parent="1" source="xary-zVek9Bg-A1b1ZmA-9" target="xary-zVek9Bg-A1b1ZmA-13"> + <mxGeometry x="0.2902" relative="1" as="geometry"> + <mxPoint as="offset" /> + </mxGeometry> + </mxCell> + <mxCell id="xary-zVek9Bg-A1b1ZmA-31" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=0.5;exitY=1;exitDx=0;exitDy=0;" edge="1" parent="1" source="xary-zVek9Bg-A1b1ZmA-9" target="xary-zVek9Bg-A1b1ZmA-18"> + <mxGeometry relative="1" as="geometry" /> + </mxCell> + <mxCell id="xary-zVek9Bg-A1b1ZmA-42" value="if self.name != 'valid'<br>and self.inference_method != 'rejection'" style="edgeLabel;html=1;align=center;verticalAlign=middle;resizable=0;points=[];labelBackgroundColor=default;" vertex="1" connectable="0" parent="xary-zVek9Bg-A1b1ZmA-31"> + <mxGeometry x="0.5646" relative="1" as="geometry"> + <mxPoint as="offset" /> + </mxGeometry> + </mxCell> + <mxCell id="xary-zVek9Bg-A1b1ZmA-32" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=1;exitY=0.5;exitDx=0;exitDy=0;" edge="1" parent="1" source="xary-zVek9Bg-A1b1ZmA-9" target="HiMKSJFquRK0mIlwyRFI-5"> + <mxGeometry relative="1" as="geometry" /> + </mxCell> + <mxCell id="xary-zVek9Bg-A1b1ZmA-43" value="if self.inference_method == 'mcmc'" style="edgeLabel;html=1;align=center;verticalAlign=middle;resizable=0;points=[];" vertex="1" connectable="0" parent="xary-zVek9Bg-A1b1ZmA-32"> + <mxGeometry x="-0.0958" y="-1" relative="1" as="geometry"> + <mxPoint as="offset" /> + </mxGeometry> + </mxCell> + <mxCell id="xary-zVek9Bg-A1b1ZmA-33" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=0.75;exitY=1;exitDx=0;exitDy=0;entryX=0;entryY=0.5;entryDx=0;entryDy=0;" edge="1" parent="1" source="xary-zVek9Bg-A1b1ZmA-9" target="xary-zVek9Bg-A1b1ZmA-19"> + <mxGeometry relative="1" as="geometry" /> + </mxCell> + <mxCell id="xary-zVek9Bg-A1b1ZmA-52" value="always" style="edgeLabel;html=1;align=center;verticalAlign=middle;resizable=0;points=[];labelBackgroundColor=#C2C2C2;" vertex="1" connectable="0" parent="xary-zVek9Bg-A1b1ZmA-33"> + <mxGeometry x="-0.112" y="1" relative="1" as="geometry"> + <mxPoint as="offset" /> + </mxGeometry> + </mxCell> + <mxCell id="xary-zVek9Bg-A1b1ZmA-34" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=0.5;exitY=1;exitDx=0;exitDy=0;" edge="1" parent="1" source="xary-zVek9Bg-A1b1ZmA-9" target="xary-zVek9Bg-A1b1ZmA-21"> + <mxGeometry relative="1" as="geometry" /> + </mxCell> + <mxCell id="xary-zVek9Bg-A1b1ZmA-47" value="if self.plot_post_pred" style="edgeLabel;html=1;align=center;verticalAlign=middle;resizable=0;points=[];" vertex="1" connectable="0" parent="xary-zVek9Bg-A1b1ZmA-34"> + <mxGeometry x="0.2399" y="-1" relative="1" as="geometry"> + <mxPoint y="1" as="offset" /> + </mxGeometry> + </mxCell> + <mxCell id="xary-zVek9Bg-A1b1ZmA-35" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=0.5;exitY=1;exitDx=0;exitDy=0;" edge="1" parent="1" source="xary-zVek9Bg-A1b1ZmA-9" target="xary-zVek9Bg-A1b1ZmA-20"> + <mxGeometry relative="1" as="geometry" /> + </mxCell> + <mxCell id="xary-zVek9Bg-A1b1ZmA-46" value="if self.plot_map_pred" style="edgeLabel;html=1;align=center;verticalAlign=middle;resizable=0;points=[];" vertex="1" connectable="0" parent="xary-zVek9Bg-A1b1ZmA-35"> + <mxGeometry x="0.4183" y="-1" relative="1" as="geometry"> + <mxPoint as="offset" /> + </mxGeometry> + </mxCell> + <mxCell id="xary-zVek9Bg-A1b1ZmA-54" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=0.5;exitY=1;exitDx=0;exitDy=0;" edge="1" parent="1" source="xary-zVek9Bg-A1b1ZmA-9" target="xary-zVek9Bg-A1b1ZmA-53"> + <mxGeometry relative="1" as="geometry" /> + </mxCell> + <mxCell id="xary-zVek9Bg-A1b1ZmA-55" value="if self.bootstrap" style="edgeLabel;html=1;align=center;verticalAlign=middle;resizable=0;points=[];labelBackgroundColor=#FF9A03;" vertex="1" connectable="0" parent="xary-zVek9Bg-A1b1ZmA-54"> + <mxGeometry x="0.1816" y="3" relative="1" as="geometry"> + <mxPoint x="1" as="offset" /> + </mxGeometry> + </mxCell> + <mxCell id="xary-zVek9Bg-A1b1ZmA-57" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=0.5;exitY=1;exitDx=0;exitDy=0;entryX=0;entryY=0.5;entryDx=0;entryDy=0;" edge="1" parent="1" source="xary-zVek9Bg-A1b1ZmA-9" target="xary-zVek9Bg-A1b1ZmA-56"> + <mxGeometry relative="1" as="geometry" /> + </mxCell> + <mxCell id="xary-zVek9Bg-A1b1ZmA-58" value="always" style="edgeLabel;html=1;align=center;verticalAlign=middle;resizable=0;points=[];labelBackgroundColor=#FF9A03;" vertex="1" connectable="0" parent="xary-zVek9Bg-A1b1ZmA-57"> + <mxGeometry x="0.7182" y="2" relative="1" as="geometry"> + <mxPoint as="offset" /> + </mxGeometry> + </mxCell> + <mxCell id="xary-zVek9Bg-A1b1ZmA-60" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=0.25;exitY=1;exitDx=0;exitDy=0;" edge="1" parent="1" source="xary-zVek9Bg-A1b1ZmA-9" target="xary-zVek9Bg-A1b1ZmA-59"> + <mxGeometry relative="1" as="geometry" /> + </mxCell> + <mxCell id="xary-zVek9Bg-A1b1ZmA-61" value="if self.error_model<br>and self.name == 'calib'" style="edgeLabel;html=1;align=center;verticalAlign=middle;resizable=0;points=[];" vertex="1" connectable="0" parent="xary-zVek9Bg-A1b1ZmA-60"> + <mxGeometry x="0.3024" y="2" relative="1" as="geometry"> + <mxPoint x="67" y="1" as="offset" /> + </mxGeometry> + </mxCell> + <mxCell id="HiMKSJFquRK0mIlwyRFI-54" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=0.5;exitY=1;exitDx=0;exitDy=0;" edge="1" parent="1" source="xary-zVek9Bg-A1b1ZmA-9" target="HiMKSJFquRK0mIlwyRFI-51"> + <mxGeometry relative="1" as="geometry" /> + </mxCell> + <mxCell id="HiMKSJFquRK0mIlwyRFI-55" value="always" style="edgeLabel;html=1;align=center;verticalAlign=middle;resizable=0;points=[];labelBackgroundColor=#FF9A03;" vertex="1" connectable="0" parent="HiMKSJFquRK0mIlwyRFI-54"> + <mxGeometry x="0.8253" y="3" relative="1" as="geometry"> + <mxPoint as="offset" /> + </mxGeometry> + </mxCell> + <mxCell id="xary-zVek9Bg-A1b1ZmA-9" value="create_inference" style="html=1;whiteSpace=wrap;strokeWidth=2;" vertex="1" parent="1"> + <mxGeometry x="405" y="539" width="110" height="50" as="geometry" /> + </mxCell> + <mxCell id="xary-zVek9Bg-A1b1ZmA-25" value="if len(self.perturbed_data) == 0" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;" edge="1" parent="1" source="xary-zVek9Bg-A1b1ZmA-13" target="xary-zVek9Bg-A1b1ZmA-14"> + <mxGeometry x="0.3402" relative="1" as="geometry"> + <mxPoint y="1" as="offset" /> + </mxGeometry> + </mxCell> + <mxCell id="xary-zVek9Bg-A1b1ZmA-27" value="if not self.emulator" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=0.5;exitY=1;exitDx=0;exitDy=0;" edge="1" parent="1" source="xary-zVek9Bg-A1b1ZmA-13" target="xary-zVek9Bg-A1b1ZmA-15"> + <mxGeometry relative="1" as="geometry" /> + </mxCell> + <mxCell id="xary-zVek9Bg-A1b1ZmA-29" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=0.5;exitY=1;exitDx=0;exitDy=0;entryX=0;entryY=0.5;entryDx=0;entryDy=0;" edge="1" parent="1" source="xary-zVek9Bg-A1b1ZmA-13" target="xary-zVek9Bg-A1b1ZmA-16"> + <mxGeometry relative="1" as="geometry" /> + </mxCell> + <mxCell id="xary-zVek9Bg-A1b1ZmA-44" value="always" style="edgeLabel;html=1;align=center;verticalAlign=middle;resizable=0;points=[];labelBackgroundColor=#cdcbcb;" vertex="1" connectable="0" parent="xary-zVek9Bg-A1b1ZmA-29"> + <mxGeometry x="0.4722" y="1" relative="1" as="geometry"> + <mxPoint as="offset" /> + </mxGeometry> + </mxCell> + <mxCell id="xary-zVek9Bg-A1b1ZmA-30" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=0.5;exitY=1;exitDx=0;exitDy=0;entryX=0;entryY=0.5;entryDx=0;entryDy=0;" edge="1" parent="1" source="xary-zVek9Bg-A1b1ZmA-13" target="xary-zVek9Bg-A1b1ZmA-17"> + <mxGeometry relative="1" as="geometry" /> + </mxCell> + <mxCell id="xary-zVek9Bg-A1b1ZmA-41" value="if self.emulator" style="edgeLabel;html=1;align=center;verticalAlign=middle;resizable=0;points=[];" vertex="1" connectable="0" parent="xary-zVek9Bg-A1b1ZmA-30"> + <mxGeometry x="0.6143" y="-3" relative="1" as="geometry"> + <mxPoint as="offset" /> + </mxGeometry> + </mxCell> + <mxCell id="xary-zVek9Bg-A1b1ZmA-62" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;" edge="1" parent="1" source="xary-zVek9Bg-A1b1ZmA-13" target="xary-zVek9Bg-A1b1ZmA-59"> + <mxGeometry relative="1" as="geometry"> + <mxPoint x="340" y="680" as="targetPoint" /> + </mxGeometry> + </mxCell> + <mxCell id="xary-zVek9Bg-A1b1ZmA-63" value="if self.error_model<br>and self.name == 'valid'" style="edgeLabel;html=1;align=center;verticalAlign=middle;resizable=0;points=[];labelBackgroundColor=default;" vertex="1" connectable="0" parent="xary-zVek9Bg-A1b1ZmA-62"> + <mxGeometry x="-0.3906" relative="1" as="geometry"> + <mxPoint y="121" as="offset" /> + </mxGeometry> + </mxCell> + <mxCell id="xary-zVek9Bg-A1b1ZmA-13" value="perform_bootstrap" style="html=1;whiteSpace=wrap;" vertex="1" parent="1"> + <mxGeometry x="50" y="335" width="110" height="50" as="geometry" /> + </mxCell> + <mxCell id="xary-zVek9Bg-A1b1ZmA-14" value="_perturb_data" style="html=1;whiteSpace=wrap;" vertex="1" parent="1"> + <mxGeometry x="-75" y="460" width="110" height="50" as="geometry" /> + </mxCell> + <mxCell id="xary-zVek9Bg-A1b1ZmA-15" value="_eval_model" style="html=1;whiteSpace=wrap;" vertex="1" parent="1"> + <mxGeometry x="1050" y="660" width="110" height="50" as="geometry" /> + </mxCell> + <mxCell id="xary-zVek9Bg-A1b1ZmA-38" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=1;exitY=0.5;exitDx=0;exitDy=0;entryX=0.5;entryY=1;entryDx=0;entryDy=0;" edge="1" parent="1" source="xary-zVek9Bg-A1b1ZmA-16" target="xary-zVek9Bg-A1b1ZmA-1"> + <mxGeometry relative="1" as="geometry" /> + </mxCell> + <mxCell id="xary-zVek9Bg-A1b1ZmA-49" value="if hasattr bias_inputs&nbsp;<br>and not hasattr error_model" style="edgeLabel;html=1;align=center;verticalAlign=middle;resizable=0;points=[];labelBackgroundColor=#ffae00;" vertex="1" connectable="0" parent="xary-zVek9Bg-A1b1ZmA-38"> + <mxGeometry x="0.3126" y="-3" relative="1" as="geometry"> + <mxPoint x="-103" y="31" as="offset" /> + </mxGeometry> + </mxCell> + <mxCell id="xary-zVek9Bg-A1b1ZmA-39" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=1;exitY=0.5;exitDx=0;exitDy=0;" edge="1" parent="1" source="xary-zVek9Bg-A1b1ZmA-16" target="xary-zVek9Bg-A1b1ZmA-2"> + <mxGeometry relative="1" as="geometry" /> + </mxCell> + <mxCell id="xary-zVek9Bg-A1b1ZmA-16" value="normpdf" style="html=1;whiteSpace=wrap;" vertex="1" parent="1"> + <mxGeometry x="650" y="455" width="110" height="50" as="geometry" /> + </mxCell> + <mxCell id="xary-zVek9Bg-A1b1ZmA-40" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=1;exitY=0.5;exitDx=0;exitDy=0;" edge="1" parent="1" source="xary-zVek9Bg-A1b1ZmA-17" target="xary-zVek9Bg-A1b1ZmA-2"> + <mxGeometry relative="1" as="geometry" /> + </mxCell> + <mxCell id="xary-zVek9Bg-A1b1ZmA-50" value="always" style="edgeLabel;html=1;align=center;verticalAlign=middle;resizable=0;points=[];labelBackgroundColor=#cdcbcb;" vertex="1" connectable="0" parent="xary-zVek9Bg-A1b1ZmA-40"> + <mxGeometry x="-0.6073" y="-5" relative="1" as="geometry"> + <mxPoint as="offset" /> + </mxGeometry> + </mxCell> + <mxCell id="xary-zVek9Bg-A1b1ZmA-17" value="_corr_factor_BME" style="html=1;whiteSpace=wrap;" vertex="1" parent="1"> + <mxGeometry x="650" y="385" width="110" height="50" as="geometry" /> + </mxCell> + <mxCell id="xary-zVek9Bg-A1b1ZmA-18" value="_rejection_sampling" style="html=1;whiteSpace=wrap;" vertex="1" parent="1"> + <mxGeometry x="280" y="890" width="120" height="50" as="geometry" /> + </mxCell> + <mxCell id="xary-zVek9Bg-A1b1ZmA-26" value="if not self.emulator&nbsp;<br>and not self.inference_method == 'rejection'&nbsp;<br>and self.name == 'calib" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=0.5;exitY=1;exitDx=0;exitDy=0;entryX=0;entryY=0.5;entryDx=0;entryDy=0;" edge="1" parent="1" source="xary-zVek9Bg-A1b1ZmA-19" target="xary-zVek9Bg-A1b1ZmA-15"> + <mxGeometry x="-0.0559" y="15" relative="1" as="geometry"> + <mxPoint as="offset" /> + </mxGeometry> + </mxCell> + <mxCell id="xary-zVek9Bg-A1b1ZmA-37" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=1;exitY=0.5;exitDx=0;exitDy=0;" edge="1" parent="1" source="xary-zVek9Bg-A1b1ZmA-19" target="xary-zVek9Bg-A1b1ZmA-1"> + <mxGeometry relative="1" as="geometry" /> + </mxCell> + <mxCell id="xary-zVek9Bg-A1b1ZmA-48" value="if sigma2_prior is not None<br>and if hasattr bias_inputs<br>and if not hasattr error_model" style="edgeLabel;html=1;align=center;verticalAlign=middle;resizable=0;points=[];labelBackgroundColor=#ffae00;" vertex="1" connectable="0" parent="xary-zVek9Bg-A1b1ZmA-37"> + <mxGeometry x="-0.5544" y="-1" relative="1" as="geometry"> + <mxPoint x="1" y="-5" as="offset" /> + </mxGeometry> + </mxCell> + <mxCell id="xary-zVek9Bg-A1b1ZmA-19" value="_posterior_predictive" style="html=1;whiteSpace=wrap;" vertex="1" parent="1"> + <mxGeometry x="690" y="589" width="130" height="50" as="geometry" /> + </mxCell> + <mxCell id="xary-zVek9Bg-A1b1ZmA-28" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=1;exitY=0.5;exitDx=0;exitDy=0;" edge="1" parent="1" source="xary-zVek9Bg-A1b1ZmA-20" target="xary-zVek9Bg-A1b1ZmA-15"> + <mxGeometry relative="1" as="geometry" /> + </mxCell> + <mxCell id="xary-zVek9Bg-A1b1ZmA-45" value="always" style="edgeLabel;html=1;align=center;verticalAlign=middle;resizable=0;points=[];labelBackgroundColor=#cdcbcb;" vertex="1" connectable="0" parent="xary-zVek9Bg-A1b1ZmA-28"> + <mxGeometry x="0.0517" relative="1" as="geometry"> + <mxPoint as="offset" /> + </mxGeometry> + </mxCell> + <mxCell id="xary-zVek9Bg-A1b1ZmA-20" value="_plot_max_a_posteriori" style="html=1;whiteSpace=wrap;" vertex="1" parent="1"> + <mxGeometry x="495" y="790" width="140" height="50" as="geometry" /> + </mxCell> + <mxCell id="xary-zVek9Bg-A1b1ZmA-21" value="plot_post_predictive" style="html=1;whiteSpace=wrap;" vertex="1" parent="1"> + <mxGeometry x="630" y="720" width="120" height="50" as="geometry" /> + </mxCell> + <mxCell id="xary-zVek9Bg-A1b1ZmA-36" value="Note: Arrows indicate function calls, beginning calls the end" style="text;html=1;strokeColor=none;fillColor=none;align=center;verticalAlign=middle;whiteSpace=wrap;rounded=0;" vertex="1" parent="1"> + <mxGeometry x="10" y="10" width="190" height="30" as="geometry" /> + </mxCell> + <mxCell id="xary-zVek9Bg-A1b1ZmA-51" value="Color meanings:<br><span style="white-space: pre;">	</span>red: wrong, change<br><span style="white-space: pre;">	</span>orange: seems off, look at again<br><span style="white-space: pre;">	</span>light beige: has been removed" style="text;html=1;strokeColor=none;fillColor=none;align=left;verticalAlign=middle;whiteSpace=wrap;rounded=0;" vertex="1" parent="1"> + <mxGeometry x="20" y="70" width="220" height="30" as="geometry" /> + </mxCell> + <mxCell id="xary-zVek9Bg-A1b1ZmA-53" value="plot_log_BME" style="rounded=0;whiteSpace=wrap;html=1;" vertex="1" parent="1"> + <mxGeometry x="150" y="820" width="120" height="60" as="geometry" /> + </mxCell> + <mxCell id="xary-zVek9Bg-A1b1ZmA-56" value="plot_post_params" style="rounded=0;whiteSpace=wrap;html=1;" vertex="1" parent="1"> + <mxGeometry x="660" y="840" width="120" height="60" as="geometry" /> + </mxCell> + <mxCell id="xary-zVek9Bg-A1b1ZmA-59" value="create_error_model" style="rounded=0;whiteSpace=wrap;html=1;" vertex="1" parent="1"> + <mxGeometry x="45" y="740" width="120" height="60" as="geometry" /> + </mxCell> + <mxCell id="HiMKSJFquRK0mIlwyRFI-1" value="_check_ranges" style="rounded=0;whiteSpace=wrap;html=1;" vertex="1" parent="1"> + <mxGeometry x="1595" y="280" width="120" height="60" as="geometry" /> + </mxCell> + <mxCell id="HiMKSJFquRK0mIlwyRFI-2" value="gelman_rubin" style="rounded=0;whiteSpace=wrap;html=1;" vertex="1" parent="1"> + <mxGeometry x="1350" y="250" width="120" height="60" as="geometry" /> + </mxCell> + <mxCell id="HiMKSJFquRK0mIlwyRFI-3" value="_iterative_scheme" style="rounded=0;whiteSpace=wrap;html=1;fillColor=#f9f7ed;strokeColor=#CCC1AA;fontColor=#CCC1AA;" vertex="1" parent="1"> + <mxGeometry x="2055" y="620" width="120" height="60" as="geometry" /> + </mxCell> + <mxCell id="HiMKSJFquRK0mIlwyRFI-21" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;fillColor=#f9f7ed;strokeColor=#CCC1AA;fontColor=#CCC1AA;" edge="1" parent="1" source="HiMKSJFquRK0mIlwyRFI-4" target="HiMKSJFquRK0mIlwyRFI-2"> + <mxGeometry relative="1" as="geometry" /> + </mxCell> + <mxCell id="HiMKSJFquRK0mIlwyRFI-24" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=1;exitY=0.5;exitDx=0;exitDy=0;fillColor=#f9f7ed;strokeColor=#CCC1AA;fontColor=#CCC1AA;" edge="1" parent="1" source="HiMKSJFquRK0mIlwyRFI-4" target="HiMKSJFquRK0mIlwyRFI-11"> + <mxGeometry relative="1" as="geometry" /> + </mxCell> + <mxCell id="HiMKSJFquRK0mIlwyRFI-4" value="_my_ESS" style="rounded=0;whiteSpace=wrap;html=1;fillColor=#f9f7ed;strokeColor=#CCC1AA;fontColor=#CCC1AA;" vertex="1" parent="1"> + <mxGeometry x="1350" y="100" width="120" height="60" as="geometry" /> + </mxCell> + <mxCell id="HiMKSJFquRK0mIlwyRFI-14" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;entryX=0;entryY=0.5;entryDx=0;entryDy=0;exitX=0.5;exitY=1;exitDx=0;exitDy=0;" edge="1" parent="1" source="HiMKSJFquRK0mIlwyRFI-5" target="HiMKSJFquRK0mIlwyRFI-8"> + <mxGeometry relative="1" as="geometry" /> + </mxCell> + <mxCell id="HiMKSJFquRK0mIlwyRFI-19" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=1;exitY=0.5;exitDx=0;exitDy=0;" edge="1" parent="1" source="HiMKSJFquRK0mIlwyRFI-5" target="HiMKSJFquRK0mIlwyRFI-10"> + <mxGeometry relative="1" as="geometry" /> + </mxCell> + <mxCell id="HiMKSJFquRK0mIlwyRFI-22" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=0.5;exitY=0;exitDx=0;exitDy=0;" edge="1" parent="1" source="HiMKSJFquRK0mIlwyRFI-5" target="HiMKSJFquRK0mIlwyRFI-2"> + <mxGeometry relative="1" as="geometry" /> + </mxCell> + <mxCell id="HiMKSJFquRK0mIlwyRFI-53" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=0.25;exitY=1;exitDx=0;exitDy=0;entryX=1;entryY=0.5;entryDx=0;entryDy=0;" edge="1" parent="1" source="HiMKSJFquRK0mIlwyRFI-5" target="HiMKSJFquRK0mIlwyRFI-52"> + <mxGeometry relative="1" as="geometry" /> + </mxCell> + <mxCell id="HiMKSJFquRK0mIlwyRFI-56" value="if opts_sigma != 'B'" style="edgeLabel;html=1;align=center;verticalAlign=middle;resizable=0;points=[];labelBackgroundColor=#FF9A03;" vertex="1" connectable="0" parent="HiMKSJFquRK0mIlwyRFI-53"> + <mxGeometry x="0.7377" y="1" relative="1" as="geometry"> + <mxPoint as="offset" /> + </mxGeometry> + </mxCell> + <mxCell id="HiMKSJFquRK0mIlwyRFI-5" value="run_sampler" style="rounded=0;whiteSpace=wrap;html=1;strokeWidth=2;" vertex="1" parent="1"> + <mxGeometry x="1350" y="534" width="120" height="60" as="geometry" /> + </mxCell> + <mxCell id="HiMKSJFquRK0mIlwyRFI-20" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=0.5;exitY=0;exitDx=0;exitDy=0;" edge="1" parent="1" source="HiMKSJFquRK0mIlwyRFI-6" target="HiMKSJFquRK0mIlwyRFI-1"> + <mxGeometry relative="1" as="geometry" /> + </mxCell> + <mxCell id="HiMKSJFquRK0mIlwyRFI-6" value="log_prior" style="rounded=0;whiteSpace=wrap;html=1;" vertex="1" parent="1"> + <mxGeometry x="1595" y="510" width="120" height="60" as="geometry" /> + </mxCell> + <mxCell id="HiMKSJFquRK0mIlwyRFI-15" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=0.5;exitY=0;exitDx=0;exitDy=0;" edge="1" parent="1" source="HiMKSJFquRK0mIlwyRFI-7" target="HiMKSJFquRK0mIlwyRFI-9"> + <mxGeometry relative="1" as="geometry" /> + </mxCell> + <mxCell id="HiMKSJFquRK0mIlwyRFI-16" value="always" style="edgeLabel;html=1;align=center;verticalAlign=middle;resizable=0;points=[];" vertex="1" connectable="0" parent="HiMKSJFquRK0mIlwyRFI-15"> + <mxGeometry x="0.0246" y="2" relative="1" as="geometry"> + <mxPoint as="offset" /> + </mxGeometry> + </mxCell> + <mxCell id="HiMKSJFquRK0mIlwyRFI-7" value="log_likelihood" style="rounded=0;whiteSpace=wrap;html=1;" vertex="1" parent="1"> + <mxGeometry x="1760" y="539" width="120" height="60" as="geometry" /> + </mxCell> + <mxCell id="HiMKSJFquRK0mIlwyRFI-12" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=1;exitY=0.5;exitDx=0;exitDy=0;" edge="1" parent="1" source="HiMKSJFquRK0mIlwyRFI-8" target="HiMKSJFquRK0mIlwyRFI-6"> + <mxGeometry relative="1" as="geometry" /> + </mxCell> + <mxCell id="HiMKSJFquRK0mIlwyRFI-17" value="always" style="edgeLabel;html=1;align=center;verticalAlign=middle;resizable=0;points=[];" vertex="1" connectable="0" parent="HiMKSJFquRK0mIlwyRFI-12"> + <mxGeometry x="0.4587" y="4" relative="1" as="geometry"> + <mxPoint as="offset" /> + </mxGeometry> + </mxCell> + <mxCell id="HiMKSJFquRK0mIlwyRFI-13" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=1;exitY=0.5;exitDx=0;exitDy=0;" edge="1" parent="1" source="HiMKSJFquRK0mIlwyRFI-8" target="HiMKSJFquRK0mIlwyRFI-7"> + <mxGeometry relative="1" as="geometry" /> + </mxCell> + <mxCell id="HiMKSJFquRK0mIlwyRFI-18" value="always" style="edgeLabel;html=1;align=center;verticalAlign=middle;resizable=0;points=[];" vertex="1" connectable="0" parent="HiMKSJFquRK0mIlwyRFI-13"> + <mxGeometry x="0.6826" y="4" relative="1" as="geometry"> + <mxPoint as="offset" /> + </mxGeometry> + </mxCell> + <mxCell id="HiMKSJFquRK0mIlwyRFI-8" value="log_posterior" style="rounded=0;whiteSpace=wrap;html=1;" vertex="1" parent="1"> + <mxGeometry x="1480" y="610" width="120" height="60" as="geometry" /> + </mxCell> + <mxCell id="HiMKSJFquRK0mIlwyRFI-9" value="eval_model" style="rounded=0;whiteSpace=wrap;html=1;" vertex="1" parent="1"> + <mxGeometry x="1760" y="400" width="120" height="60" as="geometry" /> + </mxCell> + <mxCell id="HiMKSJFquRK0mIlwyRFI-10" value="train_error_model" style="rounded=0;whiteSpace=wrap;html=1;" vertex="1" parent="1"> + <mxGeometry x="1450" y="420" width="120" height="60" as="geometry" /> + </mxCell> + <mxCell id="HiMKSJFquRK0mIlwyRFI-23" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;fillColor=#f9f7ed;strokeColor=#CCC1AA;fontColor=#CCC1AA;" edge="1" parent="1" source="HiMKSJFquRK0mIlwyRFI-11" target="HiMKSJFquRK0mIlwyRFI-3"> + <mxGeometry relative="1" as="geometry" /> + </mxCell> + <mxCell id="HiMKSJFquRK0mIlwyRFI-11" value="marginal_llk_emcee" style="rounded=0;whiteSpace=wrap;html=1;fillColor=#f9f7ed;strokeColor=#CCC1AA;fontColor=#CCC1AA;" vertex="1" parent="1"> + <mxGeometry x="1870" y="620" width="120" height="60" as="geometry" /> + </mxCell> + <mxCell id="HiMKSJFquRK0mIlwyRFI-25" value="Never used!" style="text;html=1;strokeColor=none;fillColor=none;align=center;verticalAlign=middle;whiteSpace=wrap;rounded=0;fontColor=#CCC1AA;" vertex="1" parent="1"> + <mxGeometry x="1880" y="680" width="100" height="30" as="geometry" /> + </mxCell> + <mxCell id="HiMKSJFquRK0mIlwyRFI-26" value="<p style="margin:0px;margin-top:4px;text-align:center;"><b>BayesModelComp</b></p><hr size="1"><div style="height:2px;"></div>" style="verticalAlign=top;align=left;overflow=fill;fontSize=12;fontFamily=Helvetica;html=1;whiteSpace=wrap;" vertex="1" parent="1"> + <mxGeometry x="-1060" y="380" width="840" height="420" as="geometry" /> + </mxCell> + <mxCell id="HC1H8j6nMwEtLoyIrXXk-9" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=0.5;exitY=1;exitDx=0;exitDy=0;" edge="1" parent="1" source="HiMKSJFquRK0mIlwyRFI-27" target="HC1H8j6nMwEtLoyIrXXk-3"> + <mxGeometry relative="1" as="geometry" /> + </mxCell> + <mxCell id="HC1H8j6nMwEtLoyIrXXk-13" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=1;exitY=0.5;exitDx=0;exitDy=0;entryX=0;entryY=0.75;entryDx=0;entryDy=0;" edge="1" parent="1" source="HiMKSJFquRK0mIlwyRFI-27" target="HC1H8j6nMwEtLoyIrXXk-1"> + <mxGeometry relative="1" as="geometry" /> + </mxCell> + <mxCell id="HC1H8j6nMwEtLoyIrXXk-14" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=0.5;exitY=0;exitDx=0;exitDy=0;" edge="1" parent="1" source="HiMKSJFquRK0mIlwyRFI-27" target="HiMKSJFquRK0mIlwyRFI-31"> + <mxGeometry relative="1" as="geometry" /> + </mxCell> + <mxCell id="HiMKSJFquRK0mIlwyRFI-27" value="model_comparison_all" style="html=1;whiteSpace=wrap;strokeWidth=2;" vertex="1" parent="1"> + <mxGeometry x="-860" y="566" width="160" height="50" as="geometry" /> + </mxCell> + <mxCell id="HiMKSJFquRK0mIlwyRFI-42" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;entryX=0;entryY=0.5;entryDx=0;entryDy=0;" edge="1" parent="1" source="HC1H8j6nMwEtLoyIrXXk-1" target="xary-zVek9Bg-A1b1ZmA-9"> + <mxGeometry relative="1" as="geometry"> + <mxPoint x="-630" y="564" as="sourcePoint" /> + </mxGeometry> + </mxCell> + <mxCell id="HiMKSJFquRK0mIlwyRFI-47" value="always" style="edgeLabel;html=1;align=center;verticalAlign=middle;resizable=0;points=[];" vertex="1" connectable="0" parent="HiMKSJFquRK0mIlwyRFI-42"> + <mxGeometry x="-0.4883" relative="1" as="geometry"> + <mxPoint as="offset" /> + </mxGeometry> + </mxCell> + <mxCell id="HiMKSJFquRK0mIlwyRFI-37" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;" edge="1" parent="1" source="HiMKSJFquRK0mIlwyRFI-29" target="HiMKSJFquRK0mIlwyRFI-30"> + <mxGeometry relative="1" as="geometry" /> + </mxCell> + <mxCell id="HiMKSJFquRK0mIlwyRFI-49" value="if perturbed_data is None" style="edgeLabel;html=1;align=center;verticalAlign=middle;resizable=0;points=[];" vertex="1" connectable="0" parent="HiMKSJFquRK0mIlwyRFI-37"> + <mxGeometry x="-0.0507" y="4" relative="1" as="geometry"> + <mxPoint x="-1" as="offset" /> + </mxGeometry> + </mxCell> + <mxCell id="HiMKSJFquRK0mIlwyRFI-29" value="generate_dataset" style="html=1;whiteSpace=wrap;" vertex="1" parent="1"> + <mxGeometry x="-510" y="566" width="110" height="50" as="geometry" /> + </mxCell> + <mxCell id="HiMKSJFquRK0mIlwyRFI-30" value="_perturb_data" style="html=1;whiteSpace=wrap;" vertex="1" parent="1"> + <mxGeometry x="-340" y="636" width="110" height="50" as="geometry" /> + </mxCell> + <mxCell id="HC1H8j6nMwEtLoyIrXXk-6" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=1;exitY=0.5;exitDx=0;exitDy=0;" edge="1" parent="1" source="HiMKSJFquRK0mIlwyRFI-31" target="HC1H8j6nMwEtLoyIrXXk-1"> + <mxGeometry relative="1" as="geometry" /> + </mxCell> + <mxCell id="HC1H8j6nMwEtLoyIrXXk-10" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=0.5;exitY=0;exitDx=0;exitDy=0;" edge="1" parent="1" source="HiMKSJFquRK0mIlwyRFI-31" target="HiMKSJFquRK0mIlwyRFI-33"> + <mxGeometry relative="1" as="geometry" /> + </mxCell> + <mxCell id="HC1H8j6nMwEtLoyIrXXk-11" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=0;exitY=0.5;exitDx=0;exitDy=0;" edge="1" parent="1" source="HiMKSJFquRK0mIlwyRFI-31" target="HC1H8j6nMwEtLoyIrXXk-2"> + <mxGeometry relative="1" as="geometry" /> + </mxCell> + <mxCell id="HiMKSJFquRK0mIlwyRFI-31" value="cal_model_weight" style="html=1;whiteSpace=wrap;" vertex="1" parent="1"> + <mxGeometry x="-835" y="466" width="110" height="50" as="geometry" /> + </mxCell> + <mxCell id="HiMKSJFquRK0mIlwyRFI-32" value="plot_just_analysis" style="html=1;whiteSpace=wrap;" vertex="1" parent="1"> + <mxGeometry x="-835" y="736" width="110" height="50" as="geometry" /> + </mxCell> + <mxCell id="HiMKSJFquRK0mIlwyRFI-33" value="plot_model_weights" style="html=1;whiteSpace=wrap;" vertex="1" parent="1"> + <mxGeometry x="-980" y="416" width="110" height="50" as="geometry" /> + </mxCell> + <mxCell id="HiMKSJFquRK0mIlwyRFI-34" value="plot_bayes_factor" style="html=1;whiteSpace=wrap;" vertex="1" parent="1"> + <mxGeometry x="-410" y="431" width="110" height="50" as="geometry" /> + </mxCell> + <mxCell id="HiMKSJFquRK0mIlwyRFI-51" value="<p style="margin:0px;margin-top:4px;text-align:center;"><b>Discrepancy</b></p><hr size="1"><div style="height:2px;"></div>" style="verticalAlign=top;align=left;overflow=fill;fontSize=12;fontFamily=Helvetica;html=1;whiteSpace=wrap;" vertex="1" parent="1"> + <mxGeometry x="360" y="1039.82" width="200" height="130" as="geometry" /> + </mxCell> + <mxCell id="HiMKSJFquRK0mIlwyRFI-52" value="get_sample" style="rounded=0;whiteSpace=wrap;html=1;" vertex="1" parent="1"> + <mxGeometry x="400" y="1079.82" width="120" height="60" as="geometry" /> + </mxCell> + <mxCell id="HC1H8j6nMwEtLoyIrXXk-5" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=1;exitY=0.25;exitDx=0;exitDy=0;" edge="1" parent="1" source="HC1H8j6nMwEtLoyIrXXk-1" target="HiMKSJFquRK0mIlwyRFI-34"> + <mxGeometry relative="1" as="geometry" /> + </mxCell> + <mxCell id="HC1H8j6nMwEtLoyIrXXk-20" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=0.5;exitY=1;exitDx=0;exitDy=0;" edge="1" parent="1" source="HC1H8j6nMwEtLoyIrXXk-1" target="HC1H8j6nMwEtLoyIrXXk-17"> + <mxGeometry relative="1" as="geometry" /> + </mxCell> + <mxCell id="HC1H8j6nMwEtLoyIrXXk-21" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=1;exitY=0.75;exitDx=0;exitDy=0;" edge="1" parent="1" source="HC1H8j6nMwEtLoyIrXXk-1" target="HiMKSJFquRK0mIlwyRFI-29"> + <mxGeometry relative="1" as="geometry" /> + </mxCell> + <mxCell id="HC1H8j6nMwEtLoyIrXXk-1" value="calc_bayes_factors" style="html=1;whiteSpace=wrap;" vertex="1" parent="1"> + <mxGeometry x="-630" y="466" width="110" height="50" as="geometry" /> + </mxCell> + <mxCell id="HC1H8j6nMwEtLoyIrXXk-2" value="calc_model_weights" style="html=1;whiteSpace=wrap;" vertex="1" parent="1"> + <mxGeometry x="-1030" y="566" width="130" height="50" as="geometry" /> + </mxCell> + <mxCell id="HC1H8j6nMwEtLoyIrXXk-4" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=0.5;exitY=1;exitDx=0;exitDy=0;" edge="1" parent="1" source="HC1H8j6nMwEtLoyIrXXk-3" target="HiMKSJFquRK0mIlwyRFI-32"> + <mxGeometry relative="1" as="geometry" /> + </mxCell> + <mxCell id="HC1H8j6nMwEtLoyIrXXk-12" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=0;exitY=0.5;exitDx=0;exitDy=0;" edge="1" parent="1" source="HC1H8j6nMwEtLoyIrXXk-3" target="HC1H8j6nMwEtLoyIrXXk-2"> + <mxGeometry relative="1" as="geometry" /> + </mxCell> + <mxCell id="HC1H8j6nMwEtLoyIrXXk-16" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=1;exitY=0.75;exitDx=0;exitDy=0;entryX=0;entryY=0.5;entryDx=0;entryDy=0;" edge="1" parent="1" source="HC1H8j6nMwEtLoyIrXXk-3" target="xary-zVek9Bg-A1b1ZmA-9"> + <mxGeometry relative="1" as="geometry" /> + </mxCell> + <mxCell id="HC1H8j6nMwEtLoyIrXXk-23" value="always" style="edgeLabel;html=1;align=center;verticalAlign=middle;resizable=0;points=[];" vertex="1" connectable="0" parent="HC1H8j6nMwEtLoyIrXXk-16"> + <mxGeometry x="-0.5478" y="3" relative="1" as="geometry"> + <mxPoint as="offset" /> + </mxGeometry> + </mxCell> + <mxCell id="HC1H8j6nMwEtLoyIrXXk-18" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=1;exitY=0.25;exitDx=0;exitDy=0;" edge="1" parent="1" source="HC1H8j6nMwEtLoyIrXXk-3" target="HC1H8j6nMwEtLoyIrXXk-17"> + <mxGeometry relative="1" as="geometry" /> + </mxCell> + <mxCell id="HC1H8j6nMwEtLoyIrXXk-22" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=1;exitY=0.5;exitDx=0;exitDy=0;" edge="1" parent="1" source="HC1H8j6nMwEtLoyIrXXk-3" target="HiMKSJFquRK0mIlwyRFI-29"> + <mxGeometry relative="1" as="geometry" /> + </mxCell> + <mxCell id="HC1H8j6nMwEtLoyIrXXk-3" value="calc_justifiability_analysis" style="html=1;whiteSpace=wrap;" vertex="1" parent="1"> + <mxGeometry x="-860" y="666" width="160" height="50" as="geometry" /> + </mxCell> + <mxCell id="HC1H8j6nMwEtLoyIrXXk-17" value="setup" style="html=1;whiteSpace=wrap;" vertex="1" parent="1"> + <mxGeometry x="-630" y="566" width="110" height="50" as="geometry" /> + </mxCell> + </root> + </mxGraphModel> + </diagram> + <diagram id="sQf09xvhinkT827TE7Va" name="Function structure Engine"> + <mxGraphModel dx="1436" dy="968" grid="1" gridSize="10" guides="1" tooltips="1" connect="1" arrows="1" fold="1" page="1" pageScale="1" pageWidth="850" pageHeight="1100" math="0" shadow="0"> + <root> + <mxCell id="0" /> + <mxCell id="1" parent="0" /> + <mxCell id="JXjM7l_erEiZMkSmYBvl-1" value="<p style="margin:0px;margin-top:4px;text-align:center;"><b>Engine</b></p><hr size="1"><div style="height:2px;"></div>" style="verticalAlign=top;align=left;overflow=fill;fontSize=12;fontFamily=Helvetica;html=1;whiteSpace=wrap;" vertex="1" parent="1"> + <mxGeometry x="130" y="140" width="1390" height="690" as="geometry" /> + </mxCell> + <mxCell id="JXjM7l_erEiZMkSmYBvl-2" value="hellinger_distance" style="html=1;whiteSpace=wrap;" vertex="1" parent="1"> + <mxGeometry x="1340" y="50" width="110" height="50" as="geometry" /> + </mxCell> + <mxCell id="JXjM7l_erEiZMkSmYBvl-3" value="logpdf" style="html=1;whiteSpace=wrap;" vertex="1" parent="1"> + <mxGeometry x="1050" y="50" width="110" height="50" as="geometry" /> + </mxCell> + <mxCell id="JXjM7l_erEiZMkSmYBvl-4" value="subdomain" style="html=1;whiteSpace=wrap;" vertex="1" parent="1"> + <mxGeometry x="625" y="50" width="110" height="50" as="geometry" /> + </mxCell> + <mxCell id="JXjM7l_erEiZMkSmYBvl-5" value="start_engine" style="html=1;whiteSpace=wrap;" vertex="1" parent="1"> + <mxGeometry x="250" y="680" width="110" height="50" as="geometry" /> + </mxCell> + <mxCell id="JXjM7l_erEiZMkSmYBvl-32" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=1;exitY=0.5;exitDx=0;exitDy=0;" edge="1" parent="1" source="JXjM7l_erEiZMkSmYBvl-6" target="JXjM7l_erEiZMkSmYBvl-5"> + <mxGeometry relative="1" as="geometry" /> + </mxCell> + <mxCell id="JXjM7l_erEiZMkSmYBvl-6" value="train_normal" style="html=1;whiteSpace=wrap;strokeWidth=2;" vertex="1" parent="1"> + <mxGeometry x="170" y="420" width="110" height="50" as="geometry" /> + </mxCell> + <mxCell id="JXjM7l_erEiZMkSmYBvl-10" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=1;exitY=0.5;exitDx=0;exitDy=0;" edge="1" parent="1" source="JXjM7l_erEiZMkSmYBvl-7" target="JXjM7l_erEiZMkSmYBvl-9"> + <mxGeometry relative="1" as="geometry"> + <mxPoint x="335" y="335" as="targetPoint" /> + </mxGeometry> + </mxCell> + <mxCell id="JXjM7l_erEiZMkSmYBvl-33" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=0.5;exitY=1;exitDx=0;exitDy=0;" edge="1" parent="1" source="JXjM7l_erEiZMkSmYBvl-7" target="JXjM7l_erEiZMkSmYBvl-6"> + <mxGeometry relative="1" as="geometry" /> + </mxCell> + <mxCell id="JXjM7l_erEiZMkSmYBvl-7" value="train_sequential" style="html=1;whiteSpace=wrap;strokeWidth=2;" vertex="1" parent="1"> + <mxGeometry x="170" y="310" width="110" height="50" as="geometry" /> + </mxCell> + <mxCell id="JXjM7l_erEiZMkSmYBvl-8" value="eval_metamodel" style="html=1;whiteSpace=wrap;strokeWidth=2;" vertex="1" parent="1"> + <mxGeometry x="190" y="210" width="110" height="50" as="geometry" /> + </mxCell> + <mxCell id="W5_FOelZ0qj-h3Gb0n3K-7" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=1;exitY=0.5;exitDx=0;exitDy=0;" edge="1" parent="1" source="JXjM7l_erEiZMkSmYBvl-9" target="JXjM7l_erEiZMkSmYBvl-18"> + <mxGeometry relative="1" as="geometry" /> + </mxCell> + <mxCell id="W5_FOelZ0qj-h3Gb0n3K-19" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=0.5;exitY=1;exitDx=0;exitDy=0;entryX=0;entryY=0.5;entryDx=0;entryDy=0;" edge="1" parent="1" source="JXjM7l_erEiZMkSmYBvl-9" target="JXjM7l_erEiZMkSmYBvl-23"> + <mxGeometry relative="1" as="geometry" /> + </mxCell> + <mxCell id="W5_FOelZ0qj-h3Gb0n3K-20" value="if len(obs_data) != 0" style="edgeLabel;html=1;align=center;verticalAlign=middle;resizable=0;points=[];" vertex="1" connectable="0" parent="W5_FOelZ0qj-h3Gb0n3K-19"> + <mxGeometry x="0.8137" relative="1" as="geometry"> + <mxPoint x="-57" as="offset" /> + </mxGeometry> + </mxCell> + <mxCell id="W5_FOelZ0qj-h3Gb0n3K-21" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=0.5;exitY=0;exitDx=0;exitDy=0;entryX=0.25;entryY=1;entryDx=0;entryDy=0;" edge="1" parent="1" source="JXjM7l_erEiZMkSmYBvl-9" target="JXjM7l_erEiZMkSmYBvl-24"> + <mxGeometry relative="1" as="geometry" /> + </mxCell> + <mxCell id="W5_FOelZ0qj-h3Gb0n3K-22" value="if len(obs_data) != 0" style="edgeLabel;html=1;align=center;verticalAlign=middle;resizable=0;points=[];" vertex="1" connectable="0" parent="W5_FOelZ0qj-h3Gb0n3K-21"> + <mxGeometry x="0.7684" y="3" relative="1" as="geometry"> + <mxPoint x="1" as="offset" /> + </mxGeometry> + </mxCell> + <mxCell id="W5_FOelZ0qj-h3Gb0n3K-23" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=0.5;exitY=1;exitDx=0;exitDy=0;entryX=0;entryY=0.5;entryDx=0;entryDy=0;" edge="1" parent="1" source="JXjM7l_erEiZMkSmYBvl-9" target="JXjM7l_erEiZMkSmYBvl-25"> + <mxGeometry relative="1" as="geometry" /> + </mxCell> + <mxCell id="W5_FOelZ0qj-h3Gb0n3K-24" value="if expdes.valid_model_runs" style="edgeLabel;html=1;align=center;verticalAlign=middle;resizable=0;points=[];" vertex="1" connectable="0" parent="W5_FOelZ0qj-h3Gb0n3K-23"> + <mxGeometry x="0.606" y="3" relative="1" as="geometry"> + <mxPoint x="-16" y="3" as="offset" /> + </mxGeometry> + </mxCell> + <mxCell id="W5_FOelZ0qj-h3Gb0n3K-25" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=0.5;exitY=1;exitDx=0;exitDy=0;entryX=0;entryY=0.5;entryDx=0;entryDy=0;" edge="1" parent="1" source="JXjM7l_erEiZMkSmYBvl-9" target="JXjM7l_erEiZMkSmYBvl-26"> + <mxGeometry relative="1" as="geometry" /> + </mxCell> + <mxCell id="W5_FOelZ0qj-h3Gb0n3K-26" value="if mc_ref and pce" style="edgeLabel;html=1;align=center;verticalAlign=middle;resizable=0;points=[];" vertex="1" connectable="0" parent="W5_FOelZ0qj-h3Gb0n3K-25"> + <mxGeometry x="0.7094" y="-3" relative="1" as="geometry"> + <mxPoint x="-31" y="-3" as="offset" /> + </mxGeometry> + </mxCell> + <mxCell id="JXjM7l_erEiZMkSmYBvl-9" value="train_seq_design" style="html=1;whiteSpace=wrap;" vertex="1" parent="1"> + <mxGeometry x="315" y="310" width="110" height="50" as="geometry" /> + </mxCell> + <mxCell id="JXjM7l_erEiZMkSmYBvl-12" value="util_VarBasedDesign" style="html=1;whiteSpace=wrap;" vertex="1" parent="1"> + <mxGeometry x="670" y="648" width="130" height="50" as="geometry" /> + </mxCell> + <mxCell id="JXjM7l_erEiZMkSmYBvl-28" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=0.75;exitY=0;exitDx=0;exitDy=0;" edge="1" parent="1" source="JXjM7l_erEiZMkSmYBvl-13" target="JXjM7l_erEiZMkSmYBvl-3"> + <mxGeometry relative="1" as="geometry" /> + </mxCell> + <mxCell id="JXjM7l_erEiZMkSmYBvl-31" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;" edge="1" parent="1" source="JXjM7l_erEiZMkSmYBvl-13" target="JXjM7l_erEiZMkSmYBvl-5"> + <mxGeometry relative="1" as="geometry" /> + </mxCell> + <mxCell id="JXjM7l_erEiZMkSmYBvl-38" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=0.75;exitY=1;exitDx=0;exitDy=0;" edge="1" parent="1" source="JXjM7l_erEiZMkSmYBvl-15" target="JXjM7l_erEiZMkSmYBvl-13"> + <mxGeometry relative="1" as="geometry" /> + </mxCell> + <mxCell id="JXjM7l_erEiZMkSmYBvl-39" value="if method == 'bayesactdesign'" style="edgeLabel;html=1;align=center;verticalAlign=middle;resizable=0;points=[];labelBackgroundColor=default;" vertex="1" connectable="0" parent="JXjM7l_erEiZMkSmYBvl-38"> + <mxGeometry x="-0.6235" y="2" relative="1" as="geometry"> + <mxPoint x="289" y="2" as="offset" /> + </mxGeometry> + </mxCell> + <mxCell id="W5_FOelZ0qj-h3Gb0n3K-12" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=1;exitY=0.5;exitDx=0;exitDy=0;" edge="1" parent="1" source="JXjM7l_erEiZMkSmYBvl-13" target="JXjM7l_erEiZMkSmYBvl-21"> + <mxGeometry relative="1" as="geometry" /> + </mxCell> + <mxCell id="W5_FOelZ0qj-h3Gb0n3K-15" value="always" style="edgeLabel;html=1;align=center;verticalAlign=middle;resizable=0;points=[];" vertex="1" connectable="0" parent="W5_FOelZ0qj-h3Gb0n3K-12"> + <mxGeometry x="0.7865" y="4" relative="1" as="geometry"> + <mxPoint x="-91" y="185" as="offset" /> + </mxGeometry> + </mxCell> + <mxCell id="JXjM7l_erEiZMkSmYBvl-13" value="util_BayesianActiveDesign" style="html=1;whiteSpace=wrap;" vertex="1" parent="1"> + <mxGeometry x="1020" y="680" width="150" height="50" as="geometry" /> + </mxCell> + <mxCell id="JXjM7l_erEiZMkSmYBvl-34" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=0;exitY=0.5;exitDx=0;exitDy=0;" edge="1" parent="1" source="JXjM7l_erEiZMkSmYBvl-14" target="JXjM7l_erEiZMkSmYBvl-6"> + <mxGeometry relative="1" as="geometry" /> + </mxCell> + <mxCell id="W5_FOelZ0qj-h3Gb0n3K-13" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=1;exitY=0.5;exitDx=0;exitDy=0;" edge="1" parent="1" source="JXjM7l_erEiZMkSmYBvl-14" target="JXjM7l_erEiZMkSmYBvl-21"> + <mxGeometry relative="1" as="geometry" /> + </mxCell> + <mxCell id="W5_FOelZ0qj-h3Gb0n3K-16" value="always" style="edgeLabel;html=1;align=center;verticalAlign=middle;resizable=0;points=[];" vertex="1" connectable="0" parent="W5_FOelZ0qj-h3Gb0n3K-13"> + <mxGeometry x="0.197" y="-3" relative="1" as="geometry"> + <mxPoint x="-1" as="offset" /> + </mxGeometry> + </mxCell> + <mxCell id="JXjM7l_erEiZMkSmYBvl-14" value="utilBayesianDesign" style="html=1;whiteSpace=wrap;" vertex="1" parent="1"> + <mxGeometry x="880" y="730" width="110" height="50" as="geometry" /> + </mxCell> + <mxCell id="JXjM7l_erEiZMkSmYBvl-37" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=0.25;exitY=1;exitDx=0;exitDy=0;entryX=0.5;entryY=0;entryDx=0;entryDy=0;" edge="1" parent="1" source="JXjM7l_erEiZMkSmYBvl-15" target="JXjM7l_erEiZMkSmYBvl-12"> + <mxGeometry relative="1" as="geometry" /> + </mxCell> + <mxCell id="JXjM7l_erEiZMkSmYBvl-42" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=0.5;exitY=1;exitDx=0;exitDy=0;" edge="1" parent="1" source="JXjM7l_erEiZMkSmYBvl-15" target="JXjM7l_erEiZMkSmYBvl-14"> + <mxGeometry relative="1" as="geometry" /> + </mxCell> + <mxCell id="JXjM7l_erEiZMkSmYBvl-43" value="if method == 'bayesoptdesign'" style="edgeLabel;html=1;align=center;verticalAlign=middle;resizable=0;points=[];" vertex="1" connectable="0" parent="JXjM7l_erEiZMkSmYBvl-42"> + <mxGeometry x="0.6143" y="-3" relative="1" as="geometry"> + <mxPoint x="3" y="29" as="offset" /> + </mxGeometry> + </mxCell> + <mxCell id="JXjM7l_erEiZMkSmYBvl-15" value="run_util_func" style="html=1;whiteSpace=wrap;" vertex="1" parent="1"> + <mxGeometry x="660" y="450" width="110" height="50" as="geometry" /> + </mxCell> + <mxCell id="JXjM7l_erEiZMkSmYBvl-36" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=0.25;exitY=1;exitDx=0;exitDy=0;" edge="1" parent="1" source="JXjM7l_erEiZMkSmYBvl-16" target="JXjM7l_erEiZMkSmYBvl-12"> + <mxGeometry relative="1" as="geometry" /> + </mxCell> + <mxCell id="JXjM7l_erEiZMkSmYBvl-41" value="if method == 'varoptdesign'" style="edgeLabel;html=1;align=center;verticalAlign=middle;resizable=0;points=[];" vertex="1" connectable="0" parent="JXjM7l_erEiZMkSmYBvl-36"> + <mxGeometry x="-0.5992" relative="1" as="geometry"> + <mxPoint x="-197" y="62" as="offset" /> + </mxGeometry> + </mxCell> + <mxCell id="JXjM7l_erEiZMkSmYBvl-44" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;" edge="1" parent="1" source="JXjM7l_erEiZMkSmYBvl-16" target="JXjM7l_erEiZMkSmYBvl-13"> + <mxGeometry relative="1" as="geometry"> + <Array as="points"> + <mxPoint x="965" y="590" /> + <mxPoint x="1095" y="590" /> + </Array> + </mxGeometry> + </mxCell> + <mxCell id="W5_FOelZ0qj-h3Gb0n3K-27" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;" edge="1" parent="1" source="JXjM7l_erEiZMkSmYBvl-16" target="JXjM7l_erEiZMkSmYBvl-14"> + <mxGeometry relative="1" as="geometry" /> + </mxCell> + <mxCell id="JXjM7l_erEiZMkSmYBvl-16" value="dual_annealing" style="html=1;whiteSpace=wrap;" vertex="1" parent="1"> + <mxGeometry x="910" y="450" width="110" height="50" as="geometry" /> + </mxCell> + <mxCell id="W5_FOelZ0qj-h3Gb0n3K-5" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;entryX=1;entryY=0.5;entryDx=0;entryDy=0;" edge="1" parent="1" source="JXjM7l_erEiZMkSmYBvl-17" target="JXjM7l_erEiZMkSmYBvl-18"> + <mxGeometry relative="1" as="geometry" /> + </mxCell> + <mxCell id="W5_FOelZ0qj-h3Gb0n3K-6" value="if exploit _method is 'bayesoptdesign',<br style="border-color: var(--border-color);">'bayesactdesign' or 'varoptdesign'" style="edgeLabel;html=1;align=center;verticalAlign=middle;resizable=0;points=[];" vertex="1" connectable="0" parent="W5_FOelZ0qj-h3Gb0n3K-5"> + <mxGeometry x="0.1312" y="2" relative="1" as="geometry"> + <mxPoint x="17" y="-2" as="offset" /> + </mxGeometry> + </mxCell> + <mxCell id="JXjM7l_erEiZMkSmYBvl-17" value="tradeoff_weights" style="html=1;whiteSpace=wrap;" vertex="1" parent="1"> + <mxGeometry x="980" y="210" width="110" height="50" as="geometry" /> + </mxCell> + <mxCell id="JXjM7l_erEiZMkSmYBvl-30" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=0.5;exitY=0;exitDx=0;exitDy=0;" edge="1" parent="1" source="JXjM7l_erEiZMkSmYBvl-18" target="JXjM7l_erEiZMkSmYBvl-4"> + <mxGeometry relative="1" as="geometry" /> + </mxCell> + <mxCell id="W5_FOelZ0qj-h3Gb0n3K-1" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=0.75;exitY=1;exitDx=0;exitDy=0;" edge="1" parent="1" source="JXjM7l_erEiZMkSmYBvl-18" target="JXjM7l_erEiZMkSmYBvl-15"> + <mxGeometry relative="1" as="geometry"> + <mxPoint x="790" y="280.0000000000002" as="sourcePoint" /> + <mxPoint x="690" y="499.9999999999998" as="targetPoint" /> + </mxGeometry> + </mxCell> + <mxCell id="W5_FOelZ0qj-h3Gb0n3K-2" value="if exploit _method is 'bayesoptdesign',<br>'bayesactdesign' or 'varoptdesign'" style="edgeLabel;html=1;align=center;verticalAlign=middle;resizable=0;points=[];" vertex="1" connectable="0" parent="W5_FOelZ0qj-h3Gb0n3K-1"> + <mxGeometry x="0.1579" relative="1" as="geometry"> + <mxPoint x="-15" y="49" as="offset" /> + </mxGeometry> + </mxCell> + <mxCell id="W5_FOelZ0qj-h3Gb0n3K-3" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=0.75;exitY=1;exitDx=0;exitDy=0;" edge="1" parent="1" source="JXjM7l_erEiZMkSmYBvl-18" target="JXjM7l_erEiZMkSmYBvl-16"> + <mxGeometry relative="1" as="geometry"> + <mxPoint x="680" y="205.05882352941194" as="sourcePoint" /> + <mxPoint x="805" y="779.9999999999998" as="targetPoint" /> + </mxGeometry> + </mxCell> + <mxCell id="W5_FOelZ0qj-h3Gb0n3K-4" value="if explore_method == 'dual annealing'" style="edgeLabel;html=1;align=center;verticalAlign=middle;resizable=0;points=[];" vertex="1" connectable="0" parent="W5_FOelZ0qj-h3Gb0n3K-3"> + <mxGeometry x="-0.6061" relative="1" as="geometry"> + <mxPoint x="270" y="46" as="offset" /> + </mxGeometry> + </mxCell> + <mxCell id="W5_FOelZ0qj-h3Gb0n3K-9" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;" edge="1" parent="1" source="JXjM7l_erEiZMkSmYBvl-18" target="JXjM7l_erEiZMkSmYBvl-20"> + <mxGeometry relative="1" as="geometry" /> + </mxCell> + <mxCell id="W5_FOelZ0qj-h3Gb0n3K-10" value="if exploit_method == 'alphabetic'" style="edgeLabel;html=1;align=center;verticalAlign=middle;resizable=0;points=[];" vertex="1" connectable="0" parent="W5_FOelZ0qj-h3Gb0n3K-9"> + <mxGeometry x="0.8144" y="1" relative="1" as="geometry"> + <mxPoint x="74" y="-1" as="offset" /> + </mxGeometry> + </mxCell> + <mxCell id="JXjM7l_erEiZMkSmYBvl-18" value="choose_next_sample" style="html=1;whiteSpace=wrap;" vertex="1" parent="1"> + <mxGeometry x="610" y="210" width="140" height="50" as="geometry" /> + </mxCell> + <mxCell id="JXjM7l_erEiZMkSmYBvl-20" value="util_AlphOptDesign" style="html=1;whiteSpace=wrap;" vertex="1" parent="1"> + <mxGeometry x="330" y="210" width="110" height="50" as="geometry" /> + </mxCell> + <mxCell id="JXjM7l_erEiZMkSmYBvl-21" value="_normpdf" style="html=1;whiteSpace=wrap;" vertex="1" parent="1"> + <mxGeometry x="1340" y="430" width="110" height="50" as="geometry" /> + </mxCell> + <mxCell id="JXjM7l_erEiZMkSmYBvl-29" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;" edge="1" parent="1" source="JXjM7l_erEiZMkSmYBvl-22" target="JXjM7l_erEiZMkSmYBvl-3"> + <mxGeometry relative="1" as="geometry" /> + </mxCell> + <mxCell id="JXjM7l_erEiZMkSmYBvl-22" value="_corr_factor_BME" style="html=1;whiteSpace=wrap;" vertex="1" parent="1"> + <mxGeometry x="1130" y="220" width="110" height="50" as="geometry" /> + </mxCell> + <mxCell id="JXjM7l_erEiZMkSmYBvl-23" value="_posteriorPlot" style="html=1;whiteSpace=wrap;" vertex="1" parent="1"> + <mxGeometry x="520" y="440" width="110" height="50" as="geometry" /> + </mxCell> + <mxCell id="JXjM7l_erEiZMkSmYBvl-27" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=0.5;exitY=0;exitDx=0;exitDy=0;" edge="1" parent="1" source="JXjM7l_erEiZMkSmYBvl-24" target="JXjM7l_erEiZMkSmYBvl-2"> + <mxGeometry relative="1" as="geometry" /> + </mxCell> + <mxCell id="W5_FOelZ0qj-h3Gb0n3K-11" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=0.5;exitY=1;exitDx=0;exitDy=0;entryX=0.5;entryY=0;entryDx=0;entryDy=0;" edge="1" parent="1" source="JXjM7l_erEiZMkSmYBvl-24" target="JXjM7l_erEiZMkSmYBvl-21"> + <mxGeometry relative="1" as="geometry" /> + </mxCell> + <mxCell id="W5_FOelZ0qj-h3Gb0n3K-14" value="always" style="edgeLabel;html=1;align=center;verticalAlign=middle;resizable=0;points=[];" vertex="1" connectable="0" parent="W5_FOelZ0qj-h3Gb0n3K-11"> + <mxGeometry x="0.0929" y="-1" relative="1" as="geometry"> + <mxPoint as="offset" /> + </mxGeometry> + </mxCell> + <mxCell id="W5_FOelZ0qj-h3Gb0n3K-17" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=0;exitY=0.5;exitDx=0;exitDy=0;" edge="1" parent="1" source="JXjM7l_erEiZMkSmYBvl-24" target="JXjM7l_erEiZMkSmYBvl-22"> + <mxGeometry relative="1" as="geometry" /> + </mxCell> + <mxCell id="W5_FOelZ0qj-h3Gb0n3K-18" value="commented out?" style="edgeLabel;html=1;align=center;verticalAlign=middle;resizable=0;points=[];" vertex="1" connectable="0" parent="W5_FOelZ0qj-h3Gb0n3K-17"> + <mxGeometry x="-0.1477" y="3" relative="1" as="geometry"> + <mxPoint as="offset" /> + </mxGeometry> + </mxCell> + <mxCell id="JXjM7l_erEiZMkSmYBvl-24" value="_BME_Calculator" style="html=1;whiteSpace=wrap;" vertex="1" parent="1"> + <mxGeometry x="1340" y="220" width="110" height="50" as="geometry" /> + </mxCell> + <mxCell id="JXjM7l_erEiZMkSmYBvl-25" value="_validError" style="html=1;whiteSpace=wrap;" vertex="1" parent="1"> + <mxGeometry x="520" y="510" width="110" height="50" as="geometry" /> + </mxCell> + <mxCell id="JXjM7l_erEiZMkSmYBvl-26" value="_error_Mean_Std" style="html=1;whiteSpace=wrap;" vertex="1" parent="1"> + <mxGeometry x="520" y="580" width="110" height="50" as="geometry" /> + </mxCell> + </root> + </mxGraphModel> + </diagram> + <diagram id="ME5gyYpVqUByTnAIOcMV" name="Parameter and function interaction"> + <mxGraphModel dx="2049" dy="1366" grid="1" gridSize="10" guides="1" tooltips="1" connect="1" arrows="1" fold="1" page="1" pageScale="1" pageWidth="850" pageHeight="1100" math="0" shadow="0"> + <root> + <mxCell id="0" /> + <mxCell id="1" parent="0" /> + <mxCell id="K5oJ7VEt7dPmeK6pba1f-33" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=1;exitY=0.5;exitDx=0;exitDy=0;entryX=0.5;entryY=1;entryDx=0;entryDy=0;" edge="1" parent="1" source="K5oJ7VEt7dPmeK6pba1f-1" target="K5oJ7VEt7dPmeK6pba1f-32"> + <mxGeometry relative="1" as="geometry" /> + </mxCell> + <mxCell id="K5oJ7VEt7dPmeK6pba1f-54" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=1;exitY=0.5;exitDx=0;exitDy=0;entryX=0.5;entryY=1;entryDx=0;entryDy=0;" edge="1" parent="1" source="K5oJ7VEt7dPmeK6pba1f-1" target="K5oJ7VEt7dPmeK6pba1f-53"> + <mxGeometry relative="1" as="geometry" /> + </mxCell> + <mxCell id="K5oJ7VEt7dPmeK6pba1f-61" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=1;exitY=0.5;exitDx=0;exitDy=0;entryX=0.5;entryY=1;entryDx=0;entryDy=0;" edge="1" parent="1" source="K5oJ7VEt7dPmeK6pba1f-1" target="K5oJ7VEt7dPmeK6pba1f-60"> + <mxGeometry relative="1" as="geometry" /> + </mxCell> + <mxCell id="K5oJ7VEt7dPmeK6pba1f-1" value="engine" style="rounded=0;whiteSpace=wrap;html=1;" vertex="1" parent="1"> + <mxGeometry x="40" y="160" width="120" height="60" as="geometry" /> + </mxCell> + <mxCell id="K5oJ7VEt7dPmeK6pba1f-3" value="Discrepancy" style="rounded=0;whiteSpace=wrap;html=1;" vertex="1" parent="1"> + <mxGeometry x="40" y="240" width="120" height="60" as="geometry" /> + </mxCell> + <mxCell id="K5oJ7VEt7dPmeK6pba1f-71" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=1;exitY=0.5;exitDx=0;exitDy=0;" edge="1" parent="1" source="K5oJ7VEt7dPmeK6pba1f-4" target="K5oJ7VEt7dPmeK6pba1f-60"> + <mxGeometry relative="1" as="geometry" /> + </mxCell> + <mxCell id="K5oJ7VEt7dPmeK6pba1f-4" value="emulator" style="rounded=0;whiteSpace=wrap;html=1;" vertex="1" parent="1"> + <mxGeometry x="40" y="320" width="120" height="60" as="geometry" /> + </mxCell> + <mxCell id="K5oJ7VEt7dPmeK6pba1f-37" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=1;exitY=0.5;exitDx=0;exitDy=0;" edge="1" parent="1" source="K5oJ7VEt7dPmeK6pba1f-5" target="K5oJ7VEt7dPmeK6pba1f-32"> + <mxGeometry relative="1" as="geometry" /> + </mxCell> + <mxCell id="K5oJ7VEt7dPmeK6pba1f-57" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=1;exitY=0.5;exitDx=0;exitDy=0;" edge="1" parent="1" source="K5oJ7VEt7dPmeK6pba1f-5" target="K5oJ7VEt7dPmeK6pba1f-53"> + <mxGeometry relative="1" as="geometry" /> + </mxCell> + <mxCell id="K5oJ7VEt7dPmeK6pba1f-65" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=1;exitY=0.5;exitDx=0;exitDy=0;" edge="1" parent="1" source="K5oJ7VEt7dPmeK6pba1f-5" target="K5oJ7VEt7dPmeK6pba1f-60"> + <mxGeometry relative="1" as="geometry" /> + </mxCell> + <mxCell id="K5oJ7VEt7dPmeK6pba1f-5" value="name" style="rounded=0;whiteSpace=wrap;html=1;" vertex="1" parent="1"> + <mxGeometry x="40" y="400" width="120" height="60" as="geometry" /> + </mxCell> + <mxCell id="K5oJ7VEt7dPmeK6pba1f-47" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=1;exitY=0.5;exitDx=0;exitDy=0;entryX=0.5;entryY=1;entryDx=0;entryDy=0;" edge="1" parent="1" source="K5oJ7VEt7dPmeK6pba1f-6" target="K5oJ7VEt7dPmeK6pba1f-32"> + <mxGeometry relative="1" as="geometry" /> + </mxCell> + <mxCell id="K5oJ7VEt7dPmeK6pba1f-6" value="bootstrap" style="rounded=0;whiteSpace=wrap;html=1;" vertex="1" parent="1"> + <mxGeometry x="40" y="480" width="120" height="60" as="geometry" /> + </mxCell> + <mxCell id="K5oJ7VEt7dPmeK6pba1f-7" value="req_outputs" style="rounded=0;whiteSpace=wrap;html=1;" vertex="1" parent="1"> + <mxGeometry x="40" y="560" width="120" height="60" as="geometry" /> + </mxCell> + <mxCell id="K5oJ7VEt7dPmeK6pba1f-79" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=1;exitY=0.5;exitDx=0;exitDy=0;" edge="1" parent="1" source="K5oJ7VEt7dPmeK6pba1f-8" target="K5oJ7VEt7dPmeK6pba1f-60"> + <mxGeometry relative="1" as="geometry" /> + </mxCell> + <mxCell id="K5oJ7VEt7dPmeK6pba1f-8" value="selected_indices" style="rounded=0;whiteSpace=wrap;html=1;" vertex="1" parent="1"> + <mxGeometry x="40" y="640" width="120" height="60" as="geometry" /> + </mxCell> + <mxCell id="K5oJ7VEt7dPmeK6pba1f-35" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=1;exitY=0.5;exitDx=0;exitDy=0;" edge="1" parent="1" source="K5oJ7VEt7dPmeK6pba1f-9" target="K5oJ7VEt7dPmeK6pba1f-32"> + <mxGeometry relative="1" as="geometry" /> + </mxCell> + <mxCell id="K5oJ7VEt7dPmeK6pba1f-55" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=1;exitY=0.5;exitDx=0;exitDy=0;" edge="1" parent="1" source="K5oJ7VEt7dPmeK6pba1f-9" target="K5oJ7VEt7dPmeK6pba1f-53"> + <mxGeometry relative="1" as="geometry" /> + </mxCell> + <mxCell id="K5oJ7VEt7dPmeK6pba1f-67" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=1;exitY=0.5;exitDx=0;exitDy=0;" edge="1" parent="1" source="K5oJ7VEt7dPmeK6pba1f-9" target="K5oJ7VEt7dPmeK6pba1f-60"> + <mxGeometry relative="1" as="geometry" /> + </mxCell> + <mxCell id="K5oJ7VEt7dPmeK6pba1f-9" value="prior_samples" style="rounded=0;whiteSpace=wrap;html=1;" vertex="1" parent="1"> + <mxGeometry x="40" y="720" width="120" height="60" as="geometry" /> + </mxCell> + <mxCell id="K5oJ7VEt7dPmeK6pba1f-36" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=1;exitY=0.5;exitDx=0;exitDy=0;" edge="1" parent="1" source="K5oJ7VEt7dPmeK6pba1f-11" target="K5oJ7VEt7dPmeK6pba1f-32"> + <mxGeometry relative="1" as="geometry" /> + </mxCell> + <mxCell id="K5oJ7VEt7dPmeK6pba1f-68" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=1;exitY=0.5;exitDx=0;exitDy=0;" edge="1" parent="1" source="K5oJ7VEt7dPmeK6pba1f-11" target="K5oJ7VEt7dPmeK6pba1f-60"> + <mxGeometry relative="1" as="geometry" /> + </mxCell> + <mxCell id="K5oJ7VEt7dPmeK6pba1f-11" value="n_prior_samples" style="rounded=0;whiteSpace=wrap;html=1;" vertex="1" parent="1"> + <mxGeometry x="40" y="800" width="120" height="60" as="geometry" /> + </mxCell> + <mxCell id="K5oJ7VEt7dPmeK6pba1f-38" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=1;exitY=0.5;exitDx=0;exitDy=0;" edge="1" parent="1" source="K5oJ7VEt7dPmeK6pba1f-12" target="K5oJ7VEt7dPmeK6pba1f-32"> + <mxGeometry relative="1" as="geometry" /> + </mxCell> + <mxCell id="K5oJ7VEt7dPmeK6pba1f-80" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=1;exitY=0.5;exitDx=0;exitDy=0;" edge="1" parent="1" source="K5oJ7VEt7dPmeK6pba1f-12" target="K5oJ7VEt7dPmeK6pba1f-60"> + <mxGeometry relative="1" as="geometry" /> + </mxCell> + <mxCell id="K5oJ7VEt7dPmeK6pba1f-12" value="measured_data" style="rounded=0;whiteSpace=wrap;html=1;" vertex="1" parent="1"> + <mxGeometry x="40" y="880" width="120" height="60" as="geometry" /> + </mxCell> + <mxCell id="K5oJ7VEt7dPmeK6pba1f-58" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=1;exitY=0.5;exitDx=0;exitDy=0;" edge="1" parent="1" source="K5oJ7VEt7dPmeK6pba1f-13" target="K5oJ7VEt7dPmeK6pba1f-53"> + <mxGeometry relative="1" as="geometry" /> + </mxCell> + <mxCell id="K5oJ7VEt7dPmeK6pba1f-13" value="inference_method" style="rounded=0;whiteSpace=wrap;html=1;" vertex="1" parent="1"> + <mxGeometry x="40" y="960" width="120" height="60" as="geometry" /> + </mxCell> + <mxCell id="K5oJ7VEt7dPmeK6pba1f-14" value="mcmc_params" style="rounded=0;whiteSpace=wrap;html=1;" vertex="1" parent="1"> + <mxGeometry x="40" y="1040" width="120" height="60" as="geometry" /> + </mxCell> + <mxCell id="K5oJ7VEt7dPmeK6pba1f-63" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=1;exitY=0.5;exitDx=0;exitDy=0;" edge="1" parent="1" source="K5oJ7VEt7dPmeK6pba1f-15" target="K5oJ7VEt7dPmeK6pba1f-60"> + <mxGeometry relative="1" as="geometry" /> + </mxCell> + <mxCell id="K5oJ7VEt7dPmeK6pba1f-15" value="perturbed_data" style="rounded=0;whiteSpace=wrap;html=1;" vertex="1" parent="1"> + <mxGeometry x="40" y="1120" width="120" height="60" as="geometry" /> + </mxCell> + <mxCell id="K5oJ7VEt7dPmeK6pba1f-45" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=1;exitY=0.5;exitDx=0;exitDy=0;" edge="1" parent="1" source="K5oJ7VEt7dPmeK6pba1f-16" target="K5oJ7VEt7dPmeK6pba1f-32"> + <mxGeometry relative="1" as="geometry" /> + </mxCell> + <mxCell id="K5oJ7VEt7dPmeK6pba1f-77" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=1;exitY=0.5;exitDx=0;exitDy=0;" edge="1" parent="1" source="K5oJ7VEt7dPmeK6pba1f-16" target="K5oJ7VEt7dPmeK6pba1f-60"> + <mxGeometry relative="1" as="geometry" /> + </mxCell> + <mxCell id="K5oJ7VEt7dPmeK6pba1f-16" value="bayes_loocv" style="rounded=0;whiteSpace=wrap;html=1;" vertex="1" parent="1"> + <mxGeometry x="40" y="1200" width="120" height="60" as="geometry" /> + </mxCell> + <mxCell id="K5oJ7VEt7dPmeK6pba1f-64" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=1;exitY=0.5;exitDx=0;exitDy=0;" edge="1" parent="1" source="K5oJ7VEt7dPmeK6pba1f-17" target="K5oJ7VEt7dPmeK6pba1f-60"> + <mxGeometry relative="1" as="geometry" /> + </mxCell> + <mxCell id="K5oJ7VEt7dPmeK6pba1f-17" value="n_bootstrap_itrs" style="rounded=0;whiteSpace=wrap;html=1;" vertex="1" parent="1"> + <mxGeometry x="40" y="1280" width="120" height="60" as="geometry" /> + </mxCell> + <mxCell id="K5oJ7VEt7dPmeK6pba1f-18" value="bootstrap_noise" style="rounded=0;whiteSpace=wrap;html=1;" vertex="1" parent="1"> + <mxGeometry x="40" y="1360" width="120" height="60" as="geometry" /> + </mxCell> + <mxCell id="K5oJ7VEt7dPmeK6pba1f-46" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=1;exitY=0.5;exitDx=0;exitDy=0;" edge="1" parent="1" source="K5oJ7VEt7dPmeK6pba1f-19" target="K5oJ7VEt7dPmeK6pba1f-32"> + <mxGeometry relative="1" as="geometry" /> + </mxCell> + <mxCell id="K5oJ7VEt7dPmeK6pba1f-78" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=1;exitY=0.5;exitDx=0;exitDy=0;" edge="1" parent="1" source="K5oJ7VEt7dPmeK6pba1f-19" target="K5oJ7VEt7dPmeK6pba1f-60"> + <mxGeometry relative="1" as="geometry" /> + </mxCell> + <mxCell id="K5oJ7VEt7dPmeK6pba1f-19" value="just_analysis" style="rounded=0;whiteSpace=wrap;html=1;" vertex="1" parent="1"> + <mxGeometry x="40" y="1440" width="120" height="60" as="geometry" /> + </mxCell> + <mxCell id="K5oJ7VEt7dPmeK6pba1f-20" value="valid_metrics" style="rounded=0;whiteSpace=wrap;html=1;" vertex="1" parent="1"> + <mxGeometry x="40" y="1520" width="120" height="60" as="geometry" /> + </mxCell> + <mxCell id="K5oJ7VEt7dPmeK6pba1f-52" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=1;exitY=0.5;exitDx=0;exitDy=0;" edge="1" parent="1" source="K5oJ7VEt7dPmeK6pba1f-21" target="K5oJ7VEt7dPmeK6pba1f-32"> + <mxGeometry relative="1" as="geometry" /> + </mxCell> + <mxCell id="K5oJ7VEt7dPmeK6pba1f-21" value="plot_post_pred" style="rounded=0;whiteSpace=wrap;html=1;" vertex="1" parent="1"> + <mxGeometry x="40" y="1600" width="120" height="60" as="geometry" /> + </mxCell> + <mxCell id="K5oJ7VEt7dPmeK6pba1f-51" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=1;exitY=0.5;exitDx=0;exitDy=0;" edge="1" parent="1" source="K5oJ7VEt7dPmeK6pba1f-22" target="K5oJ7VEt7dPmeK6pba1f-32"> + <mxGeometry relative="1" as="geometry" /> + </mxCell> + <mxCell id="K5oJ7VEt7dPmeK6pba1f-22" value="plot_map_pred" style="rounded=0;whiteSpace=wrap;html=1;" vertex="1" parent="1"> + <mxGeometry x="40" y="1680" width="120" height="60" as="geometry" /> + </mxCell> + <mxCell id="K5oJ7VEt7dPmeK6pba1f-23" value="max_a_posteriori" style="rounded=0;whiteSpace=wrap;html=1;" vertex="1" parent="1"> + <mxGeometry x="40" y="1760" width="120" height="60" as="geometry" /> + </mxCell> + <mxCell id="K5oJ7VEt7dPmeK6pba1f-24" value="corner_title_fmt" style="rounded=0;whiteSpace=wrap;html=1;" vertex="1" parent="1"> + <mxGeometry x="40" y="1840" width="120" height="60" as="geometry" /> + </mxCell> + <mxCell id="K5oJ7VEt7dPmeK6pba1f-34" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=1;exitY=0.5;exitDx=0;exitDy=0;" edge="1" parent="1" source="K5oJ7VEt7dPmeK6pba1f-25" target="K5oJ7VEt7dPmeK6pba1f-32"> + <mxGeometry relative="1" as="geometry" /> + </mxCell> + <mxCell id="K5oJ7VEt7dPmeK6pba1f-25" value="out_dir" style="rounded=0;whiteSpace=wrap;html=1;" vertex="1" parent="1"> + <mxGeometry x="40" y="1920" width="120" height="60" as="geometry" /> + </mxCell> + <mxCell id="K5oJ7VEt7dPmeK6pba1f-50" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=1;exitY=0.5;exitDx=0;exitDy=0;" edge="1" parent="1" source="K5oJ7VEt7dPmeK6pba1f-26" target="K5oJ7VEt7dPmeK6pba1f-32"> + <mxGeometry relative="1" as="geometry" /> + </mxCell> + <mxCell id="K5oJ7VEt7dPmeK6pba1f-66" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=1;exitY=0.5;exitDx=0;exitDy=0;" edge="1" parent="1" source="K5oJ7VEt7dPmeK6pba1f-26" target="K5oJ7VEt7dPmeK6pba1f-60"> + <mxGeometry relative="1" as="geometry" /> + </mxCell> + <mxCell id="K5oJ7VEt7dPmeK6pba1f-26" value="error_model" style="rounded=0;whiteSpace=wrap;html=1;" vertex="1" parent="1"> + <mxGeometry x="40" y="2000" width="120" height="60" as="geometry" /> + </mxCell> + <mxCell id="K5oJ7VEt7dPmeK6pba1f-56" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=1;exitY=0.5;exitDx=0;exitDy=0;" edge="1" parent="1" source="K5oJ7VEt7dPmeK6pba1f-27" target="K5oJ7VEt7dPmeK6pba1f-53"> + <mxGeometry relative="1" as="geometry" /> + </mxCell> + <mxCell id="K5oJ7VEt7dPmeK6pba1f-72" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=1;exitY=0.5;exitDx=0;exitDy=0;" edge="1" parent="1" source="K5oJ7VEt7dPmeK6pba1f-27" target="K5oJ7VEt7dPmeK6pba1f-60"> + <mxGeometry relative="1" as="geometry" /> + </mxCell> + <mxCell id="K5oJ7VEt7dPmeK6pba1f-27" value="bias_inputs" style="rounded=0;whiteSpace=wrap;html=1;" vertex="1" parent="1"> + <mxGeometry x="40" y="2080" width="120" height="60" as="geometry" /> + </mxCell> + <mxCell id="K5oJ7VEt7dPmeK6pba1f-41" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=1;exitY=0.5;exitDx=0;exitDy=0;" edge="1" parent="1" source="K5oJ7VEt7dPmeK6pba1f-28" target="K5oJ7VEt7dPmeK6pba1f-32"> + <mxGeometry relative="1" as="geometry" /> + </mxCell> + <mxCell id="K5oJ7VEt7dPmeK6pba1f-28" value="measurement_error" style="rounded=0;whiteSpace=wrap;html=1;" vertex="1" parent="1"> + <mxGeometry x="40" y="2160" width="120" height="60" as="geometry" /> + </mxCell> + <mxCell id="K5oJ7VEt7dPmeK6pba1f-44" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=1;exitY=0.5;exitDx=0;exitDy=0;" edge="1" parent="1" source="K5oJ7VEt7dPmeK6pba1f-29" target="K5oJ7VEt7dPmeK6pba1f-32"> + <mxGeometry relative="1" as="geometry" /> + </mxCell> + <mxCell id="K5oJ7VEt7dPmeK6pba1f-81" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=1;exitY=0.5;exitDx=0;exitDy=0;" edge="1" parent="1" source="K5oJ7VEt7dPmeK6pba1f-29" target="K5oJ7VEt7dPmeK6pba1f-60"> + <mxGeometry relative="1" as="geometry" /> + </mxCell> + <mxCell id="K5oJ7VEt7dPmeK6pba1f-29" value="sigma2s" style="rounded=0;whiteSpace=wrap;html=1;" vertex="1" parent="1"> + <mxGeometry x="40" y="2240" width="120" height="60" as="geometry" /> + </mxCell> + <mxCell id="K5oJ7VEt7dPmeK6pba1f-30" value="log_likes" style="rounded=0;whiteSpace=wrap;html=1;" vertex="1" parent="1"> + <mxGeometry x="40" y="2320" width="120" height="60" as="geometry" /> + </mxCell> + <mxCell id="K5oJ7VEt7dPmeK6pba1f-82" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=1;exitY=0.5;exitDx=0;exitDy=0;" edge="1" parent="1" source="K5oJ7VEt7dPmeK6pba1f-31" target="K5oJ7VEt7dPmeK6pba1f-60"> + <mxGeometry relative="1" as="geometry" /> + </mxCell> + <mxCell id="K5oJ7VEt7dPmeK6pba1f-31" value="dtype" style="rounded=0;whiteSpace=wrap;html=1;" vertex="1" parent="1"> + <mxGeometry x="40" y="2400" width="120" height="60" as="geometry" /> + </mxCell> + <mxCell id="K5oJ7VEt7dPmeK6pba1f-32" value="create_inference" style="rounded=0;whiteSpace=wrap;html=1;" vertex="1" parent="1"> + <mxGeometry x="400" y="20" width="120" height="60" as="geometry" /> + </mxCell> + <mxCell id="K5oJ7VEt7dPmeK6pba1f-40" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=1;exitY=0.5;exitDx=0;exitDy=0;" edge="1" parent="1" source="K5oJ7VEt7dPmeK6pba1f-39" target="K5oJ7VEt7dPmeK6pba1f-32"> + <mxGeometry relative="1" as="geometry" /> + </mxCell> + <mxCell id="K5oJ7VEt7dPmeK6pba1f-39" value="n_tot_measurement" style="rounded=0;whiteSpace=wrap;html=1;" vertex="1" parent="1"> + <mxGeometry x="40" y="2480" width="120" height="60" as="geometry" /> + </mxCell> + <mxCell id="K5oJ7VEt7dPmeK6pba1f-43" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=1;exitY=0.5;exitDx=0;exitDy=0;" edge="1" parent="1" source="K5oJ7VEt7dPmeK6pba1f-42" target="K5oJ7VEt7dPmeK6pba1f-32"> + <mxGeometry relative="1" as="geometry" /> + </mxCell> + <mxCell id="K5oJ7VEt7dPmeK6pba1f-42" value="Discrepancy" style="rounded=0;whiteSpace=wrap;html=1;" vertex="1" parent="1"> + <mxGeometry x="40" y="2560" width="120" height="60" as="geometry" /> + </mxCell> + <mxCell id="K5oJ7VEt7dPmeK6pba1f-49" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=1;exitY=0.5;exitDx=0;exitDy=0;" edge="1" parent="1" source="K5oJ7VEt7dPmeK6pba1f-48" target="K5oJ7VEt7dPmeK6pba1f-32"> + <mxGeometry relative="1" as="geometry" /> + </mxCell> + <mxCell id="K5oJ7VEt7dPmeK6pba1f-59" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=1;exitY=0.5;exitDx=0;exitDy=0;" edge="1" parent="1" source="K5oJ7VEt7dPmeK6pba1f-48" target="K5oJ7VEt7dPmeK6pba1f-53"> + <mxGeometry relative="1" as="geometry" /> + </mxCell> + <mxCell id="K5oJ7VEt7dPmeK6pba1f-48" value="posterior_df" style="rounded=0;whiteSpace=wrap;html=1;" vertex="1" parent="1"> + <mxGeometry x="40" y="2640" width="120" height="60" as="geometry" /> + </mxCell> + <mxCell id="K5oJ7VEt7dPmeK6pba1f-53" value="create_error_model" style="rounded=0;whiteSpace=wrap;html=1;" vertex="1" parent="1"> + <mxGeometry x="560" y="20" width="120" height="60" as="geometry" /> + </mxCell> + <mxCell id="K5oJ7VEt7dPmeK6pba1f-60" value="perform_bootstrap" style="rounded=0;whiteSpace=wrap;html=1;" vertex="1" parent="1"> + <mxGeometry x="720" y="20" width="120" height="60" as="geometry" /> + </mxCell> + <mxCell id="K5oJ7VEt7dPmeK6pba1f-75" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=1;exitY=0.5;exitDx=0;exitDy=0;" edge="1" parent="1" source="K5oJ7VEt7dPmeK6pba1f-69" target="K5oJ7VEt7dPmeK6pba1f-60"> + <mxGeometry relative="1" as="geometry" /> + </mxCell> + <mxCell id="K5oJ7VEt7dPmeK6pba1f-69" value="__mean_pce_prior_pred" style="rounded=0;whiteSpace=wrap;html=1;" vertex="1" parent="1"> + <mxGeometry x="40" y="2720" width="120" height="60" as="geometry" /> + </mxCell> + <mxCell id="K5oJ7VEt7dPmeK6pba1f-76" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=1;exitY=0.5;exitDx=0;exitDy=0;" edge="1" parent="1" source="K5oJ7VEt7dPmeK6pba1f-70" target="K5oJ7VEt7dPmeK6pba1f-60"> + <mxGeometry relative="1" as="geometry" /> + </mxCell> + <mxCell id="K5oJ7VEt7dPmeK6pba1f-70" value="_std_pce_prior_pred" style="rounded=0;whiteSpace=wrap;html=1;" vertex="1" parent="1"> + <mxGeometry x="40" y="2800" width="120" height="60" as="geometry" /> + </mxCell> + <mxCell id="K5oJ7VEt7dPmeK6pba1f-74" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=1;exitY=0.5;exitDx=0;exitDy=0;" edge="1" parent="1" source="K5oJ7VEt7dPmeK6pba1f-73" target="K5oJ7VEt7dPmeK6pba1f-60"> + <mxGeometry relative="1" as="geometry" /> + </mxCell> + <mxCell id="K5oJ7VEt7dPmeK6pba1f-73" value="__model_prior_pred" style="rounded=0;whiteSpace=wrap;html=1;" vertex="1" parent="1"> + <mxGeometry x="40" y="2880" width="120" height="60" as="geometry" /> + </mxCell> + </root> + </mxGraphModel> + </diagram> +</mxfile> diff --git a/docs/diagrams/.$Structure_BayesInf.drawio.dtmp b/docs/diagrams/.$Structure_BayesInf.drawio.dtmp new file mode 100644 index 0000000000000000000000000000000000000000..14663ecb0086f14c8b80083b9ecf9a1df87e7ad5 --- /dev/null +++ b/docs/diagrams/.$Structure_BayesInf.drawio.dtmp @@ -0,0 +1,964 @@ +<mxfile host="Electron" modified="2024-04-19T16:08:46.718Z" agent="Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) draw.io/22.1.11 Chrome/114.0.5735.289 Electron/25.9.8 Safari/537.36" etag="QkifmTMxwBp7UqUSeBiS" version="22.1.11" type="device" pages="4"> + <diagram name="Class and function structure" id="efOe0Jku58RX-i1bv-3b"> + <mxGraphModel dx="3735" dy="1372" grid="1" gridSize="10" guides="1" tooltips="1" connect="1" arrows="1" fold="1" page="1" pageScale="1" pageWidth="850" pageHeight="1100" math="0" shadow="0"> + <root> + <mxCell id="0" /> + <mxCell id="1" parent="0" /> + <mxCell id="xary-zVek9Bg-A1b1ZmA-22" value="<p style="margin:0px;margin-top:4px;text-align:center;"><b>MCMC</b></p><hr size="1"><div style="height:2px;"></div>" style="verticalAlign=top;align=left;overflow=fill;fontSize=12;fontFamily=Helvetica;html=1;whiteSpace=wrap;" vertex="1" parent="1"> + <mxGeometry x="1270" y="360" width="770" height="380" as="geometry" /> + </mxCell> + <mxCell id="xary-zVek9Bg-A1b1ZmA-1" value="_kernel_rbf" style="rounded=0;whiteSpace=wrap;html=1;" vertex="1" parent="1"> + <mxGeometry x="1020" y="200" width="120" height="60" as="geometry" /> + </mxCell> + <mxCell id="xary-zVek9Bg-A1b1ZmA-2" value="_logpdf" style="rounded=0;whiteSpace=wrap;html=1;" vertex="1" parent="1"> + <mxGeometry x="820" y="140" width="120" height="60" as="geometry" /> + </mxCell> + <mxCell id="xary-zVek9Bg-A1b1ZmA-10" value="<p style="margin:0px;margin-top:4px;text-align:center;"><b>BayesInf</b></p><hr size="1"><div style="height:2px;"></div>" style="verticalAlign=top;align=left;overflow=fill;fontSize=12;fontFamily=Helvetica;html=1;whiteSpace=wrap;" vertex="1" parent="1"> + <mxGeometry x="-120" y="290" width="1310" height="680" as="geometry" /> + </mxCell> + <mxCell id="xary-zVek9Bg-A1b1ZmA-24" value="if self.bootstrap <br>or self.bayes_loocv <br>or self.just_analysis" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;entryX=1;entryY=0.5;entryDx=0;entryDy=0;labelBackgroundColor=#ffae00;exitX=0.5;exitY=0;exitDx=0;exitDy=0;" edge="1" parent="1" source="xary-zVek9Bg-A1b1ZmA-9" target="xary-zVek9Bg-A1b1ZmA-13"> + <mxGeometry x="0.2902" relative="1" as="geometry"> + <mxPoint as="offset" /> + </mxGeometry> + </mxCell> + <mxCell id="xary-zVek9Bg-A1b1ZmA-31" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=0.5;exitY=1;exitDx=0;exitDy=0;" edge="1" parent="1" source="xary-zVek9Bg-A1b1ZmA-9" target="xary-zVek9Bg-A1b1ZmA-18"> + <mxGeometry relative="1" as="geometry" /> + </mxCell> + <mxCell id="xary-zVek9Bg-A1b1ZmA-42" value="if self.name != 'valid'<br>and self.inference_method != 'rejection'" style="edgeLabel;html=1;align=center;verticalAlign=middle;resizable=0;points=[];labelBackgroundColor=default;" vertex="1" connectable="0" parent="xary-zVek9Bg-A1b1ZmA-31"> + <mxGeometry x="0.5646" relative="1" as="geometry"> + <mxPoint as="offset" /> + </mxGeometry> + </mxCell> + <mxCell id="xary-zVek9Bg-A1b1ZmA-32" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=1;exitY=0.5;exitDx=0;exitDy=0;" edge="1" parent="1" source="xary-zVek9Bg-A1b1ZmA-9" target="HiMKSJFquRK0mIlwyRFI-5"> + <mxGeometry relative="1" as="geometry" /> + </mxCell> + <mxCell id="xary-zVek9Bg-A1b1ZmA-43" value="if self.inference_method == 'mcmc'" style="edgeLabel;html=1;align=center;verticalAlign=middle;resizable=0;points=[];" vertex="1" connectable="0" parent="xary-zVek9Bg-A1b1ZmA-32"> + <mxGeometry x="-0.0958" y="-1" relative="1" as="geometry"> + <mxPoint as="offset" /> + </mxGeometry> + </mxCell> + <mxCell id="xary-zVek9Bg-A1b1ZmA-33" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=0.75;exitY=1;exitDx=0;exitDy=0;entryX=0;entryY=0.5;entryDx=0;entryDy=0;" edge="1" parent="1" source="xary-zVek9Bg-A1b1ZmA-9" target="xary-zVek9Bg-A1b1ZmA-19"> + <mxGeometry relative="1" as="geometry" /> + </mxCell> + <mxCell id="xary-zVek9Bg-A1b1ZmA-52" value="always" style="edgeLabel;html=1;align=center;verticalAlign=middle;resizable=0;points=[];labelBackgroundColor=#C2C2C2;" vertex="1" connectable="0" parent="xary-zVek9Bg-A1b1ZmA-33"> + <mxGeometry x="-0.112" y="1" relative="1" as="geometry"> + <mxPoint as="offset" /> + </mxGeometry> + </mxCell> + <mxCell id="xary-zVek9Bg-A1b1ZmA-34" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=0.5;exitY=1;exitDx=0;exitDy=0;" edge="1" parent="1" source="xary-zVek9Bg-A1b1ZmA-9" target="xary-zVek9Bg-A1b1ZmA-21"> + <mxGeometry relative="1" as="geometry" /> + </mxCell> + <mxCell id="xary-zVek9Bg-A1b1ZmA-47" value="if self.plot_post_pred" style="edgeLabel;html=1;align=center;verticalAlign=middle;resizable=0;points=[];" vertex="1" connectable="0" parent="xary-zVek9Bg-A1b1ZmA-34"> + <mxGeometry x="0.2399" y="-1" relative="1" as="geometry"> + <mxPoint y="1" as="offset" /> + </mxGeometry> + </mxCell> + <mxCell id="xary-zVek9Bg-A1b1ZmA-35" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=0.5;exitY=1;exitDx=0;exitDy=0;" edge="1" parent="1" source="xary-zVek9Bg-A1b1ZmA-9" target="xary-zVek9Bg-A1b1ZmA-20"> + <mxGeometry relative="1" as="geometry" /> + </mxCell> + <mxCell id="xary-zVek9Bg-A1b1ZmA-46" value="if self.plot_map_pred" style="edgeLabel;html=1;align=center;verticalAlign=middle;resizable=0;points=[];" vertex="1" connectable="0" parent="xary-zVek9Bg-A1b1ZmA-35"> + <mxGeometry x="0.4183" y="-1" relative="1" as="geometry"> + <mxPoint as="offset" /> + </mxGeometry> + </mxCell> + <mxCell id="xary-zVek9Bg-A1b1ZmA-54" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=0.5;exitY=1;exitDx=0;exitDy=0;" edge="1" parent="1" source="xary-zVek9Bg-A1b1ZmA-9" target="xary-zVek9Bg-A1b1ZmA-53"> + <mxGeometry relative="1" as="geometry" /> + </mxCell> + <mxCell id="xary-zVek9Bg-A1b1ZmA-55" value="if self.bootstrap" style="edgeLabel;html=1;align=center;verticalAlign=middle;resizable=0;points=[];labelBackgroundColor=#FF9A03;" vertex="1" connectable="0" parent="xary-zVek9Bg-A1b1ZmA-54"> + <mxGeometry x="0.1816" y="3" relative="1" as="geometry"> + <mxPoint x="1" as="offset" /> + </mxGeometry> + </mxCell> + <mxCell id="xary-zVek9Bg-A1b1ZmA-57" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=0.5;exitY=1;exitDx=0;exitDy=0;entryX=0;entryY=0.5;entryDx=0;entryDy=0;" edge="1" parent="1" source="xary-zVek9Bg-A1b1ZmA-9" target="xary-zVek9Bg-A1b1ZmA-56"> + <mxGeometry relative="1" as="geometry" /> + </mxCell> + <mxCell id="xary-zVek9Bg-A1b1ZmA-58" value="always" style="edgeLabel;html=1;align=center;verticalAlign=middle;resizable=0;points=[];labelBackgroundColor=#FF9A03;" vertex="1" connectable="0" parent="xary-zVek9Bg-A1b1ZmA-57"> + <mxGeometry x="0.7182" y="2" relative="1" as="geometry"> + <mxPoint as="offset" /> + </mxGeometry> + </mxCell> + <mxCell id="xary-zVek9Bg-A1b1ZmA-60" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=0.25;exitY=1;exitDx=0;exitDy=0;" edge="1" parent="1" source="xary-zVek9Bg-A1b1ZmA-9" target="xary-zVek9Bg-A1b1ZmA-59"> + <mxGeometry relative="1" as="geometry" /> + </mxCell> + <mxCell id="xary-zVek9Bg-A1b1ZmA-61" value="if self.error_model<br>and self.name == 'calib'" style="edgeLabel;html=1;align=center;verticalAlign=middle;resizable=0;points=[];" vertex="1" connectable="0" parent="xary-zVek9Bg-A1b1ZmA-60"> + <mxGeometry x="0.3024" y="2" relative="1" as="geometry"> + <mxPoint x="67" y="1" as="offset" /> + </mxGeometry> + </mxCell> + <mxCell id="HiMKSJFquRK0mIlwyRFI-54" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=0.5;exitY=1;exitDx=0;exitDy=0;" edge="1" parent="1" source="xary-zVek9Bg-A1b1ZmA-9" target="HiMKSJFquRK0mIlwyRFI-51"> + <mxGeometry relative="1" as="geometry" /> + </mxCell> + <mxCell id="HiMKSJFquRK0mIlwyRFI-55" value="always" style="edgeLabel;html=1;align=center;verticalAlign=middle;resizable=0;points=[];labelBackgroundColor=#FF9A03;" vertex="1" connectable="0" parent="HiMKSJFquRK0mIlwyRFI-54"> + <mxGeometry x="0.8253" y="3" relative="1" as="geometry"> + <mxPoint as="offset" /> + </mxGeometry> + </mxCell> + <mxCell id="xary-zVek9Bg-A1b1ZmA-9" value="create_inference" style="html=1;whiteSpace=wrap;strokeWidth=2;" vertex="1" parent="1"> + <mxGeometry x="405" y="539" width="110" height="50" as="geometry" /> + </mxCell> + <mxCell id="xary-zVek9Bg-A1b1ZmA-25" value="if len(self.perturbed_data) == 0" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;" edge="1" parent="1" source="xary-zVek9Bg-A1b1ZmA-13" target="xary-zVek9Bg-A1b1ZmA-14"> + <mxGeometry x="0.3402" relative="1" as="geometry"> + <mxPoint y="1" as="offset" /> + </mxGeometry> + </mxCell> + <mxCell id="xary-zVek9Bg-A1b1ZmA-27" value="if not self.emulator" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=0.5;exitY=1;exitDx=0;exitDy=0;" edge="1" parent="1" source="xary-zVek9Bg-A1b1ZmA-13" target="xary-zVek9Bg-A1b1ZmA-15"> + <mxGeometry relative="1" as="geometry" /> + </mxCell> + <mxCell id="xary-zVek9Bg-A1b1ZmA-29" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=0.5;exitY=1;exitDx=0;exitDy=0;entryX=0;entryY=0.5;entryDx=0;entryDy=0;" edge="1" parent="1" source="xary-zVek9Bg-A1b1ZmA-13" target="xary-zVek9Bg-A1b1ZmA-16"> + <mxGeometry relative="1" as="geometry" /> + </mxCell> + <mxCell id="xary-zVek9Bg-A1b1ZmA-44" value="always" style="edgeLabel;html=1;align=center;verticalAlign=middle;resizable=0;points=[];labelBackgroundColor=#cdcbcb;" vertex="1" connectable="0" parent="xary-zVek9Bg-A1b1ZmA-29"> + <mxGeometry x="0.4722" y="1" relative="1" as="geometry"> + <mxPoint as="offset" /> + </mxGeometry> + </mxCell> + <mxCell id="xary-zVek9Bg-A1b1ZmA-30" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=0.5;exitY=1;exitDx=0;exitDy=0;entryX=0;entryY=0.5;entryDx=0;entryDy=0;" edge="1" parent="1" source="xary-zVek9Bg-A1b1ZmA-13" target="xary-zVek9Bg-A1b1ZmA-17"> + <mxGeometry relative="1" as="geometry" /> + </mxCell> + <mxCell id="xary-zVek9Bg-A1b1ZmA-41" value="if self.emulator" style="edgeLabel;html=1;align=center;verticalAlign=middle;resizable=0;points=[];" vertex="1" connectable="0" parent="xary-zVek9Bg-A1b1ZmA-30"> + <mxGeometry x="0.6143" y="-3" relative="1" as="geometry"> + <mxPoint as="offset" /> + </mxGeometry> + </mxCell> + <mxCell id="xary-zVek9Bg-A1b1ZmA-62" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;" edge="1" parent="1" source="xary-zVek9Bg-A1b1ZmA-13" target="xary-zVek9Bg-A1b1ZmA-59"> + <mxGeometry relative="1" as="geometry"> + <mxPoint x="340" y="680" as="targetPoint" /> + </mxGeometry> + </mxCell> + <mxCell id="xary-zVek9Bg-A1b1ZmA-63" value="if self.error_model<br>and self.name == 'valid'" style="edgeLabel;html=1;align=center;verticalAlign=middle;resizable=0;points=[];labelBackgroundColor=default;" vertex="1" connectable="0" parent="xary-zVek9Bg-A1b1ZmA-62"> + <mxGeometry x="-0.3906" relative="1" as="geometry"> + <mxPoint y="121" as="offset" /> + </mxGeometry> + </mxCell> + <mxCell id="xary-zVek9Bg-A1b1ZmA-13" value="perform_bootstrap" style="html=1;whiteSpace=wrap;" vertex="1" parent="1"> + <mxGeometry x="50" y="335" width="110" height="50" as="geometry" /> + </mxCell> + <mxCell id="xary-zVek9Bg-A1b1ZmA-14" value="_perturb_data" style="html=1;whiteSpace=wrap;" vertex="1" parent="1"> + <mxGeometry x="-75" y="460" width="110" height="50" as="geometry" /> + </mxCell> + <mxCell id="xary-zVek9Bg-A1b1ZmA-15" value="_eval_model" style="html=1;whiteSpace=wrap;" vertex="1" parent="1"> + <mxGeometry x="1050" y="660" width="110" height="50" as="geometry" /> + </mxCell> + <mxCell id="xary-zVek9Bg-A1b1ZmA-38" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=1;exitY=0.5;exitDx=0;exitDy=0;entryX=0.5;entryY=1;entryDx=0;entryDy=0;" edge="1" parent="1" source="xary-zVek9Bg-A1b1ZmA-16" target="xary-zVek9Bg-A1b1ZmA-1"> + <mxGeometry relative="1" as="geometry" /> + </mxCell> + <mxCell id="xary-zVek9Bg-A1b1ZmA-49" value="if hasattr bias_inputs&nbsp;<br>and not hasattr error_model" style="edgeLabel;html=1;align=center;verticalAlign=middle;resizable=0;points=[];labelBackgroundColor=#ffae00;" vertex="1" connectable="0" parent="xary-zVek9Bg-A1b1ZmA-38"> + <mxGeometry x="0.3126" y="-3" relative="1" as="geometry"> + <mxPoint x="-103" y="31" as="offset" /> + </mxGeometry> + </mxCell> + <mxCell id="xary-zVek9Bg-A1b1ZmA-39" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=1;exitY=0.5;exitDx=0;exitDy=0;" edge="1" parent="1" source="xary-zVek9Bg-A1b1ZmA-16" target="xary-zVek9Bg-A1b1ZmA-2"> + <mxGeometry relative="1" as="geometry" /> + </mxCell> + <mxCell id="xary-zVek9Bg-A1b1ZmA-16" value="normpdf" style="html=1;whiteSpace=wrap;" vertex="1" parent="1"> + <mxGeometry x="650" y="455" width="110" height="50" as="geometry" /> + </mxCell> + <mxCell id="xary-zVek9Bg-A1b1ZmA-40" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=1;exitY=0.5;exitDx=0;exitDy=0;" edge="1" parent="1" source="xary-zVek9Bg-A1b1ZmA-17" target="xary-zVek9Bg-A1b1ZmA-2"> + <mxGeometry relative="1" as="geometry" /> + </mxCell> + <mxCell id="xary-zVek9Bg-A1b1ZmA-50" value="always" style="edgeLabel;html=1;align=center;verticalAlign=middle;resizable=0;points=[];labelBackgroundColor=#cdcbcb;" vertex="1" connectable="0" parent="xary-zVek9Bg-A1b1ZmA-40"> + <mxGeometry x="-0.6073" y="-5" relative="1" as="geometry"> + <mxPoint as="offset" /> + </mxGeometry> + </mxCell> + <mxCell id="xary-zVek9Bg-A1b1ZmA-17" value="_corr_factor_BME" style="html=1;whiteSpace=wrap;" vertex="1" parent="1"> + <mxGeometry x="650" y="385" width="110" height="50" as="geometry" /> + </mxCell> + <mxCell id="xary-zVek9Bg-A1b1ZmA-18" value="_rejection_sampling" style="html=1;whiteSpace=wrap;" vertex="1" parent="1"> + <mxGeometry x="280" y="890" width="120" height="50" as="geometry" /> + </mxCell> + <mxCell id="xary-zVek9Bg-A1b1ZmA-26" value="if not self.emulator&nbsp;<br>and not self.inference_method == 'rejection'&nbsp;<br>and self.name == 'calib" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=0.5;exitY=1;exitDx=0;exitDy=0;entryX=0;entryY=0.5;entryDx=0;entryDy=0;" edge="1" parent="1" source="xary-zVek9Bg-A1b1ZmA-19" target="xary-zVek9Bg-A1b1ZmA-15"> + <mxGeometry x="-0.0559" y="15" relative="1" as="geometry"> + <mxPoint as="offset" /> + </mxGeometry> + </mxCell> + <mxCell id="xary-zVek9Bg-A1b1ZmA-37" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=1;exitY=0.5;exitDx=0;exitDy=0;" edge="1" parent="1" source="xary-zVek9Bg-A1b1ZmA-19" target="xary-zVek9Bg-A1b1ZmA-1"> + <mxGeometry relative="1" as="geometry" /> + </mxCell> + <mxCell id="xary-zVek9Bg-A1b1ZmA-48" value="if sigma2_prior is not None<br>and if hasattr bias_inputs<br>and if not hasattr error_model" style="edgeLabel;html=1;align=center;verticalAlign=middle;resizable=0;points=[];labelBackgroundColor=#ffae00;" vertex="1" connectable="0" parent="xary-zVek9Bg-A1b1ZmA-37"> + <mxGeometry x="-0.5544" y="-1" relative="1" as="geometry"> + <mxPoint x="1" y="-5" as="offset" /> + </mxGeometry> + </mxCell> + <mxCell id="xary-zVek9Bg-A1b1ZmA-19" value="_posterior_predictive" style="html=1;whiteSpace=wrap;" vertex="1" parent="1"> + <mxGeometry x="690" y="589" width="130" height="50" as="geometry" /> + </mxCell> + <mxCell id="xary-zVek9Bg-A1b1ZmA-28" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=1;exitY=0.5;exitDx=0;exitDy=0;" edge="1" parent="1" source="xary-zVek9Bg-A1b1ZmA-20" target="xary-zVek9Bg-A1b1ZmA-15"> + <mxGeometry relative="1" as="geometry" /> + </mxCell> + <mxCell id="xary-zVek9Bg-A1b1ZmA-45" value="always" style="edgeLabel;html=1;align=center;verticalAlign=middle;resizable=0;points=[];labelBackgroundColor=#cdcbcb;" vertex="1" connectable="0" parent="xary-zVek9Bg-A1b1ZmA-28"> + <mxGeometry x="0.0517" relative="1" as="geometry"> + <mxPoint as="offset" /> + </mxGeometry> + </mxCell> + <mxCell id="xary-zVek9Bg-A1b1ZmA-20" value="_plot_max_a_posteriori" style="html=1;whiteSpace=wrap;" vertex="1" parent="1"> + <mxGeometry x="495" y="790" width="140" height="50" as="geometry" /> + </mxCell> + <mxCell id="xary-zVek9Bg-A1b1ZmA-21" value="plot_post_predictive" style="html=1;whiteSpace=wrap;" vertex="1" parent="1"> + <mxGeometry x="630" y="720" width="120" height="50" as="geometry" /> + </mxCell> + <mxCell id="xary-zVek9Bg-A1b1ZmA-36" value="Note: Arrows indicate function calls, beginning calls the end" style="text;html=1;strokeColor=none;fillColor=none;align=center;verticalAlign=middle;whiteSpace=wrap;rounded=0;" vertex="1" parent="1"> + <mxGeometry x="10" y="10" width="190" height="30" as="geometry" /> + </mxCell> + <mxCell id="xary-zVek9Bg-A1b1ZmA-51" value="Color meanings:<br><span style="white-space: pre;">	</span>red: wrong, change<br><span style="white-space: pre;">	</span>orange: seems off, look at again<br><span style="white-space: pre;">	</span>light beige: has been removed" style="text;html=1;strokeColor=none;fillColor=none;align=left;verticalAlign=middle;whiteSpace=wrap;rounded=0;" vertex="1" parent="1"> + <mxGeometry x="20" y="70" width="220" height="30" as="geometry" /> + </mxCell> + <mxCell id="xary-zVek9Bg-A1b1ZmA-53" value="plot_log_BME" style="rounded=0;whiteSpace=wrap;html=1;" vertex="1" parent="1"> + <mxGeometry x="150" y="820" width="120" height="60" as="geometry" /> + </mxCell> + <mxCell id="xary-zVek9Bg-A1b1ZmA-56" value="plot_post_params" style="rounded=0;whiteSpace=wrap;html=1;" vertex="1" parent="1"> + <mxGeometry x="660" y="840" width="120" height="60" as="geometry" /> + </mxCell> + <mxCell id="xary-zVek9Bg-A1b1ZmA-59" value="create_error_model" style="rounded=0;whiteSpace=wrap;html=1;" vertex="1" parent="1"> + <mxGeometry x="45" y="740" width="120" height="60" as="geometry" /> + </mxCell> + <mxCell id="HiMKSJFquRK0mIlwyRFI-1" value="_check_ranges" style="rounded=0;whiteSpace=wrap;html=1;" vertex="1" parent="1"> + <mxGeometry x="1595" y="280" width="120" height="60" as="geometry" /> + </mxCell> + <mxCell id="HiMKSJFquRK0mIlwyRFI-2" value="gelman_rubin" style="rounded=0;whiteSpace=wrap;html=1;" vertex="1" parent="1"> + <mxGeometry x="1350" y="250" width="120" height="60" as="geometry" /> + </mxCell> + <mxCell id="HiMKSJFquRK0mIlwyRFI-3" value="_iterative_scheme" style="rounded=0;whiteSpace=wrap;html=1;fillColor=#f9f7ed;strokeColor=#CCC1AA;fontColor=#CCC1AA;" vertex="1" parent="1"> + <mxGeometry x="2055" y="620" width="120" height="60" as="geometry" /> + </mxCell> + <mxCell id="HiMKSJFquRK0mIlwyRFI-21" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;fillColor=#f9f7ed;strokeColor=#CCC1AA;fontColor=#CCC1AA;" edge="1" parent="1" source="HiMKSJFquRK0mIlwyRFI-4" target="HiMKSJFquRK0mIlwyRFI-2"> + <mxGeometry relative="1" as="geometry" /> + </mxCell> + <mxCell id="HiMKSJFquRK0mIlwyRFI-24" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=1;exitY=0.5;exitDx=0;exitDy=0;fillColor=#f9f7ed;strokeColor=#CCC1AA;fontColor=#CCC1AA;" edge="1" parent="1" source="HiMKSJFquRK0mIlwyRFI-4" target="HiMKSJFquRK0mIlwyRFI-11"> + <mxGeometry relative="1" as="geometry" /> + </mxCell> + <mxCell id="HiMKSJFquRK0mIlwyRFI-4" value="_my_ESS" style="rounded=0;whiteSpace=wrap;html=1;fillColor=#f9f7ed;strokeColor=#CCC1AA;fontColor=#CCC1AA;" vertex="1" parent="1"> + <mxGeometry x="1350" y="100" width="120" height="60" as="geometry" /> + </mxCell> + <mxCell id="HiMKSJFquRK0mIlwyRFI-14" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;entryX=0;entryY=0.5;entryDx=0;entryDy=0;exitX=0.5;exitY=1;exitDx=0;exitDy=0;" edge="1" parent="1" source="HiMKSJFquRK0mIlwyRFI-5" target="HiMKSJFquRK0mIlwyRFI-8"> + <mxGeometry relative="1" as="geometry" /> + </mxCell> + <mxCell id="HiMKSJFquRK0mIlwyRFI-19" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=1;exitY=0.5;exitDx=0;exitDy=0;" edge="1" parent="1" source="HiMKSJFquRK0mIlwyRFI-5" target="HiMKSJFquRK0mIlwyRFI-10"> + <mxGeometry relative="1" as="geometry" /> + </mxCell> + <mxCell id="HiMKSJFquRK0mIlwyRFI-22" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=0.5;exitY=0;exitDx=0;exitDy=0;" edge="1" parent="1" source="HiMKSJFquRK0mIlwyRFI-5" target="HiMKSJFquRK0mIlwyRFI-2"> + <mxGeometry relative="1" as="geometry" /> + </mxCell> + <mxCell id="HiMKSJFquRK0mIlwyRFI-53" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=0.25;exitY=1;exitDx=0;exitDy=0;entryX=1;entryY=0.5;entryDx=0;entryDy=0;" edge="1" parent="1" source="HiMKSJFquRK0mIlwyRFI-5" target="HiMKSJFquRK0mIlwyRFI-52"> + <mxGeometry relative="1" as="geometry" /> + </mxCell> + <mxCell id="HiMKSJFquRK0mIlwyRFI-56" value="if opts_sigma != 'B'" style="edgeLabel;html=1;align=center;verticalAlign=middle;resizable=0;points=[];labelBackgroundColor=#FF9A03;" vertex="1" connectable="0" parent="HiMKSJFquRK0mIlwyRFI-53"> + <mxGeometry x="0.7377" y="1" relative="1" as="geometry"> + <mxPoint as="offset" /> + </mxGeometry> + </mxCell> + <mxCell id="HiMKSJFquRK0mIlwyRFI-5" value="run_sampler" style="rounded=0;whiteSpace=wrap;html=1;strokeWidth=2;" vertex="1" parent="1"> + <mxGeometry x="1350" y="534" width="120" height="60" as="geometry" /> + </mxCell> + <mxCell id="HiMKSJFquRK0mIlwyRFI-20" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=0.5;exitY=0;exitDx=0;exitDy=0;" edge="1" parent="1" source="HiMKSJFquRK0mIlwyRFI-6" target="HiMKSJFquRK0mIlwyRFI-1"> + <mxGeometry relative="1" as="geometry" /> + </mxCell> + <mxCell id="HiMKSJFquRK0mIlwyRFI-6" value="log_prior" style="rounded=0;whiteSpace=wrap;html=1;" vertex="1" parent="1"> + <mxGeometry x="1595" y="510" width="120" height="60" as="geometry" /> + </mxCell> + <mxCell id="HiMKSJFquRK0mIlwyRFI-15" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=0.5;exitY=0;exitDx=0;exitDy=0;" edge="1" parent="1" source="HiMKSJFquRK0mIlwyRFI-7" target="HiMKSJFquRK0mIlwyRFI-9"> + <mxGeometry relative="1" as="geometry" /> + </mxCell> + <mxCell id="HiMKSJFquRK0mIlwyRFI-16" value="always" style="edgeLabel;html=1;align=center;verticalAlign=middle;resizable=0;points=[];" vertex="1" connectable="0" parent="HiMKSJFquRK0mIlwyRFI-15"> + <mxGeometry x="0.0246" y="2" relative="1" as="geometry"> + <mxPoint as="offset" /> + </mxGeometry> + </mxCell> + <mxCell id="HiMKSJFquRK0mIlwyRFI-7" value="log_likelihood" style="rounded=0;whiteSpace=wrap;html=1;" vertex="1" parent="1"> + <mxGeometry x="1760" y="539" width="120" height="60" as="geometry" /> + </mxCell> + <mxCell id="HiMKSJFquRK0mIlwyRFI-12" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=1;exitY=0.5;exitDx=0;exitDy=0;" edge="1" parent="1" source="HiMKSJFquRK0mIlwyRFI-8" target="HiMKSJFquRK0mIlwyRFI-6"> + <mxGeometry relative="1" as="geometry" /> + </mxCell> + <mxCell id="HiMKSJFquRK0mIlwyRFI-17" value="always" style="edgeLabel;html=1;align=center;verticalAlign=middle;resizable=0;points=[];" vertex="1" connectable="0" parent="HiMKSJFquRK0mIlwyRFI-12"> + <mxGeometry x="0.4587" y="4" relative="1" as="geometry"> + <mxPoint as="offset" /> + </mxGeometry> + </mxCell> + <mxCell id="HiMKSJFquRK0mIlwyRFI-13" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=1;exitY=0.5;exitDx=0;exitDy=0;" edge="1" parent="1" source="HiMKSJFquRK0mIlwyRFI-8" target="HiMKSJFquRK0mIlwyRFI-7"> + <mxGeometry relative="1" as="geometry" /> + </mxCell> + <mxCell id="HiMKSJFquRK0mIlwyRFI-18" value="always" style="edgeLabel;html=1;align=center;verticalAlign=middle;resizable=0;points=[];" vertex="1" connectable="0" parent="HiMKSJFquRK0mIlwyRFI-13"> + <mxGeometry x="0.6826" y="4" relative="1" as="geometry"> + <mxPoint as="offset" /> + </mxGeometry> + </mxCell> + <mxCell id="HiMKSJFquRK0mIlwyRFI-8" value="log_posterior" style="rounded=0;whiteSpace=wrap;html=1;" vertex="1" parent="1"> + <mxGeometry x="1480" y="610" width="120" height="60" as="geometry" /> + </mxCell> + <mxCell id="HiMKSJFquRK0mIlwyRFI-9" value="eval_model" style="rounded=0;whiteSpace=wrap;html=1;" vertex="1" parent="1"> + <mxGeometry x="1760" y="400" width="120" height="60" as="geometry" /> + </mxCell> + <mxCell id="HiMKSJFquRK0mIlwyRFI-10" value="train_error_model" style="rounded=0;whiteSpace=wrap;html=1;" vertex="1" parent="1"> + <mxGeometry x="1450" y="420" width="120" height="60" as="geometry" /> + </mxCell> + <mxCell id="HiMKSJFquRK0mIlwyRFI-23" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;fillColor=#f9f7ed;strokeColor=#CCC1AA;fontColor=#CCC1AA;" edge="1" parent="1" source="HiMKSJFquRK0mIlwyRFI-11" target="HiMKSJFquRK0mIlwyRFI-3"> + <mxGeometry relative="1" as="geometry" /> + </mxCell> + <mxCell id="HiMKSJFquRK0mIlwyRFI-11" value="marginal_llk_emcee" style="rounded=0;whiteSpace=wrap;html=1;fillColor=#f9f7ed;strokeColor=#CCC1AA;fontColor=#CCC1AA;" vertex="1" parent="1"> + <mxGeometry x="1870" y="620" width="120" height="60" as="geometry" /> + </mxCell> + <mxCell id="HiMKSJFquRK0mIlwyRFI-25" value="Never used!" style="text;html=1;strokeColor=none;fillColor=none;align=center;verticalAlign=middle;whiteSpace=wrap;rounded=0;fontColor=#CCC1AA;" vertex="1" parent="1"> + <mxGeometry x="1880" y="680" width="100" height="30" as="geometry" /> + </mxCell> + <mxCell id="HiMKSJFquRK0mIlwyRFI-26" value="<p style="margin:0px;margin-top:4px;text-align:center;"><b>BayesModelComp</b></p><hr size="1"><div style="height:2px;"></div>" style="verticalAlign=top;align=left;overflow=fill;fontSize=12;fontFamily=Helvetica;html=1;whiteSpace=wrap;" vertex="1" parent="1"> + <mxGeometry x="-1096" y="380" width="840" height="420" as="geometry" /> + </mxCell> + <mxCell id="HC1H8j6nMwEtLoyIrXXk-9" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=0.5;exitY=1;exitDx=0;exitDy=0;" edge="1" parent="1" source="HiMKSJFquRK0mIlwyRFI-27" target="HC1H8j6nMwEtLoyIrXXk-3"> + <mxGeometry relative="1" as="geometry" /> + </mxCell> + <mxCell id="HC1H8j6nMwEtLoyIrXXk-13" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=1;exitY=0.5;exitDx=0;exitDy=0;entryX=0;entryY=0.75;entryDx=0;entryDy=0;" edge="1" parent="1" source="HiMKSJFquRK0mIlwyRFI-27" target="HC1H8j6nMwEtLoyIrXXk-1"> + <mxGeometry relative="1" as="geometry" /> + </mxCell> + <mxCell id="HC1H8j6nMwEtLoyIrXXk-14" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=0.5;exitY=0;exitDx=0;exitDy=0;" edge="1" parent="1" source="HiMKSJFquRK0mIlwyRFI-27" target="HiMKSJFquRK0mIlwyRFI-31"> + <mxGeometry relative="1" as="geometry" /> + </mxCell> + <mxCell id="HiMKSJFquRK0mIlwyRFI-27" value="model_comparison_all" style="html=1;whiteSpace=wrap;strokeWidth=2;" vertex="1" parent="1"> + <mxGeometry x="-896" y="566" width="160" height="50" as="geometry" /> + </mxCell> + <mxCell id="HiMKSJFquRK0mIlwyRFI-42" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;entryX=0;entryY=0.5;entryDx=0;entryDy=0;" edge="1" parent="1" source="HC1H8j6nMwEtLoyIrXXk-1" target="xary-zVek9Bg-A1b1ZmA-9"> + <mxGeometry relative="1" as="geometry"> + <mxPoint x="-630" y="564" as="sourcePoint" /> + </mxGeometry> + </mxCell> + <mxCell id="HiMKSJFquRK0mIlwyRFI-47" value="always" style="edgeLabel;html=1;align=center;verticalAlign=middle;resizable=0;points=[];" vertex="1" connectable="0" parent="HiMKSJFquRK0mIlwyRFI-42"> + <mxGeometry x="-0.4883" relative="1" as="geometry"> + <mxPoint as="offset" /> + </mxGeometry> + </mxCell> + <mxCell id="HiMKSJFquRK0mIlwyRFI-37" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;" edge="1" parent="1" source="HiMKSJFquRK0mIlwyRFI-29" target="HiMKSJFquRK0mIlwyRFI-30"> + <mxGeometry relative="1" as="geometry" /> + </mxCell> + <mxCell id="HiMKSJFquRK0mIlwyRFI-49" value="if perturbed_data is None" style="edgeLabel;html=1;align=center;verticalAlign=middle;resizable=0;points=[];" vertex="1" connectable="0" parent="HiMKSJFquRK0mIlwyRFI-37"> + <mxGeometry x="-0.0507" y="4" relative="1" as="geometry"> + <mxPoint x="-1" as="offset" /> + </mxGeometry> + </mxCell> + <mxCell id="HiMKSJFquRK0mIlwyRFI-29" value="generate_dataset" style="html=1;whiteSpace=wrap;" vertex="1" parent="1"> + <mxGeometry x="-546" y="566" width="110" height="50" as="geometry" /> + </mxCell> + <mxCell id="HiMKSJFquRK0mIlwyRFI-30" value="_perturb_data" style="html=1;whiteSpace=wrap;" vertex="1" parent="1"> + <mxGeometry x="-376" y="636" width="110" height="50" as="geometry" /> + </mxCell> + <mxCell id="HC1H8j6nMwEtLoyIrXXk-6" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=1;exitY=0.5;exitDx=0;exitDy=0;" edge="1" parent="1" source="HiMKSJFquRK0mIlwyRFI-31" target="HC1H8j6nMwEtLoyIrXXk-1"> + <mxGeometry relative="1" as="geometry" /> + </mxCell> + <mxCell id="HC1H8j6nMwEtLoyIrXXk-10" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=0.5;exitY=0;exitDx=0;exitDy=0;" edge="1" parent="1" source="HiMKSJFquRK0mIlwyRFI-31" target="HiMKSJFquRK0mIlwyRFI-33"> + <mxGeometry relative="1" as="geometry" /> + </mxCell> + <mxCell id="HC1H8j6nMwEtLoyIrXXk-11" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=0;exitY=0.5;exitDx=0;exitDy=0;" edge="1" parent="1" source="HiMKSJFquRK0mIlwyRFI-31" target="HC1H8j6nMwEtLoyIrXXk-2"> + <mxGeometry relative="1" as="geometry" /> + </mxCell> + <mxCell id="HiMKSJFquRK0mIlwyRFI-31" value="cal_model_weight" style="html=1;whiteSpace=wrap;strokeWidth=2;" vertex="1" parent="1"> + <mxGeometry x="-871" y="466" width="110" height="50" as="geometry" /> + </mxCell> + <mxCell id="HiMKSJFquRK0mIlwyRFI-32" value="plot_just_analysis" style="html=1;whiteSpace=wrap;" vertex="1" parent="1"> + <mxGeometry x="-871" y="736" width="110" height="50" as="geometry" /> + </mxCell> + <mxCell id="HiMKSJFquRK0mIlwyRFI-33" value="plot_model_weights" style="html=1;whiteSpace=wrap;" vertex="1" parent="1"> + <mxGeometry x="-1016" y="416" width="110" height="50" as="geometry" /> + </mxCell> + <mxCell id="HiMKSJFquRK0mIlwyRFI-34" value="plot_bayes_factor" style="html=1;whiteSpace=wrap;" vertex="1" parent="1"> + <mxGeometry x="-446" y="431" width="110" height="50" as="geometry" /> + </mxCell> + <mxCell id="HiMKSJFquRK0mIlwyRFI-51" value="<p style="margin:0px;margin-top:4px;text-align:center;"><b>Discrepancy</b></p><hr size="1"><div style="height:2px;"></div>" style="verticalAlign=top;align=left;overflow=fill;fontSize=12;fontFamily=Helvetica;html=1;whiteSpace=wrap;" vertex="1" parent="1"> + <mxGeometry x="360" y="1039.82" width="200" height="130" as="geometry" /> + </mxCell> + <mxCell id="HiMKSJFquRK0mIlwyRFI-52" value="get_sample" style="rounded=0;whiteSpace=wrap;html=1;" vertex="1" parent="1"> + <mxGeometry x="400" y="1079.82" width="120" height="60" as="geometry" /> + </mxCell> + <mxCell id="HC1H8j6nMwEtLoyIrXXk-5" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=1;exitY=0.25;exitDx=0;exitDy=0;" edge="1" parent="1" source="HC1H8j6nMwEtLoyIrXXk-1" target="HiMKSJFquRK0mIlwyRFI-34"> + <mxGeometry relative="1" as="geometry" /> + </mxCell> + <mxCell id="HC1H8j6nMwEtLoyIrXXk-20" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=0.5;exitY=1;exitDx=0;exitDy=0;" edge="1" parent="1" source="HC1H8j6nMwEtLoyIrXXk-1" target="HC1H8j6nMwEtLoyIrXXk-17"> + <mxGeometry relative="1" as="geometry" /> + </mxCell> + <mxCell id="HC1H8j6nMwEtLoyIrXXk-21" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=1;exitY=0.75;exitDx=0;exitDy=0;" edge="1" parent="1" source="HC1H8j6nMwEtLoyIrXXk-1" target="HiMKSJFquRK0mIlwyRFI-29"> + <mxGeometry relative="1" as="geometry" /> + </mxCell> + <mxCell id="HC1H8j6nMwEtLoyIrXXk-1" value="calc_bayes_factors" style="html=1;whiteSpace=wrap;strokeWidth=2;" vertex="1" parent="1"> + <mxGeometry x="-666" y="466" width="110" height="50" as="geometry" /> + </mxCell> + <mxCell id="HC1H8j6nMwEtLoyIrXXk-2" value="calc_model_weights" style="html=1;whiteSpace=wrap;" vertex="1" parent="1"> + <mxGeometry x="-1066" y="566" width="130" height="50" as="geometry" /> + </mxCell> + <mxCell id="HC1H8j6nMwEtLoyIrXXk-4" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=0.5;exitY=1;exitDx=0;exitDy=0;" edge="1" parent="1" source="HC1H8j6nMwEtLoyIrXXk-3" target="HiMKSJFquRK0mIlwyRFI-32"> + <mxGeometry relative="1" as="geometry" /> + </mxCell> + <mxCell id="HC1H8j6nMwEtLoyIrXXk-12" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=0;exitY=0.5;exitDx=0;exitDy=0;" edge="1" parent="1" source="HC1H8j6nMwEtLoyIrXXk-3" target="HC1H8j6nMwEtLoyIrXXk-2"> + <mxGeometry relative="1" as="geometry" /> + </mxCell> + <mxCell id="HC1H8j6nMwEtLoyIrXXk-16" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=1;exitY=0.75;exitDx=0;exitDy=0;entryX=0;entryY=0.5;entryDx=0;entryDy=0;" edge="1" parent="1" source="HC1H8j6nMwEtLoyIrXXk-3" target="xary-zVek9Bg-A1b1ZmA-9"> + <mxGeometry relative="1" as="geometry" /> + </mxCell> + <mxCell id="HC1H8j6nMwEtLoyIrXXk-23" value="always" style="edgeLabel;html=1;align=center;verticalAlign=middle;resizable=0;points=[];" vertex="1" connectable="0" parent="HC1H8j6nMwEtLoyIrXXk-16"> + <mxGeometry x="-0.5478" y="3" relative="1" as="geometry"> + <mxPoint as="offset" /> + </mxGeometry> + </mxCell> + <mxCell id="HC1H8j6nMwEtLoyIrXXk-18" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=1;exitY=0.25;exitDx=0;exitDy=0;" edge="1" parent="1" source="HC1H8j6nMwEtLoyIrXXk-3" target="HC1H8j6nMwEtLoyIrXXk-17"> + <mxGeometry relative="1" as="geometry" /> + </mxCell> + <mxCell id="HC1H8j6nMwEtLoyIrXXk-22" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=1;exitY=0.5;exitDx=0;exitDy=0;" edge="1" parent="1" source="HC1H8j6nMwEtLoyIrXXk-3" target="HiMKSJFquRK0mIlwyRFI-29"> + <mxGeometry relative="1" as="geometry" /> + </mxCell> + <mxCell id="HC1H8j6nMwEtLoyIrXXk-3" value="calc_justifiability_analysis" style="html=1;whiteSpace=wrap;strokeWidth=2;" vertex="1" parent="1"> + <mxGeometry x="-896" y="666" width="160" height="50" as="geometry" /> + </mxCell> + <mxCell id="HC1H8j6nMwEtLoyIrXXk-17" value="setup" style="html=1;whiteSpace=wrap;" vertex="1" parent="1"> + <mxGeometry x="-666" y="566" width="110" height="50" as="geometry" /> + </mxCell> + </root> + </mxGraphModel> + </diagram> + <diagram id="sQf09xvhinkT827TE7Va" name="Function structure Engine"> + <mxGraphModel dx="1436" dy="968" grid="1" gridSize="10" guides="1" tooltips="1" connect="1" arrows="1" fold="1" page="1" pageScale="1" pageWidth="850" pageHeight="1100" math="0" shadow="0"> + <root> + <mxCell id="0" /> + <mxCell id="1" parent="0" /> + <mxCell id="JXjM7l_erEiZMkSmYBvl-1" value="<p style="margin:0px;margin-top:4px;text-align:center;"><b>Engine</b></p><hr size="1"><div style="height:2px;"></div>" style="verticalAlign=top;align=left;overflow=fill;fontSize=12;fontFamily=Helvetica;html=1;whiteSpace=wrap;" vertex="1" parent="1"> + <mxGeometry x="130" y="140" width="1390" height="690" as="geometry" /> + </mxCell> + <mxCell id="JXjM7l_erEiZMkSmYBvl-2" value="hellinger_distance" style="html=1;whiteSpace=wrap;" vertex="1" parent="1"> + <mxGeometry x="1340" y="50" width="110" height="50" as="geometry" /> + </mxCell> + <mxCell id="JXjM7l_erEiZMkSmYBvl-3" value="logpdf" style="html=1;whiteSpace=wrap;" vertex="1" parent="1"> + <mxGeometry x="1050" y="50" width="110" height="50" as="geometry" /> + </mxCell> + <mxCell id="JXjM7l_erEiZMkSmYBvl-4" value="subdomain" style="html=1;whiteSpace=wrap;" vertex="1" parent="1"> + <mxGeometry x="625" y="50" width="110" height="50" as="geometry" /> + </mxCell> + <mxCell id="JXjM7l_erEiZMkSmYBvl-5" value="start_engine" style="html=1;whiteSpace=wrap;" vertex="1" parent="1"> + <mxGeometry x="250" y="680" width="110" height="50" as="geometry" /> + </mxCell> + <mxCell id="JXjM7l_erEiZMkSmYBvl-32" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=1;exitY=0.5;exitDx=0;exitDy=0;" edge="1" parent="1" source="JXjM7l_erEiZMkSmYBvl-6" target="JXjM7l_erEiZMkSmYBvl-5"> + <mxGeometry relative="1" as="geometry" /> + </mxCell> + <mxCell id="JXjM7l_erEiZMkSmYBvl-6" value="train_normal" style="html=1;whiteSpace=wrap;strokeWidth=2;" vertex="1" parent="1"> + <mxGeometry x="170" y="420" width="110" height="50" as="geometry" /> + </mxCell> + <mxCell id="JXjM7l_erEiZMkSmYBvl-10" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=1;exitY=0.5;exitDx=0;exitDy=0;" edge="1" parent="1" source="JXjM7l_erEiZMkSmYBvl-7" target="JXjM7l_erEiZMkSmYBvl-9"> + <mxGeometry relative="1" as="geometry"> + <mxPoint x="335" y="335" as="targetPoint" /> + </mxGeometry> + </mxCell> + <mxCell id="JXjM7l_erEiZMkSmYBvl-33" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=0.5;exitY=1;exitDx=0;exitDy=0;" edge="1" parent="1" source="JXjM7l_erEiZMkSmYBvl-7" target="JXjM7l_erEiZMkSmYBvl-6"> + <mxGeometry relative="1" as="geometry" /> + </mxCell> + <mxCell id="JXjM7l_erEiZMkSmYBvl-7" value="train_sequential" style="html=1;whiteSpace=wrap;strokeWidth=2;" vertex="1" parent="1"> + <mxGeometry x="170" y="310" width="110" height="50" as="geometry" /> + </mxCell> + <mxCell id="JXjM7l_erEiZMkSmYBvl-8" value="eval_metamodel" style="html=1;whiteSpace=wrap;strokeWidth=2;" vertex="1" parent="1"> + <mxGeometry x="190" y="210" width="110" height="50" as="geometry" /> + </mxCell> + <mxCell id="W5_FOelZ0qj-h3Gb0n3K-7" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=1;exitY=0.5;exitDx=0;exitDy=0;" edge="1" parent="1" source="JXjM7l_erEiZMkSmYBvl-9" target="JXjM7l_erEiZMkSmYBvl-18"> + <mxGeometry relative="1" as="geometry" /> + </mxCell> + <mxCell id="W5_FOelZ0qj-h3Gb0n3K-19" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=0.5;exitY=1;exitDx=0;exitDy=0;entryX=0;entryY=0.5;entryDx=0;entryDy=0;" edge="1" parent="1" source="JXjM7l_erEiZMkSmYBvl-9" target="JXjM7l_erEiZMkSmYBvl-23"> + <mxGeometry relative="1" as="geometry" /> + </mxCell> + <mxCell id="W5_FOelZ0qj-h3Gb0n3K-20" value="if len(obs_data) != 0" style="edgeLabel;html=1;align=center;verticalAlign=middle;resizable=0;points=[];" vertex="1" connectable="0" parent="W5_FOelZ0qj-h3Gb0n3K-19"> + <mxGeometry x="0.8137" relative="1" as="geometry"> + <mxPoint x="-57" as="offset" /> + </mxGeometry> + </mxCell> + <mxCell id="W5_FOelZ0qj-h3Gb0n3K-21" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=0.5;exitY=0;exitDx=0;exitDy=0;entryX=0.25;entryY=1;entryDx=0;entryDy=0;" edge="1" parent="1" source="JXjM7l_erEiZMkSmYBvl-9" target="JXjM7l_erEiZMkSmYBvl-24"> + <mxGeometry relative="1" as="geometry" /> + </mxCell> + <mxCell id="W5_FOelZ0qj-h3Gb0n3K-22" value="if len(obs_data) != 0" style="edgeLabel;html=1;align=center;verticalAlign=middle;resizable=0;points=[];" vertex="1" connectable="0" parent="W5_FOelZ0qj-h3Gb0n3K-21"> + <mxGeometry x="0.7684" y="3" relative="1" as="geometry"> + <mxPoint x="1" as="offset" /> + </mxGeometry> + </mxCell> + <mxCell id="W5_FOelZ0qj-h3Gb0n3K-23" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=0.5;exitY=1;exitDx=0;exitDy=0;entryX=0;entryY=0.5;entryDx=0;entryDy=0;" edge="1" parent="1" source="JXjM7l_erEiZMkSmYBvl-9" target="JXjM7l_erEiZMkSmYBvl-25"> + <mxGeometry relative="1" as="geometry" /> + </mxCell> + <mxCell id="W5_FOelZ0qj-h3Gb0n3K-24" value="if expdes.valid_model_runs" style="edgeLabel;html=1;align=center;verticalAlign=middle;resizable=0;points=[];" vertex="1" connectable="0" parent="W5_FOelZ0qj-h3Gb0n3K-23"> + <mxGeometry x="0.606" y="3" relative="1" as="geometry"> + <mxPoint x="-16" y="3" as="offset" /> + </mxGeometry> + </mxCell> + <mxCell id="W5_FOelZ0qj-h3Gb0n3K-25" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=0.5;exitY=1;exitDx=0;exitDy=0;entryX=0;entryY=0.5;entryDx=0;entryDy=0;" edge="1" parent="1" source="JXjM7l_erEiZMkSmYBvl-9" target="JXjM7l_erEiZMkSmYBvl-26"> + <mxGeometry relative="1" as="geometry" /> + </mxCell> + <mxCell id="W5_FOelZ0qj-h3Gb0n3K-26" value="if mc_ref and pce" style="edgeLabel;html=1;align=center;verticalAlign=middle;resizable=0;points=[];" vertex="1" connectable="0" parent="W5_FOelZ0qj-h3Gb0n3K-25"> + <mxGeometry x="0.7094" y="-3" relative="1" as="geometry"> + <mxPoint x="-31" y="-3" as="offset" /> + </mxGeometry> + </mxCell> + <mxCell id="JXjM7l_erEiZMkSmYBvl-9" value="train_seq_design" style="html=1;whiteSpace=wrap;" vertex="1" parent="1"> + <mxGeometry x="315" y="310" width="110" height="50" as="geometry" /> + </mxCell> + <mxCell id="JXjM7l_erEiZMkSmYBvl-12" value="util_VarBasedDesign" style="html=1;whiteSpace=wrap;" vertex="1" parent="1"> + <mxGeometry x="670" y="648" width="130" height="50" as="geometry" /> + </mxCell> + <mxCell id="JXjM7l_erEiZMkSmYBvl-28" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=0.75;exitY=0;exitDx=0;exitDy=0;" edge="1" parent="1" source="JXjM7l_erEiZMkSmYBvl-13" target="JXjM7l_erEiZMkSmYBvl-3"> + <mxGeometry relative="1" as="geometry" /> + </mxCell> + <mxCell id="JXjM7l_erEiZMkSmYBvl-31" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;" edge="1" parent="1" source="JXjM7l_erEiZMkSmYBvl-13" target="JXjM7l_erEiZMkSmYBvl-5"> + <mxGeometry relative="1" as="geometry" /> + </mxCell> + <mxCell id="JXjM7l_erEiZMkSmYBvl-38" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=0.75;exitY=1;exitDx=0;exitDy=0;" edge="1" parent="1" source="JXjM7l_erEiZMkSmYBvl-15" target="JXjM7l_erEiZMkSmYBvl-13"> + <mxGeometry relative="1" as="geometry" /> + </mxCell> + <mxCell id="JXjM7l_erEiZMkSmYBvl-39" value="if method == 'bayesactdesign'" style="edgeLabel;html=1;align=center;verticalAlign=middle;resizable=0;points=[];labelBackgroundColor=default;" vertex="1" connectable="0" parent="JXjM7l_erEiZMkSmYBvl-38"> + <mxGeometry x="-0.6235" y="2" relative="1" as="geometry"> + <mxPoint x="289" y="2" as="offset" /> + </mxGeometry> + </mxCell> + <mxCell id="W5_FOelZ0qj-h3Gb0n3K-12" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=1;exitY=0.5;exitDx=0;exitDy=0;" edge="1" parent="1" source="JXjM7l_erEiZMkSmYBvl-13" target="JXjM7l_erEiZMkSmYBvl-21"> + <mxGeometry relative="1" as="geometry" /> + </mxCell> + <mxCell id="W5_FOelZ0qj-h3Gb0n3K-15" value="always" style="edgeLabel;html=1;align=center;verticalAlign=middle;resizable=0;points=[];" vertex="1" connectable="0" parent="W5_FOelZ0qj-h3Gb0n3K-12"> + <mxGeometry x="0.7865" y="4" relative="1" as="geometry"> + <mxPoint x="-91" y="185" as="offset" /> + </mxGeometry> + </mxCell> + <mxCell id="JXjM7l_erEiZMkSmYBvl-13" value="util_BayesianActiveDesign" style="html=1;whiteSpace=wrap;" vertex="1" parent="1"> + <mxGeometry x="1020" y="680" width="150" height="50" as="geometry" /> + </mxCell> + <mxCell id="JXjM7l_erEiZMkSmYBvl-34" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=0;exitY=0.5;exitDx=0;exitDy=0;" edge="1" parent="1" source="JXjM7l_erEiZMkSmYBvl-14" target="JXjM7l_erEiZMkSmYBvl-6"> + <mxGeometry relative="1" as="geometry" /> + </mxCell> + <mxCell id="W5_FOelZ0qj-h3Gb0n3K-13" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=1;exitY=0.5;exitDx=0;exitDy=0;" edge="1" parent="1" source="JXjM7l_erEiZMkSmYBvl-14" target="JXjM7l_erEiZMkSmYBvl-21"> + <mxGeometry relative="1" as="geometry" /> + </mxCell> + <mxCell id="W5_FOelZ0qj-h3Gb0n3K-16" value="always" style="edgeLabel;html=1;align=center;verticalAlign=middle;resizable=0;points=[];" vertex="1" connectable="0" parent="W5_FOelZ0qj-h3Gb0n3K-13"> + <mxGeometry x="0.197" y="-3" relative="1" as="geometry"> + <mxPoint x="-1" as="offset" /> + </mxGeometry> + </mxCell> + <mxCell id="JXjM7l_erEiZMkSmYBvl-14" value="utilBayesianDesign" style="html=1;whiteSpace=wrap;" vertex="1" parent="1"> + <mxGeometry x="880" y="730" width="110" height="50" as="geometry" /> + </mxCell> + <mxCell id="JXjM7l_erEiZMkSmYBvl-37" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=0.25;exitY=1;exitDx=0;exitDy=0;entryX=0.5;entryY=0;entryDx=0;entryDy=0;" edge="1" parent="1" source="JXjM7l_erEiZMkSmYBvl-15" target="JXjM7l_erEiZMkSmYBvl-12"> + <mxGeometry relative="1" as="geometry" /> + </mxCell> + <mxCell id="JXjM7l_erEiZMkSmYBvl-42" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=0.5;exitY=1;exitDx=0;exitDy=0;" edge="1" parent="1" source="JXjM7l_erEiZMkSmYBvl-15" target="JXjM7l_erEiZMkSmYBvl-14"> + <mxGeometry relative="1" as="geometry" /> + </mxCell> + <mxCell id="JXjM7l_erEiZMkSmYBvl-43" value="if method == 'bayesoptdesign'" style="edgeLabel;html=1;align=center;verticalAlign=middle;resizable=0;points=[];" vertex="1" connectable="0" parent="JXjM7l_erEiZMkSmYBvl-42"> + <mxGeometry x="0.6143" y="-3" relative="1" as="geometry"> + <mxPoint x="3" y="29" as="offset" /> + </mxGeometry> + </mxCell> + <mxCell id="JXjM7l_erEiZMkSmYBvl-15" value="run_util_func" style="html=1;whiteSpace=wrap;" vertex="1" parent="1"> + <mxGeometry x="660" y="450" width="110" height="50" as="geometry" /> + </mxCell> + <mxCell id="JXjM7l_erEiZMkSmYBvl-36" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=0.25;exitY=1;exitDx=0;exitDy=0;" edge="1" parent="1" source="JXjM7l_erEiZMkSmYBvl-16" target="JXjM7l_erEiZMkSmYBvl-12"> + <mxGeometry relative="1" as="geometry" /> + </mxCell> + <mxCell id="JXjM7l_erEiZMkSmYBvl-41" value="if method == 'varoptdesign'" style="edgeLabel;html=1;align=center;verticalAlign=middle;resizable=0;points=[];" vertex="1" connectable="0" parent="JXjM7l_erEiZMkSmYBvl-36"> + <mxGeometry x="-0.5992" relative="1" as="geometry"> + <mxPoint x="-197" y="62" as="offset" /> + </mxGeometry> + </mxCell> + <mxCell id="JXjM7l_erEiZMkSmYBvl-44" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;" edge="1" parent="1" source="JXjM7l_erEiZMkSmYBvl-16" target="JXjM7l_erEiZMkSmYBvl-13"> + <mxGeometry relative="1" as="geometry"> + <Array as="points"> + <mxPoint x="965" y="590" /> + <mxPoint x="1095" y="590" /> + </Array> + </mxGeometry> + </mxCell> + <mxCell id="W5_FOelZ0qj-h3Gb0n3K-27" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;" edge="1" parent="1" source="JXjM7l_erEiZMkSmYBvl-16" target="JXjM7l_erEiZMkSmYBvl-14"> + <mxGeometry relative="1" as="geometry" /> + </mxCell> + <mxCell id="JXjM7l_erEiZMkSmYBvl-16" value="dual_annealing" style="html=1;whiteSpace=wrap;" vertex="1" parent="1"> + <mxGeometry x="910" y="450" width="110" height="50" as="geometry" /> + </mxCell> + <mxCell id="W5_FOelZ0qj-h3Gb0n3K-5" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;entryX=1;entryY=0.5;entryDx=0;entryDy=0;" edge="1" parent="1" source="JXjM7l_erEiZMkSmYBvl-17" target="JXjM7l_erEiZMkSmYBvl-18"> + <mxGeometry relative="1" as="geometry" /> + </mxCell> + <mxCell id="W5_FOelZ0qj-h3Gb0n3K-6" value="if exploit _method is 'bayesoptdesign',<br style="border-color: var(--border-color);">'bayesactdesign' or 'varoptdesign'" style="edgeLabel;html=1;align=center;verticalAlign=middle;resizable=0;points=[];" vertex="1" connectable="0" parent="W5_FOelZ0qj-h3Gb0n3K-5"> + <mxGeometry x="0.1312" y="2" relative="1" as="geometry"> + <mxPoint x="17" y="-2" as="offset" /> + </mxGeometry> + </mxCell> + <mxCell id="JXjM7l_erEiZMkSmYBvl-17" value="tradeoff_weights" style="html=1;whiteSpace=wrap;" vertex="1" parent="1"> + <mxGeometry x="980" y="210" width="110" height="50" as="geometry" /> + </mxCell> + <mxCell id="JXjM7l_erEiZMkSmYBvl-30" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=0.5;exitY=0;exitDx=0;exitDy=0;" edge="1" parent="1" source="JXjM7l_erEiZMkSmYBvl-18" target="JXjM7l_erEiZMkSmYBvl-4"> + <mxGeometry relative="1" as="geometry" /> + </mxCell> + <mxCell id="W5_FOelZ0qj-h3Gb0n3K-1" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=0.75;exitY=1;exitDx=0;exitDy=0;" edge="1" parent="1" source="JXjM7l_erEiZMkSmYBvl-18" target="JXjM7l_erEiZMkSmYBvl-15"> + <mxGeometry relative="1" as="geometry"> + <mxPoint x="790" y="280.0000000000002" as="sourcePoint" /> + <mxPoint x="690" y="499.9999999999998" as="targetPoint" /> + </mxGeometry> + </mxCell> + <mxCell id="W5_FOelZ0qj-h3Gb0n3K-2" value="if exploit _method is 'bayesoptdesign',<br>'bayesactdesign' or 'varoptdesign'" style="edgeLabel;html=1;align=center;verticalAlign=middle;resizable=0;points=[];" vertex="1" connectable="0" parent="W5_FOelZ0qj-h3Gb0n3K-1"> + <mxGeometry x="0.1579" relative="1" as="geometry"> + <mxPoint x="-15" y="49" as="offset" /> + </mxGeometry> + </mxCell> + <mxCell id="W5_FOelZ0qj-h3Gb0n3K-3" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=0.75;exitY=1;exitDx=0;exitDy=0;" edge="1" parent="1" source="JXjM7l_erEiZMkSmYBvl-18" target="JXjM7l_erEiZMkSmYBvl-16"> + <mxGeometry relative="1" as="geometry"> + <mxPoint x="680" y="205.05882352941194" as="sourcePoint" /> + <mxPoint x="805" y="779.9999999999998" as="targetPoint" /> + </mxGeometry> + </mxCell> + <mxCell id="W5_FOelZ0qj-h3Gb0n3K-4" value="if explore_method == 'dual annealing'" style="edgeLabel;html=1;align=center;verticalAlign=middle;resizable=0;points=[];" vertex="1" connectable="0" parent="W5_FOelZ0qj-h3Gb0n3K-3"> + <mxGeometry x="-0.6061" relative="1" as="geometry"> + <mxPoint x="270" y="46" as="offset" /> + </mxGeometry> + </mxCell> + <mxCell id="W5_FOelZ0qj-h3Gb0n3K-9" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;" edge="1" parent="1" source="JXjM7l_erEiZMkSmYBvl-18" target="JXjM7l_erEiZMkSmYBvl-20"> + <mxGeometry relative="1" as="geometry" /> + </mxCell> + <mxCell id="W5_FOelZ0qj-h3Gb0n3K-10" value="if exploit_method == 'alphabetic'" style="edgeLabel;html=1;align=center;verticalAlign=middle;resizable=0;points=[];" vertex="1" connectable="0" parent="W5_FOelZ0qj-h3Gb0n3K-9"> + <mxGeometry x="0.8144" y="1" relative="1" as="geometry"> + <mxPoint x="74" y="-1" as="offset" /> + </mxGeometry> + </mxCell> + <mxCell id="JXjM7l_erEiZMkSmYBvl-18" value="choose_next_sample" style="html=1;whiteSpace=wrap;" vertex="1" parent="1"> + <mxGeometry x="610" y="210" width="140" height="50" as="geometry" /> + </mxCell> + <mxCell id="JXjM7l_erEiZMkSmYBvl-20" value="util_AlphOptDesign" style="html=1;whiteSpace=wrap;" vertex="1" parent="1"> + <mxGeometry x="330" y="210" width="110" height="50" as="geometry" /> + </mxCell> + <mxCell id="JXjM7l_erEiZMkSmYBvl-21" value="_normpdf" style="html=1;whiteSpace=wrap;" vertex="1" parent="1"> + <mxGeometry x="1340" y="430" width="110" height="50" as="geometry" /> + </mxCell> + <mxCell id="JXjM7l_erEiZMkSmYBvl-29" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;" edge="1" parent="1" source="JXjM7l_erEiZMkSmYBvl-22" target="JXjM7l_erEiZMkSmYBvl-3"> + <mxGeometry relative="1" as="geometry" /> + </mxCell> + <mxCell id="JXjM7l_erEiZMkSmYBvl-22" value="_corr_factor_BME" style="html=1;whiteSpace=wrap;" vertex="1" parent="1"> + <mxGeometry x="1130" y="220" width="110" height="50" as="geometry" /> + </mxCell> + <mxCell id="JXjM7l_erEiZMkSmYBvl-23" value="_posteriorPlot" style="html=1;whiteSpace=wrap;" vertex="1" parent="1"> + <mxGeometry x="520" y="440" width="110" height="50" as="geometry" /> + </mxCell> + <mxCell id="JXjM7l_erEiZMkSmYBvl-27" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=0.5;exitY=0;exitDx=0;exitDy=0;" edge="1" parent="1" source="JXjM7l_erEiZMkSmYBvl-24" target="JXjM7l_erEiZMkSmYBvl-2"> + <mxGeometry relative="1" as="geometry" /> + </mxCell> + <mxCell id="W5_FOelZ0qj-h3Gb0n3K-11" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=0.5;exitY=1;exitDx=0;exitDy=0;entryX=0.5;entryY=0;entryDx=0;entryDy=0;" edge="1" parent="1" source="JXjM7l_erEiZMkSmYBvl-24" target="JXjM7l_erEiZMkSmYBvl-21"> + <mxGeometry relative="1" as="geometry" /> + </mxCell> + <mxCell id="W5_FOelZ0qj-h3Gb0n3K-14" value="always" style="edgeLabel;html=1;align=center;verticalAlign=middle;resizable=0;points=[];" vertex="1" connectable="0" parent="W5_FOelZ0qj-h3Gb0n3K-11"> + <mxGeometry x="0.0929" y="-1" relative="1" as="geometry"> + <mxPoint as="offset" /> + </mxGeometry> + </mxCell> + <mxCell id="W5_FOelZ0qj-h3Gb0n3K-17" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=0;exitY=0.5;exitDx=0;exitDy=0;" edge="1" parent="1" source="JXjM7l_erEiZMkSmYBvl-24" target="JXjM7l_erEiZMkSmYBvl-22"> + <mxGeometry relative="1" as="geometry" /> + </mxCell> + <mxCell id="W5_FOelZ0qj-h3Gb0n3K-18" value="commented out?" style="edgeLabel;html=1;align=center;verticalAlign=middle;resizable=0;points=[];" vertex="1" connectable="0" parent="W5_FOelZ0qj-h3Gb0n3K-17"> + <mxGeometry x="-0.1477" y="3" relative="1" as="geometry"> + <mxPoint as="offset" /> + </mxGeometry> + </mxCell> + <mxCell id="JXjM7l_erEiZMkSmYBvl-24" value="_BME_Calculator" style="html=1;whiteSpace=wrap;" vertex="1" parent="1"> + <mxGeometry x="1340" y="220" width="110" height="50" as="geometry" /> + </mxCell> + <mxCell id="JXjM7l_erEiZMkSmYBvl-25" value="_validError" style="html=1;whiteSpace=wrap;" vertex="1" parent="1"> + <mxGeometry x="520" y="510" width="110" height="50" as="geometry" /> + </mxCell> + <mxCell id="JXjM7l_erEiZMkSmYBvl-26" value="_error_Mean_Std" style="html=1;whiteSpace=wrap;" vertex="1" parent="1"> + <mxGeometry x="520" y="580" width="110" height="50" as="geometry" /> + </mxCell> + </root> + </mxGraphModel> + </diagram> + <diagram id="ME5gyYpVqUByTnAIOcMV" name="Parameter and function interaction"> + <mxGraphModel dx="2049" dy="1366" grid="1" gridSize="10" guides="1" tooltips="1" connect="1" arrows="1" fold="1" page="1" pageScale="1" pageWidth="850" pageHeight="1100" math="0" shadow="0"> + <root> + <mxCell id="0" /> + <mxCell id="1" parent="0" /> + <mxCell id="K5oJ7VEt7dPmeK6pba1f-33" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=1;exitY=0.5;exitDx=0;exitDy=0;entryX=0.5;entryY=1;entryDx=0;entryDy=0;" edge="1" parent="1" source="K5oJ7VEt7dPmeK6pba1f-1" target="K5oJ7VEt7dPmeK6pba1f-32"> + <mxGeometry relative="1" as="geometry" /> + </mxCell> + <mxCell id="K5oJ7VEt7dPmeK6pba1f-54" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=1;exitY=0.5;exitDx=0;exitDy=0;entryX=0.5;entryY=1;entryDx=0;entryDy=0;" edge="1" parent="1" source="K5oJ7VEt7dPmeK6pba1f-1" target="K5oJ7VEt7dPmeK6pba1f-53"> + <mxGeometry relative="1" as="geometry" /> + </mxCell> + <mxCell id="K5oJ7VEt7dPmeK6pba1f-61" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=1;exitY=0.5;exitDx=0;exitDy=0;entryX=0.5;entryY=1;entryDx=0;entryDy=0;" edge="1" parent="1" source="K5oJ7VEt7dPmeK6pba1f-1" target="K5oJ7VEt7dPmeK6pba1f-60"> + <mxGeometry relative="1" as="geometry" /> + </mxCell> + <mxCell id="K5oJ7VEt7dPmeK6pba1f-1" value="engine" style="rounded=0;whiteSpace=wrap;html=1;" vertex="1" parent="1"> + <mxGeometry x="40" y="160" width="120" height="60" as="geometry" /> + </mxCell> + <mxCell id="K5oJ7VEt7dPmeK6pba1f-3" value="Discrepancy" style="rounded=0;whiteSpace=wrap;html=1;" vertex="1" parent="1"> + <mxGeometry x="40" y="240" width="120" height="60" as="geometry" /> + </mxCell> + <mxCell id="K5oJ7VEt7dPmeK6pba1f-71" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=1;exitY=0.5;exitDx=0;exitDy=0;" edge="1" parent="1" source="K5oJ7VEt7dPmeK6pba1f-4" target="K5oJ7VEt7dPmeK6pba1f-60"> + <mxGeometry relative="1" as="geometry" /> + </mxCell> + <mxCell id="K5oJ7VEt7dPmeK6pba1f-4" value="emulator" style="rounded=0;whiteSpace=wrap;html=1;" vertex="1" parent="1"> + <mxGeometry x="40" y="320" width="120" height="60" as="geometry" /> + </mxCell> + <mxCell id="K5oJ7VEt7dPmeK6pba1f-37" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=1;exitY=0.5;exitDx=0;exitDy=0;" edge="1" parent="1" source="K5oJ7VEt7dPmeK6pba1f-5" target="K5oJ7VEt7dPmeK6pba1f-32"> + <mxGeometry relative="1" as="geometry" /> + </mxCell> + <mxCell id="K5oJ7VEt7dPmeK6pba1f-57" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=1;exitY=0.5;exitDx=0;exitDy=0;" edge="1" parent="1" source="K5oJ7VEt7dPmeK6pba1f-5" target="K5oJ7VEt7dPmeK6pba1f-53"> + <mxGeometry relative="1" as="geometry" /> + </mxCell> + <mxCell id="K5oJ7VEt7dPmeK6pba1f-65" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=1;exitY=0.5;exitDx=0;exitDy=0;" edge="1" parent="1" source="K5oJ7VEt7dPmeK6pba1f-5" target="K5oJ7VEt7dPmeK6pba1f-60"> + <mxGeometry relative="1" as="geometry" /> + </mxCell> + <mxCell id="K5oJ7VEt7dPmeK6pba1f-5" value="name" style="rounded=0;whiteSpace=wrap;html=1;" vertex="1" parent="1"> + <mxGeometry x="40" y="400" width="120" height="60" as="geometry" /> + </mxCell> + <mxCell id="K5oJ7VEt7dPmeK6pba1f-47" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=1;exitY=0.5;exitDx=0;exitDy=0;entryX=0.5;entryY=1;entryDx=0;entryDy=0;" edge="1" parent="1" source="K5oJ7VEt7dPmeK6pba1f-6" target="K5oJ7VEt7dPmeK6pba1f-32"> + <mxGeometry relative="1" as="geometry" /> + </mxCell> + <mxCell id="K5oJ7VEt7dPmeK6pba1f-6" value="bootstrap" style="rounded=0;whiteSpace=wrap;html=1;" vertex="1" parent="1"> + <mxGeometry x="40" y="480" width="120" height="60" as="geometry" /> + </mxCell> + <mxCell id="K5oJ7VEt7dPmeK6pba1f-7" value="req_outputs" style="rounded=0;whiteSpace=wrap;html=1;" vertex="1" parent="1"> + <mxGeometry x="40" y="560" width="120" height="60" as="geometry" /> + </mxCell> + <mxCell id="K5oJ7VEt7dPmeK6pba1f-79" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=1;exitY=0.5;exitDx=0;exitDy=0;" edge="1" parent="1" source="K5oJ7VEt7dPmeK6pba1f-8" target="K5oJ7VEt7dPmeK6pba1f-60"> + <mxGeometry relative="1" as="geometry" /> + </mxCell> + <mxCell id="K5oJ7VEt7dPmeK6pba1f-8" value="selected_indices" style="rounded=0;whiteSpace=wrap;html=1;" vertex="1" parent="1"> + <mxGeometry x="40" y="640" width="120" height="60" as="geometry" /> + </mxCell> + <mxCell id="K5oJ7VEt7dPmeK6pba1f-35" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=1;exitY=0.5;exitDx=0;exitDy=0;" edge="1" parent="1" source="K5oJ7VEt7dPmeK6pba1f-9" target="K5oJ7VEt7dPmeK6pba1f-32"> + <mxGeometry relative="1" as="geometry" /> + </mxCell> + <mxCell id="K5oJ7VEt7dPmeK6pba1f-55" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=1;exitY=0.5;exitDx=0;exitDy=0;" edge="1" parent="1" source="K5oJ7VEt7dPmeK6pba1f-9" target="K5oJ7VEt7dPmeK6pba1f-53"> + <mxGeometry relative="1" as="geometry" /> + </mxCell> + <mxCell id="K5oJ7VEt7dPmeK6pba1f-67" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=1;exitY=0.5;exitDx=0;exitDy=0;" edge="1" parent="1" source="K5oJ7VEt7dPmeK6pba1f-9" target="K5oJ7VEt7dPmeK6pba1f-60"> + <mxGeometry relative="1" as="geometry" /> + </mxCell> + <mxCell id="K5oJ7VEt7dPmeK6pba1f-9" value="prior_samples" style="rounded=0;whiteSpace=wrap;html=1;" vertex="1" parent="1"> + <mxGeometry x="40" y="720" width="120" height="60" as="geometry" /> + </mxCell> + <mxCell id="K5oJ7VEt7dPmeK6pba1f-36" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=1;exitY=0.5;exitDx=0;exitDy=0;" edge="1" parent="1" source="K5oJ7VEt7dPmeK6pba1f-11" target="K5oJ7VEt7dPmeK6pba1f-32"> + <mxGeometry relative="1" as="geometry" /> + </mxCell> + <mxCell id="K5oJ7VEt7dPmeK6pba1f-68" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=1;exitY=0.5;exitDx=0;exitDy=0;" edge="1" parent="1" source="K5oJ7VEt7dPmeK6pba1f-11" target="K5oJ7VEt7dPmeK6pba1f-60"> + <mxGeometry relative="1" as="geometry" /> + </mxCell> + <mxCell id="K5oJ7VEt7dPmeK6pba1f-11" value="n_prior_samples" style="rounded=0;whiteSpace=wrap;html=1;" vertex="1" parent="1"> + <mxGeometry x="40" y="800" width="120" height="60" as="geometry" /> + </mxCell> + <mxCell id="K5oJ7VEt7dPmeK6pba1f-38" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=1;exitY=0.5;exitDx=0;exitDy=0;" edge="1" parent="1" source="K5oJ7VEt7dPmeK6pba1f-12" target="K5oJ7VEt7dPmeK6pba1f-32"> + <mxGeometry relative="1" as="geometry" /> + </mxCell> + <mxCell id="K5oJ7VEt7dPmeK6pba1f-80" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=1;exitY=0.5;exitDx=0;exitDy=0;" edge="1" parent="1" source="K5oJ7VEt7dPmeK6pba1f-12" target="K5oJ7VEt7dPmeK6pba1f-60"> + <mxGeometry relative="1" as="geometry" /> + </mxCell> + <mxCell id="K5oJ7VEt7dPmeK6pba1f-12" value="measured_data" style="rounded=0;whiteSpace=wrap;html=1;" vertex="1" parent="1"> + <mxGeometry x="40" y="880" width="120" height="60" as="geometry" /> + </mxCell> + <mxCell id="K5oJ7VEt7dPmeK6pba1f-58" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=1;exitY=0.5;exitDx=0;exitDy=0;" edge="1" parent="1" source="K5oJ7VEt7dPmeK6pba1f-13" target="K5oJ7VEt7dPmeK6pba1f-53"> + <mxGeometry relative="1" as="geometry" /> + </mxCell> + <mxCell id="K5oJ7VEt7dPmeK6pba1f-13" value="inference_method" style="rounded=0;whiteSpace=wrap;html=1;" vertex="1" parent="1"> + <mxGeometry x="40" y="960" width="120" height="60" as="geometry" /> + </mxCell> + <mxCell id="K5oJ7VEt7dPmeK6pba1f-14" value="mcmc_params" style="rounded=0;whiteSpace=wrap;html=1;" vertex="1" parent="1"> + <mxGeometry x="40" y="1040" width="120" height="60" as="geometry" /> + </mxCell> + <mxCell id="K5oJ7VEt7dPmeK6pba1f-63" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=1;exitY=0.5;exitDx=0;exitDy=0;" edge="1" parent="1" source="K5oJ7VEt7dPmeK6pba1f-15" target="K5oJ7VEt7dPmeK6pba1f-60"> + <mxGeometry relative="1" as="geometry" /> + </mxCell> + <mxCell id="K5oJ7VEt7dPmeK6pba1f-15" value="perturbed_data" style="rounded=0;whiteSpace=wrap;html=1;" vertex="1" parent="1"> + <mxGeometry x="40" y="1120" width="120" height="60" as="geometry" /> + </mxCell> + <mxCell id="K5oJ7VEt7dPmeK6pba1f-45" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=1;exitY=0.5;exitDx=0;exitDy=0;" edge="1" parent="1" source="K5oJ7VEt7dPmeK6pba1f-16" target="K5oJ7VEt7dPmeK6pba1f-32"> + <mxGeometry relative="1" as="geometry" /> + </mxCell> + <mxCell id="K5oJ7VEt7dPmeK6pba1f-77" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=1;exitY=0.5;exitDx=0;exitDy=0;" edge="1" parent="1" source="K5oJ7VEt7dPmeK6pba1f-16" target="K5oJ7VEt7dPmeK6pba1f-60"> + <mxGeometry relative="1" as="geometry" /> + </mxCell> + <mxCell id="K5oJ7VEt7dPmeK6pba1f-16" value="bayes_loocv" style="rounded=0;whiteSpace=wrap;html=1;" vertex="1" parent="1"> + <mxGeometry x="40" y="1200" width="120" height="60" as="geometry" /> + </mxCell> + <mxCell id="K5oJ7VEt7dPmeK6pba1f-64" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=1;exitY=0.5;exitDx=0;exitDy=0;" edge="1" parent="1" source="K5oJ7VEt7dPmeK6pba1f-17" target="K5oJ7VEt7dPmeK6pba1f-60"> + <mxGeometry relative="1" as="geometry" /> + </mxCell> + <mxCell id="K5oJ7VEt7dPmeK6pba1f-17" value="n_bootstrap_itrs" style="rounded=0;whiteSpace=wrap;html=1;" vertex="1" parent="1"> + <mxGeometry x="40" y="1280" width="120" height="60" as="geometry" /> + </mxCell> + <mxCell id="K5oJ7VEt7dPmeK6pba1f-18" value="bootstrap_noise" style="rounded=0;whiteSpace=wrap;html=1;" vertex="1" parent="1"> + <mxGeometry x="40" y="1360" width="120" height="60" as="geometry" /> + </mxCell> + <mxCell id="K5oJ7VEt7dPmeK6pba1f-46" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=1;exitY=0.5;exitDx=0;exitDy=0;" edge="1" parent="1" source="K5oJ7VEt7dPmeK6pba1f-19" target="K5oJ7VEt7dPmeK6pba1f-32"> + <mxGeometry relative="1" as="geometry" /> + </mxCell> + <mxCell id="K5oJ7VEt7dPmeK6pba1f-78" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=1;exitY=0.5;exitDx=0;exitDy=0;" edge="1" parent="1" source="K5oJ7VEt7dPmeK6pba1f-19" target="K5oJ7VEt7dPmeK6pba1f-60"> + <mxGeometry relative="1" as="geometry" /> + </mxCell> + <mxCell id="K5oJ7VEt7dPmeK6pba1f-19" value="just_analysis" style="rounded=0;whiteSpace=wrap;html=1;" vertex="1" parent="1"> + <mxGeometry x="40" y="1440" width="120" height="60" as="geometry" /> + </mxCell> + <mxCell id="K5oJ7VEt7dPmeK6pba1f-20" value="valid_metrics" style="rounded=0;whiteSpace=wrap;html=1;" vertex="1" parent="1"> + <mxGeometry x="40" y="1520" width="120" height="60" as="geometry" /> + </mxCell> + <mxCell id="K5oJ7VEt7dPmeK6pba1f-52" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=1;exitY=0.5;exitDx=0;exitDy=0;" edge="1" parent="1" source="K5oJ7VEt7dPmeK6pba1f-21" target="K5oJ7VEt7dPmeK6pba1f-32"> + <mxGeometry relative="1" as="geometry" /> + </mxCell> + <mxCell id="K5oJ7VEt7dPmeK6pba1f-21" value="plot_post_pred" style="rounded=0;whiteSpace=wrap;html=1;" vertex="1" parent="1"> + <mxGeometry x="40" y="1600" width="120" height="60" as="geometry" /> + </mxCell> + <mxCell id="K5oJ7VEt7dPmeK6pba1f-51" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=1;exitY=0.5;exitDx=0;exitDy=0;" edge="1" parent="1" source="K5oJ7VEt7dPmeK6pba1f-22" target="K5oJ7VEt7dPmeK6pba1f-32"> + <mxGeometry relative="1" as="geometry" /> + </mxCell> + <mxCell id="K5oJ7VEt7dPmeK6pba1f-22" value="plot_map_pred" style="rounded=0;whiteSpace=wrap;html=1;" vertex="1" parent="1"> + <mxGeometry x="40" y="1680" width="120" height="60" as="geometry" /> + </mxCell> + <mxCell id="K5oJ7VEt7dPmeK6pba1f-23" value="max_a_posteriori" style="rounded=0;whiteSpace=wrap;html=1;" vertex="1" parent="1"> + <mxGeometry x="40" y="1760" width="120" height="60" as="geometry" /> + </mxCell> + <mxCell id="K5oJ7VEt7dPmeK6pba1f-24" value="corner_title_fmt" style="rounded=0;whiteSpace=wrap;html=1;" vertex="1" parent="1"> + <mxGeometry x="40" y="1840" width="120" height="60" as="geometry" /> + </mxCell> + <mxCell id="K5oJ7VEt7dPmeK6pba1f-34" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=1;exitY=0.5;exitDx=0;exitDy=0;" edge="1" parent="1" source="K5oJ7VEt7dPmeK6pba1f-25" target="K5oJ7VEt7dPmeK6pba1f-32"> + <mxGeometry relative="1" as="geometry" /> + </mxCell> + <mxCell id="K5oJ7VEt7dPmeK6pba1f-25" value="out_dir" style="rounded=0;whiteSpace=wrap;html=1;" vertex="1" parent="1"> + <mxGeometry x="40" y="1920" width="120" height="60" as="geometry" /> + </mxCell> + <mxCell id="K5oJ7VEt7dPmeK6pba1f-50" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=1;exitY=0.5;exitDx=0;exitDy=0;" edge="1" parent="1" source="K5oJ7VEt7dPmeK6pba1f-26" target="K5oJ7VEt7dPmeK6pba1f-32"> + <mxGeometry relative="1" as="geometry" /> + </mxCell> + <mxCell id="K5oJ7VEt7dPmeK6pba1f-66" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=1;exitY=0.5;exitDx=0;exitDy=0;" edge="1" parent="1" source="K5oJ7VEt7dPmeK6pba1f-26" target="K5oJ7VEt7dPmeK6pba1f-60"> + <mxGeometry relative="1" as="geometry" /> + </mxCell> + <mxCell id="K5oJ7VEt7dPmeK6pba1f-26" value="error_model" style="rounded=0;whiteSpace=wrap;html=1;" vertex="1" parent="1"> + <mxGeometry x="40" y="2000" width="120" height="60" as="geometry" /> + </mxCell> + <mxCell id="K5oJ7VEt7dPmeK6pba1f-56" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=1;exitY=0.5;exitDx=0;exitDy=0;" edge="1" parent="1" source="K5oJ7VEt7dPmeK6pba1f-27" target="K5oJ7VEt7dPmeK6pba1f-53"> + <mxGeometry relative="1" as="geometry" /> + </mxCell> + <mxCell id="K5oJ7VEt7dPmeK6pba1f-72" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=1;exitY=0.5;exitDx=0;exitDy=0;" edge="1" parent="1" source="K5oJ7VEt7dPmeK6pba1f-27" target="K5oJ7VEt7dPmeK6pba1f-60"> + <mxGeometry relative="1" as="geometry" /> + </mxCell> + <mxCell id="K5oJ7VEt7dPmeK6pba1f-27" value="bias_inputs" style="rounded=0;whiteSpace=wrap;html=1;" vertex="1" parent="1"> + <mxGeometry x="40" y="2080" width="120" height="60" as="geometry" /> + </mxCell> + <mxCell id="K5oJ7VEt7dPmeK6pba1f-41" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=1;exitY=0.5;exitDx=0;exitDy=0;" edge="1" parent="1" source="K5oJ7VEt7dPmeK6pba1f-28" target="K5oJ7VEt7dPmeK6pba1f-32"> + <mxGeometry relative="1" as="geometry" /> + </mxCell> + <mxCell id="K5oJ7VEt7dPmeK6pba1f-28" value="measurement_error" style="rounded=0;whiteSpace=wrap;html=1;" vertex="1" parent="1"> + <mxGeometry x="40" y="2160" width="120" height="60" as="geometry" /> + </mxCell> + <mxCell id="K5oJ7VEt7dPmeK6pba1f-44" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=1;exitY=0.5;exitDx=0;exitDy=0;" edge="1" parent="1" source="K5oJ7VEt7dPmeK6pba1f-29" target="K5oJ7VEt7dPmeK6pba1f-32"> + <mxGeometry relative="1" as="geometry" /> + </mxCell> + <mxCell id="K5oJ7VEt7dPmeK6pba1f-81" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=1;exitY=0.5;exitDx=0;exitDy=0;" edge="1" parent="1" source="K5oJ7VEt7dPmeK6pba1f-29" target="K5oJ7VEt7dPmeK6pba1f-60"> + <mxGeometry relative="1" as="geometry" /> + </mxCell> + <mxCell id="K5oJ7VEt7dPmeK6pba1f-29" value="sigma2s" style="rounded=0;whiteSpace=wrap;html=1;" vertex="1" parent="1"> + <mxGeometry x="40" y="2240" width="120" height="60" as="geometry" /> + </mxCell> + <mxCell id="K5oJ7VEt7dPmeK6pba1f-30" value="log_likes" style="rounded=0;whiteSpace=wrap;html=1;" vertex="1" parent="1"> + <mxGeometry x="40" y="2320" width="120" height="60" as="geometry" /> + </mxCell> + <mxCell id="K5oJ7VEt7dPmeK6pba1f-82" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=1;exitY=0.5;exitDx=0;exitDy=0;" edge="1" parent="1" source="K5oJ7VEt7dPmeK6pba1f-31" target="K5oJ7VEt7dPmeK6pba1f-60"> + <mxGeometry relative="1" as="geometry" /> + </mxCell> + <mxCell id="K5oJ7VEt7dPmeK6pba1f-31" value="dtype" style="rounded=0;whiteSpace=wrap;html=1;" vertex="1" parent="1"> + <mxGeometry x="40" y="2400" width="120" height="60" as="geometry" /> + </mxCell> + <mxCell id="K5oJ7VEt7dPmeK6pba1f-32" value="create_inference" style="rounded=0;whiteSpace=wrap;html=1;" vertex="1" parent="1"> + <mxGeometry x="400" y="20" width="120" height="60" as="geometry" /> + </mxCell> + <mxCell id="K5oJ7VEt7dPmeK6pba1f-40" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=1;exitY=0.5;exitDx=0;exitDy=0;" edge="1" parent="1" source="K5oJ7VEt7dPmeK6pba1f-39" target="K5oJ7VEt7dPmeK6pba1f-32"> + <mxGeometry relative="1" as="geometry" /> + </mxCell> + <mxCell id="K5oJ7VEt7dPmeK6pba1f-39" value="n_tot_measurement" style="rounded=0;whiteSpace=wrap;html=1;" vertex="1" parent="1"> + <mxGeometry x="40" y="2480" width="120" height="60" as="geometry" /> + </mxCell> + <mxCell id="K5oJ7VEt7dPmeK6pba1f-43" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=1;exitY=0.5;exitDx=0;exitDy=0;" edge="1" parent="1" source="K5oJ7VEt7dPmeK6pba1f-42" target="K5oJ7VEt7dPmeK6pba1f-32"> + <mxGeometry relative="1" as="geometry" /> + </mxCell> + <mxCell id="K5oJ7VEt7dPmeK6pba1f-42" value="Discrepancy" style="rounded=0;whiteSpace=wrap;html=1;" vertex="1" parent="1"> + <mxGeometry x="40" y="2560" width="120" height="60" as="geometry" /> + </mxCell> + <mxCell id="K5oJ7VEt7dPmeK6pba1f-49" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=1;exitY=0.5;exitDx=0;exitDy=0;" edge="1" parent="1" source="K5oJ7VEt7dPmeK6pba1f-48" target="K5oJ7VEt7dPmeK6pba1f-32"> + <mxGeometry relative="1" as="geometry" /> + </mxCell> + <mxCell id="K5oJ7VEt7dPmeK6pba1f-59" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=1;exitY=0.5;exitDx=0;exitDy=0;" edge="1" parent="1" source="K5oJ7VEt7dPmeK6pba1f-48" target="K5oJ7VEt7dPmeK6pba1f-53"> + <mxGeometry relative="1" as="geometry" /> + </mxCell> + <mxCell id="K5oJ7VEt7dPmeK6pba1f-48" value="posterior_df" style="rounded=0;whiteSpace=wrap;html=1;" vertex="1" parent="1"> + <mxGeometry x="40" y="2640" width="120" height="60" as="geometry" /> + </mxCell> + <mxCell id="K5oJ7VEt7dPmeK6pba1f-53" value="create_error_model" style="rounded=0;whiteSpace=wrap;html=1;" vertex="1" parent="1"> + <mxGeometry x="560" y="20" width="120" height="60" as="geometry" /> + </mxCell> + <mxCell id="K5oJ7VEt7dPmeK6pba1f-60" value="perform_bootstrap" style="rounded=0;whiteSpace=wrap;html=1;" vertex="1" parent="1"> + <mxGeometry x="720" y="20" width="120" height="60" as="geometry" /> + </mxCell> + <mxCell id="K5oJ7VEt7dPmeK6pba1f-75" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=1;exitY=0.5;exitDx=0;exitDy=0;" edge="1" parent="1" source="K5oJ7VEt7dPmeK6pba1f-69" target="K5oJ7VEt7dPmeK6pba1f-60"> + <mxGeometry relative="1" as="geometry" /> + </mxCell> + <mxCell id="K5oJ7VEt7dPmeK6pba1f-69" value="__mean_pce_prior_pred" style="rounded=0;whiteSpace=wrap;html=1;" vertex="1" parent="1"> + <mxGeometry x="40" y="2720" width="120" height="60" as="geometry" /> + </mxCell> + <mxCell id="K5oJ7VEt7dPmeK6pba1f-76" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=1;exitY=0.5;exitDx=0;exitDy=0;" edge="1" parent="1" source="K5oJ7VEt7dPmeK6pba1f-70" target="K5oJ7VEt7dPmeK6pba1f-60"> + <mxGeometry relative="1" as="geometry" /> + </mxCell> + <mxCell id="K5oJ7VEt7dPmeK6pba1f-70" value="_std_pce_prior_pred" style="rounded=0;whiteSpace=wrap;html=1;" vertex="1" parent="1"> + <mxGeometry x="40" y="2800" width="120" height="60" as="geometry" /> + </mxCell> + <mxCell id="K5oJ7VEt7dPmeK6pba1f-74" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=1;exitY=0.5;exitDx=0;exitDy=0;" edge="1" parent="1" source="K5oJ7VEt7dPmeK6pba1f-73" target="K5oJ7VEt7dPmeK6pba1f-60"> + <mxGeometry relative="1" as="geometry" /> + </mxCell> + <mxCell id="K5oJ7VEt7dPmeK6pba1f-73" value="__model_prior_pred" style="rounded=0;whiteSpace=wrap;html=1;" vertex="1" parent="1"> + <mxGeometry x="40" y="2880" width="120" height="60" as="geometry" /> + </mxCell> + </root> + </mxGraphModel> + </diagram> + <diagram id="QgiNX2WXFOBDsDgzoFY9" name="Folder structure"> + <mxGraphModel dx="1436" dy="968" grid="1" gridSize="10" guides="1" tooltips="1" connect="1" arrows="1" fold="1" page="1" pageScale="1" pageWidth="850" pageHeight="1100" math="0" shadow="0"> + <root> + <mxCell id="0" /> + <mxCell id="1" parent="0" /> + <mxCell id="KLYezTmecfuvBG8KQe-n-1" value="" style="shape=folder;fontStyle=1;spacingTop=10;tabWidth=40;tabHeight=14;tabPosition=left;html=1;whiteSpace=wrap;" vertex="1" parent="1"> + <mxGeometry x="140" y="80" width="750" height="550" as="geometry" /> + </mxCell> + <mxCell id="KLYezTmecfuvBG8KQe-n-2" value="" style="shape=folder;fontStyle=1;spacingTop=10;tabWidth=40;tabHeight=14;tabPosition=left;html=1;whiteSpace=wrap;" vertex="1" parent="1"> + <mxGeometry x="170" y="110" width="700" height="220" as="geometry" /> + </mxCell> + <mxCell id="KLYezTmecfuvBG8KQe-n-3" value="" style="shape=folder;fontStyle=1;spacingTop=10;tabWidth=40;tabHeight=14;tabPosition=left;html=1;whiteSpace=wrap;" vertex="1" parent="1"> + <mxGeometry x="170" y="370" width="180" height="50" as="geometry" /> + </mxCell> + <mxCell id="KLYezTmecfuvBG8KQe-n-4" value="" style="shape=folder;fontStyle=1;spacingTop=10;tabWidth=40;tabHeight=14;tabPosition=left;html=1;whiteSpace=wrap;" vertex="1" parent="1"> + <mxGeometry x="170" y="440" width="180" height="50" as="geometry" /> + </mxCell> + <mxCell id="KLYezTmecfuvBG8KQe-n-5" value="" style="shape=folder;fontStyle=1;spacingTop=10;tabWidth=40;tabHeight=14;tabPosition=left;html=1;whiteSpace=wrap;" vertex="1" parent="1"> + <mxGeometry x="170" y="500" width="180" height="50" as="geometry" /> + </mxCell> + <mxCell id="KLYezTmecfuvBG8KQe-n-6" value="adaptPlot" style="shape=folder;fontStyle=1;spacingTop=10;tabWidth=40;tabHeight=14;tabPosition=left;html=1;whiteSpace=wrap;" vertex="1" parent="1"> + <mxGeometry x="190" y="150" width="70" height="50" as="geometry" /> + </mxCell> + <mxCell id="KLYezTmecfuvBG8KQe-n-7" value="apoly_construction" style="shape=folder;fontStyle=1;spacingTop=10;tabWidth=40;tabHeight=14;tabPosition=left;html=1;whiteSpace=wrap;" vertex="1" parent="1"> + <mxGeometry x="280" y="150" width="140" height="50" as="geometry" /> + </mxCell> + <mxCell id="KLYezTmecfuvBG8KQe-n-8" value="bayes_linear" style="shape=folder;fontStyle=1;spacingTop=10;tabWidth=40;tabHeight=14;tabPosition=left;html=1;whiteSpace=wrap;" vertex="1" parent="1"> + <mxGeometry x="440" y="150" width="90" height="50" as="geometry" /> + </mxCell> + <mxCell id="KLYezTmecfuvBG8KQe-n-9" value="engine" style="shape=folder;fontStyle=1;spacingTop=10;tabWidth=40;tabHeight=14;tabPosition=left;html=1;whiteSpace=wrap;" vertex="1" parent="1"> + <mxGeometry x="550" y="150" width="70" height="50" as="geometry" /> + </mxCell> + <mxCell id="KLYezTmecfuvBG8KQe-n-11" value="eval_rec_rule" style="shape=folder;fontStyle=1;spacingTop=10;tabWidth=40;tabHeight=14;tabPosition=left;html=1;whiteSpace=wrap;" vertex="1" parent="1"> + <mxGeometry x="640" y="150" width="100" height="50" as="geometry" /> + </mxCell> + <mxCell id="KLYezTmecfuvBG8KQe-n-12" value="exp_designs" style="shape=folder;fontStyle=1;spacingTop=10;tabWidth=40;tabHeight=14;tabPosition=left;html=1;whiteSpace=wrap;" vertex="1" parent="1"> + <mxGeometry x="760" y="150" width="90" height="50" as="geometry" /> + </mxCell> + <mxCell id="KLYezTmecfuvBG8KQe-n-13" value="exploration" style="shape=folder;fontStyle=1;spacingTop=10;tabWidth=40;tabHeight=14;tabPosition=left;html=1;whiteSpace=wrap;" vertex="1" parent="1"> + <mxGeometry x="190" y="210" width="80" height="50" as="geometry" /> + </mxCell> + <mxCell id="KLYezTmecfuvBG8KQe-n-14" value="glexindex" style="shape=folder;fontStyle=1;spacingTop=10;tabWidth=40;tabHeight=14;tabPosition=left;html=1;whiteSpace=wrap;" vertex="1" parent="1"> + <mxGeometry x="290" y="210" width="70" height="50" as="geometry" /> + </mxCell> + <mxCell id="KLYezTmecfuvBG8KQe-n-15" value="input_space" style="shape=folder;fontStyle=1;spacingTop=10;tabWidth=40;tabHeight=14;tabPosition=left;html=1;whiteSpace=wrap;" vertex="1" parent="1"> + <mxGeometry x="380" y="210" width="80" height="50" as="geometry" /> + </mxCell> + <mxCell id="KLYezTmecfuvBG8KQe-n-16" value="inputs" style="shape=folder;fontStyle=1;spacingTop=10;tabWidth=40;tabHeight=14;tabPosition=left;html=1;whiteSpace=wrap;" vertex="1" parent="1"> + <mxGeometry x="480" y="210" width="70" height="50" as="geometry" /> + </mxCell> + <mxCell id="KLYezTmecfuvBG8KQe-n-17" value="meta_model_engine" style="shape=folder;fontStyle=1;spacingTop=10;tabWidth=40;tabHeight=14;tabPosition=left;html=1;whiteSpace=wrap;" vertex="1" parent="1"> + <mxGeometry x="570" y="210" width="160" height="50" as="geometry" /> + </mxCell> + </root> + </mxGraphModel> + </diagram> +</mxfile> diff --git a/docs/diagrams/Structure_BayesInf.drawio b/docs/diagrams/Structure_BayesInf.drawio new file mode 100644 index 0000000000000000000000000000000000000000..2e28cbcb3f3e16bee1b42a18f2b93c6f73a156f7 --- /dev/null +++ b/docs/diagrams/Structure_BayesInf.drawio @@ -0,0 +1,964 @@ +<mxfile host="Electron" modified="2024-04-19T16:08:43.773Z" agent="Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) draw.io/22.1.11 Chrome/114.0.5735.289 Electron/25.9.8 Safari/537.36" etag="2ELAo-FvqOEnLxZhqqO4" version="22.1.11" type="device" pages="4"> + <diagram name="Class and function structure" id="efOe0Jku58RX-i1bv-3b"> + <mxGraphModel dx="3735" dy="1372" grid="1" gridSize="10" guides="1" tooltips="1" connect="1" arrows="1" fold="1" page="1" pageScale="1" pageWidth="850" pageHeight="1100" math="0" shadow="0"> + <root> + <mxCell id="0" /> + <mxCell id="1" parent="0" /> + <mxCell id="xary-zVek9Bg-A1b1ZmA-22" value="<p style="margin:0px;margin-top:4px;text-align:center;"><b>MCMC</b></p><hr size="1"><div style="height:2px;"></div>" style="verticalAlign=top;align=left;overflow=fill;fontSize=12;fontFamily=Helvetica;html=1;whiteSpace=wrap;" vertex="1" parent="1"> + <mxGeometry x="1270" y="360" width="770" height="380" as="geometry" /> + </mxCell> + <mxCell id="xary-zVek9Bg-A1b1ZmA-1" value="_kernel_rbf" style="rounded=0;whiteSpace=wrap;html=1;" vertex="1" parent="1"> + <mxGeometry x="1020" y="200" width="120" height="60" as="geometry" /> + </mxCell> + <mxCell id="xary-zVek9Bg-A1b1ZmA-2" value="_logpdf" style="rounded=0;whiteSpace=wrap;html=1;" vertex="1" parent="1"> + <mxGeometry x="820" y="140" width="120" height="60" as="geometry" /> + </mxCell> + <mxCell id="xary-zVek9Bg-A1b1ZmA-10" value="<p style="margin:0px;margin-top:4px;text-align:center;"><b>BayesInf</b></p><hr size="1"><div style="height:2px;"></div>" style="verticalAlign=top;align=left;overflow=fill;fontSize=12;fontFamily=Helvetica;html=1;whiteSpace=wrap;" vertex="1" parent="1"> + <mxGeometry x="-120" y="290" width="1310" height="680" as="geometry" /> + </mxCell> + <mxCell id="xary-zVek9Bg-A1b1ZmA-24" value="if self.bootstrap <br>or self.bayes_loocv <br>or self.just_analysis" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;entryX=1;entryY=0.5;entryDx=0;entryDy=0;labelBackgroundColor=#ffae00;exitX=0.5;exitY=0;exitDx=0;exitDy=0;" edge="1" parent="1" source="xary-zVek9Bg-A1b1ZmA-9" target="xary-zVek9Bg-A1b1ZmA-13"> + <mxGeometry x="0.2902" relative="1" as="geometry"> + <mxPoint as="offset" /> + </mxGeometry> + </mxCell> + <mxCell id="xary-zVek9Bg-A1b1ZmA-31" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=0.5;exitY=1;exitDx=0;exitDy=0;" edge="1" parent="1" source="xary-zVek9Bg-A1b1ZmA-9" target="xary-zVek9Bg-A1b1ZmA-18"> + <mxGeometry relative="1" as="geometry" /> + </mxCell> + <mxCell id="xary-zVek9Bg-A1b1ZmA-42" value="if self.name != 'valid'<br>and self.inference_method != 'rejection'" style="edgeLabel;html=1;align=center;verticalAlign=middle;resizable=0;points=[];labelBackgroundColor=default;" vertex="1" connectable="0" parent="xary-zVek9Bg-A1b1ZmA-31"> + <mxGeometry x="0.5646" relative="1" as="geometry"> + <mxPoint as="offset" /> + </mxGeometry> + </mxCell> + <mxCell id="xary-zVek9Bg-A1b1ZmA-32" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=1;exitY=0.5;exitDx=0;exitDy=0;" edge="1" parent="1" source="xary-zVek9Bg-A1b1ZmA-9" target="HiMKSJFquRK0mIlwyRFI-5"> + <mxGeometry relative="1" as="geometry" /> + </mxCell> + <mxCell id="xary-zVek9Bg-A1b1ZmA-43" value="if self.inference_method == 'mcmc'" style="edgeLabel;html=1;align=center;verticalAlign=middle;resizable=0;points=[];" vertex="1" connectable="0" parent="xary-zVek9Bg-A1b1ZmA-32"> + <mxGeometry x="-0.0958" y="-1" relative="1" as="geometry"> + <mxPoint as="offset" /> + </mxGeometry> + </mxCell> + <mxCell id="xary-zVek9Bg-A1b1ZmA-33" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=0.75;exitY=1;exitDx=0;exitDy=0;entryX=0;entryY=0.5;entryDx=0;entryDy=0;" edge="1" parent="1" source="xary-zVek9Bg-A1b1ZmA-9" target="xary-zVek9Bg-A1b1ZmA-19"> + <mxGeometry relative="1" as="geometry" /> + </mxCell> + <mxCell id="xary-zVek9Bg-A1b1ZmA-52" value="always" style="edgeLabel;html=1;align=center;verticalAlign=middle;resizable=0;points=[];labelBackgroundColor=#C2C2C2;" vertex="1" connectable="0" parent="xary-zVek9Bg-A1b1ZmA-33"> + <mxGeometry x="-0.112" y="1" relative="1" as="geometry"> + <mxPoint as="offset" /> + </mxGeometry> + </mxCell> + <mxCell id="xary-zVek9Bg-A1b1ZmA-34" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=0.5;exitY=1;exitDx=0;exitDy=0;" edge="1" parent="1" source="xary-zVek9Bg-A1b1ZmA-9" target="xary-zVek9Bg-A1b1ZmA-21"> + <mxGeometry relative="1" as="geometry" /> + </mxCell> + <mxCell id="xary-zVek9Bg-A1b1ZmA-47" value="if self.plot_post_pred" style="edgeLabel;html=1;align=center;verticalAlign=middle;resizable=0;points=[];" vertex="1" connectable="0" parent="xary-zVek9Bg-A1b1ZmA-34"> + <mxGeometry x="0.2399" y="-1" relative="1" as="geometry"> + <mxPoint y="1" as="offset" /> + </mxGeometry> + </mxCell> + <mxCell id="xary-zVek9Bg-A1b1ZmA-35" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=0.5;exitY=1;exitDx=0;exitDy=0;" edge="1" parent="1" source="xary-zVek9Bg-A1b1ZmA-9" target="xary-zVek9Bg-A1b1ZmA-20"> + <mxGeometry relative="1" as="geometry" /> + </mxCell> + <mxCell id="xary-zVek9Bg-A1b1ZmA-46" value="if self.plot_map_pred" style="edgeLabel;html=1;align=center;verticalAlign=middle;resizable=0;points=[];" vertex="1" connectable="0" parent="xary-zVek9Bg-A1b1ZmA-35"> + <mxGeometry x="0.4183" y="-1" relative="1" as="geometry"> + <mxPoint as="offset" /> + </mxGeometry> + </mxCell> + <mxCell id="xary-zVek9Bg-A1b1ZmA-54" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=0.5;exitY=1;exitDx=0;exitDy=0;" edge="1" parent="1" source="xary-zVek9Bg-A1b1ZmA-9" target="xary-zVek9Bg-A1b1ZmA-53"> + <mxGeometry relative="1" as="geometry" /> + </mxCell> + <mxCell id="xary-zVek9Bg-A1b1ZmA-55" value="if self.bootstrap" style="edgeLabel;html=1;align=center;verticalAlign=middle;resizable=0;points=[];labelBackgroundColor=#FF9A03;" vertex="1" connectable="0" parent="xary-zVek9Bg-A1b1ZmA-54"> + <mxGeometry x="0.1816" y="3" relative="1" as="geometry"> + <mxPoint x="1" as="offset" /> + </mxGeometry> + </mxCell> + <mxCell id="xary-zVek9Bg-A1b1ZmA-57" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=0.5;exitY=1;exitDx=0;exitDy=0;entryX=0;entryY=0.5;entryDx=0;entryDy=0;" edge="1" parent="1" source="xary-zVek9Bg-A1b1ZmA-9" target="xary-zVek9Bg-A1b1ZmA-56"> + <mxGeometry relative="1" as="geometry" /> + </mxCell> + <mxCell id="xary-zVek9Bg-A1b1ZmA-58" value="always" style="edgeLabel;html=1;align=center;verticalAlign=middle;resizable=0;points=[];labelBackgroundColor=#FF9A03;" vertex="1" connectable="0" parent="xary-zVek9Bg-A1b1ZmA-57"> + <mxGeometry x="0.7182" y="2" relative="1" as="geometry"> + <mxPoint as="offset" /> + </mxGeometry> + </mxCell> + <mxCell id="xary-zVek9Bg-A1b1ZmA-60" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=0.25;exitY=1;exitDx=0;exitDy=0;" edge="1" parent="1" source="xary-zVek9Bg-A1b1ZmA-9" target="xary-zVek9Bg-A1b1ZmA-59"> + <mxGeometry relative="1" as="geometry" /> + </mxCell> + <mxCell id="xary-zVek9Bg-A1b1ZmA-61" value="if self.error_model<br>and self.name == 'calib'" style="edgeLabel;html=1;align=center;verticalAlign=middle;resizable=0;points=[];" vertex="1" connectable="0" parent="xary-zVek9Bg-A1b1ZmA-60"> + <mxGeometry x="0.3024" y="2" relative="1" as="geometry"> + <mxPoint x="67" y="1" as="offset" /> + </mxGeometry> + </mxCell> + <mxCell id="HiMKSJFquRK0mIlwyRFI-54" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=0.5;exitY=1;exitDx=0;exitDy=0;" edge="1" parent="1" source="xary-zVek9Bg-A1b1ZmA-9" target="HiMKSJFquRK0mIlwyRFI-51"> + <mxGeometry relative="1" as="geometry" /> + </mxCell> + <mxCell id="HiMKSJFquRK0mIlwyRFI-55" value="always" style="edgeLabel;html=1;align=center;verticalAlign=middle;resizable=0;points=[];labelBackgroundColor=#FF9A03;" vertex="1" connectable="0" parent="HiMKSJFquRK0mIlwyRFI-54"> + <mxGeometry x="0.8253" y="3" relative="1" as="geometry"> + <mxPoint as="offset" /> + </mxGeometry> + </mxCell> + <mxCell id="xary-zVek9Bg-A1b1ZmA-9" value="create_inference" style="html=1;whiteSpace=wrap;strokeWidth=2;" vertex="1" parent="1"> + <mxGeometry x="405" y="539" width="110" height="50" as="geometry" /> + </mxCell> + <mxCell id="xary-zVek9Bg-A1b1ZmA-25" value="if len(self.perturbed_data) == 0" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;" edge="1" parent="1" source="xary-zVek9Bg-A1b1ZmA-13" target="xary-zVek9Bg-A1b1ZmA-14"> + <mxGeometry x="0.3402" relative="1" as="geometry"> + <mxPoint y="1" as="offset" /> + </mxGeometry> + </mxCell> + <mxCell id="xary-zVek9Bg-A1b1ZmA-27" value="if not self.emulator" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=0.5;exitY=1;exitDx=0;exitDy=0;" edge="1" parent="1" source="xary-zVek9Bg-A1b1ZmA-13" target="xary-zVek9Bg-A1b1ZmA-15"> + <mxGeometry relative="1" as="geometry" /> + </mxCell> + <mxCell id="xary-zVek9Bg-A1b1ZmA-29" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=0.5;exitY=1;exitDx=0;exitDy=0;entryX=0;entryY=0.5;entryDx=0;entryDy=0;" edge="1" parent="1" source="xary-zVek9Bg-A1b1ZmA-13" target="xary-zVek9Bg-A1b1ZmA-16"> + <mxGeometry relative="1" as="geometry" /> + </mxCell> + <mxCell id="xary-zVek9Bg-A1b1ZmA-44" value="always" style="edgeLabel;html=1;align=center;verticalAlign=middle;resizable=0;points=[];labelBackgroundColor=#cdcbcb;" vertex="1" connectable="0" parent="xary-zVek9Bg-A1b1ZmA-29"> + <mxGeometry x="0.4722" y="1" relative="1" as="geometry"> + <mxPoint as="offset" /> + </mxGeometry> + </mxCell> + <mxCell id="xary-zVek9Bg-A1b1ZmA-30" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=0.5;exitY=1;exitDx=0;exitDy=0;entryX=0;entryY=0.5;entryDx=0;entryDy=0;" edge="1" parent="1" source="xary-zVek9Bg-A1b1ZmA-13" target="xary-zVek9Bg-A1b1ZmA-17"> + <mxGeometry relative="1" as="geometry" /> + </mxCell> + <mxCell id="xary-zVek9Bg-A1b1ZmA-41" value="if self.emulator" style="edgeLabel;html=1;align=center;verticalAlign=middle;resizable=0;points=[];" vertex="1" connectable="0" parent="xary-zVek9Bg-A1b1ZmA-30"> + <mxGeometry x="0.6143" y="-3" relative="1" as="geometry"> + <mxPoint as="offset" /> + </mxGeometry> + </mxCell> + <mxCell id="xary-zVek9Bg-A1b1ZmA-62" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;" edge="1" parent="1" source="xary-zVek9Bg-A1b1ZmA-13" target="xary-zVek9Bg-A1b1ZmA-59"> + <mxGeometry relative="1" as="geometry"> + <mxPoint x="340" y="680" as="targetPoint" /> + </mxGeometry> + </mxCell> + <mxCell id="xary-zVek9Bg-A1b1ZmA-63" value="if self.error_model<br>and self.name == 'valid'" style="edgeLabel;html=1;align=center;verticalAlign=middle;resizable=0;points=[];labelBackgroundColor=default;" vertex="1" connectable="0" parent="xary-zVek9Bg-A1b1ZmA-62"> + <mxGeometry x="-0.3906" relative="1" as="geometry"> + <mxPoint y="121" as="offset" /> + </mxGeometry> + </mxCell> + <mxCell id="xary-zVek9Bg-A1b1ZmA-13" value="perform_bootstrap" style="html=1;whiteSpace=wrap;" vertex="1" parent="1"> + <mxGeometry x="50" y="335" width="110" height="50" as="geometry" /> + </mxCell> + <mxCell id="xary-zVek9Bg-A1b1ZmA-14" value="_perturb_data" style="html=1;whiteSpace=wrap;" vertex="1" parent="1"> + <mxGeometry x="-75" y="460" width="110" height="50" as="geometry" /> + </mxCell> + <mxCell id="xary-zVek9Bg-A1b1ZmA-15" value="_eval_model" style="html=1;whiteSpace=wrap;" vertex="1" parent="1"> + <mxGeometry x="1050" y="660" width="110" height="50" as="geometry" /> + </mxCell> + <mxCell id="xary-zVek9Bg-A1b1ZmA-38" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=1;exitY=0.5;exitDx=0;exitDy=0;entryX=0.5;entryY=1;entryDx=0;entryDy=0;" edge="1" parent="1" source="xary-zVek9Bg-A1b1ZmA-16" target="xary-zVek9Bg-A1b1ZmA-1"> + <mxGeometry relative="1" as="geometry" /> + </mxCell> + <mxCell id="xary-zVek9Bg-A1b1ZmA-49" value="if hasattr bias_inputs&nbsp;<br>and not hasattr error_model" style="edgeLabel;html=1;align=center;verticalAlign=middle;resizable=0;points=[];labelBackgroundColor=#ffae00;" vertex="1" connectable="0" parent="xary-zVek9Bg-A1b1ZmA-38"> + <mxGeometry x="0.3126" y="-3" relative="1" as="geometry"> + <mxPoint x="-103" y="31" as="offset" /> + </mxGeometry> + </mxCell> + <mxCell id="xary-zVek9Bg-A1b1ZmA-39" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=1;exitY=0.5;exitDx=0;exitDy=0;" edge="1" parent="1" source="xary-zVek9Bg-A1b1ZmA-16" target="xary-zVek9Bg-A1b1ZmA-2"> + <mxGeometry relative="1" as="geometry" /> + </mxCell> + <mxCell id="xary-zVek9Bg-A1b1ZmA-16" value="normpdf" style="html=1;whiteSpace=wrap;" vertex="1" parent="1"> + <mxGeometry x="650" y="455" width="110" height="50" as="geometry" /> + </mxCell> + <mxCell id="xary-zVek9Bg-A1b1ZmA-40" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=1;exitY=0.5;exitDx=0;exitDy=0;" edge="1" parent="1" source="xary-zVek9Bg-A1b1ZmA-17" target="xary-zVek9Bg-A1b1ZmA-2"> + <mxGeometry relative="1" as="geometry" /> + </mxCell> + <mxCell id="xary-zVek9Bg-A1b1ZmA-50" value="always" style="edgeLabel;html=1;align=center;verticalAlign=middle;resizable=0;points=[];labelBackgroundColor=#cdcbcb;" vertex="1" connectable="0" parent="xary-zVek9Bg-A1b1ZmA-40"> + <mxGeometry x="-0.6073" y="-5" relative="1" as="geometry"> + <mxPoint as="offset" /> + </mxGeometry> + </mxCell> + <mxCell id="xary-zVek9Bg-A1b1ZmA-17" value="_corr_factor_BME" style="html=1;whiteSpace=wrap;" vertex="1" parent="1"> + <mxGeometry x="650" y="385" width="110" height="50" as="geometry" /> + </mxCell> + <mxCell id="xary-zVek9Bg-A1b1ZmA-18" value="_rejection_sampling" style="html=1;whiteSpace=wrap;" vertex="1" parent="1"> + <mxGeometry x="280" y="890" width="120" height="50" as="geometry" /> + </mxCell> + <mxCell id="xary-zVek9Bg-A1b1ZmA-26" value="if not self.emulator&nbsp;<br>and not self.inference_method == 'rejection'&nbsp;<br>and self.name == 'calib" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=0.5;exitY=1;exitDx=0;exitDy=0;entryX=0;entryY=0.5;entryDx=0;entryDy=0;" edge="1" parent="1" source="xary-zVek9Bg-A1b1ZmA-19" target="xary-zVek9Bg-A1b1ZmA-15"> + <mxGeometry x="-0.0559" y="15" relative="1" as="geometry"> + <mxPoint as="offset" /> + </mxGeometry> + </mxCell> + <mxCell id="xary-zVek9Bg-A1b1ZmA-37" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=1;exitY=0.5;exitDx=0;exitDy=0;" edge="1" parent="1" source="xary-zVek9Bg-A1b1ZmA-19" target="xary-zVek9Bg-A1b1ZmA-1"> + <mxGeometry relative="1" as="geometry" /> + </mxCell> + <mxCell id="xary-zVek9Bg-A1b1ZmA-48" value="if sigma2_prior is not None<br>and if hasattr bias_inputs<br>and if not hasattr error_model" style="edgeLabel;html=1;align=center;verticalAlign=middle;resizable=0;points=[];labelBackgroundColor=#ffae00;" vertex="1" connectable="0" parent="xary-zVek9Bg-A1b1ZmA-37"> + <mxGeometry x="-0.5544" y="-1" relative="1" as="geometry"> + <mxPoint x="1" y="-5" as="offset" /> + </mxGeometry> + </mxCell> + <mxCell id="xary-zVek9Bg-A1b1ZmA-19" value="_posterior_predictive" style="html=1;whiteSpace=wrap;" vertex="1" parent="1"> + <mxGeometry x="690" y="589" width="130" height="50" as="geometry" /> + </mxCell> + <mxCell id="xary-zVek9Bg-A1b1ZmA-28" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=1;exitY=0.5;exitDx=0;exitDy=0;" edge="1" parent="1" source="xary-zVek9Bg-A1b1ZmA-20" target="xary-zVek9Bg-A1b1ZmA-15"> + <mxGeometry relative="1" as="geometry" /> + </mxCell> + <mxCell id="xary-zVek9Bg-A1b1ZmA-45" value="always" style="edgeLabel;html=1;align=center;verticalAlign=middle;resizable=0;points=[];labelBackgroundColor=#cdcbcb;" vertex="1" connectable="0" parent="xary-zVek9Bg-A1b1ZmA-28"> + <mxGeometry x="0.0517" relative="1" as="geometry"> + <mxPoint as="offset" /> + </mxGeometry> + </mxCell> + <mxCell id="xary-zVek9Bg-A1b1ZmA-20" value="_plot_max_a_posteriori" style="html=1;whiteSpace=wrap;" vertex="1" parent="1"> + <mxGeometry x="495" y="790" width="140" height="50" as="geometry" /> + </mxCell> + <mxCell id="xary-zVek9Bg-A1b1ZmA-21" value="plot_post_predictive" style="html=1;whiteSpace=wrap;" vertex="1" parent="1"> + <mxGeometry x="630" y="720" width="120" height="50" as="geometry" /> + </mxCell> + <mxCell id="xary-zVek9Bg-A1b1ZmA-36" value="Note: Arrows indicate function calls, beginning calls the end" style="text;html=1;strokeColor=none;fillColor=none;align=center;verticalAlign=middle;whiteSpace=wrap;rounded=0;" vertex="1" parent="1"> + <mxGeometry x="10" y="10" width="190" height="30" as="geometry" /> + </mxCell> + <mxCell id="xary-zVek9Bg-A1b1ZmA-51" value="Color meanings:<br><span style="white-space: pre;">	</span>red: wrong, change<br><span style="white-space: pre;">	</span>orange: seems off, look at again<br><span style="white-space: pre;">	</span>light beige: has been removed" style="text;html=1;strokeColor=none;fillColor=none;align=left;verticalAlign=middle;whiteSpace=wrap;rounded=0;" vertex="1" parent="1"> + <mxGeometry x="20" y="70" width="220" height="30" as="geometry" /> + </mxCell> + <mxCell id="xary-zVek9Bg-A1b1ZmA-53" value="plot_log_BME" style="rounded=0;whiteSpace=wrap;html=1;" vertex="1" parent="1"> + <mxGeometry x="150" y="820" width="120" height="60" as="geometry" /> + </mxCell> + <mxCell id="xary-zVek9Bg-A1b1ZmA-56" value="plot_post_params" style="rounded=0;whiteSpace=wrap;html=1;" vertex="1" parent="1"> + <mxGeometry x="660" y="840" width="120" height="60" as="geometry" /> + </mxCell> + <mxCell id="xary-zVek9Bg-A1b1ZmA-59" value="create_error_model" style="rounded=0;whiteSpace=wrap;html=1;" vertex="1" parent="1"> + <mxGeometry x="45" y="740" width="120" height="60" as="geometry" /> + </mxCell> + <mxCell id="HiMKSJFquRK0mIlwyRFI-1" value="_check_ranges" style="rounded=0;whiteSpace=wrap;html=1;" vertex="1" parent="1"> + <mxGeometry x="1595" y="280" width="120" height="60" as="geometry" /> + </mxCell> + <mxCell id="HiMKSJFquRK0mIlwyRFI-2" value="gelman_rubin" style="rounded=0;whiteSpace=wrap;html=1;" vertex="1" parent="1"> + <mxGeometry x="1350" y="250" width="120" height="60" as="geometry" /> + </mxCell> + <mxCell id="HiMKSJFquRK0mIlwyRFI-3" value="_iterative_scheme" style="rounded=0;whiteSpace=wrap;html=1;fillColor=#f9f7ed;strokeColor=#CCC1AA;fontColor=#CCC1AA;" vertex="1" parent="1"> + <mxGeometry x="2055" y="620" width="120" height="60" as="geometry" /> + </mxCell> + <mxCell id="HiMKSJFquRK0mIlwyRFI-21" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;fillColor=#f9f7ed;strokeColor=#CCC1AA;fontColor=#CCC1AA;" edge="1" parent="1" source="HiMKSJFquRK0mIlwyRFI-4" target="HiMKSJFquRK0mIlwyRFI-2"> + <mxGeometry relative="1" as="geometry" /> + </mxCell> + <mxCell id="HiMKSJFquRK0mIlwyRFI-24" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=1;exitY=0.5;exitDx=0;exitDy=0;fillColor=#f9f7ed;strokeColor=#CCC1AA;fontColor=#CCC1AA;" edge="1" parent="1" source="HiMKSJFquRK0mIlwyRFI-4" target="HiMKSJFquRK0mIlwyRFI-11"> + <mxGeometry relative="1" as="geometry" /> + </mxCell> + <mxCell id="HiMKSJFquRK0mIlwyRFI-4" value="_my_ESS" style="rounded=0;whiteSpace=wrap;html=1;fillColor=#f9f7ed;strokeColor=#CCC1AA;fontColor=#CCC1AA;" vertex="1" parent="1"> + <mxGeometry x="1350" y="100" width="120" height="60" as="geometry" /> + </mxCell> + <mxCell id="HiMKSJFquRK0mIlwyRFI-14" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;entryX=0;entryY=0.5;entryDx=0;entryDy=0;exitX=0.5;exitY=1;exitDx=0;exitDy=0;" edge="1" parent="1" source="HiMKSJFquRK0mIlwyRFI-5" target="HiMKSJFquRK0mIlwyRFI-8"> + <mxGeometry relative="1" as="geometry" /> + </mxCell> + <mxCell id="HiMKSJFquRK0mIlwyRFI-19" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=1;exitY=0.5;exitDx=0;exitDy=0;" edge="1" parent="1" source="HiMKSJFquRK0mIlwyRFI-5" target="HiMKSJFquRK0mIlwyRFI-10"> + <mxGeometry relative="1" as="geometry" /> + </mxCell> + <mxCell id="HiMKSJFquRK0mIlwyRFI-22" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=0.5;exitY=0;exitDx=0;exitDy=0;" edge="1" parent="1" source="HiMKSJFquRK0mIlwyRFI-5" target="HiMKSJFquRK0mIlwyRFI-2"> + <mxGeometry relative="1" as="geometry" /> + </mxCell> + <mxCell id="HiMKSJFquRK0mIlwyRFI-53" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=0.25;exitY=1;exitDx=0;exitDy=0;entryX=1;entryY=0.5;entryDx=0;entryDy=0;" edge="1" parent="1" source="HiMKSJFquRK0mIlwyRFI-5" target="HiMKSJFquRK0mIlwyRFI-52"> + <mxGeometry relative="1" as="geometry" /> + </mxCell> + <mxCell id="HiMKSJFquRK0mIlwyRFI-56" value="if opts_sigma != 'B'" style="edgeLabel;html=1;align=center;verticalAlign=middle;resizable=0;points=[];labelBackgroundColor=#FF9A03;" vertex="1" connectable="0" parent="HiMKSJFquRK0mIlwyRFI-53"> + <mxGeometry x="0.7377" y="1" relative="1" as="geometry"> + <mxPoint as="offset" /> + </mxGeometry> + </mxCell> + <mxCell id="HiMKSJFquRK0mIlwyRFI-5" value="run_sampler" style="rounded=0;whiteSpace=wrap;html=1;strokeWidth=2;" vertex="1" parent="1"> + <mxGeometry x="1350" y="534" width="120" height="60" as="geometry" /> + </mxCell> + <mxCell id="HiMKSJFquRK0mIlwyRFI-20" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=0.5;exitY=0;exitDx=0;exitDy=0;" edge="1" parent="1" source="HiMKSJFquRK0mIlwyRFI-6" target="HiMKSJFquRK0mIlwyRFI-1"> + <mxGeometry relative="1" as="geometry" /> + </mxCell> + <mxCell id="HiMKSJFquRK0mIlwyRFI-6" value="log_prior" style="rounded=0;whiteSpace=wrap;html=1;" vertex="1" parent="1"> + <mxGeometry x="1595" y="510" width="120" height="60" as="geometry" /> + </mxCell> + <mxCell id="HiMKSJFquRK0mIlwyRFI-15" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=0.5;exitY=0;exitDx=0;exitDy=0;" edge="1" parent="1" source="HiMKSJFquRK0mIlwyRFI-7" target="HiMKSJFquRK0mIlwyRFI-9"> + <mxGeometry relative="1" as="geometry" /> + </mxCell> + <mxCell id="HiMKSJFquRK0mIlwyRFI-16" value="always" style="edgeLabel;html=1;align=center;verticalAlign=middle;resizable=0;points=[];" vertex="1" connectable="0" parent="HiMKSJFquRK0mIlwyRFI-15"> + <mxGeometry x="0.0246" y="2" relative="1" as="geometry"> + <mxPoint as="offset" /> + </mxGeometry> + </mxCell> + <mxCell id="HiMKSJFquRK0mIlwyRFI-7" value="log_likelihood" style="rounded=0;whiteSpace=wrap;html=1;" vertex="1" parent="1"> + <mxGeometry x="1760" y="539" width="120" height="60" as="geometry" /> + </mxCell> + <mxCell id="HiMKSJFquRK0mIlwyRFI-12" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=1;exitY=0.5;exitDx=0;exitDy=0;" edge="1" parent="1" source="HiMKSJFquRK0mIlwyRFI-8" target="HiMKSJFquRK0mIlwyRFI-6"> + <mxGeometry relative="1" as="geometry" /> + </mxCell> + <mxCell id="HiMKSJFquRK0mIlwyRFI-17" value="always" style="edgeLabel;html=1;align=center;verticalAlign=middle;resizable=0;points=[];" vertex="1" connectable="0" parent="HiMKSJFquRK0mIlwyRFI-12"> + <mxGeometry x="0.4587" y="4" relative="1" as="geometry"> + <mxPoint as="offset" /> + </mxGeometry> + </mxCell> + <mxCell id="HiMKSJFquRK0mIlwyRFI-13" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=1;exitY=0.5;exitDx=0;exitDy=0;" edge="1" parent="1" source="HiMKSJFquRK0mIlwyRFI-8" target="HiMKSJFquRK0mIlwyRFI-7"> + <mxGeometry relative="1" as="geometry" /> + </mxCell> + <mxCell id="HiMKSJFquRK0mIlwyRFI-18" value="always" style="edgeLabel;html=1;align=center;verticalAlign=middle;resizable=0;points=[];" vertex="1" connectable="0" parent="HiMKSJFquRK0mIlwyRFI-13"> + <mxGeometry x="0.6826" y="4" relative="1" as="geometry"> + <mxPoint as="offset" /> + </mxGeometry> + </mxCell> + <mxCell id="HiMKSJFquRK0mIlwyRFI-8" value="log_posterior" style="rounded=0;whiteSpace=wrap;html=1;" vertex="1" parent="1"> + <mxGeometry x="1480" y="610" width="120" height="60" as="geometry" /> + </mxCell> + <mxCell id="HiMKSJFquRK0mIlwyRFI-9" value="eval_model" style="rounded=0;whiteSpace=wrap;html=1;" vertex="1" parent="1"> + <mxGeometry x="1760" y="400" width="120" height="60" as="geometry" /> + </mxCell> + <mxCell id="HiMKSJFquRK0mIlwyRFI-10" value="train_error_model" style="rounded=0;whiteSpace=wrap;html=1;" vertex="1" parent="1"> + <mxGeometry x="1450" y="420" width="120" height="60" as="geometry" /> + </mxCell> + <mxCell id="HiMKSJFquRK0mIlwyRFI-23" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;fillColor=#f9f7ed;strokeColor=#CCC1AA;fontColor=#CCC1AA;" edge="1" parent="1" source="HiMKSJFquRK0mIlwyRFI-11" target="HiMKSJFquRK0mIlwyRFI-3"> + <mxGeometry relative="1" as="geometry" /> + </mxCell> + <mxCell id="HiMKSJFquRK0mIlwyRFI-11" value="marginal_llk_emcee" style="rounded=0;whiteSpace=wrap;html=1;fillColor=#f9f7ed;strokeColor=#CCC1AA;fontColor=#CCC1AA;" vertex="1" parent="1"> + <mxGeometry x="1870" y="620" width="120" height="60" as="geometry" /> + </mxCell> + <mxCell id="HiMKSJFquRK0mIlwyRFI-25" value="Never used!" style="text;html=1;strokeColor=none;fillColor=none;align=center;verticalAlign=middle;whiteSpace=wrap;rounded=0;fontColor=#CCC1AA;" vertex="1" parent="1"> + <mxGeometry x="1880" y="680" width="100" height="30" as="geometry" /> + </mxCell> + <mxCell id="HiMKSJFquRK0mIlwyRFI-26" value="<p style="margin:0px;margin-top:4px;text-align:center;"><b>BayesModelComp</b></p><hr size="1"><div style="height:2px;"></div>" style="verticalAlign=top;align=left;overflow=fill;fontSize=12;fontFamily=Helvetica;html=1;whiteSpace=wrap;" vertex="1" parent="1"> + <mxGeometry x="-1096" y="380" width="840" height="420" as="geometry" /> + </mxCell> + <mxCell id="HC1H8j6nMwEtLoyIrXXk-9" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=0.5;exitY=1;exitDx=0;exitDy=0;" edge="1" parent="1" source="HiMKSJFquRK0mIlwyRFI-27" target="HC1H8j6nMwEtLoyIrXXk-3"> + <mxGeometry relative="1" as="geometry" /> + </mxCell> + <mxCell id="HC1H8j6nMwEtLoyIrXXk-13" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=1;exitY=0.5;exitDx=0;exitDy=0;entryX=0;entryY=0.75;entryDx=0;entryDy=0;" edge="1" parent="1" source="HiMKSJFquRK0mIlwyRFI-27" target="HC1H8j6nMwEtLoyIrXXk-1"> + <mxGeometry relative="1" as="geometry" /> + </mxCell> + <mxCell id="HC1H8j6nMwEtLoyIrXXk-14" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=0.5;exitY=0;exitDx=0;exitDy=0;" edge="1" parent="1" source="HiMKSJFquRK0mIlwyRFI-27" target="HiMKSJFquRK0mIlwyRFI-31"> + <mxGeometry relative="1" as="geometry" /> + </mxCell> + <mxCell id="HiMKSJFquRK0mIlwyRFI-27" value="model_comparison_all" style="html=1;whiteSpace=wrap;strokeWidth=2;" vertex="1" parent="1"> + <mxGeometry x="-896" y="566" width="160" height="50" as="geometry" /> + </mxCell> + <mxCell id="HiMKSJFquRK0mIlwyRFI-42" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;entryX=0;entryY=0.5;entryDx=0;entryDy=0;" edge="1" parent="1" source="HC1H8j6nMwEtLoyIrXXk-1" target="xary-zVek9Bg-A1b1ZmA-9"> + <mxGeometry relative="1" as="geometry"> + <mxPoint x="-630" y="564" as="sourcePoint" /> + </mxGeometry> + </mxCell> + <mxCell id="HiMKSJFquRK0mIlwyRFI-47" value="always" style="edgeLabel;html=1;align=center;verticalAlign=middle;resizable=0;points=[];" vertex="1" connectable="0" parent="HiMKSJFquRK0mIlwyRFI-42"> + <mxGeometry x="-0.4883" relative="1" as="geometry"> + <mxPoint as="offset" /> + </mxGeometry> + </mxCell> + <mxCell id="HiMKSJFquRK0mIlwyRFI-37" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;" edge="1" parent="1" source="HiMKSJFquRK0mIlwyRFI-29" target="HiMKSJFquRK0mIlwyRFI-30"> + <mxGeometry relative="1" as="geometry" /> + </mxCell> + <mxCell id="HiMKSJFquRK0mIlwyRFI-49" value="if perturbed_data is None" style="edgeLabel;html=1;align=center;verticalAlign=middle;resizable=0;points=[];" vertex="1" connectable="0" parent="HiMKSJFquRK0mIlwyRFI-37"> + <mxGeometry x="-0.0507" y="4" relative="1" as="geometry"> + <mxPoint x="-1" as="offset" /> + </mxGeometry> + </mxCell> + <mxCell id="HiMKSJFquRK0mIlwyRFI-29" value="generate_dataset" style="html=1;whiteSpace=wrap;" vertex="1" parent="1"> + <mxGeometry x="-546" y="566" width="110" height="50" as="geometry" /> + </mxCell> + <mxCell id="HiMKSJFquRK0mIlwyRFI-30" value="_perturb_data" style="html=1;whiteSpace=wrap;" vertex="1" parent="1"> + <mxGeometry x="-376" y="636" width="110" height="50" as="geometry" /> + </mxCell> + <mxCell id="HC1H8j6nMwEtLoyIrXXk-6" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=1;exitY=0.5;exitDx=0;exitDy=0;" edge="1" parent="1" source="HiMKSJFquRK0mIlwyRFI-31" target="HC1H8j6nMwEtLoyIrXXk-1"> + <mxGeometry relative="1" as="geometry" /> + </mxCell> + <mxCell id="HC1H8j6nMwEtLoyIrXXk-10" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=0.5;exitY=0;exitDx=0;exitDy=0;" edge="1" parent="1" source="HiMKSJFquRK0mIlwyRFI-31" target="HiMKSJFquRK0mIlwyRFI-33"> + <mxGeometry relative="1" as="geometry" /> + </mxCell> + <mxCell id="HC1H8j6nMwEtLoyIrXXk-11" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=0;exitY=0.5;exitDx=0;exitDy=0;" edge="1" parent="1" source="HiMKSJFquRK0mIlwyRFI-31" target="HC1H8j6nMwEtLoyIrXXk-2"> + <mxGeometry relative="1" as="geometry" /> + </mxCell> + <mxCell id="HiMKSJFquRK0mIlwyRFI-31" value="cal_model_weight" style="html=1;whiteSpace=wrap;strokeWidth=2;" vertex="1" parent="1"> + <mxGeometry x="-871" y="466" width="110" height="50" as="geometry" /> + </mxCell> + <mxCell id="HiMKSJFquRK0mIlwyRFI-32" value="plot_just_analysis" style="html=1;whiteSpace=wrap;" vertex="1" parent="1"> + <mxGeometry x="-871" y="736" width="110" height="50" as="geometry" /> + </mxCell> + <mxCell id="HiMKSJFquRK0mIlwyRFI-33" value="plot_model_weights" style="html=1;whiteSpace=wrap;" vertex="1" parent="1"> + <mxGeometry x="-1016" y="416" width="110" height="50" as="geometry" /> + </mxCell> + <mxCell id="HiMKSJFquRK0mIlwyRFI-34" value="plot_bayes_factor" style="html=1;whiteSpace=wrap;" vertex="1" parent="1"> + <mxGeometry x="-446" y="431" width="110" height="50" as="geometry" /> + </mxCell> + <mxCell id="HiMKSJFquRK0mIlwyRFI-51" value="<p style="margin:0px;margin-top:4px;text-align:center;"><b>Discrepancy</b></p><hr size="1"><div style="height:2px;"></div>" style="verticalAlign=top;align=left;overflow=fill;fontSize=12;fontFamily=Helvetica;html=1;whiteSpace=wrap;" vertex="1" parent="1"> + <mxGeometry x="360" y="1039.82" width="200" height="130" as="geometry" /> + </mxCell> + <mxCell id="HiMKSJFquRK0mIlwyRFI-52" value="get_sample" style="rounded=0;whiteSpace=wrap;html=1;" vertex="1" parent="1"> + <mxGeometry x="400" y="1079.82" width="120" height="60" as="geometry" /> + </mxCell> + <mxCell id="HC1H8j6nMwEtLoyIrXXk-5" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=1;exitY=0.25;exitDx=0;exitDy=0;" edge="1" parent="1" source="HC1H8j6nMwEtLoyIrXXk-1" target="HiMKSJFquRK0mIlwyRFI-34"> + <mxGeometry relative="1" as="geometry" /> + </mxCell> + <mxCell id="HC1H8j6nMwEtLoyIrXXk-20" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=0.5;exitY=1;exitDx=0;exitDy=0;" edge="1" parent="1" source="HC1H8j6nMwEtLoyIrXXk-1" target="HC1H8j6nMwEtLoyIrXXk-17"> + <mxGeometry relative="1" as="geometry" /> + </mxCell> + <mxCell id="HC1H8j6nMwEtLoyIrXXk-21" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=1;exitY=0.75;exitDx=0;exitDy=0;" edge="1" parent="1" source="HC1H8j6nMwEtLoyIrXXk-1" target="HiMKSJFquRK0mIlwyRFI-29"> + <mxGeometry relative="1" as="geometry" /> + </mxCell> + <mxCell id="HC1H8j6nMwEtLoyIrXXk-1" value="calc_bayes_factors" style="html=1;whiteSpace=wrap;strokeWidth=2;" vertex="1" parent="1"> + <mxGeometry x="-666" y="466" width="110" height="50" as="geometry" /> + </mxCell> + <mxCell id="HC1H8j6nMwEtLoyIrXXk-2" value="calc_model_weights" style="html=1;whiteSpace=wrap;" vertex="1" parent="1"> + <mxGeometry x="-1066" y="566" width="130" height="50" as="geometry" /> + </mxCell> + <mxCell id="HC1H8j6nMwEtLoyIrXXk-4" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=0.5;exitY=1;exitDx=0;exitDy=0;" edge="1" parent="1" source="HC1H8j6nMwEtLoyIrXXk-3" target="HiMKSJFquRK0mIlwyRFI-32"> + <mxGeometry relative="1" as="geometry" /> + </mxCell> + <mxCell id="HC1H8j6nMwEtLoyIrXXk-12" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=0;exitY=0.5;exitDx=0;exitDy=0;" edge="1" parent="1" source="HC1H8j6nMwEtLoyIrXXk-3" target="HC1H8j6nMwEtLoyIrXXk-2"> + <mxGeometry relative="1" as="geometry" /> + </mxCell> + <mxCell id="HC1H8j6nMwEtLoyIrXXk-16" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=1;exitY=0.75;exitDx=0;exitDy=0;entryX=0;entryY=0.5;entryDx=0;entryDy=0;" edge="1" parent="1" source="HC1H8j6nMwEtLoyIrXXk-3" target="xary-zVek9Bg-A1b1ZmA-9"> + <mxGeometry relative="1" as="geometry" /> + </mxCell> + <mxCell id="HC1H8j6nMwEtLoyIrXXk-23" value="always" style="edgeLabel;html=1;align=center;verticalAlign=middle;resizable=0;points=[];" vertex="1" connectable="0" parent="HC1H8j6nMwEtLoyIrXXk-16"> + <mxGeometry x="-0.5478" y="3" relative="1" as="geometry"> + <mxPoint as="offset" /> + </mxGeometry> + </mxCell> + <mxCell id="HC1H8j6nMwEtLoyIrXXk-18" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=1;exitY=0.25;exitDx=0;exitDy=0;" edge="1" parent="1" source="HC1H8j6nMwEtLoyIrXXk-3" target="HC1H8j6nMwEtLoyIrXXk-17"> + <mxGeometry relative="1" as="geometry" /> + </mxCell> + <mxCell id="HC1H8j6nMwEtLoyIrXXk-22" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=1;exitY=0.5;exitDx=0;exitDy=0;" edge="1" parent="1" source="HC1H8j6nMwEtLoyIrXXk-3" target="HiMKSJFquRK0mIlwyRFI-29"> + <mxGeometry relative="1" as="geometry" /> + </mxCell> + <mxCell id="HC1H8j6nMwEtLoyIrXXk-3" value="calc_justifiability_analysis" style="html=1;whiteSpace=wrap;strokeWidth=2;" vertex="1" parent="1"> + <mxGeometry x="-896" y="666" width="160" height="50" as="geometry" /> + </mxCell> + <mxCell id="HC1H8j6nMwEtLoyIrXXk-17" value="setup" style="html=1;whiteSpace=wrap;" vertex="1" parent="1"> + <mxGeometry x="-666" y="566" width="110" height="50" as="geometry" /> + </mxCell> + </root> + </mxGraphModel> + </diagram> + <diagram id="sQf09xvhinkT827TE7Va" name="Function structure Engine"> + <mxGraphModel dx="1436" dy="968" grid="1" gridSize="10" guides="1" tooltips="1" connect="1" arrows="1" fold="1" page="1" pageScale="1" pageWidth="850" pageHeight="1100" math="0" shadow="0"> + <root> + <mxCell id="0" /> + <mxCell id="1" parent="0" /> + <mxCell id="JXjM7l_erEiZMkSmYBvl-1" value="<p style="margin:0px;margin-top:4px;text-align:center;"><b>Engine</b></p><hr size="1"><div style="height:2px;"></div>" style="verticalAlign=top;align=left;overflow=fill;fontSize=12;fontFamily=Helvetica;html=1;whiteSpace=wrap;" vertex="1" parent="1"> + <mxGeometry x="130" y="140" width="1390" height="690" as="geometry" /> + </mxCell> + <mxCell id="JXjM7l_erEiZMkSmYBvl-2" value="hellinger_distance" style="html=1;whiteSpace=wrap;" vertex="1" parent="1"> + <mxGeometry x="1340" y="50" width="110" height="50" as="geometry" /> + </mxCell> + <mxCell id="JXjM7l_erEiZMkSmYBvl-3" value="logpdf" style="html=1;whiteSpace=wrap;" vertex="1" parent="1"> + <mxGeometry x="1050" y="50" width="110" height="50" as="geometry" /> + </mxCell> + <mxCell id="JXjM7l_erEiZMkSmYBvl-4" value="subdomain" style="html=1;whiteSpace=wrap;" vertex="1" parent="1"> + <mxGeometry x="625" y="50" width="110" height="50" as="geometry" /> + </mxCell> + <mxCell id="JXjM7l_erEiZMkSmYBvl-5" value="start_engine" style="html=1;whiteSpace=wrap;" vertex="1" parent="1"> + <mxGeometry x="250" y="680" width="110" height="50" as="geometry" /> + </mxCell> + <mxCell id="JXjM7l_erEiZMkSmYBvl-32" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=1;exitY=0.5;exitDx=0;exitDy=0;" edge="1" parent="1" source="JXjM7l_erEiZMkSmYBvl-6" target="JXjM7l_erEiZMkSmYBvl-5"> + <mxGeometry relative="1" as="geometry" /> + </mxCell> + <mxCell id="JXjM7l_erEiZMkSmYBvl-6" value="train_normal" style="html=1;whiteSpace=wrap;strokeWidth=2;" vertex="1" parent="1"> + <mxGeometry x="170" y="420" width="110" height="50" as="geometry" /> + </mxCell> + <mxCell id="JXjM7l_erEiZMkSmYBvl-10" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=1;exitY=0.5;exitDx=0;exitDy=0;" edge="1" parent="1" source="JXjM7l_erEiZMkSmYBvl-7" target="JXjM7l_erEiZMkSmYBvl-9"> + <mxGeometry relative="1" as="geometry"> + <mxPoint x="335" y="335" as="targetPoint" /> + </mxGeometry> + </mxCell> + <mxCell id="JXjM7l_erEiZMkSmYBvl-33" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=0.5;exitY=1;exitDx=0;exitDy=0;" edge="1" parent="1" source="JXjM7l_erEiZMkSmYBvl-7" target="JXjM7l_erEiZMkSmYBvl-6"> + <mxGeometry relative="1" as="geometry" /> + </mxCell> + <mxCell id="JXjM7l_erEiZMkSmYBvl-7" value="train_sequential" style="html=1;whiteSpace=wrap;strokeWidth=2;" vertex="1" parent="1"> + <mxGeometry x="170" y="310" width="110" height="50" as="geometry" /> + </mxCell> + <mxCell id="JXjM7l_erEiZMkSmYBvl-8" value="eval_metamodel" style="html=1;whiteSpace=wrap;strokeWidth=2;" vertex="1" parent="1"> + <mxGeometry x="190" y="210" width="110" height="50" as="geometry" /> + </mxCell> + <mxCell id="W5_FOelZ0qj-h3Gb0n3K-7" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=1;exitY=0.5;exitDx=0;exitDy=0;" edge="1" parent="1" source="JXjM7l_erEiZMkSmYBvl-9" target="JXjM7l_erEiZMkSmYBvl-18"> + <mxGeometry relative="1" as="geometry" /> + </mxCell> + <mxCell id="W5_FOelZ0qj-h3Gb0n3K-19" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=0.5;exitY=1;exitDx=0;exitDy=0;entryX=0;entryY=0.5;entryDx=0;entryDy=0;" edge="1" parent="1" source="JXjM7l_erEiZMkSmYBvl-9" target="JXjM7l_erEiZMkSmYBvl-23"> + <mxGeometry relative="1" as="geometry" /> + </mxCell> + <mxCell id="W5_FOelZ0qj-h3Gb0n3K-20" value="if len(obs_data) != 0" style="edgeLabel;html=1;align=center;verticalAlign=middle;resizable=0;points=[];" vertex="1" connectable="0" parent="W5_FOelZ0qj-h3Gb0n3K-19"> + <mxGeometry x="0.8137" relative="1" as="geometry"> + <mxPoint x="-57" as="offset" /> + </mxGeometry> + </mxCell> + <mxCell id="W5_FOelZ0qj-h3Gb0n3K-21" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=0.5;exitY=0;exitDx=0;exitDy=0;entryX=0.25;entryY=1;entryDx=0;entryDy=0;" edge="1" parent="1" source="JXjM7l_erEiZMkSmYBvl-9" target="JXjM7l_erEiZMkSmYBvl-24"> + <mxGeometry relative="1" as="geometry" /> + </mxCell> + <mxCell id="W5_FOelZ0qj-h3Gb0n3K-22" value="if len(obs_data) != 0" style="edgeLabel;html=1;align=center;verticalAlign=middle;resizable=0;points=[];" vertex="1" connectable="0" parent="W5_FOelZ0qj-h3Gb0n3K-21"> + <mxGeometry x="0.7684" y="3" relative="1" as="geometry"> + <mxPoint x="1" as="offset" /> + </mxGeometry> + </mxCell> + <mxCell id="W5_FOelZ0qj-h3Gb0n3K-23" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=0.5;exitY=1;exitDx=0;exitDy=0;entryX=0;entryY=0.5;entryDx=0;entryDy=0;" edge="1" parent="1" source="JXjM7l_erEiZMkSmYBvl-9" target="JXjM7l_erEiZMkSmYBvl-25"> + <mxGeometry relative="1" as="geometry" /> + </mxCell> + <mxCell id="W5_FOelZ0qj-h3Gb0n3K-24" value="if expdes.valid_model_runs" style="edgeLabel;html=1;align=center;verticalAlign=middle;resizable=0;points=[];" vertex="1" connectable="0" parent="W5_FOelZ0qj-h3Gb0n3K-23"> + <mxGeometry x="0.606" y="3" relative="1" as="geometry"> + <mxPoint x="-16" y="3" as="offset" /> + </mxGeometry> + </mxCell> + <mxCell id="W5_FOelZ0qj-h3Gb0n3K-25" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=0.5;exitY=1;exitDx=0;exitDy=0;entryX=0;entryY=0.5;entryDx=0;entryDy=0;" edge="1" parent="1" source="JXjM7l_erEiZMkSmYBvl-9" target="JXjM7l_erEiZMkSmYBvl-26"> + <mxGeometry relative="1" as="geometry" /> + </mxCell> + <mxCell id="W5_FOelZ0qj-h3Gb0n3K-26" value="if mc_ref and pce" style="edgeLabel;html=1;align=center;verticalAlign=middle;resizable=0;points=[];" vertex="1" connectable="0" parent="W5_FOelZ0qj-h3Gb0n3K-25"> + <mxGeometry x="0.7094" y="-3" relative="1" as="geometry"> + <mxPoint x="-31" y="-3" as="offset" /> + </mxGeometry> + </mxCell> + <mxCell id="JXjM7l_erEiZMkSmYBvl-9" value="train_seq_design" style="html=1;whiteSpace=wrap;" vertex="1" parent="1"> + <mxGeometry x="315" y="310" width="110" height="50" as="geometry" /> + </mxCell> + <mxCell id="JXjM7l_erEiZMkSmYBvl-12" value="util_VarBasedDesign" style="html=1;whiteSpace=wrap;" vertex="1" parent="1"> + <mxGeometry x="670" y="648" width="130" height="50" as="geometry" /> + </mxCell> + <mxCell id="JXjM7l_erEiZMkSmYBvl-28" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=0.75;exitY=0;exitDx=0;exitDy=0;" edge="1" parent="1" source="JXjM7l_erEiZMkSmYBvl-13" target="JXjM7l_erEiZMkSmYBvl-3"> + <mxGeometry relative="1" as="geometry" /> + </mxCell> + <mxCell id="JXjM7l_erEiZMkSmYBvl-31" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;" edge="1" parent="1" source="JXjM7l_erEiZMkSmYBvl-13" target="JXjM7l_erEiZMkSmYBvl-5"> + <mxGeometry relative="1" as="geometry" /> + </mxCell> + <mxCell id="JXjM7l_erEiZMkSmYBvl-38" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=0.75;exitY=1;exitDx=0;exitDy=0;" edge="1" parent="1" source="JXjM7l_erEiZMkSmYBvl-15" target="JXjM7l_erEiZMkSmYBvl-13"> + <mxGeometry relative="1" as="geometry" /> + </mxCell> + <mxCell id="JXjM7l_erEiZMkSmYBvl-39" value="if method == 'bayesactdesign'" style="edgeLabel;html=1;align=center;verticalAlign=middle;resizable=0;points=[];labelBackgroundColor=default;" vertex="1" connectable="0" parent="JXjM7l_erEiZMkSmYBvl-38"> + <mxGeometry x="-0.6235" y="2" relative="1" as="geometry"> + <mxPoint x="289" y="2" as="offset" /> + </mxGeometry> + </mxCell> + <mxCell id="W5_FOelZ0qj-h3Gb0n3K-12" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=1;exitY=0.5;exitDx=0;exitDy=0;" edge="1" parent="1" source="JXjM7l_erEiZMkSmYBvl-13" target="JXjM7l_erEiZMkSmYBvl-21"> + <mxGeometry relative="1" as="geometry" /> + </mxCell> + <mxCell id="W5_FOelZ0qj-h3Gb0n3K-15" value="always" style="edgeLabel;html=1;align=center;verticalAlign=middle;resizable=0;points=[];" vertex="1" connectable="0" parent="W5_FOelZ0qj-h3Gb0n3K-12"> + <mxGeometry x="0.7865" y="4" relative="1" as="geometry"> + <mxPoint x="-91" y="185" as="offset" /> + </mxGeometry> + </mxCell> + <mxCell id="JXjM7l_erEiZMkSmYBvl-13" value="util_BayesianActiveDesign" style="html=1;whiteSpace=wrap;" vertex="1" parent="1"> + <mxGeometry x="1020" y="680" width="150" height="50" as="geometry" /> + </mxCell> + <mxCell id="JXjM7l_erEiZMkSmYBvl-34" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=0;exitY=0.5;exitDx=0;exitDy=0;" edge="1" parent="1" source="JXjM7l_erEiZMkSmYBvl-14" target="JXjM7l_erEiZMkSmYBvl-6"> + <mxGeometry relative="1" as="geometry" /> + </mxCell> + <mxCell id="W5_FOelZ0qj-h3Gb0n3K-13" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=1;exitY=0.5;exitDx=0;exitDy=0;" edge="1" parent="1" source="JXjM7l_erEiZMkSmYBvl-14" target="JXjM7l_erEiZMkSmYBvl-21"> + <mxGeometry relative="1" as="geometry" /> + </mxCell> + <mxCell id="W5_FOelZ0qj-h3Gb0n3K-16" value="always" style="edgeLabel;html=1;align=center;verticalAlign=middle;resizable=0;points=[];" vertex="1" connectable="0" parent="W5_FOelZ0qj-h3Gb0n3K-13"> + <mxGeometry x="0.197" y="-3" relative="1" as="geometry"> + <mxPoint x="-1" as="offset" /> + </mxGeometry> + </mxCell> + <mxCell id="JXjM7l_erEiZMkSmYBvl-14" value="utilBayesianDesign" style="html=1;whiteSpace=wrap;" vertex="1" parent="1"> + <mxGeometry x="880" y="730" width="110" height="50" as="geometry" /> + </mxCell> + <mxCell id="JXjM7l_erEiZMkSmYBvl-37" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=0.25;exitY=1;exitDx=0;exitDy=0;entryX=0.5;entryY=0;entryDx=0;entryDy=0;" edge="1" parent="1" source="JXjM7l_erEiZMkSmYBvl-15" target="JXjM7l_erEiZMkSmYBvl-12"> + <mxGeometry relative="1" as="geometry" /> + </mxCell> + <mxCell id="JXjM7l_erEiZMkSmYBvl-42" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=0.5;exitY=1;exitDx=0;exitDy=0;" edge="1" parent="1" source="JXjM7l_erEiZMkSmYBvl-15" target="JXjM7l_erEiZMkSmYBvl-14"> + <mxGeometry relative="1" as="geometry" /> + </mxCell> + <mxCell id="JXjM7l_erEiZMkSmYBvl-43" value="if method == 'bayesoptdesign'" style="edgeLabel;html=1;align=center;verticalAlign=middle;resizable=0;points=[];" vertex="1" connectable="0" parent="JXjM7l_erEiZMkSmYBvl-42"> + <mxGeometry x="0.6143" y="-3" relative="1" as="geometry"> + <mxPoint x="3" y="29" as="offset" /> + </mxGeometry> + </mxCell> + <mxCell id="JXjM7l_erEiZMkSmYBvl-15" value="run_util_func" style="html=1;whiteSpace=wrap;" vertex="1" parent="1"> + <mxGeometry x="660" y="450" width="110" height="50" as="geometry" /> + </mxCell> + <mxCell id="JXjM7l_erEiZMkSmYBvl-36" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=0.25;exitY=1;exitDx=0;exitDy=0;" edge="1" parent="1" source="JXjM7l_erEiZMkSmYBvl-16" target="JXjM7l_erEiZMkSmYBvl-12"> + <mxGeometry relative="1" as="geometry" /> + </mxCell> + <mxCell id="JXjM7l_erEiZMkSmYBvl-41" value="if method == 'varoptdesign'" style="edgeLabel;html=1;align=center;verticalAlign=middle;resizable=0;points=[];" vertex="1" connectable="0" parent="JXjM7l_erEiZMkSmYBvl-36"> + <mxGeometry x="-0.5992" relative="1" as="geometry"> + <mxPoint x="-197" y="62" as="offset" /> + </mxGeometry> + </mxCell> + <mxCell id="JXjM7l_erEiZMkSmYBvl-44" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;" edge="1" parent="1" source="JXjM7l_erEiZMkSmYBvl-16" target="JXjM7l_erEiZMkSmYBvl-13"> + <mxGeometry relative="1" as="geometry"> + <Array as="points"> + <mxPoint x="965" y="590" /> + <mxPoint x="1095" y="590" /> + </Array> + </mxGeometry> + </mxCell> + <mxCell id="W5_FOelZ0qj-h3Gb0n3K-27" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;" edge="1" parent="1" source="JXjM7l_erEiZMkSmYBvl-16" target="JXjM7l_erEiZMkSmYBvl-14"> + <mxGeometry relative="1" as="geometry" /> + </mxCell> + <mxCell id="JXjM7l_erEiZMkSmYBvl-16" value="dual_annealing" style="html=1;whiteSpace=wrap;" vertex="1" parent="1"> + <mxGeometry x="910" y="450" width="110" height="50" as="geometry" /> + </mxCell> + <mxCell id="W5_FOelZ0qj-h3Gb0n3K-5" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;entryX=1;entryY=0.5;entryDx=0;entryDy=0;" edge="1" parent="1" source="JXjM7l_erEiZMkSmYBvl-17" target="JXjM7l_erEiZMkSmYBvl-18"> + <mxGeometry relative="1" as="geometry" /> + </mxCell> + <mxCell id="W5_FOelZ0qj-h3Gb0n3K-6" value="if exploit _method is 'bayesoptdesign',<br style="border-color: var(--border-color);">'bayesactdesign' or 'varoptdesign'" style="edgeLabel;html=1;align=center;verticalAlign=middle;resizable=0;points=[];" vertex="1" connectable="0" parent="W5_FOelZ0qj-h3Gb0n3K-5"> + <mxGeometry x="0.1312" y="2" relative="1" as="geometry"> + <mxPoint x="17" y="-2" as="offset" /> + </mxGeometry> + </mxCell> + <mxCell id="JXjM7l_erEiZMkSmYBvl-17" value="tradeoff_weights" style="html=1;whiteSpace=wrap;" vertex="1" parent="1"> + <mxGeometry x="980" y="210" width="110" height="50" as="geometry" /> + </mxCell> + <mxCell id="JXjM7l_erEiZMkSmYBvl-30" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=0.5;exitY=0;exitDx=0;exitDy=0;" edge="1" parent="1" source="JXjM7l_erEiZMkSmYBvl-18" target="JXjM7l_erEiZMkSmYBvl-4"> + <mxGeometry relative="1" as="geometry" /> + </mxCell> + <mxCell id="W5_FOelZ0qj-h3Gb0n3K-1" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=0.75;exitY=1;exitDx=0;exitDy=0;" edge="1" parent="1" source="JXjM7l_erEiZMkSmYBvl-18" target="JXjM7l_erEiZMkSmYBvl-15"> + <mxGeometry relative="1" as="geometry"> + <mxPoint x="790" y="280.0000000000002" as="sourcePoint" /> + <mxPoint x="690" y="499.9999999999998" as="targetPoint" /> + </mxGeometry> + </mxCell> + <mxCell id="W5_FOelZ0qj-h3Gb0n3K-2" value="if exploit _method is 'bayesoptdesign',<br>'bayesactdesign' or 'varoptdesign'" style="edgeLabel;html=1;align=center;verticalAlign=middle;resizable=0;points=[];" vertex="1" connectable="0" parent="W5_FOelZ0qj-h3Gb0n3K-1"> + <mxGeometry x="0.1579" relative="1" as="geometry"> + <mxPoint x="-15" y="49" as="offset" /> + </mxGeometry> + </mxCell> + <mxCell id="W5_FOelZ0qj-h3Gb0n3K-3" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=0.75;exitY=1;exitDx=0;exitDy=0;" edge="1" parent="1" source="JXjM7l_erEiZMkSmYBvl-18" target="JXjM7l_erEiZMkSmYBvl-16"> + <mxGeometry relative="1" as="geometry"> + <mxPoint x="680" y="205.05882352941194" as="sourcePoint" /> + <mxPoint x="805" y="779.9999999999998" as="targetPoint" /> + </mxGeometry> + </mxCell> + <mxCell id="W5_FOelZ0qj-h3Gb0n3K-4" value="if explore_method == 'dual annealing'" style="edgeLabel;html=1;align=center;verticalAlign=middle;resizable=0;points=[];" vertex="1" connectable="0" parent="W5_FOelZ0qj-h3Gb0n3K-3"> + <mxGeometry x="-0.6061" relative="1" as="geometry"> + <mxPoint x="270" y="46" as="offset" /> + </mxGeometry> + </mxCell> + <mxCell id="W5_FOelZ0qj-h3Gb0n3K-9" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;" edge="1" parent="1" source="JXjM7l_erEiZMkSmYBvl-18" target="JXjM7l_erEiZMkSmYBvl-20"> + <mxGeometry relative="1" as="geometry" /> + </mxCell> + <mxCell id="W5_FOelZ0qj-h3Gb0n3K-10" value="if exploit_method == 'alphabetic'" style="edgeLabel;html=1;align=center;verticalAlign=middle;resizable=0;points=[];" vertex="1" connectable="0" parent="W5_FOelZ0qj-h3Gb0n3K-9"> + <mxGeometry x="0.8144" y="1" relative="1" as="geometry"> + <mxPoint x="74" y="-1" as="offset" /> + </mxGeometry> + </mxCell> + <mxCell id="JXjM7l_erEiZMkSmYBvl-18" value="choose_next_sample" style="html=1;whiteSpace=wrap;" vertex="1" parent="1"> + <mxGeometry x="610" y="210" width="140" height="50" as="geometry" /> + </mxCell> + <mxCell id="JXjM7l_erEiZMkSmYBvl-20" value="util_AlphOptDesign" style="html=1;whiteSpace=wrap;" vertex="1" parent="1"> + <mxGeometry x="330" y="210" width="110" height="50" as="geometry" /> + </mxCell> + <mxCell id="JXjM7l_erEiZMkSmYBvl-21" value="_normpdf" style="html=1;whiteSpace=wrap;" vertex="1" parent="1"> + <mxGeometry x="1340" y="430" width="110" height="50" as="geometry" /> + </mxCell> + <mxCell id="JXjM7l_erEiZMkSmYBvl-29" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;" edge="1" parent="1" source="JXjM7l_erEiZMkSmYBvl-22" target="JXjM7l_erEiZMkSmYBvl-3"> + <mxGeometry relative="1" as="geometry" /> + </mxCell> + <mxCell id="JXjM7l_erEiZMkSmYBvl-22" value="_corr_factor_BME" style="html=1;whiteSpace=wrap;" vertex="1" parent="1"> + <mxGeometry x="1130" y="220" width="110" height="50" as="geometry" /> + </mxCell> + <mxCell id="JXjM7l_erEiZMkSmYBvl-23" value="_posteriorPlot" style="html=1;whiteSpace=wrap;" vertex="1" parent="1"> + <mxGeometry x="520" y="440" width="110" height="50" as="geometry" /> + </mxCell> + <mxCell id="JXjM7l_erEiZMkSmYBvl-27" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=0.5;exitY=0;exitDx=0;exitDy=0;" edge="1" parent="1" source="JXjM7l_erEiZMkSmYBvl-24" target="JXjM7l_erEiZMkSmYBvl-2"> + <mxGeometry relative="1" as="geometry" /> + </mxCell> + <mxCell id="W5_FOelZ0qj-h3Gb0n3K-11" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=0.5;exitY=1;exitDx=0;exitDy=0;entryX=0.5;entryY=0;entryDx=0;entryDy=0;" edge="1" parent="1" source="JXjM7l_erEiZMkSmYBvl-24" target="JXjM7l_erEiZMkSmYBvl-21"> + <mxGeometry relative="1" as="geometry" /> + </mxCell> + <mxCell id="W5_FOelZ0qj-h3Gb0n3K-14" value="always" style="edgeLabel;html=1;align=center;verticalAlign=middle;resizable=0;points=[];" vertex="1" connectable="0" parent="W5_FOelZ0qj-h3Gb0n3K-11"> + <mxGeometry x="0.0929" y="-1" relative="1" as="geometry"> + <mxPoint as="offset" /> + </mxGeometry> + </mxCell> + <mxCell id="W5_FOelZ0qj-h3Gb0n3K-17" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=0;exitY=0.5;exitDx=0;exitDy=0;" edge="1" parent="1" source="JXjM7l_erEiZMkSmYBvl-24" target="JXjM7l_erEiZMkSmYBvl-22"> + <mxGeometry relative="1" as="geometry" /> + </mxCell> + <mxCell id="W5_FOelZ0qj-h3Gb0n3K-18" value="commented out?" style="edgeLabel;html=1;align=center;verticalAlign=middle;resizable=0;points=[];" vertex="1" connectable="0" parent="W5_FOelZ0qj-h3Gb0n3K-17"> + <mxGeometry x="-0.1477" y="3" relative="1" as="geometry"> + <mxPoint as="offset" /> + </mxGeometry> + </mxCell> + <mxCell id="JXjM7l_erEiZMkSmYBvl-24" value="_BME_Calculator" style="html=1;whiteSpace=wrap;" vertex="1" parent="1"> + <mxGeometry x="1340" y="220" width="110" height="50" as="geometry" /> + </mxCell> + <mxCell id="JXjM7l_erEiZMkSmYBvl-25" value="_validError" style="html=1;whiteSpace=wrap;" vertex="1" parent="1"> + <mxGeometry x="520" y="510" width="110" height="50" as="geometry" /> + </mxCell> + <mxCell id="JXjM7l_erEiZMkSmYBvl-26" value="_error_Mean_Std" style="html=1;whiteSpace=wrap;" vertex="1" parent="1"> + <mxGeometry x="520" y="580" width="110" height="50" as="geometry" /> + </mxCell> + </root> + </mxGraphModel> + </diagram> + <diagram id="ME5gyYpVqUByTnAIOcMV" name="Parameter and function interaction"> + <mxGraphModel dx="2049" dy="1366" grid="1" gridSize="10" guides="1" tooltips="1" connect="1" arrows="1" fold="1" page="1" pageScale="1" pageWidth="850" pageHeight="1100" math="0" shadow="0"> + <root> + <mxCell id="0" /> + <mxCell id="1" parent="0" /> + <mxCell id="K5oJ7VEt7dPmeK6pba1f-33" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=1;exitY=0.5;exitDx=0;exitDy=0;entryX=0.5;entryY=1;entryDx=0;entryDy=0;" edge="1" parent="1" source="K5oJ7VEt7dPmeK6pba1f-1" target="K5oJ7VEt7dPmeK6pba1f-32"> + <mxGeometry relative="1" as="geometry" /> + </mxCell> + <mxCell id="K5oJ7VEt7dPmeK6pba1f-54" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=1;exitY=0.5;exitDx=0;exitDy=0;entryX=0.5;entryY=1;entryDx=0;entryDy=0;" edge="1" parent="1" source="K5oJ7VEt7dPmeK6pba1f-1" target="K5oJ7VEt7dPmeK6pba1f-53"> + <mxGeometry relative="1" as="geometry" /> + </mxCell> + <mxCell id="K5oJ7VEt7dPmeK6pba1f-61" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=1;exitY=0.5;exitDx=0;exitDy=0;entryX=0.5;entryY=1;entryDx=0;entryDy=0;" edge="1" parent="1" source="K5oJ7VEt7dPmeK6pba1f-1" target="K5oJ7VEt7dPmeK6pba1f-60"> + <mxGeometry relative="1" as="geometry" /> + </mxCell> + <mxCell id="K5oJ7VEt7dPmeK6pba1f-1" value="engine" style="rounded=0;whiteSpace=wrap;html=1;" vertex="1" parent="1"> + <mxGeometry x="40" y="160" width="120" height="60" as="geometry" /> + </mxCell> + <mxCell id="K5oJ7VEt7dPmeK6pba1f-3" value="Discrepancy" style="rounded=0;whiteSpace=wrap;html=1;" vertex="1" parent="1"> + <mxGeometry x="40" y="240" width="120" height="60" as="geometry" /> + </mxCell> + <mxCell id="K5oJ7VEt7dPmeK6pba1f-71" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=1;exitY=0.5;exitDx=0;exitDy=0;" edge="1" parent="1" source="K5oJ7VEt7dPmeK6pba1f-4" target="K5oJ7VEt7dPmeK6pba1f-60"> + <mxGeometry relative="1" as="geometry" /> + </mxCell> + <mxCell id="K5oJ7VEt7dPmeK6pba1f-4" value="emulator" style="rounded=0;whiteSpace=wrap;html=1;" vertex="1" parent="1"> + <mxGeometry x="40" y="320" width="120" height="60" as="geometry" /> + </mxCell> + <mxCell id="K5oJ7VEt7dPmeK6pba1f-37" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=1;exitY=0.5;exitDx=0;exitDy=0;" edge="1" parent="1" source="K5oJ7VEt7dPmeK6pba1f-5" target="K5oJ7VEt7dPmeK6pba1f-32"> + <mxGeometry relative="1" as="geometry" /> + </mxCell> + <mxCell id="K5oJ7VEt7dPmeK6pba1f-57" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=1;exitY=0.5;exitDx=0;exitDy=0;" edge="1" parent="1" source="K5oJ7VEt7dPmeK6pba1f-5" target="K5oJ7VEt7dPmeK6pba1f-53"> + <mxGeometry relative="1" as="geometry" /> + </mxCell> + <mxCell id="K5oJ7VEt7dPmeK6pba1f-65" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=1;exitY=0.5;exitDx=0;exitDy=0;" edge="1" parent="1" source="K5oJ7VEt7dPmeK6pba1f-5" target="K5oJ7VEt7dPmeK6pba1f-60"> + <mxGeometry relative="1" as="geometry" /> + </mxCell> + <mxCell id="K5oJ7VEt7dPmeK6pba1f-5" value="name" style="rounded=0;whiteSpace=wrap;html=1;" vertex="1" parent="1"> + <mxGeometry x="40" y="400" width="120" height="60" as="geometry" /> + </mxCell> + <mxCell id="K5oJ7VEt7dPmeK6pba1f-47" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=1;exitY=0.5;exitDx=0;exitDy=0;entryX=0.5;entryY=1;entryDx=0;entryDy=0;" edge="1" parent="1" source="K5oJ7VEt7dPmeK6pba1f-6" target="K5oJ7VEt7dPmeK6pba1f-32"> + <mxGeometry relative="1" as="geometry" /> + </mxCell> + <mxCell id="K5oJ7VEt7dPmeK6pba1f-6" value="bootstrap" style="rounded=0;whiteSpace=wrap;html=1;" vertex="1" parent="1"> + <mxGeometry x="40" y="480" width="120" height="60" as="geometry" /> + </mxCell> + <mxCell id="K5oJ7VEt7dPmeK6pba1f-7" value="req_outputs" style="rounded=0;whiteSpace=wrap;html=1;" vertex="1" parent="1"> + <mxGeometry x="40" y="560" width="120" height="60" as="geometry" /> + </mxCell> + <mxCell id="K5oJ7VEt7dPmeK6pba1f-79" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=1;exitY=0.5;exitDx=0;exitDy=0;" edge="1" parent="1" source="K5oJ7VEt7dPmeK6pba1f-8" target="K5oJ7VEt7dPmeK6pba1f-60"> + <mxGeometry relative="1" as="geometry" /> + </mxCell> + <mxCell id="K5oJ7VEt7dPmeK6pba1f-8" value="selected_indices" style="rounded=0;whiteSpace=wrap;html=1;" vertex="1" parent="1"> + <mxGeometry x="40" y="640" width="120" height="60" as="geometry" /> + </mxCell> + <mxCell id="K5oJ7VEt7dPmeK6pba1f-35" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=1;exitY=0.5;exitDx=0;exitDy=0;" edge="1" parent="1" source="K5oJ7VEt7dPmeK6pba1f-9" target="K5oJ7VEt7dPmeK6pba1f-32"> + <mxGeometry relative="1" as="geometry" /> + </mxCell> + <mxCell id="K5oJ7VEt7dPmeK6pba1f-55" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=1;exitY=0.5;exitDx=0;exitDy=0;" edge="1" parent="1" source="K5oJ7VEt7dPmeK6pba1f-9" target="K5oJ7VEt7dPmeK6pba1f-53"> + <mxGeometry relative="1" as="geometry" /> + </mxCell> + <mxCell id="K5oJ7VEt7dPmeK6pba1f-67" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=1;exitY=0.5;exitDx=0;exitDy=0;" edge="1" parent="1" source="K5oJ7VEt7dPmeK6pba1f-9" target="K5oJ7VEt7dPmeK6pba1f-60"> + <mxGeometry relative="1" as="geometry" /> + </mxCell> + <mxCell id="K5oJ7VEt7dPmeK6pba1f-9" value="prior_samples" style="rounded=0;whiteSpace=wrap;html=1;" vertex="1" parent="1"> + <mxGeometry x="40" y="720" width="120" height="60" as="geometry" /> + </mxCell> + <mxCell id="K5oJ7VEt7dPmeK6pba1f-36" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=1;exitY=0.5;exitDx=0;exitDy=0;" edge="1" parent="1" source="K5oJ7VEt7dPmeK6pba1f-11" target="K5oJ7VEt7dPmeK6pba1f-32"> + <mxGeometry relative="1" as="geometry" /> + </mxCell> + <mxCell id="K5oJ7VEt7dPmeK6pba1f-68" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=1;exitY=0.5;exitDx=0;exitDy=0;" edge="1" parent="1" source="K5oJ7VEt7dPmeK6pba1f-11" target="K5oJ7VEt7dPmeK6pba1f-60"> + <mxGeometry relative="1" as="geometry" /> + </mxCell> + <mxCell id="K5oJ7VEt7dPmeK6pba1f-11" value="n_prior_samples" style="rounded=0;whiteSpace=wrap;html=1;" vertex="1" parent="1"> + <mxGeometry x="40" y="800" width="120" height="60" as="geometry" /> + </mxCell> + <mxCell id="K5oJ7VEt7dPmeK6pba1f-38" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=1;exitY=0.5;exitDx=0;exitDy=0;" edge="1" parent="1" source="K5oJ7VEt7dPmeK6pba1f-12" target="K5oJ7VEt7dPmeK6pba1f-32"> + <mxGeometry relative="1" as="geometry" /> + </mxCell> + <mxCell id="K5oJ7VEt7dPmeK6pba1f-80" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=1;exitY=0.5;exitDx=0;exitDy=0;" edge="1" parent="1" source="K5oJ7VEt7dPmeK6pba1f-12" target="K5oJ7VEt7dPmeK6pba1f-60"> + <mxGeometry relative="1" as="geometry" /> + </mxCell> + <mxCell id="K5oJ7VEt7dPmeK6pba1f-12" value="measured_data" style="rounded=0;whiteSpace=wrap;html=1;" vertex="1" parent="1"> + <mxGeometry x="40" y="880" width="120" height="60" as="geometry" /> + </mxCell> + <mxCell id="K5oJ7VEt7dPmeK6pba1f-58" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=1;exitY=0.5;exitDx=0;exitDy=0;" edge="1" parent="1" source="K5oJ7VEt7dPmeK6pba1f-13" target="K5oJ7VEt7dPmeK6pba1f-53"> + <mxGeometry relative="1" as="geometry" /> + </mxCell> + <mxCell id="K5oJ7VEt7dPmeK6pba1f-13" value="inference_method" style="rounded=0;whiteSpace=wrap;html=1;" vertex="1" parent="1"> + <mxGeometry x="40" y="960" width="120" height="60" as="geometry" /> + </mxCell> + <mxCell id="K5oJ7VEt7dPmeK6pba1f-14" value="mcmc_params" style="rounded=0;whiteSpace=wrap;html=1;" vertex="1" parent="1"> + <mxGeometry x="40" y="1040" width="120" height="60" as="geometry" /> + </mxCell> + <mxCell id="K5oJ7VEt7dPmeK6pba1f-63" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=1;exitY=0.5;exitDx=0;exitDy=0;" edge="1" parent="1" source="K5oJ7VEt7dPmeK6pba1f-15" target="K5oJ7VEt7dPmeK6pba1f-60"> + <mxGeometry relative="1" as="geometry" /> + </mxCell> + <mxCell id="K5oJ7VEt7dPmeK6pba1f-15" value="perturbed_data" style="rounded=0;whiteSpace=wrap;html=1;" vertex="1" parent="1"> + <mxGeometry x="40" y="1120" width="120" height="60" as="geometry" /> + </mxCell> + <mxCell id="K5oJ7VEt7dPmeK6pba1f-45" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=1;exitY=0.5;exitDx=0;exitDy=0;" edge="1" parent="1" source="K5oJ7VEt7dPmeK6pba1f-16" target="K5oJ7VEt7dPmeK6pba1f-32"> + <mxGeometry relative="1" as="geometry" /> + </mxCell> + <mxCell id="K5oJ7VEt7dPmeK6pba1f-77" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=1;exitY=0.5;exitDx=0;exitDy=0;" edge="1" parent="1" source="K5oJ7VEt7dPmeK6pba1f-16" target="K5oJ7VEt7dPmeK6pba1f-60"> + <mxGeometry relative="1" as="geometry" /> + </mxCell> + <mxCell id="K5oJ7VEt7dPmeK6pba1f-16" value="bayes_loocv" style="rounded=0;whiteSpace=wrap;html=1;" vertex="1" parent="1"> + <mxGeometry x="40" y="1200" width="120" height="60" as="geometry" /> + </mxCell> + <mxCell id="K5oJ7VEt7dPmeK6pba1f-64" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=1;exitY=0.5;exitDx=0;exitDy=0;" edge="1" parent="1" source="K5oJ7VEt7dPmeK6pba1f-17" target="K5oJ7VEt7dPmeK6pba1f-60"> + <mxGeometry relative="1" as="geometry" /> + </mxCell> + <mxCell id="K5oJ7VEt7dPmeK6pba1f-17" value="n_bootstrap_itrs" style="rounded=0;whiteSpace=wrap;html=1;" vertex="1" parent="1"> + <mxGeometry x="40" y="1280" width="120" height="60" as="geometry" /> + </mxCell> + <mxCell id="K5oJ7VEt7dPmeK6pba1f-18" value="bootstrap_noise" style="rounded=0;whiteSpace=wrap;html=1;" vertex="1" parent="1"> + <mxGeometry x="40" y="1360" width="120" height="60" as="geometry" /> + </mxCell> + <mxCell id="K5oJ7VEt7dPmeK6pba1f-46" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=1;exitY=0.5;exitDx=0;exitDy=0;" edge="1" parent="1" source="K5oJ7VEt7dPmeK6pba1f-19" target="K5oJ7VEt7dPmeK6pba1f-32"> + <mxGeometry relative="1" as="geometry" /> + </mxCell> + <mxCell id="K5oJ7VEt7dPmeK6pba1f-78" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=1;exitY=0.5;exitDx=0;exitDy=0;" edge="1" parent="1" source="K5oJ7VEt7dPmeK6pba1f-19" target="K5oJ7VEt7dPmeK6pba1f-60"> + <mxGeometry relative="1" as="geometry" /> + </mxCell> + <mxCell id="K5oJ7VEt7dPmeK6pba1f-19" value="just_analysis" style="rounded=0;whiteSpace=wrap;html=1;" vertex="1" parent="1"> + <mxGeometry x="40" y="1440" width="120" height="60" as="geometry" /> + </mxCell> + <mxCell id="K5oJ7VEt7dPmeK6pba1f-20" value="valid_metrics" style="rounded=0;whiteSpace=wrap;html=1;" vertex="1" parent="1"> + <mxGeometry x="40" y="1520" width="120" height="60" as="geometry" /> + </mxCell> + <mxCell id="K5oJ7VEt7dPmeK6pba1f-52" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=1;exitY=0.5;exitDx=0;exitDy=0;" edge="1" parent="1" source="K5oJ7VEt7dPmeK6pba1f-21" target="K5oJ7VEt7dPmeK6pba1f-32"> + <mxGeometry relative="1" as="geometry" /> + </mxCell> + <mxCell id="K5oJ7VEt7dPmeK6pba1f-21" value="plot_post_pred" style="rounded=0;whiteSpace=wrap;html=1;" vertex="1" parent="1"> + <mxGeometry x="40" y="1600" width="120" height="60" as="geometry" /> + </mxCell> + <mxCell id="K5oJ7VEt7dPmeK6pba1f-51" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=1;exitY=0.5;exitDx=0;exitDy=0;" edge="1" parent="1" source="K5oJ7VEt7dPmeK6pba1f-22" target="K5oJ7VEt7dPmeK6pba1f-32"> + <mxGeometry relative="1" as="geometry" /> + </mxCell> + <mxCell id="K5oJ7VEt7dPmeK6pba1f-22" value="plot_map_pred" style="rounded=0;whiteSpace=wrap;html=1;" vertex="1" parent="1"> + <mxGeometry x="40" y="1680" width="120" height="60" as="geometry" /> + </mxCell> + <mxCell id="K5oJ7VEt7dPmeK6pba1f-23" value="max_a_posteriori" style="rounded=0;whiteSpace=wrap;html=1;" vertex="1" parent="1"> + <mxGeometry x="40" y="1760" width="120" height="60" as="geometry" /> + </mxCell> + <mxCell id="K5oJ7VEt7dPmeK6pba1f-24" value="corner_title_fmt" style="rounded=0;whiteSpace=wrap;html=1;" vertex="1" parent="1"> + <mxGeometry x="40" y="1840" width="120" height="60" as="geometry" /> + </mxCell> + <mxCell id="K5oJ7VEt7dPmeK6pba1f-34" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=1;exitY=0.5;exitDx=0;exitDy=0;" edge="1" parent="1" source="K5oJ7VEt7dPmeK6pba1f-25" target="K5oJ7VEt7dPmeK6pba1f-32"> + <mxGeometry relative="1" as="geometry" /> + </mxCell> + <mxCell id="K5oJ7VEt7dPmeK6pba1f-25" value="out_dir" style="rounded=0;whiteSpace=wrap;html=1;" vertex="1" parent="1"> + <mxGeometry x="40" y="1920" width="120" height="60" as="geometry" /> + </mxCell> + <mxCell id="K5oJ7VEt7dPmeK6pba1f-50" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=1;exitY=0.5;exitDx=0;exitDy=0;" edge="1" parent="1" source="K5oJ7VEt7dPmeK6pba1f-26" target="K5oJ7VEt7dPmeK6pba1f-32"> + <mxGeometry relative="1" as="geometry" /> + </mxCell> + <mxCell id="K5oJ7VEt7dPmeK6pba1f-66" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=1;exitY=0.5;exitDx=0;exitDy=0;" edge="1" parent="1" source="K5oJ7VEt7dPmeK6pba1f-26" target="K5oJ7VEt7dPmeK6pba1f-60"> + <mxGeometry relative="1" as="geometry" /> + </mxCell> + <mxCell id="K5oJ7VEt7dPmeK6pba1f-26" value="error_model" style="rounded=0;whiteSpace=wrap;html=1;" vertex="1" parent="1"> + <mxGeometry x="40" y="2000" width="120" height="60" as="geometry" /> + </mxCell> + <mxCell id="K5oJ7VEt7dPmeK6pba1f-56" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=1;exitY=0.5;exitDx=0;exitDy=0;" edge="1" parent="1" source="K5oJ7VEt7dPmeK6pba1f-27" target="K5oJ7VEt7dPmeK6pba1f-53"> + <mxGeometry relative="1" as="geometry" /> + </mxCell> + <mxCell id="K5oJ7VEt7dPmeK6pba1f-72" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=1;exitY=0.5;exitDx=0;exitDy=0;" edge="1" parent="1" source="K5oJ7VEt7dPmeK6pba1f-27" target="K5oJ7VEt7dPmeK6pba1f-60"> + <mxGeometry relative="1" as="geometry" /> + </mxCell> + <mxCell id="K5oJ7VEt7dPmeK6pba1f-27" value="bias_inputs" style="rounded=0;whiteSpace=wrap;html=1;" vertex="1" parent="1"> + <mxGeometry x="40" y="2080" width="120" height="60" as="geometry" /> + </mxCell> + <mxCell id="K5oJ7VEt7dPmeK6pba1f-41" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=1;exitY=0.5;exitDx=0;exitDy=0;" edge="1" parent="1" source="K5oJ7VEt7dPmeK6pba1f-28" target="K5oJ7VEt7dPmeK6pba1f-32"> + <mxGeometry relative="1" as="geometry" /> + </mxCell> + <mxCell id="K5oJ7VEt7dPmeK6pba1f-28" value="measurement_error" style="rounded=0;whiteSpace=wrap;html=1;" vertex="1" parent="1"> + <mxGeometry x="40" y="2160" width="120" height="60" as="geometry" /> + </mxCell> + <mxCell id="K5oJ7VEt7dPmeK6pba1f-44" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=1;exitY=0.5;exitDx=0;exitDy=0;" edge="1" parent="1" source="K5oJ7VEt7dPmeK6pba1f-29" target="K5oJ7VEt7dPmeK6pba1f-32"> + <mxGeometry relative="1" as="geometry" /> + </mxCell> + <mxCell id="K5oJ7VEt7dPmeK6pba1f-81" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=1;exitY=0.5;exitDx=0;exitDy=0;" edge="1" parent="1" source="K5oJ7VEt7dPmeK6pba1f-29" target="K5oJ7VEt7dPmeK6pba1f-60"> + <mxGeometry relative="1" as="geometry" /> + </mxCell> + <mxCell id="K5oJ7VEt7dPmeK6pba1f-29" value="sigma2s" style="rounded=0;whiteSpace=wrap;html=1;" vertex="1" parent="1"> + <mxGeometry x="40" y="2240" width="120" height="60" as="geometry" /> + </mxCell> + <mxCell id="K5oJ7VEt7dPmeK6pba1f-30" value="log_likes" style="rounded=0;whiteSpace=wrap;html=1;" vertex="1" parent="1"> + <mxGeometry x="40" y="2320" width="120" height="60" as="geometry" /> + </mxCell> + <mxCell id="K5oJ7VEt7dPmeK6pba1f-82" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=1;exitY=0.5;exitDx=0;exitDy=0;" edge="1" parent="1" source="K5oJ7VEt7dPmeK6pba1f-31" target="K5oJ7VEt7dPmeK6pba1f-60"> + <mxGeometry relative="1" as="geometry" /> + </mxCell> + <mxCell id="K5oJ7VEt7dPmeK6pba1f-31" value="dtype" style="rounded=0;whiteSpace=wrap;html=1;" vertex="1" parent="1"> + <mxGeometry x="40" y="2400" width="120" height="60" as="geometry" /> + </mxCell> + <mxCell id="K5oJ7VEt7dPmeK6pba1f-32" value="create_inference" style="rounded=0;whiteSpace=wrap;html=1;" vertex="1" parent="1"> + <mxGeometry x="400" y="20" width="120" height="60" as="geometry" /> + </mxCell> + <mxCell id="K5oJ7VEt7dPmeK6pba1f-40" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=1;exitY=0.5;exitDx=0;exitDy=0;" edge="1" parent="1" source="K5oJ7VEt7dPmeK6pba1f-39" target="K5oJ7VEt7dPmeK6pba1f-32"> + <mxGeometry relative="1" as="geometry" /> + </mxCell> + <mxCell id="K5oJ7VEt7dPmeK6pba1f-39" value="n_tot_measurement" style="rounded=0;whiteSpace=wrap;html=1;" vertex="1" parent="1"> + <mxGeometry x="40" y="2480" width="120" height="60" as="geometry" /> + </mxCell> + <mxCell id="K5oJ7VEt7dPmeK6pba1f-43" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=1;exitY=0.5;exitDx=0;exitDy=0;" edge="1" parent="1" source="K5oJ7VEt7dPmeK6pba1f-42" target="K5oJ7VEt7dPmeK6pba1f-32"> + <mxGeometry relative="1" as="geometry" /> + </mxCell> + <mxCell id="K5oJ7VEt7dPmeK6pba1f-42" value="Discrepancy" style="rounded=0;whiteSpace=wrap;html=1;" vertex="1" parent="1"> + <mxGeometry x="40" y="2560" width="120" height="60" as="geometry" /> + </mxCell> + <mxCell id="K5oJ7VEt7dPmeK6pba1f-49" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=1;exitY=0.5;exitDx=0;exitDy=0;" edge="1" parent="1" source="K5oJ7VEt7dPmeK6pba1f-48" target="K5oJ7VEt7dPmeK6pba1f-32"> + <mxGeometry relative="1" as="geometry" /> + </mxCell> + <mxCell id="K5oJ7VEt7dPmeK6pba1f-59" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=1;exitY=0.5;exitDx=0;exitDy=0;" edge="1" parent="1" source="K5oJ7VEt7dPmeK6pba1f-48" target="K5oJ7VEt7dPmeK6pba1f-53"> + <mxGeometry relative="1" as="geometry" /> + </mxCell> + <mxCell id="K5oJ7VEt7dPmeK6pba1f-48" value="posterior_df" style="rounded=0;whiteSpace=wrap;html=1;" vertex="1" parent="1"> + <mxGeometry x="40" y="2640" width="120" height="60" as="geometry" /> + </mxCell> + <mxCell id="K5oJ7VEt7dPmeK6pba1f-53" value="create_error_model" style="rounded=0;whiteSpace=wrap;html=1;" vertex="1" parent="1"> + <mxGeometry x="560" y="20" width="120" height="60" as="geometry" /> + </mxCell> + <mxCell id="K5oJ7VEt7dPmeK6pba1f-60" value="perform_bootstrap" style="rounded=0;whiteSpace=wrap;html=1;" vertex="1" parent="1"> + <mxGeometry x="720" y="20" width="120" height="60" as="geometry" /> + </mxCell> + <mxCell id="K5oJ7VEt7dPmeK6pba1f-75" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=1;exitY=0.5;exitDx=0;exitDy=0;" edge="1" parent="1" source="K5oJ7VEt7dPmeK6pba1f-69" target="K5oJ7VEt7dPmeK6pba1f-60"> + <mxGeometry relative="1" as="geometry" /> + </mxCell> + <mxCell id="K5oJ7VEt7dPmeK6pba1f-69" value="__mean_pce_prior_pred" style="rounded=0;whiteSpace=wrap;html=1;" vertex="1" parent="1"> + <mxGeometry x="40" y="2720" width="120" height="60" as="geometry" /> + </mxCell> + <mxCell id="K5oJ7VEt7dPmeK6pba1f-76" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=1;exitY=0.5;exitDx=0;exitDy=0;" edge="1" parent="1" source="K5oJ7VEt7dPmeK6pba1f-70" target="K5oJ7VEt7dPmeK6pba1f-60"> + <mxGeometry relative="1" as="geometry" /> + </mxCell> + <mxCell id="K5oJ7VEt7dPmeK6pba1f-70" value="_std_pce_prior_pred" style="rounded=0;whiteSpace=wrap;html=1;" vertex="1" parent="1"> + <mxGeometry x="40" y="2800" width="120" height="60" as="geometry" /> + </mxCell> + <mxCell id="K5oJ7VEt7dPmeK6pba1f-74" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=1;exitY=0.5;exitDx=0;exitDy=0;" edge="1" parent="1" source="K5oJ7VEt7dPmeK6pba1f-73" target="K5oJ7VEt7dPmeK6pba1f-60"> + <mxGeometry relative="1" as="geometry" /> + </mxCell> + <mxCell id="K5oJ7VEt7dPmeK6pba1f-73" value="__model_prior_pred" style="rounded=0;whiteSpace=wrap;html=1;" vertex="1" parent="1"> + <mxGeometry x="40" y="2880" width="120" height="60" as="geometry" /> + </mxCell> + </root> + </mxGraphModel> + </diagram> + <diagram id="QgiNX2WXFOBDsDgzoFY9" name="Folder structure"> + <mxGraphModel dx="1436" dy="968" grid="1" gridSize="10" guides="1" tooltips="1" connect="1" arrows="1" fold="1" page="1" pageScale="1" pageWidth="850" pageHeight="1100" math="0" shadow="0"> + <root> + <mxCell id="0" /> + <mxCell id="1" parent="0" /> + <mxCell id="KLYezTmecfuvBG8KQe-n-1" value="" style="shape=folder;fontStyle=1;spacingTop=10;tabWidth=40;tabHeight=14;tabPosition=left;html=1;whiteSpace=wrap;" vertex="1" parent="1"> + <mxGeometry x="140" y="80" width="750" height="550" as="geometry" /> + </mxCell> + <mxCell id="KLYezTmecfuvBG8KQe-n-2" value="" style="shape=folder;fontStyle=1;spacingTop=10;tabWidth=40;tabHeight=14;tabPosition=left;html=1;whiteSpace=wrap;" vertex="1" parent="1"> + <mxGeometry x="170" y="110" width="700" height="220" as="geometry" /> + </mxCell> + <mxCell id="KLYezTmecfuvBG8KQe-n-3" value="" style="shape=folder;fontStyle=1;spacingTop=10;tabWidth=40;tabHeight=14;tabPosition=left;html=1;whiteSpace=wrap;" vertex="1" parent="1"> + <mxGeometry x="170" y="370" width="180" height="50" as="geometry" /> + </mxCell> + <mxCell id="KLYezTmecfuvBG8KQe-n-4" value="" style="shape=folder;fontStyle=1;spacingTop=10;tabWidth=40;tabHeight=14;tabPosition=left;html=1;whiteSpace=wrap;" vertex="1" parent="1"> + <mxGeometry x="170" y="440" width="180" height="50" as="geometry" /> + </mxCell> + <mxCell id="KLYezTmecfuvBG8KQe-n-5" value="" style="shape=folder;fontStyle=1;spacingTop=10;tabWidth=40;tabHeight=14;tabPosition=left;html=1;whiteSpace=wrap;" vertex="1" parent="1"> + <mxGeometry x="170" y="500" width="180" height="50" as="geometry" /> + </mxCell> + <mxCell id="KLYezTmecfuvBG8KQe-n-6" value="adaptPlot" style="shape=folder;fontStyle=1;spacingTop=10;tabWidth=40;tabHeight=14;tabPosition=left;html=1;whiteSpace=wrap;" vertex="1" parent="1"> + <mxGeometry x="190" y="150" width="70" height="50" as="geometry" /> + </mxCell> + <mxCell id="KLYezTmecfuvBG8KQe-n-7" value="apoly_construction" style="shape=folder;fontStyle=1;spacingTop=10;tabWidth=40;tabHeight=14;tabPosition=left;html=1;whiteSpace=wrap;" vertex="1" parent="1"> + <mxGeometry x="280" y="150" width="140" height="50" as="geometry" /> + </mxCell> + <mxCell id="KLYezTmecfuvBG8KQe-n-8" value="bayes_linear" style="shape=folder;fontStyle=1;spacingTop=10;tabWidth=40;tabHeight=14;tabPosition=left;html=1;whiteSpace=wrap;" vertex="1" parent="1"> + <mxGeometry x="440" y="150" width="90" height="50" as="geometry" /> + </mxCell> + <mxCell id="KLYezTmecfuvBG8KQe-n-9" value="engine" style="shape=folder;fontStyle=1;spacingTop=10;tabWidth=40;tabHeight=14;tabPosition=left;html=1;whiteSpace=wrap;" vertex="1" parent="1"> + <mxGeometry x="550" y="150" width="70" height="50" as="geometry" /> + </mxCell> + <mxCell id="KLYezTmecfuvBG8KQe-n-11" value="eval_rec_rule" style="shape=folder;fontStyle=1;spacingTop=10;tabWidth=40;tabHeight=14;tabPosition=left;html=1;whiteSpace=wrap;" vertex="1" parent="1"> + <mxGeometry x="640" y="150" width="100" height="50" as="geometry" /> + </mxCell> + <mxCell id="KLYezTmecfuvBG8KQe-n-12" value="exp_designs" style="shape=folder;fontStyle=1;spacingTop=10;tabWidth=40;tabHeight=14;tabPosition=left;html=1;whiteSpace=wrap;" vertex="1" parent="1"> + <mxGeometry x="760" y="150" width="90" height="50" as="geometry" /> + </mxCell> + <mxCell id="KLYezTmecfuvBG8KQe-n-13" value="exploration" style="shape=folder;fontStyle=1;spacingTop=10;tabWidth=40;tabHeight=14;tabPosition=left;html=1;whiteSpace=wrap;" vertex="1" parent="1"> + <mxGeometry x="190" y="210" width="80" height="50" as="geometry" /> + </mxCell> + <mxCell id="KLYezTmecfuvBG8KQe-n-14" value="glexindex" style="shape=folder;fontStyle=1;spacingTop=10;tabWidth=40;tabHeight=14;tabPosition=left;html=1;whiteSpace=wrap;" vertex="1" parent="1"> + <mxGeometry x="290" y="210" width="70" height="50" as="geometry" /> + </mxCell> + <mxCell id="KLYezTmecfuvBG8KQe-n-15" value="input_space" style="shape=folder;fontStyle=1;spacingTop=10;tabWidth=40;tabHeight=14;tabPosition=left;html=1;whiteSpace=wrap;" vertex="1" parent="1"> + <mxGeometry x="380" y="210" width="80" height="50" as="geometry" /> + </mxCell> + <mxCell id="KLYezTmecfuvBG8KQe-n-16" value="inputs" style="shape=folder;fontStyle=1;spacingTop=10;tabWidth=40;tabHeight=14;tabPosition=left;html=1;whiteSpace=wrap;" vertex="1" parent="1"> + <mxGeometry x="480" y="210" width="70" height="50" as="geometry" /> + </mxCell> + <mxCell id="KLYezTmecfuvBG8KQe-n-17" value="meta_model_engine" style="shape=folder;fontStyle=1;spacingTop=10;tabWidth=40;tabHeight=14;tabPosition=left;html=1;whiteSpace=wrap;" vertex="1" parent="1"> + <mxGeometry x="570" y="210" width="160" height="50" as="geometry" /> + </mxCell> + </root> + </mxGraphModel> + </diagram> +</mxfile> diff --git a/examples/.coverage b/examples/.coverage new file mode 100644 index 0000000000000000000000000000000000000000..254e10e4371d703eefec0f0437f9c0575be3f5ec Binary files /dev/null and b/examples/.coverage differ diff --git a/examples/OHagan-function/test_OHagan.py b/examples/OHagan-function/example_OHagan.py similarity index 78% rename from examples/OHagan-function/test_OHagan.py rename to examples/OHagan-function/example_OHagan.py index 2fc629d3423d7ef3312e0182a8f15d1f0fd18ba0..8c7690767346db5c09e1a7b33595567c26c36a77 100644 --- a/examples/OHagan-function/test_OHagan.py +++ b/examples/OHagan-function/example_OHagan.py @@ -16,8 +16,6 @@ of Stuttgart, www.iws.uni-stuttgart.de/lh2/ Pfaffenwaldring 61 70569 Stuttgart -Created on Wed Jul 10 2019 - """ import numpy as np @@ -28,13 +26,15 @@ import joblib import sys sys.path.append("../../src/bayesvalidrox/") -from pylink.pylink import PyLinkForwardModel -from surrogate_models.inputs import Input -from surrogate_models.surrogate_models import MetaModel -from surrogate_models.meta_model_engine import MetaModelEngine -from post_processing.post_processing import PostProcessing -from bayes_inference.bayes_inference import BayesInference -from bayes_inference.discrepancy import Discrepancy +from bayesvalidrox.pylink.pylink import PyLinkForwardModel +from bayesvalidrox.surrogate_models.inputs import Input +from bayesvalidrox.surrogate_models.exp_designs import ExpDesigns +from bayesvalidrox.surrogate_models.surrogate_models import MetaModel +#from bayesvalidrox.surrogate_models.meta_model_engine import MetaModelEngine +from bayesvalidrox.post_processing.post_processing import PostProcessing +from bayesvalidrox.bayes_inference.bayes_inference import BayesInference +from bayesvalidrox.bayes_inference.discrepancy import Discrepancy +from bayesvalidrox.surrogate_models.engine import Engine import matplotlib matplotlib.use('agg') @@ -68,7 +68,7 @@ if __name__ == "__main__": # ===================================================== # ====== POLYNOMIAL CHAOS EXPANSION METAMODELS ====== # ===================================================== - MetaModelOpts = MetaModel(Inputs, Model) + MetaModelOpts = MetaModel(Inputs) # Select your metamodel method # 1) PCE (Polynomial Chaos Expansion) 2) aPCE (arbitrary PCE) @@ -104,45 +104,45 @@ if __name__ == "__main__": # ------------------------------------------------ # ------ Experimental Design Configuration ------- # ------------------------------------------------ - MetaModelOpts.add_ExpDesign() + ExpDesign = ExpDesigns(Inputs) # One-shot (normal) or Sequential Adaptive (sequential) Design - MetaModelOpts.ExpDesign.method = 'sequential' - MetaModelOpts.ExpDesign.n_init_samples = 100 + ExpDesign.method = 'sequential' + ExpDesign.n_init_samples = 100 # Sampling methods # 1) random 2) latin_hypercube 3) sobol 4) halton 5) hammersley 6) korobov # 7) chebyshev(FT) 8) grid(FT) 9) nested_grid(FT) 10)user - MetaModelOpts.ExpDesign.sampling_method = 'latin_hypercube' + ExpDesign.sampling_method = 'latin_hypercube' # Provide the experimental design object with a hdf5 file # MetaModelOpts.ExpDesign.hdf5_file = 'ExpDesign_OHagan_orig.hdf5' # Sequential experimental design (needed only for sequential ExpDesign) - MetaModelOpts.ExpDesign.n_new_samples = 1 - MetaModelOpts.ExpDesign.n_max_samples = 500 # 150 - MetaModelOpts.ExpDesign.mod_LOO_threshold = 1e-16 + ExpDesign.n_new_samples = 1 + ExpDesign.n_max_samples = 500 # 150 + ExpDesign.mod_LOO_threshold = 1e-16 # ------------------------------------------------ # ------- Sequential Design configuration -------- # ------------------------------------------------ # 1) None 2) 'equal' 3)'epsilon-decreasing' 4) 'adaptive' - MetaModelOpts.ExpDesign.tradeoff_scheme = None + ExpDesign.tradeoff_scheme = None # MetaModelOpts.ExpDesign.n_replication = 50 # -------- Exploration ------ # 1)'Voronoi' 2)'random' 3)'latin_hypercube' 4)'dual annealing' - MetaModelOpts.ExpDesign.explore_method = 'latin_hypercube' + ExpDesign.explore_method = 'latin_hypercube' # Use when 'dual annealing' chosen - MetaModelOpts.ExpDesign.max_func_itr = 200 + ExpDesign.max_func_itr = 200 # Use when 'Voronoi' or 'random' or 'latin_hypercube' chosen - MetaModelOpts.ExpDesign.n_canddidate = 10000 - MetaModelOpts.ExpDesign.n_cand_groups = 4 + ExpDesign.n_canddidate = 10000 + ExpDesign.n_cand_groups = 4 # -------- Exploitation ------ # 1)'BayesOptDesign' 2)'VarOptDesign' 3)'alphabetic' 4)'Space-filling' - MetaModelOpts.ExpDesign.exploit_method = 'Space-filling' + ExpDesign.exploit_method = 'Space-filling' # BayesOptDesign -> when data is available # 1)DKL (Kullback-Leibler Divergence) 2)DPP (D-Posterior-percision) @@ -151,30 +151,29 @@ if __name__ == "__main__": # VarBasedOptDesign -> when data is not available # Only with Vornoi >>> 1)Entropy 2)EIGF, 3)ALM, 4)LOOCV - MetaModelOpts.ExpDesign.util_func = 'ALM' + ExpDesign.util_func = 'ALM' # alphabetic # 1)D-Opt (D-Optimality) 2)A-Opt (A-Optimality) # 3)K-Opt (K-Optimality) # MetaModelOpts.ExpDesign.util_func = 'D-Opt' - MetaModelOpts.valid_samples = np.load("data/valid_samples.npy") - MetaModelOpts.valid_model_runs = { + ExpDesign.valid_samples = np.load("data/valid_samples.npy") + ExpDesign.valid_model_runs = { 'Z': np.load("data/valid_outputs.npy") } # >>>>>>>>>>>>>>>>>>>>>> Build Surrogate <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< - meta_model_engine = MetaModelEngine(MetaModelOpts) - meta_model_engine.run() - PCEModel = meta_model_engine.MetaModel - + engine = Engine(MetaModelOpts, Model, ExpDesign) + engine.start_engine() + engine.train_sequential() # Save PCE models with open(f'PCEModel_{Model.name}.pkl', 'wb') as output: - joblib.dump(PCEModel, output, 2) + joblib.dump(engine.MetaModel, output, 2) # ===================================================== # ========= POST PROCESSING OF METAMODELS =========== # ===================================================== - PostPCE = PostProcessing(PCEModel) + PostPCE = PostProcessing(engine) # Plot to check validation visually. PostPCE.valid_metamodel(n_samples=200) @@ -184,7 +183,7 @@ if __name__ == "__main__": PostPCE.check_accuracy(n_samples=3000) # Plot the evolution of the KLD,BME, and Modified LOOCV error - if MetaModelOpts.ExpDesign.method == 'sequential': + if ExpDesign.method == 'sequential': PostPCE.plot_seq_design_diagnostics() # Plot the sobol indices diff --git a/examples/analytical-function/test_analytical_function.py b/examples/analytical-function/example_analytical_function.py old mode 100755 new mode 100644 similarity index 71% rename from examples/analytical-function/test_analytical_function.py rename to examples/analytical-function/example_analytical_function.py index fa3daf3ea324416e74c649d521d98f87690e5863..0303411be3ed7e04508ff78f5c162337736ab819 --- a/examples/analytical-function/test_analytical_function.py +++ b/examples/analytical-function/example_analytical_function.py @@ -20,20 +20,23 @@ import numpy as np import pandas as pd import sys import joblib -# import bayesvalidrox -# Add BayesValidRox path -sys.path.append("../../src/bayesvalidrox/") - -from pylink.pylink import PyLinkForwardModel -from surrogate_models.inputs import Input -from surrogate_models.surrogate_models import MetaModel -from surrogate_models.meta_model_engine import MetaModelEngine -from post_processing.post_processing import PostProcessing -from bayes_inference.bayes_inference import BayesInference -from bayes_inference.discrepancy import Discrepancy import matplotlib matplotlib.use('agg') +# import bayesvalidrox +# Add BayesValidRox path +sys.path.append("../../src/") + +from bayesvalidrox.pylink.pylink import PyLinkForwardModel +from bayesvalidrox.surrogate_models.inputs import Input +from bayesvalidrox.surrogate_models.exp_designs import ExpDesigns +from bayesvalidrox.surrogate_models.surrogate_models import MetaModel +#from bayesvalidrox.surrogate_models.meta_model_engine import MetaModelEngine +from bayesvalidrox.post_processing.post_processing import PostProcessing +from bayesvalidrox.bayes_inference.bayes_inference import BayesInference +from bayesvalidrox.bayes_inference.discrepancy import Discrepancy + +from bayesvalidrox.surrogate_models.engine import Engine if __name__ == "__main__": @@ -88,7 +91,7 @@ if __name__ == "__main__": # ===================================================== # ========== DEFINITION OF THE METAMODEL ============ # ===================================================== - MetaModelOpts = MetaModel(Inputs, Model) + MetaModelOpts = MetaModel(Inputs)#, Model) # Select if you want to preserve the spatial/temporal depencencies # MetaModelOpts.dim_red_method = 'PCA' @@ -134,47 +137,46 @@ if __name__ == "__main__": # ------------------------------------------------ # ------ Experimental Design Configuration ------- # ------------------------------------------------ - MetaModelOpts.add_ExpDesign() + ExpDesign = ExpDesigns(Inputs) # One-shot (normal) or Sequential Adaptive (sequential) Design - MetaModelOpts.ExpDesign.method = 'sequential' - MetaModelOpts.ExpDesign.n_init_samples = 3*ndim + ExpDesign.method = 'sequential' + ExpDesign.n_init_samples = 140#00#3*ndim # Sampling methods # 1) random 2) latin_hypercube 3) sobol 4) halton 5) hammersley # 6) chebyshev(FT) 7) grid(FT) 8)user - MetaModelOpts.ExpDesign.sampling_method = 'latin_hypercube' + ExpDesign.sampling_method = 'latin_hypercube' # Provide the experimental design object with a hdf5 file - # MetaModelOpts.ExpDesign.hdf5_file = 'ExpDesign_AnalyticFunc.hdf5' - - # ------------------------------------------------ - # ------- Sequential Design configuration -------- - # ------------------------------------------------ + #ExpDesign.hdf5_file = 'ExpDesign_AnalyticFunc.hdf5' + # Set the sampling parameters - MetaModelOpts.ExpDesign.n_new_samples = 1 - MetaModelOpts.ExpDesign.n_max_samples = 150 - MetaModelOpts.ExpDesign.mod_LOO_threshold = 1e-16 + ExpDesign.n_new_samples = 1 + ExpDesign.n_max_samples = 141#150 # sum of init + sequential + ExpDesign.mod_LOO_threshold = 1e-16 - # MetaModelOpts.adapt_verbose = True + # ExpDesign.adapt_verbose = True # 1) None 2) 'equal' 3)'epsilon-decreasing' 4) 'adaptive' - MetaModelOpts.ExpDesign.tradeoff_scheme = None + ExpDesign.tradeoff_scheme = None # MetaModelOpts.ExpDesign.n_replication = 5 # -------- Exploration ------ # 1)'Voronoi' 2)'random' 3)'latin_hypercube' 4)'LOOCV' 5)'dual annealing' - MetaModelOpts.ExpDesign.explore_method = 'random' + ExpDesign.explore_method = 'random' # Use when 'dual annealing' chosen - MetaModelOpts.ExpDesign.max_func_itr = 1000 + ExpDesign.max_func_itr = 1000 # Use when 'Voronoi' or 'random' or 'latin_hypercube' chosen - MetaModelOpts.ExpDesign.n_canddidate = 1000 - MetaModelOpts.ExpDesign.n_cand_groups = 4 + ExpDesign.n_canddidate = 1000 + ExpDesign.n_cand_groups = 4 # -------- Exploitation ------ # 1)'BayesOptDesign' 2)'BayesActDesign' 3)'VarOptDesign' 4)'alphabetic' # 5)'Space-filling' - MetaModelOpts.ExpDesign.exploit_method = 'BayesActDesign' + ExpDesign.exploit_method = 'Space-filling' + ExpDesign.exploit_method = 'BayesActDesign' + ExpDesign.util_func = 'DKL' # BayesOptDesign/BayesActDesign -> when data is available # 1) MI (Mutual information) 2) ALC (Active learning McKay) @@ -185,7 +187,7 @@ if __name__ == "__main__": # BayesActDesign -> when data is available # 1) BME (Bayesian model evidence) 2) infEntropy (Information entropy) # 2)DKL (Kullback-Leibler Divergence) - MetaModelOpts.ExpDesign.util_func = 'DKL' + #MetaModelOpts.ExpDesign.util_func = 'DKL' # VarBasedOptDesign -> when data is not available # 1)ALM 2)EIGF, 3)LOOCV @@ -205,27 +207,28 @@ if __name__ == "__main__": MetaModelOpts.Discrepancy = DiscrepancyOpts # Plot the posterior snapshots for SeqDesign - MetaModelOpts.ExpDesign.post_snapshot = False - MetaModelOpts.ExpDesign.step_snapshot = 1 - MetaModelOpts.ExpDesign.max_a_post = [0] * ndim + ExpDesign.post_snapshot = False + ExpDesign.step_snapshot = 1 + ExpDesign.max_a_post = [0] * ndim # For calculation of validation error for SeqDesign prior = np.load(f"data/Prior_{ndim}.npy") prior_outputs = np.load(f"data/origModelOutput_{ndim}.npy") likelihood = np.load(f"data/validLikelihoods_{ndim}.npy") - MetaModelOpts.valid_samples = prior[:500] - MetaModelOpts.valid_model_runs = {'Z': prior_outputs[:500]} - # MetaModelOpts.valid_likelihoods = likelihood - - # >>>>>>>>>>>>>>>>>>>>>> Build Surrogate <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< - # Train the meta model - meta_model_engine = MetaModelEngine(MetaModelOpts) - meta_model_engine.run() - PCEModel = meta_model_engine.MetaModel - - # Save PCE models - with open(f'PCEModel_{Model.name}.pkl', 'wb') as output: - joblib.dump(PCEModel, output, 2) + ExpDesign.valid_samples = prior[:500] + ExpDesign.valid_model_runs = {'Z': prior_outputs[:500]} + + + # Run using the new engine + #engine = Engine(MetaModelOpts, Model, ExpDesign) + #engine.start_engine() + #engine.train_normal() + + MetaModelOpts.ExpDesign = ExpDesign + engine = Engine(MetaModelOpts, Model, ExpDesign) + engine.start_engine() + #engine.train_sequential() + engine.train_normal() # Load the objects # with open(f"PCEModel_{Model.name}.pkl", "rb") as input: @@ -234,7 +237,7 @@ if __name__ == "__main__": # ===================================================== # ========= POST PROCESSING OF METAMODELS =========== # ===================================================== - PostPCE = PostProcessing(PCEModel) + PostPCE = PostProcessing(engine) # Plot to check validation visually. PostPCE.valid_metamodel(n_samples=1) @@ -258,25 +261,25 @@ if __name__ == "__main__": # ===================================================== # ======== Bayesian inference with Emulator ========== # ===================================================== - BayesOpts = BayesInference(PCEModel) + BayesOpts = BayesInference(engine) BayesOpts.emulator = True BayesOpts.plot_post_pred = True # BayesOpts.selected_indices = [0, 3, 5, 7, 9] # BME Bootstrap - # BayesOpts.bootstrap = True - # BayesOpts.n_bootstrap_itrs = 500 - # BayesOpts.bootstrap_noise = 100 + BayesOpts.bootstrap = True + BayesOpts.n_bootstrap_itrs = 500 + BayesOpts.bootstrap_noise = 100 # Bayesian cross validation - # BayesOpts.bayes_loocv = True + BayesOpts.bayes_loocv = True # TODO: test what this does # Select the inference method import emcee BayesOpts.inference_method = "MCMC" # Set the MCMC parameters passed to self.mcmc_params BayesOpts.mcmc_params = { - 'n_steps': 1e5, + 'n_steps': 1e4,#5, 'n_walkers': 30, 'moves': emcee.moves.KDEMove(), 'multiprocessing': False, @@ -284,6 +287,7 @@ if __name__ == "__main__": } # ----- Define the discrepancy model ------- + obsData = pd.DataFrame(Model.observations, columns=Model.Output.names) BayesOpts.measurement_error = obsData # # -- (Option B) -- @@ -293,31 +297,34 @@ if __name__ == "__main__": BayesOpts.Discrepancy = DiscrepancyOpts # -- (Option C) -- - # DiscOutputOpts = Input() - # # # OutputName = 'Z' - # DiscOutputOpts.add_marginals() - # DiscOutputOpts.Marginals[0].Nnme = '$\sigma^2_{\epsilon}$' - # DiscOutputOpts.Marginals[0].dist_type = 'uniform' - # DiscOutputOpts.Marginals[0].parameters = [0, 10] - # BayesOpts.Discrepancy = {'known': DiscrepancyOpts, - # 'infer': Discrepancy(DiscOutputOpts)} - - # BayesOpts.bias_inputs = {'Z':np.arange(0, 10, 1.).reshape(-1,1) / 9} - # DiscOutputOpts = Input() - # # OutputName = 'lambda' - # DiscOutputOpts.add_marginals() - # DiscOutputOpts.Marginals[0].name = '$\lambda$' - # DiscOutputOpts.Marginals[0].dist_type = 'uniform' - # DiscOutputOpts.Marginals[0].parameters = [0, 1] - - # # OutputName = 'sigma_f' - # DiscOutputOpts.add_marginals() - # DiscOutputOpts.Marginals[1].Name = '$\sigma_f$' - # DiscOutputOpts.Marginals[1].dist_type = 'uniform' - # DiscOutputOpts.Marginals[1].parameters = [0, 1e-4] - # BayesOpts.Discrepancy = Discrepancy(DiscOutputOpts) - # BayesOpts.Discrepancy = {'known': DiscrepancyOpts, - # 'infer': Discrepancy(DiscOutputOpts)} + if 0: + DiscOutputOpts = Input() + # # # OutputName = 'Z' + DiscOutputOpts.add_marginals() + DiscOutputOpts.Marginals[0].Nnme = '$\sigma^2_{\epsilon}$' + DiscOutputOpts.Marginals[0].dist_type = 'uniform' + DiscOutputOpts.Marginals[0].parameters = [0, 10] + #BayesOpts.Discrepancy = {'known': DiscrepancyOpts, + # 'infer': Discrepancy(DiscOutputOpts)} + + BayesOpts.bias_inputs = {'Z':np.arange(0, 10, 1.).reshape(-1,1) / 9} + + DiscOutputOpts = Input() + # OutputName = 'lambda' + DiscOutputOpts.add_marginals() + DiscOutputOpts.Marginals[0].name = '$\lambda$' + DiscOutputOpts.Marginals[0].dist_type = 'uniform' + DiscOutputOpts.Marginals[0].parameters = [0, 1] + + # # OutputName = 'sigma_f' + DiscOutputOpts.add_marginals() + DiscOutputOpts.Marginals[1].Name = '$\sigma_f$' + DiscOutputOpts.Marginals[1].dist_type = 'uniform' + DiscOutputOpts.Marginals[1].parameters = [0, 1e-4] + #BayesOpts.Discrepancy = Discrepancy(DiscOutputOpts) + BayesOpts.Discrepancy = {'known': DiscrepancyOpts, + 'infer': Discrepancy(DiscOutputOpts)} + # Start the calibration/inference Bayes_PCE = BayesOpts.create_inference() diff --git a/examples/analytical-function/util/AnalytFuncValid_Test.py b/examples/analytical-function/util/AnalytFuncValid_Test.py deleted file mode 100644 index b172de0baf73399ad8a1180ab9e8cfe20b4fb7b8..0000000000000000000000000000000000000000 --- a/examples/analytical-function/util/AnalytFuncValid_Test.py +++ /dev/null @@ -1,353 +0,0 @@ -#!/usr/bin/env python3 -# -*- coding: utf-8 -*- -""" -Created on Fri Aug 9 16:25:43 2019 -This example is for the calibration and validation scenario. -@author: farid - """ - -import numpy as np -import pandas as pd -import matplotlib.pyplot as plt -plt.style.use('seaborn-white') -plt.rcParams.update({'font.size': 18}) -plt.rc('font', family='sans-serif', serif='Arial') -plt.rc('figure', figsize = (24, 16)) -plt.rc('text', usetex=True) -plt.rc('xtick', labelsize=18) -plt.rc('ytick', labelsize=18) -plt.rc('axes', labelsize=18) - -import seaborn as sns -import os - -try: - import cPickle as pickle -except ModuleNotFoundError: - import pickle - -from PyLink.FuncForwardModel import FuncForwardModel -from surrogate_models.Input import Input -from surrogate_models.surrogate_models import Metamodel -from PostProcessing.PostProcessing import PostProcessing -from BayesInference.BayesInference import BayesInference, Discrepancy - -if __name__ == "__main__": - - #===================================================== - #============= COMPUTATIONAL MODEL ================ - #===================================================== - Model = FuncForwardModel() - - Model.Type = 'Function' - Model.pyFile = 'AnalyticalFunction' - Model.Name = 'AnalyticFunc' - - Model.Output.Names = ['Z'] - - - # For Bayesian inversion synthetic data with X=[0,0] - Model.Observations['Time [s]'] = np.arange(0, 5, 1.) / 5 - Model.Observations['Z'] = np.repeat([2],5) - - # For Checking with the MonteCarlo refrence -# Model.MCReference['Time [s]'] = np.arange(0, 10, 1.) / 9 -# Model.MCReference['mean'] = np.array([127.13880108, 127.12652988, 127.12144698, -# 127.11754674, 127.11425868, 127.11136184, 127.1087429, -# 127.10633454, 127.10409289, 127.10198748]) -# Model.MCReference['std'] = np.array([171.2520775, 171.21550753, 171.20352691, -# 171.19559223, 171.18975202, 171.18525035, 171.18169953, -# 171.17886925, 171.17660944, 171.17481586]) - - # For Bayesian inversion synthetic data with X=[1,1] - Model.ObservationsValid['Time [s]'] = np.arange(0, 5, 1.) / 5 - Model.ObservationsValid['Z']= np.array([2.21773563, 2.11712764, - 2.02460905, 1.93849485, 1.85761462]) - - #===================================================== - #========= PROBABILISTIC INPUT MODEL ============== - #===================================================== - # Define the uncertain parameters with their mean and - # standard deviation - Inputs = Input() - - ndim = 2 - for i in range(ndim): - Inputs.add_marginals() - Inputs.Marginals[i].Name = '$X_{%s}$'%(i+1) - Inputs.Marginals[i].DistType = 'unif' - Inputs.Marginals[i].Parameters = [-5, 5] - - #===================================================== - #========== DEFINITION OF THE METAMODEL ============ - #===================================================== - MetaModelOpts = Metamodel(Inputs) - - # Select if you want to preserve the spatial/temporal depencencies - MetaModelOpts.DimRedMethod = 'PCA' - - # Select your metamodel method - # 1) PCE (Polynomial Chaos Expansion) 2) GPE (Gaussian Process Emulator) - # 3) PCEKriging (PCE + GPE) - MetaModelOpts.metaModel = 'GPE' - - # ------------------------------------------------ - # ------------- PCE Specification ---------------- - # ------------------------------------------------ - # Select the sparse least-square minimization method for - # the PCE coefficients calculation: - # 1)OLS: Ordinary Least Square 2)BRR: Bayesian Ridge Regression - # 3)LARS: Least angle regression 4)ARD: Bayesian ARD Regression - # 5)FastARD: Fast Bayesian ARD Regression - # 6)SGDR: Stochastic gradient descent learning - MetaModelOpts.RegMethod = 'FastARD' - - # Specify the max degree to be compared by the adaptive algorithm: - # The degree with the lowest Leave-One-Out cross-validation (LOO) - # error (or the highest score=1-LOO)estimator is chosen as the final - # metamodel. - MetaModelOpts.MinPceDegree = 1 #3 - MetaModelOpts.MaxPceDegree = 8 #15 - - # q-quasi-norm 0<q<1 (default=1) - MetaModelOpts.q = 1 #0.75 - - # Print summary of the regression results - #MetaModelOpts.DisplayFlag = True - - # ------------------------------------------------ - # ------ Experimental Design Configuration ------- - # ------------------------------------------------ - - # Generate an experimental design of size NrExpDesign based on a latin - # hypercube sampling of the input model or user-defined values of X and/or Y: - MetaModelOpts.addExpDesign() - - # One-shot (normal) or Sequential Adaptive (sequential) Design - MetaModelOpts.ExpDesign.Method = 'normal' - NrofInitSamples = 200 #75 - MetaModelOpts.ExpDesign.NrSamples = NrofInitSamples - - # Sampling methods - # 1) random 2) latin_hypercube 3) sobol 4) halton 5) hammersley 6) chebyshev(FT) - # 7) korobov 8) grid(FT) 9) nested_grid(FT) 10)user - MetaModelOpts.ExpDesign.SamplingMethod = 'random' - - # Sequential experimental design (needed only for sequential ExpDesign) - MetaModelOpts.ExpDesign.NrofNewSample = 1 - MetaModelOpts.ExpDesign.MaxNSamples = 50 #150 - MetaModelOpts.ExpDesign.ModifiedLOOThreshold = 1e-16 - - # Defining the measurement error, if it's known a priori - obsData = pd.DataFrame(Model.Observations, columns=Model.Output.Names) - DiscrepancyOpts = Discrepancy('') - DiscrepancyOpts.Type = 'Gaussian' - DiscrepancyOpts.Parameters = obsData ** 2 - MetaModelOpts.Discrepancy = DiscrepancyOpts - - # Plot the posterior snapshots for SeqDesign - MetaModelOpts.ExpDesign.PostSnapshot = False - MetaModelOpts.ExpDesign.stepSnapshot = 1 - MetaModelOpts.ExpDesign.MAP = (0,0) - MetaModelOpts.ExpDesign.parNames = ['$X_1$', '$X_2$'] - - # ------------------------------------------------ - # ------- Sequential Design configuration -------- - # ------------------------------------------------ - # 1) 'None' 2) 'epsilon-decreasing' - MetaModelOpts.ExpDesign.TradeOffScheme = 'epsilon-decreasing' - #MetaModelOpts.ExpDesign.nReprications = 2 - # -------- Exploration ------ - #1)'Voronoi' 2)'MC' 3)'LHS' 4)'dual annealing' - MetaModelOpts.ExpDesign.ExploreMethod = 'Voronoi' - - # Use when 'dual annealing' chosen - MetaModelOpts.ExpDesign.MaxFunItr = 200 - - # Use when 'MC' or 'LHS' chosen - MetaModelOpts.ExpDesign.NCandidate = 100 - MetaModelOpts.ExpDesign.NrofCandGroups = 4 - - # -------- Exploitation ------ - # 1)'BayesOptDesign' 2)'ActiveLearning' 3)'alphabetic' 4)'None' (Space-filling) - MetaModelOpts.ExpDesign.ExploitMethod = 'None' - - # BayesOptDesign -> when data is available - # 1)DKL (Kullback-Leibler Divergence) 2)DPP (D-Posterior-percision) - # 3)APP (A-Posterior-percision) - MetaModelOpts.ExpDesign.UtilityFunction = 'DKL' #['DKL', 'DPP'] - - # ActiveLearning - # 1)ALM (Active learning MacKay) 2)ALC (Active learning Cohn) - # 3) - #MetaModelOpts.ExpDesign.UtilityFunction = 'ALM' #['ALM', 'ALC'] - - # alphabetic - # 1)D-Opt (D-Optimality) 2)A-Opt (A-Optimality) - # 3)K-Opt (K-Optimality) - # MetaModelOpts.ExpDesign.UtilityFunction = 'D-Opt' #['D-Opt', 'A-Opt', 'K-Opt'] - - # >>>>>>>>>>>>>>>>>>>>>> Build Surrogate <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< - # MetaModelOpts.slicingforValidation = True - MetaModelOpts.index = 5 - # Adaptive sparse arbitrary polynomial chaos expansion - # PCEModelCalib, PCEModelValid = MetaModelOpts.create_metamodel(Model) - PCEModel = MetaModelOpts.create_metamodel(Model) - - #===================================================== - #========= POST PROCESSING OF METAMODELS =========== - #===================================================== - #PostPCE = PostProcessing(PCEModelCalib) - PostPCE = PostProcessing(PCEModel) - - PostPCE.Name = 'Calib' - PostPCE.validMetamodel(nValidSamples= 3) - - # Compute the moments and compare with the Monte-Carlo reference -# PostPCE.plotMoments() - - if MetaModelOpts.metaModel != 'GPE': - # Plot the evolution of the KLD,BME, and Modified LOOCV error - if MetaModelOpts.ExpDesign.Method == 'sequential': - PostPCE.seqDesignDiagnosticPlots() - - # Plot the sobol indices - sobol_cell, total_sobol = PostPCE.sobolIndicesPCE() - - # Compute and print RMSE error - PostPCE.accuracyCheckMetaModel(nSamples=3000) - - - #===================================================== - #======= Bayesian calibration with Emulator ========= - #===================================================== - # BayesOpts = BayesInference(PCEModelCalib) - BayesOpts = BayesInference(PCEModel) - BayesOpts.Name = 'Calib' - BayesOpts.emulator = True - - # BME Bootstrap - BayesOpts.Bootstrap = True - BayesOpts.NrofSamples = 100000 - BayesOpts.BootstrapItrNr = 10 - BayesOpts.BootstrapNoise = 0.05 - - # Select the inference method - BayesOpts.SamplingMethod = 'MCMC' - BayesOpts.MCMCnSteps = 1000 - BayesOpts.MCMCnwalkers = 50 - BayesOpts.MultiProcessMCMC = True - - BayesOpts.PlotPostDist = True - BayesOpts.PlotPostPred = True - - # ----- Define the discrepancy model ------- - obsData = pd.DataFrame(Model.Observations, columns=Model.Output.Names) - # (Option B) - DiscrepancyOpts = Discrepancy('') - DiscrepancyOpts.Type = 'Gaussian' - DiscrepancyOpts.Parameters = obsData[:MetaModelOpts.index]**2 - - BayesOpts.Discrepancy = DiscrepancyOpts - - # (Option C) -# DiscInputOpts = Input() -# -# DiscInputOpts.addMarginals() -# DiscInputOpts.Marginals[0].Name = 'Sigma2' -# DiscInputOpts.Marginals[0].DistType = 'unif' -# DiscInputOpts.Marginals[0].Parameters = [0, 5e-1] -# -# DiscrepancyOpts = Discrepancy(DiscInputOpts) -# -# BayesOpts.Discrepancy = DiscrepancyOpts - - - Bayes_Calib = BayesOpts.create_Inference() - - # Make directory for saving the plots/outputs - newpath = (r'Outputs_'+MetaModelOpts.ExpDesign.Method) - if not os.path.exists(newpath): os.makedirs(newpath) - - - ## Plot the posterior (Model) - with sns.axes_style("white"): - g = sns.jointplot(x=Bayes_Calib.Posterior_df['$X_{1}$'], y=Bayes_Calib.Posterior_df['$X_{2}$'], - kind="kde", cmap='jet'); - g.ax_joint.collections[0].set_alpha(0) - g.set_axis_labels("$X_1$", "$X_2$") - - g.savefig('./'+newpath+'/Posterior_PCEModel_Calib_'+MetaModelOpts.ExpDesign.Method+'.svg') - plt.close() - - - #===================================================== - #======= Bayesian validation with Emulator ========= - #===================================================== - # BayesOpts_Valid = BayesInference(PCEModelValid) - BayesOpts_Valid = BayesInference(PCEModel) - - BayesOpts_Valid.Name = 'Valid' - BayesOpts_Valid.emulator = True - - # BME Bootstrap - BayesOpts_Valid.Bootstrap = True - BayesOpts_Valid.MCMCinitSamples = Bayes_Calib.Posterior_df - BayesOpts_Valid.BootstrapItrNr = 10 - BayesOpts_Valid.BootstrapNoise = 0.05 - - # Select the inference method - BayesOpts_Valid.SamplingMethod = 'MCMC' - BayesOpts_Valid.MCMCnSteps = 1000 - BayesOpts_Valid.MCMCnwalkers = 50 - BayesOpts.MultiProcessMCMC = True - - BayesOpts_Valid.PlotPostDist = True - BayesOpts_Valid.PlotPostPred = True - - # ----- Define the discrepancy model ------- - obsDataValid = pd.DataFrame(Model.ObservationsValid, columns=Model.Output.Names) - # (Option B) - DiscrepancyOpts = Discrepancy('') - DiscrepancyOpts.Type = 'Gaussian' - DiscrepancyOpts.Parameters = 0.01 * obsDataValid**2 - - BayesOpts_Valid.Discrepancy = DiscrepancyOpts - - Bayes_Valid = BayesOpts_Valid.create_Inference() - - - ## Plot the posterior (PCEModel) - with sns.axes_style("white"): - g = sns.jointplot(x=Bayes_Valid.Posterior_df['$X_{1}$'], y=Bayes_Valid.Posterior_df['$X_{2}$'], - kind="kde", cmap='jet'); - g.ax_joint.collections[0].set_alpha(0) - g.set_axis_labels("$X_1$", "$X_2$") - g.savefig('./'+newpath+'/Posterior_PCEModel_Valid_'+MetaModelOpts.ExpDesign.Method+'.svg') - plt.close() - - - #===================================================== - #============== Save class objects ================= - #===================================================== - with open('AnalyticFunc_Results.pkl', 'wb') as output: - pickle.dump(PCEModel, output, pickle.HIGHEST_PROTOCOL) - - # pickle.dump(PCEModelValid, output, pickle.HIGHEST_PROTOCOL) - - pickle.dump(PostPCE, output, pickle.HIGHEST_PROTOCOL) - - pickle.dump(Bayes_Calib, output, pickle.HIGHEST_PROTOCOL) - - pickle.dump(Bayes_Valid, output, pickle.HIGHEST_PROTOCOL) - -# del PCEModel -# del PostPCE -# del Bayes - - # Load the objects -# with open('AnalyticFunc_Results.pkl', 'rb') as input: -# PCEModel = pickle.load(input) -# PostPCE = pickle.load(input) -# Bayes_PCE = pickle.load(input) -# Bayes_Model = pickle.load(input) \ No newline at end of file diff --git a/examples/analytical-function/util/AnalyticFunc_Demo.py b/examples/analytical-function/util/AnalyticFunc_Demo.py deleted file mode 100644 index dea66f67dd8907fcc2560bd56a184f9e65f17a38..0000000000000000000000000000000000000000 --- a/examples/analytical-function/util/AnalyticFunc_Demo.py +++ /dev/null @@ -1,207 +0,0 @@ -#!/usr/bin/env python3 -# -*- coding: utf-8 -*- -""" -Created on Fri Aug 9 16:25:43 2019 - -@author: farid -""" - -import numpy as np -import os -import matplotlib.pyplot as plt -plt.style.use('seaborn-white') -plt.rcParams.update({'font.size': 16}) -plt.rc('font', family='sans-serif', serif='Arial') -plt.rc('figure', figsize = (24, 16)) -plt.rc('text', usetex=True) -plt.rc('xtick', labelsize=16) -plt.rc('ytick', labelsize=16) -plt.rc('axes', labelsize=16) - - -from PyLink.FuncForwardModel import FuncForwardModel -from surrogate_models.Input import Input -from surrogate_models.surrogate_models import Metamodel - -if __name__ == "__main__": - - #===================================================== - #============= COMPUTATIONAL MODEL ================ - #===================================================== - Model = FuncForwardModel() - - Model.Type = 'Function' - Model.pyFile = 'AnalyticalFunction' - Model.Name = 'AnalyticFunc' - - Model.Output.Names = ['Z'] - - - #===================================================== - #========= PROBABILISTIC INPUT MODEL ============== - #===================================================== - # Define the uncertain parameters with their mean and - # standard deviation - Inputs = Input() - - Inputs.addMarginals() - Inputs.Marginals[0].Name = 'x1' - Inputs.Marginals[0].DistType = 'unif' - Inputs.Marginals[0].Parameters = [-5, 5] - - Inputs.addMarginals() - Inputs.Marginals[1].Name = 'x2' - Inputs.Marginals[1].DistType = 'unif' - Inputs.Marginals[1].Parameters = [-5, 5] - - - #===================================================== - #======== PCE METAMODELS with adaptive aPCE ======== - #===================================================== - MetaModelOpts = Metamodel(Inputs) - - # Specify the max degree to be compared by the adaptive algorithm: - # The degree with the lowest Leave-One-Out cross-validation (LOO) - # error (or the highest score=1-LOO)estimator is chosen as the final - # metamodel. - MetaModelOpts.MaxPceDegree = 10 - - # Select the sparse least-square minimization method for - # the PCE coefficients calculation: - # 1)OLS: Ordinary Least Square 2)BRR: Bayesian Ridge Regression - # 3)LARS: Least angle regression 4)ARD: Bayesian ARD Regression - # 5)SGDR: Stochastic gradient descent learning - MetaModelOpts.RegMethod = 'OLS' - - # Print summary of the regression results - #MetaModelOpts.DisplayFlag = True - - # ------ Experimental Design -------- - # Generate an experimental design of size NrExpDesign based on a latin - # hypercube sampling of the input model or user-defined values of X and/or Y: - MetaModelOpts.addExpDesign() - - # One-shot (normal) or Sequential Adaptive (sequential) Design - MetaModelOpts.ExpDesign.Method = 'normal' - NrofInitSamples = 100 - MetaModelOpts.ExpDesign.NrSamples = NrofInitSamples - - # Sampling methods - # 1) random 2) latin_hypercube 3) sobol 4) halton 5) hammersley 6) chebyshev(FT) - # 7) korobov 8) grid(FT) 9) nested_grid(FT) 10)user - MetaModelOpts.ExpDesign.SamplingMethod = 'latin_hypercube' - - # Sequential experimental design (needed only for sequential ExpDesign) - MetaModelOpts.ExpDesign.MaxNSamples = 100 - MetaModelOpts.ExpDesign.ModifiedLOOThreshold = 1e-4 - - # ------------------------------------------------ - # ------- Sequential Design configuration -------- - # ------------------------------------------------ - # -------- Exploration ------ - MetaModelOpts.ExpDesign.ExploreMethod = 'MC' - MetaModelOpts.ExpDesign.NCandidate = 500 - MetaModelOpts.ExpDesign.NrofCandGroups = 4 - # -------- Optimality criteria: alphabetic ------ - MetaModelOpts.ExpDesign.ExploitMethod = 'alphabetic' - - # 1)D-Opt (D-Optimality) 2)A-Opt (A-Optimality) - # 3)K-Opt (K-Optimality) - MetaModelOpts.ExpDesign.UtilityFunction = 'D-Opt'#['D-Opt', 'A-Opt', 'K-Opt'] - - # >>>>>>>>>>>>>>>>>>>>>> Build Surrogate <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< - # Adaptive sparse arbitrary polynomial chaos expansion - PCEModel_OLS = MetaModelOpts.create_metamodel(Model) - - # Extract the basis and coefficients - Basis_OLS = PCEModel_OLS.BasisDict['Z']['y_2'] - COFFS_OLS = PCEModel_OLS.CoeffsDict['Z']['y_2'] - - #===================================================== - #=========== DEMO OF BAYESPCE METAMODEL =========== - #===================================================== - fig1=plt.figure() - barWidth = 0.3 - plt.title("Bar plot of the weights (OLS)") - - # Create cyan bars - r = np.arange(len(Basis_OLS)) - plt.bar(r, COFFS_OLS, width = barWidth, color = 'cyan', bottom=0.001, - edgecolor = 'black', capsize=7, label='Cofficients') - - # general layout - plt.xticks([r + barWidth for r in range(len(r))], ['term'+str(i+1) for i in range(len(Basis_OLS))]) - - plt.xlabel("Features") - plt.ylabel("Values of the weights") - plt.yscale('symlog', linthreshy=0.1) #('log') - plt.hlines(0,xmin=r.min() , xmax=r.max() ,color='k') - plt.xticks(rotation=45) - plt.legend(loc="upper left") - plt.show() - - # Make directory for saving the plots/outputs - newpath = (r'Outputs_demo') - if not os.path.exists(newpath): os.makedirs(newpath) - - ## Save the plot the posterior (Model) - fig1.savefig('./'+newpath+'/Coeffs_AaPCE.svg', bbox_inches='tight') - plt.close() - - - #===================================================== - #=========== PCE METAMODELS with BRR aPCE ========== - #===================================================== - BRRMetaModelOpts = Metamodel(Inputs) - BRRMetaModelOpts.MaxPceDegree = 10 - BRRMetaModelOpts.RegMethod = 'BRR' - - # ------ Experimental Design -------- - BRRMetaModelOpts.addExpDesign() - BRRMetaModelOpts.ExpDesign.NrSamples = PCEModel_OLS.ExpDesign.X.shape[0] - BRRMetaModelOpts.ExpDesign.SamplingMethod = 'user' - BRRMetaModelOpts.ExpDesign.X = PCEModel_OLS.ExpDesign.X - BRRMetaModelOpts.ExpDesign.Y = PCEModel_OLS.ExpDesign.Y - BRRMetaModelOpts.ExpDesign.Method = 'normal' - - # >>>>>>>>>>>>>>>>>>>>>> Build Surrogate <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< - # Adaptive sparse arbitrary polynomial chaos expansion - PCEModel_BRR = BRRMetaModelOpts.create_metamodel(Model) - - - # Extract the basis and coefficients - Basis_BRR = PCEModel_BRR.BasisDict['Z']['y_2'] - clf_poly = PCEModel_BRR.clf_poly['Z']['y_2'] - - COFFS_BRR = clf_poly.coef_ - # Find the error(std) for coeffs - COFFSError_BRR = clf_poly.sigma_.diagonal() - - #===================================================== - #=========== DEMO OF BAYESPCE METAMODEL ============ - #===================================================== - fig2=plt.figure() - barWidth = 0.3 - plt.title("Bar plot of the weights (BayesPCE)") - - # Create cyan bars - r = np.arange(len(Basis_BRR)) - plt.bar(r, COFFS_BRR, width = barWidth, color = 'cyan', bottom=0.001, - edgecolor = 'black', yerr=COFFSError_BRR, capsize=7, label='Cofficients') - - # general layout - plt.xticks([r + barWidth for r in range(len(r))], ['term'+str(i+1) for i in range(len(Basis_BRR))]) - - plt.xlabel("Features") - plt.ylabel("Values of the weights") - plt.yscale('symlog', linthreshy=0.1) #('log') - plt.hlines(0,xmin=r.min() , xmax=r.max() ,color='k') - plt.xticks(rotation=45) - plt.legend(loc="upper left") - plt.show() - - ## Save the plot the posterior (Model) - fig2.savefig('./'+newpath+'/Coeffs_BRR.svg', bbox_inches='tight') - plt.close() - - diff --git a/examples/analytical-function/util/AnalyticalFunction.py b/examples/analytical-function/util/AnalyticalFunction.py deleted file mode 100644 index c4ed8e05c3ecd841f16d6b2d4757b12d5ecad325..0000000000000000000000000000000000000000 --- a/examples/analytical-function/util/AnalyticalFunction.py +++ /dev/null @@ -1,145 +0,0 @@ -#!/usr/bin/env python3 -# -*- coding: utf-8 -*- -""" -Created on Wed Nov 20 14:48:43 2019 - -@author: farid -""" -import numpy as np -import scipy.stats as stats -import matplotlib.pyplot as plt -import scipy.stats as st -import seaborn as sns - -def AnalyticalFunction(xx, t=None): - """ - %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - % - % Analytical Non-Gaussian Function - % - % Authors: Farid Mohammadi, University of Stuttgart - % Sergey Oladyshkin, University of Stuttgart - % Questions/Comments: Please email Farid Mohammadi at: - % farid.mohammadi@iws.uni-stuttgart.de - % - % Copyright 2019. Farid Mohammadi, University of Stuttgart. - % - % THERE IS NO WARRANTY, EXPRESS OR IMPLIED. WE DO NOT ASSUME ANY LIABILITY - % FOR THE USE OF THIS SOFTWARE. If software is modified to produce - % derivative works, such modified software should be clearly marked. - % Additionally, this program is free software; you can redistribute it - % and/or modify it under the terms of the GNU General Public License as - % published by the Free Software Foundation; version 2.0 of the License. - % Accordingly, this program is distributed in the hope that it will be - % useful, but WITHOUT ANY WARRANTY; without even the implied warranty - % of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - % General Public License for more details. - % - % For function details and reference information, see: - % https://doi.org/10.3390/e21111081 - % - %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - % - % OUTPUT AND INPUTS: - % - % Output = row vector of time vectors (s, t) - % Its structure is: - % y(t_1), y(t_2), ..., y(t_dt) - % xx = [x1, x2, ..., xn] - % xn ~ Uinform(-5, 5) - % t = vector of times (optional), with default value - % ( k − 1 ) /9 and k = 1,..., 10 - %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - """ - nParamSets, nParams = xx.shape - - if t is None: t = np.arange(0, 10, 1.) / 9 - - term1 = (xx[:,0]**2 + xx[:,1] - 1)**2 - - term2 = xx[:,0]**2 - - term3 = 0.1 * xx[:,0] * np.exp(xx[:,1]) - - term5 = 0 - if nParams > 2: - for i in range(2, nParams): - term5 = term5 + xx[:,i]**3/i - - const = term1 + term2 + term3 + 1 + term5 - - # Compute time dependent term - term4 = np.zeros((nParamSets,len(t))) - for idx in range(nParamSets): - term4[idx] = -2 * xx[idx,0] * np.sqrt(0.5*t) - - Output = term4 + np.repeat(const[:,None], len(t), axis=1) - - return np.vstack((t, Output)) - -if __name__ == "__main__": - - MCSize = 10000 #1000000 - ndim = 10 - sigma = 2 - - # ------------------------------------------------------------------------- - # ----------------------- Synthetic data generation ----------------------- - # ------------------------------------------------------------------------- - t = np.arange(0, 10, 1.) / 9 - - MAP = np.zeros((1, ndim)) - synthethicData = AnalyticalFunction(MAP, t=t) - - # ------------------------------------------------------------------------- - # ---------------------- Generate Prior distribution ---------------------- - # ------------------------------------------------------------------------- - - xx = np.zeros((MCSize, ndim)) - - params = (-5,5) - - for idxDim in range(ndim): - lower, upper = params - xx[:,idxDim] = stats.uniform(loc=lower, scale=upper-lower).rvs(size=MCSize) - - # ------------------------------------------------------------------------- - # ------------- BME and Kullback-Leibler Divergence ----------------------- - # ------------------------------------------------------------------------- - Outputs = AnalyticalFunction(xx, t=t) - - cov_matrix = np.diag(np.repeat(sigma**2, synthethicData.shape[1])) - - Likelihoods = st.multivariate_normal.pdf(Outputs[1:], mean=synthethicData[1], cov=cov_matrix) - - sns.kdeplot(np.log(Likelihoods[Likelihoods>0]), shade=True, color="g", label='Ref. Likelihood') - - normLikelihood = Likelihoods / np.nanmax(Likelihoods) - # Random numbers between 0 and 1 - unif = np.random.rand(1, MCSize)[0] - - # Reject the poorly performed prior - accepted = normLikelihood >= unif - - # Prior-based estimation of BME - logBME = np.log(np.nanmean(Likelihoods)) - print('\nThe Naive MC-Estimation of BME is %.5f.'%(logBME)) - - # Posterior-based expectation of likelihoods - postExpLikelihoods = np.mean(np.log(Likelihoods[accepted])) - - # Calculate Kullback-Leibler Divergence - KLD = postExpLikelihoods - logBME - print("The Kullback-Leibler divergence estimation is %.5f."%KLD) - - # ------------------------------------------------------------------------- - # ----------------- Save the arrays as .npy files ------------------------- - # ------------------------------------------------------------------------- - if MCSize > 500000: - np.save("data/refBME_KLD_"+str(ndim)+".npy", (logBME, KLD)) - np.save("data/mean_"+str(ndim)+".npy", np.mean(Outputs[1:],axis=0)) - np.save("data/std_"+str(ndim)+".npy", np.std(Outputs[1:],axis=0)) - else: - np.save("data/Prior_"+str(ndim)+".npy", xx) - np.save("data/origModelOutput_"+str(ndim)+".npy", Outputs[1:]) - np.save("data/validLikelihoods_"+str(ndim)+".npy", Likelihoods) diff --git a/examples/analytical-function/util/PCE_vs_Chaospy.py b/examples/analytical-function/util/PCE_vs_Chaospy.py deleted file mode 100755 index 87a71cea2389e6b639fb5927baf0c6b8cb488d2b..0000000000000000000000000000000000000000 --- a/examples/analytical-function/util/PCE_vs_Chaospy.py +++ /dev/null @@ -1,319 +0,0 @@ -#!/usr/bin/env python3 -# -*- coding: utf-8 -*- -""" -Created on Thu Aug 13 09:53:11 2020 - -@author: farid -""" -import sys, os -import numpy as np -import scipy.stats as stats -from itertools import cycle -import pandas as pd -try: - import cPickle as pickle -except ModuleNotFoundError: - import pickle -from sklearn import linear_model as lm -from matplotlib.backends.backend_pdf import PdfPages -import matplotlib.pyplot as plt -plt.rcParams.update({'font.size': 24}) -plt.rc('figure', figsize = (24, 16)) -plt.rc('font', family='serif', serif='Arial') -plt.rc('axes', grid = True) -plt.rc('text', usetex=True) -plt.rc('xtick', labelsize=24) -plt.rc('ytick', labelsize=24) -plt.rc('axes', labelsize=24) -plt.rc('axes', linewidth=2) -plt.rc('axes', grid=True) -plt.rc('grid', linestyle="-") -plt.rc('savefig', dpi=2000) - -import matplotlib -matplotlib.use('agg') -# Local -sys.path.insert(0,'./../bayesian-validation/BayesValidRox/') - -# Batch script -# sys.path.insert(0,'./../../bayesian-validation/BayesValidRox/') - -from PyLink.FuncForwardModel import FuncForwardModel -from surrogate_models.Input import Input -from surrogate_models.surrogate_models import Metamodel -from PostProcessing.PostProcessing import PostProcessing - - -# Number of parameters -ndim = 10 # 2, 10 - -#===================================================== -#============= COMPUTATIONAL MODEL ================ -#===================================================== -Model = FuncForwardModel() - -Model.Type = 'Function' -Model.pyFile = 'AnalyticalFunction' -Model.Name = 'AnalyticFunc' - -Model.Output.Names = ['Z'] -OutputNames = ['Z'] - -# For Bayesian inversion synthetic data with X=[0,0] -Model.Observations['Time [s]'] = np.arange(0, 10, 1.) / 9 -Model.Observations['Z'] = np.repeat([2],10) - -# For Checking with the MonteCarlo refrence -Model.MCReference['Time [s]'] = np.arange(0, 10, 1.) / 9 -Model.MCReference['mean'] = np.load("../data/mean_"+str(ndim)+".npy") -Model.MCReference['std'] = np.load("../data/std_"+str(ndim)+".npy") - -#===================================================== -#========= PROBABILISTIC INPUT MODEL ============== -#===================================================== -# Define the uncertain parameters with their mean and -# standard deviation -Inputs = Input() - -for i in range(ndim): - Inputs.addMarginals() - Inputs.Marginals[i].Name = '$X_{%s}$'%(i+1) - Inputs.Marginals[i].DistType = 'unif' - Inputs.Marginals[i].Parameters = [-5, 5] - -# arbitrary polynomial chaos -# inputParams = np.load('../data/InputParameters_{}.npy'.format(ndim)) -# for i in range(ndim): -# Inputs.addMarginals() -# Inputs.Marginals[i].Name = '$X_{%s}$'%(i+1) -# Inputs.Marginals[i].InputValues = inputParams[:,i] - -#===================================================== -#========== DEFINITION OF THE METAMODEL ============ -#===================================================== -MetaModelOpts = Metamodel(Inputs) - -# Select if you want to preserve the spatial/temporal depencencies -MetaModelOpts.DimRedMethod = 'PCA' -MetaModelOpts.varPCAThreshold = 99.999 - -# Select your metamodel method -# 1) PCE (Polynomial Chaos Expansion) 2) GPE (Gaussian Process Emulator) -# 3) PCEKriging (PCE + GPE) -MetaModelOpts.metaModel = 'PCEKriging' - -# ------------------------------------------------ -# ------------- PCE Specification ---------------- -# ------------------------------------------------ -# Select the sparse least-square minimization method for -# the PCE coefficients calculation: -# 1)OLS: Ordinary Least Square 2)BRR: Bayesian Ridge Regression -# 3)LARS: Least angle regression 4)ARD: Bayesian ARD Regression -# 5)FastARD: Fast Bayesian ARD Regression -MetaModelOpts.RegMethod = 'FastARD' - -# Specify the max degree to be compared by the adaptive algorithm: -# The degree with the lowest Leave-One-Out cross-validation (LOO) -# error (or the highest score=1-LOO)estimator is chosen as the final -# metamodel. -MetaModelOpts.MinPceDegree = 6 -MetaModelOpts.MaxPceDegree = 6 -# q-quasi-norm 0<q<1 (default=1) -MetaModelOpts.q = 1.0 if ndim<5 else 0.75 - -# ------------------------------------------------ -# ------ Experimental Design Configuration ------- -# ------------------------------------------------ -# Generate an experimental design of size NrExpDesign based on a latin -# hypercube sampling of the input model or user-defined values of X and/or Y: -MetaModelOpts.addExpDesign() - -# One-shot (normal) or Sequential Adaptive (sequential) Design -MetaModelOpts.ExpDesign.Method = 'normal' -MetaModelOpts.ExpDesign.NrSamples = 200 - -# Sampling methods -# 1) random 2) latin_hypercube 3) sobol 4) halton 5) hammersley 6) chebyshev(FT) -# 7) korobov 8) grid(FT) 9) nested_grid(FT) 10)user -MetaModelOpts.ExpDesign.SamplingMethod = 'random' - -# >>>>>>>>>>>>>>>>>>>>>> Build Surrogate <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< -# Adaptive sparse arbitrary polynomial chaos expansion -MetaModelOpts.index = 181 -PCEModel = MetaModelOpts.create_metamodel(Model) - -# PCEModel = BayesObj.PCEModel -# Extract slicing index -# Extract the experimental design -EDX = PCEModel.ExpDesign.X -index = PCEModel.index -EDYDict = PCEModel.ExpDesign.Y -JDist = PCEModel.ExpDesign.JDist -X_train = PCEModel.ExpDesign.X -EDY = PCEModel.ExpDesign.Y -#===================================================== -#========= POST PROCESSING OF METAMODELS =========== -#===================================================== -PostPCE = PostProcessing(PCEModel) - -# Compute the moments and compare with the Monte-Carlo reference -PostPCE.plotMoments() - -# Plot the sobol indices -sobol_cell, total_sobol = PostPCE.sobolIndicesPCE() - - -#===================================================== -#============ METAMODELS WITH CHAOSPY ============= -#===================================================== -import chaospy -from surrogate_models.RegressionFastARD import RegressionFastARD - -def PCATransformation(Output): - - # Transform via Principal Component Analysis - from sklearn.decomposition import PCA as sklearnPCA - - n_samples, n_features = Output.shape - covar_matrix = sklearnPCA(n_components=None, svd_solver='full') - covar_matrix.fit(Output) - var = np.cumsum(np.round(covar_matrix.explained_variance_ratio_, decimals=5)*100) - try: - selected_n_components = np.where(var>=99.0)[0][0] + 1 - except: - selected_n_components = min(n_samples, n_features) - - nComponents = min(n_samples, n_features, selected_n_components) - - pca = sklearnPCA(n_components=nComponents, svd_solver='full', whiten=False) - OutputMatrix = pca.fit_transform(Output) - - return pca, OutputMatrix - -def fit_regression(methodConfig, X_train,Y_train,pca=False): - - from sklearn.multioutput import MultiOutputRegressor - - if pca: - PCA, Y_train = PCATransformation(Y_train) - else: - PCA = None - - deg = methodConfig['deg'] - distribution = methodConfig['distribution'] - q = methodConfig['q'] - regmethod = methodConfig['regmethod'] - # Generate Orthogonal Polynomial Expansion: - orthogonal_expansion = chaospy.orth_ttr(deg, distribution, cross_truncation=q) - - PCEModel={} - PCEModel['config'] = methodConfig - newPsi = orthogonal_expansion(*X_train.T).T - - if regmethod =='FastARD': - PCEModel = MultiOutputRegressor(RegressionFastARD(fit_intercept=False)).fit(newPsi, Y_train) - else: - PCEModel = MultiOutputRegressor(lm.BayesianRidge(fit_intercept=False)).fit(newPsi, Y_train) - - # for idx in range(Y_train.shape[1]): - # clf_poly = RegressionFastARD(fit_intercept=False) - - # PCEModel[idx] = clf_poly.fit(newPsi, Y_train[:,idx]) - - return PCA, PCEModel - -def approx_model(model, X,pca=None): - - global methodConfig - - y_Hat, y_Std = [], [] - deg = methodConfig['deg'] - distribution = methodConfig['distribution'] - q = methodConfig['q'] - - # Generate Orthogonal Polynomial Expansion: - orthogonal_expansion = chaospy.orth_ttr(deg, distribution, cross_truncation=q) - - psi = orthogonal_expansion(*X.T).T - - y_Hat = model.predict(psi).T - - # for idx in list(model.keys())[1:]: - # y_hat, y_std = model[idx].predict(psi, return_std=True) - # y_Hat.append(y_hat) - # y_Std.append(y_std) - - if pca is None: - return np.array(y_Hat).T - else: - return pca.inverse_transform(np.array(y_Hat).T)# , np.array(y_Std).T - -# Select a Distributions: -distribution = JDist #chaospy.J(*[chaospy.Uniform(-5.0,5.0)]*ndim) - -methodConfig = dict() -y_chaos = dict() -methodConfig['regmethod'] = 'FastARD' #'FastARD' -methodConfig['deg'] = PCEModel.MaxPceDegree -methodConfig['distribution'] = distribution -methodConfig['q'] = MetaModelOpts.q - - -# Fit regression model -PCA = True -for key in OutputNames: - - pca, PCEModel_chaospy = fit_regression(methodConfig, X_train,EDY[key],pca=PCA) - y_chaos[key] = approx_model(PCEModel_chaospy, X_train,pca=pca) - - -#===================================================== -#================= Visualization =================== -#===================================================== -# List of markers and colors -Color = ['k','b', 'g', 'r'] -Marker = 'x' - -Time = EDY['x_values'] - -nStes = 1 - -# Run pcemodel -y_hat, y_std = PCEModel.eval_metamodel(samples=EDX[:nStes]) #(nsamples=100, samples=EDX, name=case) - -# create a PdfPages object -pdf = PdfPages('./PCE.pdf') -fig = plt.figure() - -for key in OutputNames: - - fig, ax = plt.subplots() - - - # Plot ExpDesign - for i, output in enumerate(EDY[key][:nStes]): - plt.plot(Time,output, alpha=0.35) - - - # Plot PCE with BayesValidRox - for i, output in enumerate(y_hat[key]): - plt.plot(Time,output, ls='-', marker='*') - - - # Plot PCE with Chaospy - for i, output in enumerate(y_chaos[key][:nStes]): - plt.plot(Time,output, ls='-', marker='*') - - plt.legend(loc='best', frameon=True) - plt.xlabel('Time [s]') - plt.ylabel(key) - - # save the current figure - pdf.savefig(fig, bbox_inches='tight') - - # Destroy the current plot - plt.clf() - -pdf.close() - - diff --git a/examples/analytical-function/util/Psi_BayesValidRox.npy b/examples/analytical-function/util/Psi_BayesValidRox.npy deleted file mode 100644 index 43373abb38884fbe6f5e8c509443b916a3a0aea7..0000000000000000000000000000000000000000 Binary files a/examples/analytical-function/util/Psi_BayesValidRox.npy and /dev/null differ diff --git a/examples/analytical-function/util/Psi_Chaospy.npy b/examples/analytical-function/util/Psi_Chaospy.npy deleted file mode 100644 index dc7974367157dba6f4775091aa09acd314b4c8fe..0000000000000000000000000000000000000000 Binary files a/examples/analytical-function/util/Psi_Chaospy.npy and /dev/null differ diff --git a/examples/analytical-function/util/__pycache__/AnalyticalFunction.cpython-38.pyc b/examples/analytical-function/util/__pycache__/AnalyticalFunction.cpython-38.pyc deleted file mode 100644 index e89c6708d7e9e374610f5dec468e2d7c3a94036f..0000000000000000000000000000000000000000 Binary files a/examples/analytical-function/util/__pycache__/AnalyticalFunction.cpython-38.pyc and /dev/null differ diff --git a/examples/analytical-function/util/dynamic_image.py b/examples/analytical-function/util/dynamic_image.py deleted file mode 100644 index 8c1478164c37739fc1c7b42d4fe4d108c696deee..0000000000000000000000000000000000000000 --- a/examples/analytical-function/util/dynamic_image.py +++ /dev/null @@ -1,142 +0,0 @@ -""" -================================================= -Animated image using a precomputed list of images -================================================= - -""" - -import numpy as np -import matplotlib.pyplot as plt -import matplotlib.animation as animation -plt.rcParams.update({'font.size': 16}) -plt.rc('figure', figsize = (12, 8)) -plt.rc('font', family='sans-serif', serif='Arial') -plt.rc('axes', grid = True) -plt.rc('text', usetex=True) -plt.rc('xtick', labelsize=16) -plt.rc('ytick', labelsize=16) -plt.rc('axes', labelsize=16) - -def posteriorPlot(ax,figPosterior,Posterior, MAP, parNames): - - # Initialization - lw = 3. - BoundTuples = [(-5,5), (-5,5)] - NofPa = len(MAP) - - # This is the true mean of the second mode that we used above: - value1 = MAP - - # This is the empirical mean of the sample: - value2 = np.mean(Posterior, axis=0) - - if NofPa == 2: - - #figPosterior, ax = plt.subplots() - plt.hist2d(Posterior[:,0], Posterior[:,1], bins=(200, 200), - range=np.array([BoundTuples[0],BoundTuples[1]]), cmap=plt.cm.jet) - - plt.xlabel(parNames[0]) - plt.ylabel(parNames[1]) - - plt.xlim(BoundTuples[0]) - plt.ylim(BoundTuples[1]) - - ax.axvline(value1[0], color="g", lw=lw) - ax.axhline(value1[1], color="g", lw=lw) - ax.plot(value1[0], value1[1], "sg", lw=lw+1) - - #ax.axvline(value2[0], ls='--', color="r", lw=lw) - #ax.axhline(value2[1], ls='--', color="r", lw=lw) - #ax.plot(value2[0], value2[1], "sr", lw=lw+1) - - else: - import corner - figPosterior = corner.corner(Posterior, labels=parNames, - show_titles=True, title_kwargs={"fontsize": 12}) - - # Extract the axes - axes = np.array(figPosterior.axes).reshape((NofPa, NofPa)) - - # Loop over the diagonal - for i in range(NofPa): - ax = axes[i, i] - ax.axvline(value1[i], color="g") - ax.axvline(value2[i], ls='--', color="r") - - # Loop over the histograms - for yi in range(NofPa): - for xi in range(yi): - ax = axes[yi, xi] - ax.axvline(value1[xi], color="g") - ax.axvline(value2[xi], ls='--', color="r") - ax.axhline(value1[yi], color="g") - ax.axhline(value2[yi], ls='--', color="r") - ax.plot(value1[xi], value1[yi], "sg") - ax.plot(value2[xi], value2[yi], "sr") - - plt.subplots_adjust(left=0.1, right=0.9, top=0.9, bottom=0.1) - #figPosterior.set_size_inches((10,10)) - return figPosterior - -fig, ax = plt.subplots() -dirPath = '/home/farid/scientific/bayesian-validation/BayesValidRox/tests/AnalyticalFunction/Outputs_SeqPosteriorComparison/' - -nRuns= 35 -Posteriors = {} -nameList = ['init'] + list(range(1,nRuns+1)) -for i, name in enumerate(nameList): -# x = np.random.normal(size=50000) -# y = x * 3 * (i+1) + np.random.normal(size=50000) -# Posteriors[i] = np.stack((x,y)).T - Posteriors[i] = np.load(dirPath+'SeqPosterior_%s.npy'%name) - - -# animation function -def animate(i, Posteriors): - - Posterior = Posteriors[i] - - cont = posteriorPlot(ax,fig,Posterior, MAP = (0,0), parNames=['$X_1$', '$X_2$']) - - plt.title(r'Iteration = %i' % i) - - return cont - -anim = animation.FuncAnimation(fig, animate, fargs=(Posteriors,))#, frames=nRuns) -anim.save('animation.mp4') - - - -#fig = plt.figure() -# -# -#def f(x, y): -# return np.sin(x) + np.cos(y) -# -#x = np.linspace(0, 2 * np.pi, 120) -#y = np.linspace(0, 2 * np.pi, 100).reshape(-1, 1) -## ims is a list of lists, each row is a list of artists to draw in the -## current frame; here we are just animating one artist, the image, in -## each frame -#ims = [] -#for i in range(60): -# x += np.pi / 15. -# y += np.pi / 20. -# im = plt.imshow(f(x, y), animated=True) -# ims.append([im]) -# -#ani = animation.ArtistAnimation(fig, ims, interval=50, blit=True, -# repeat_delay=1000) -# -## To save the animation, use e.g. -## -#ani.save("movie.mp4") -# -# or -# -# from matplotlib.animation import FFMpegWriter -# writer = FFMpegWriter(fps=15, metadata=dict(artist='Me'), bitrate=1800) -# ani.save("movie.mp4", writer=writer) - -#plt.show() diff --git a/examples/analytical-function/util/indices_bayesValid.npy b/examples/analytical-function/util/indices_bayesValid.npy deleted file mode 100644 index 087a2608fb8da023977760ab15582c61c7a8ff6d..0000000000000000000000000000000000000000 Binary files a/examples/analytical-function/util/indices_bayesValid.npy and /dev/null differ diff --git a/examples/analytical-function/util/indices_chaospy.npy b/examples/analytical-function/util/indices_chaospy.npy deleted file mode 100644 index 087a2608fb8da023977760ab15582c61c7a8ff6d..0000000000000000000000000000000000000000 Binary files a/examples/analytical-function/util/indices_chaospy.npy and /dev/null differ diff --git a/examples/analytical-function/util/svg_gif.py b/examples/analytical-function/util/svg_gif.py deleted file mode 100644 index 4430de69c299a495bba9642ea5d5115e7452bdda..0000000000000000000000000000000000000000 --- a/examples/analytical-function/util/svg_gif.py +++ /dev/null @@ -1,47 +0,0 @@ -#!/usr/bin/env python3 -# -*- coding: utf-8 -*- -""" -Created on Mon May 16 10:51:20 2022 - -@author: farid -""" - -import imageio -import os -import re - - -def tryint(s): - try: - return int(s) - except: - return s - - -def alphanum_key(s): - """ Turn a string into a list of string and number chunks. - "z23a" -> ["z", 23, "a"] - """ - return [tryint(c) for c in re.split('([0-9]+)', s)] - - -def sort_nicely(input_list): - """ Sort the given list in the way that humans expect. - """ - input_list.sort(key=alphanum_key) - - -path = '../adaptivePlots' -file_ext = 'pdf' - - -filenames = [] -for file in os.listdir(path): - if file.endswith(f'.{file_ext}'): - filenames.append(os.path.join(path, file)) -sort_nicely(filenames) - -images = [] -for filename in filenames: - images.append(imageio.imread(filename)) -imageio.mimsave(f'{path}/movie.gif', images) diff --git a/examples/beam/Beam9points_1/SSBeam_Deflection_1.inp b/examples/beam/Beam9points_1/SSBeam_Deflection_1.inp new file mode 100644 index 0000000000000000000000000000000000000000..fec3b20b0b63491c95e1deab597784c31448405f --- /dev/null +++ b/examples/beam/Beam9points_1/SSBeam_Deflection_1.inp @@ -0,0 +1,6 @@ +% Input file for the simply supported beam model +1.5557e-01 % b in m +2.8052e-01 % h in m +5 % L in m +2.2558e+10 % E in Pa +9.2858e+03 % p in N/m diff --git a/examples/beam/example_beam.py b/examples/beam/example_beam.py new file mode 100644 index 0000000000000000000000000000000000000000..84b88255f53ef81ae5eb2861b4550fe0c68052ab --- /dev/null +++ b/examples/beam/example_beam.py @@ -0,0 +1,157 @@ +#!/usr/bin/env python3 +# -*- coding: utf-8 -*- +""" +This test shows a surrogate for a beam deflection model can be created. +This example also illustrate how a model with an executable and a +input file can be linked with the bayesvalidrox package. + +Author: Farid Mohammadi, M.Sc. +E-Mail: farid.mohammadi@iws.uni-stuttgart.de +Department of Hydromechanics and Modelling of Hydrosystems (LH2) +Institute for Modelling Hydraulic and Environmental Systems (IWS), University +of Stuttgart www.iws.uni-stuttgart.de/lh2/ +Pfaffenwaldring 61 +70569 Stuttgart + +""" +# Add BayesValidRox path +import sys +sys.path.append("../../src/bayesvalidrox/") + +from bayesvalidrox.pylink.pylink import PyLinkForwardModel +from bayesvalidrox.surrogate_models.inputs import Input +from bayesvalidrox.surrogate_models.exp_designs import ExpDesigns +from bayesvalidrox.surrogate_models.surrogate_models import MetaModel +#from bayesvalidrox.surrogate_models.meta_model_engine import MetaModelEngine +from bayesvalidrox.post_processing.post_processing import PostProcessing +from bayesvalidrox.bayes_inference.bayes_inference import BayesInference +from bayesvalidrox.bayes_inference.discrepancy import Discrepancy + +from bayesvalidrox.surrogate_models.engine import Engine + + +if __name__ == "__main__": + + # ===================================================== + # ============= COMPUTATIONAL MODEL ================ + # ===================================================== + Model = PyLinkForwardModel() + + Model.link_type = 'PyLink' + Model.name = 'Beam9points' + Model.input_file = "SSBeam_Deflection.inp" + Model.input_template = "SSBeam_Deflection.tpl.inp" + + Model.shell_command = "myBeam9points SSBeam_Deflection.inp" + Model.Output.parser = 'read_Beam_Deflection' + Model.Output.names = ['Deflection [m]'] + Model.Output.file_names = ["SSBeam_Deflection.out"] + + # For Bayesian inversion + Model.meas_file = 'data/MeasuredData.csv' + Model.meas_file_valid = 'data/MeasuredData_Valid.csv' + + # For Checking with the MonteCarlo refrence + Model.mc_ref_file = 'data/MCrefs_MeanStd.csv' + + # ===================================================== + # ========= PROBABILISTIC INPUT MODEL ============== + # ===================================================== + # Define the uncertain parameters with their mean and + # standard deviation + Inputs = Input() + + Inputs.add_marginals() + Inputs.Marginals[0].name = 'Beam width' + Inputs.Marginals[0].dist_type = 'lognormal' + Inputs.Marginals[0].parameters = [0.15, 0.0075] + + Inputs.add_marginals() + Inputs.Marginals[1].name = 'Beam height' + Inputs.Marginals[1].dist_type = 'lognormal' + Inputs.Marginals[1].parameters = [0.3, 0.015] + + Inputs.add_marginals() + Inputs.Marginals[2].name = 'Youngs modulus' + Inputs.Marginals[2].dist_type = 'lognormal' + Inputs.Marginals[2].parameters = [30000e+6, 4500e+6] + + Inputs.add_marginals() + Inputs.Marginals[3].name = 'Uniform load' + Inputs.Marginals[3].dist_type = 'lognormal' + Inputs.Marginals[3].parameters = [1e4, 2e3] + + # ===================================================== + # ========== DEFINITION OF THE METAMODEL ============ + # ===================================================== + MetaModelOpts = MetaModel(Inputs, Model) + + # Select if you want to preserve the spatial/temporal depencencies + # MetaModelOpts.dim_red_method = 'PCA' + # MetaModelOpts.var_pca_threshold = 99.999 + # MetaModelOpts.n_pca_components = 12 + + # Select your metamodel method + # 1) PCE (Polynomial Chaos Expansion) 2) aPCE (arbitrary PCE) + # 3) GPE (Gaussian Process Emulator) + MetaModelOpts.meta_model_type = 'PCE' + + # ------------------------------------------------ + # ------------- PCE Specification ---------------- + # ------------------------------------------------ + # Select the sparse least-square minimization method for + # the PCE coefficients calculation: + # 1)OLS: Ordinary Least Square 2)BRR: Bayesian Ridge Regression + # 3)LARS: Least angle regression 4)ARD: Bayesian ARD Regression + # 5)FastARD: Fast Bayesian ARD Regression + # 6)BCS: Bayesian Compressive Sensing + # 7)OMP: Orthogonal Matching Pursuit + # 8)VBL: Variational Bayesian Learning + # 9)EBL: Emperical Bayesian Learning + MetaModelOpts.pce_reg_method = 'FastARD' + + # Specify the max degree to be compared by the adaptive algorithm: + # The degree with the lowest Leave-One-Out cross-validation (LOO) + # error (or the highest score=1-LOO)estimator is chosen as the final + # metamodel. pce_deg accepts degree as a scalar or a range. + MetaModelOpts.pce_deg = 6 + + # q-quasi-norm 0<q<1 (default=1) + MetaModelOpts.pce_q_norm = 0.75 + + # ------------------------------------------------ + # ------ Experimental Design Configuration ------- + # ------------------------------------------------ + # MetaModelOpts.add_ExpDesign() + ExpDesign = ExpDesigns(Inputs) + + # One-shot (normal) or Sequential Adaptive (sequential) Design + ExpDesign.n_init_samples = 100 + + # Sampling methods + # 1) random 2) latin_hypercube 3) sobol 4) halton 5) hammersley + # 6) chebyshev(FT) 7) grid(FT) 8)user + ExpDesign.sampling_method = 'latin_hypercube' + + # Provide the experimental design object with a hdf5 file + # MetaModelOpts.ExpDesign.hdf5_file = 'ExpDesign_Beam9points.hdf5' + + # ------ Train the surrogate model ------ + engine = Engine(MetaModelOpts, Model, ExpDesign) + engine.start_engine() + engine.train_normal() + + # ===================================================== + # ========= POST PROCESSING OF METAMODELS =========== + # ===================================================== + PostPCE = PostProcessing(engine) + + # Compute the moments and compare with the Monte-Carlo reference + PostPCE.plot_moments(xlabel='$\\mathrm{L_{rel}}$ (-)') + + # Plot the sobol indices + if MetaModelOpts.meta_model_type != 'GPE': + total_sobol = PostPCE.sobol_indices() + + # Plot to check validation visually. + PostPCE.valid_metamodel(n_samples=3) diff --git a/examples/borehole/borehole.py b/examples/borehole/borehole.py index b2a0dcd4a08091e05b74cceae3eda3709308ae49..f91cbb8f8a645ce9a48e159b268005213e682619 100644 --- a/examples/borehole/borehole.py +++ b/examples/borehole/borehole.py @@ -58,6 +58,7 @@ def borehole(xx, *args): Hu = xx[:, 5] Hl = xx[:, 6] r = xx[:, 7] + frac1 = 2 * np.pi * Tu * (Hu-Hl) @@ -68,6 +69,8 @@ def borehole(xx, *args): y = frac1 / frac2 # Prepare output dict using standard bayesvalidrox format - output = {'x_values': np.zeros(1), 'flow rate [m$^3$/yr]': y} + #output = {'x_values': np.zeros(1), 'flow rate [m$^3$/yr]': y} + output = {'x_values': np.zeros(1), 'flow rate': y} return output + diff --git a/examples/borehole/test_borehole.py b/examples/borehole/example_borehole.py similarity index 79% rename from examples/borehole/test_borehole.py rename to examples/borehole/example_borehole.py index e28e9a30f76afa9deb158e23532af12623f2d8e2..869a053202cfb7343ee03a9a8f41b8b2fc4c8958 100644 --- a/examples/borehole/test_borehole.py +++ b/examples/borehole/example_borehole.py @@ -27,19 +27,26 @@ import joblib import sys sys.path.append("../../src/bayesvalidrox/") -from pylink.pylink import PyLinkForwardModel -from surrogate_models.inputs import Input -from surrogate_models.surrogate_models import MetaModel -from post_processing.post_processing import PostProcessing -from bayes_inference.bayes_inference import BayesInference -from bayes_inference.discrepancy import Discrepancy -from surrogate_models.meta_model_engine import MetaModelEngine +from bayesvalidrox.pylink.pylink import PyLinkForwardModel +from bayesvalidrox.surrogate_models.inputs import Input +from bayesvalidrox.surrogate_models.exp_designs import ExpDesigns +from bayesvalidrox.surrogate_models.surrogate_models import MetaModel +#from bayesvalidrox.surrogate_models.meta_model_engine import MetaModelEngine +from bayesvalidrox.post_processing.post_processing import PostProcessing +from bayesvalidrox.bayes_inference.bayes_inference import BayesInference +from bayesvalidrox.bayes_inference.discrepancy import Discrepancy +from bayesvalidrox.surrogate_models.engine import Engine import matplotlib matplotlib.use('agg') + +# TODO: this is a test in hopes of removing multiprocessing issues +from multiprocessing import set_start_method if __name__ == "__main__": + #set_start_method('fork', force = True) + # ===================================================== # ============= COMPUTATIONAL MODEL ================ # ===================================================== @@ -50,7 +57,7 @@ if __name__ == "__main__": Model.py_file = 'borehole' Model.name = 'borehole' - Model.Output.names = ['flow rate [m$^3$/yr]'] + Model.Output.names = ['flow rate']#' [m$^3$/yr]'] # ===================================================== # ========= PROBABILISTIC INPUT MODEL ============== @@ -144,45 +151,45 @@ if __name__ == "__main__": # ------------------------------------------------ # ------ Experimental Design Configuration ------- # ------------------------------------------------ - MetaModelOpts.add_ExpDesign() + ExpDesign = ExpDesigns(Inputs) # One-shot (normal) or Sequential Adaptive (sequential) Design - MetaModelOpts.ExpDesign.method = 'sequential' - MetaModelOpts.ExpDesign.n_init_samples = 50 + ExpDesign.method = 'sequential' + ExpDesign.n_init_samples = 50 # Sampling methods # 1) random 2) latin_hypercube 3) sobol 4) halton 5) hammersley 6) korobov # 7) chebyshev(FT) 8) grid(FT) 9) nested_grid(FT) 10)user - MetaModelOpts.ExpDesign.sampling_method = 'latin_hypercube' + ExpDesign.sampling_method = 'latin_hypercube' # Provide the experimental design object with a hdf5 file # MetaModelOpts.ExpDesign.hdf5_file = 'ExpDesign_borehole.hdf5' # Sequential experimental design (needed only for sequential ExpDesign) - MetaModelOpts.ExpDesign.n_new_samples = 1 - MetaModelOpts.ExpDesign.n_max_samples = 300 - MetaModelOpts.ExpDesign.mod_LOO_threshold = 1e-16 + ExpDesign.n_new_samples = 1 + ExpDesign.n_max_samples = 300 + ExpDesign.mod_LOO_threshold = 1e-16 # ------------------------------------------------ # ------- Sequential Design configuration -------- # ------------------------------------------------ # 1) None 2) 'equal' 3)'epsilon-decreasing' 4) 'adaptive' - MetaModelOpts.ExpDesign.tradeoff_scheme = None + ExpDesign.tradeoff_scheme = None # MetaModelOpts.ExpDesign.n_replication = 50 # -------- Exploration ------ # 1)'Voronoi' 2)'random' 3)'latin_hypercube' 4)'dual annealing' - MetaModelOpts.ExpDesign.explore_method = 'latin_hypercube' + ExpDesign.explore_method = 'latin_hypercube' # Use when 'dual annealing' chosen - MetaModelOpts.ExpDesign.max_func_itr = 200 + ExpDesign.max_func_itr = 200 # Use when 'Voronoi' or 'random' or 'latin_hypercube' chosen - MetaModelOpts.ExpDesign.n_canddidate = 5000 - MetaModelOpts.ExpDesign.n_cand_groups = 4 + ExpDesign.n_canddidate = 5000 + ExpDesign.n_cand_groups = 4 # -------- Exploitation ------ # 1)'BayesOptDesign' 2)'VarOptDesign' 3)'alphabetic' 4)'Space-filling' - MetaModelOpts.ExpDesign.exploit_method = 'Space-filling' + ExpDesign.exploit_method = 'Space-filling' # BayesOptDesign -> when data is available # 1)DKL (Kullback-Leibler Divergence) 2)DPP (D-Posterior-percision) @@ -191,31 +198,33 @@ if __name__ == "__main__": # VarBasedOptDesign -> when data is not available # Only with Vornoi >>> 1)Entropy 2)EIGF, 3)ALM, 4)LOOCV - MetaModelOpts.ExpDesign.util_func = 'ALM' + ExpDesign.util_func = 'ALM' # alphabetic # 1)D-Opt (D-Optimality) 2)A-Opt (A-Optimality) # 3)K-Opt (K-Optimality) # MetaModelOpts.ExpDesign.util_func = 'D-Opt' - MetaModelOpts.valid_samples = np.load("data/valid_samples.npy") - MetaModelOpts.valid_model_runs = { - 'flow rate [m$^3$/yr]': np.load("data/valid_outputs.npy") - } + valid_samples = np.load("data/valid_samples.npy") + #valid_model_runs = {'flow rate [m$^3$/yr]': np.load("data/valid_outputs.npy")} + valid_model_runs = {'flow rate': np.load("data/valid_outputs.npy")} # >>>>>>>>>>>>>>>>>>>>>> Build Surrogate <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< # Use MetaModelEngine for sequential experimental design - meta_model_engine = MetaModelEngine(MetaModelOpts) - meta_model_engine.run() - PCEModel = meta_model_engine.MetaModel + + MetaModelOpts.ExpDesign = ExpDesign + engine = Engine(MetaModelOpts, Model, ExpDesign) + engine.start_engine() +# engine.train_sequential() + engine.train_sequential(parallel = True) # Save PCE models with open(f'PCEModel_{Model.name}.pkl', 'wb') as output: - joblib.dump(PCEModel, output, 2) + joblib.dump(engine.MetaModel, output, 2) # ===================================================== # ========= POST PROCESSING OF METAMODELS =========== # ===================================================== - PostPCE = PostProcessing(PCEModel) + PostPCE = PostProcessing(engine) # Plot to check validation visually. PostPCE.valid_metamodel(n_samples=200) diff --git a/examples/convergence_tests/convergence_test.py b/examples/convergence_tests/convergence_test.py new file mode 100644 index 0000000000000000000000000000000000000000..bc56e4cb897cde5cf95c5b832002814da831b663 --- /dev/null +++ b/examples/convergence_tests/convergence_test.py @@ -0,0 +1,106 @@ +#!/usr/bin/env python3 +# -*- coding: utf-8 -*- + +import matplotlib.pyplot as plt +import time + +def convergence_test(engine, steps, error, train_samples, test_samples, + test_data, plot = True, write = True): + """ + Tests the convergence for a metamodel over the number of given training + samples in its experimental design. + The results are written out and plotted. + + Conditions: + If data is not given, then arbitrary samples will be chosen to run the + model on + + Parameters + ---------- + engine : bayesvalidrox.Engine + Engine with model and metamodel to train. The ExpDesign needs to exist, + but sampling method and more will be set in this function + steps : list of ints in increasing order + The number of samples to train on per iteration + error : function(test_mean, test_std, test_data) + The function ued to calculate the accuracy of the surrogate, + e.g. the L2-norm + train_samples : 2d np.array + The samples to train on + test_samples : 2d np.array + The samples to use for the accuracy tests of the trained metamodels + test_data : dict of np.arrays + Model evaluations matching the test_samples + plot : bool, optional + Sets if the accuracy should be visualized + write : bool, optional + + Returns + ------- + engines : The trained engines + accuracy : Results of the accuracy measures on the engines + + """ + print('') + print('STARTING THE CONVERGENCE TEST') + # Define output lists + engines = [] + test_runs = {} + test_runs['mean'] = [] + test_runs['std']=[] + accuracy = {} + + for n in steps: + print('') + print(f'---- {n} TRAINING POINTS ----') + print('') + samples = train_samples[:n] + + # Redo the explerimental design + engine.ExpDesign.method = 'normal' + engine.ExpDesign.n_init_samples = n + engine.ExpDesign.sampling_method = 'user' + engine.ExpDesign.X = samples + engine.ExpDesign.Y = None + engine.start_engine() + + # Train and evaluate + start = time.time() + engine.train_normal() + end = time.time() + + print('') + print('Evaluating the metamodel') + surrogate = engine.MetaModel + test_mean, test_std = surrogate.eval_metamodel(test_samples) + + # Add the results + engines.append(engine) + test_runs['mean'].append(test_mean) + test_runs['std'].append(test_std) + + # Add training time + if 'time' not in accuracy.keys(): + accuracy['time'] = [] + accuracy['time'].append(end-start) + + # Add error measures + er = error(test_mean, test_std, test_data) + for key in er: + if key not in accuracy.keys(): + accuracy[key] = [] + accuracy[key].append(er[key]) + + # Save the results? + if write: + None + + # Plot the results + for key in accuracy: + if plot: + plt.plot(steps, accuracy[key], linestyle = 'dashed') + plt.scatter(steps, accuracy[key], label = key) + plt.legend() + plt.show() + + return engines, accuracy diff --git a/examples/convergence_tests/example_trainingconvergence.py b/examples/convergence_tests/example_trainingconvergence.py new file mode 100644 index 0000000000000000000000000000000000000000..d1aea4fe0de0d6467d525564965f8b6e052adda4 --- /dev/null +++ b/examples/convergence_tests/example_trainingconvergence.py @@ -0,0 +1,176 @@ +#!/usr/bin/env python3 +# -*- coding: utf-8 -*- +""" +This example shows comparisons of three regression options for the aPC in +bayesvalidrox: OLS, FastARD and OLS with constraints. +The trained surrogates are compared with respect to the here defined error +measure and their computational cost for different numbers of training samples. +""" + +import numpy as np +import matplotlib.pyplot as plt +import random + +from bayesvalidrox.pylink.pylink import PyLinkForwardModel +from bayesvalidrox.surrogate_models.inputs import Input +from bayesvalidrox.surrogate_models.engine import Engine +from bayesvalidrox.surrogate_models.exp_designs import ExpDesigns +import bayesvalidrox.surrogate_models.surrogate_models as sm + +from convergence_test import convergence_test +from testfunction import testfunction + +def error(mean, std, true): + """ + Error function to evaluate the metamodels + Returns a dictionary of measures. + Here: + 'L2': standard L2 error + + Parameters + ---------- + mean : dict + Mean-part of surrogate evaluation + std : dict + Std-part of surrogate evaluation + true : dict + Mean-part of model evaluation + + Returns + ------- + dict + Results of error measures + + """ + m = mean['Z'] + t = true['Z'] + diff = m-t + return {'L2': np.linalg.norm(diff)} + + +if __name__=="__main__": + random.seed(15) + + # Some model properties and settings + t = np.linspace(0,10,10) + ndim = 2 + + # Plot some evaluations of the model + xx, yy = np.meshgrid(np.linspace(0,1,10),np.linspace(0,1,10)) + x = np.swapaxes(np.vstack([ xx.reshape(-1), yy.reshape(-1) ]),0,1) + out_list = [] + for x_ in x: + out_list.append(testfunction([x_],t)['Z']) + out = np.array(out_list) + mean_out = np.mean(out, axis = 0) + std_out = np.std(out, axis = 0) + + for i in out: + plt.plot(t,i,alpha = 0.2, color = 'blue') + plt.show() + plt.plot(t, mean_out) + plt.show() + plt.plot(t, std_out) + plt.show() + + # Define the model + Model = PyLinkForwardModel() + Model.link_type = 'Function' + Model.py_file = 'testfunction' + Model.name = 'testfunction' + Model.Output.names = ['Z'] + Model.func_args = {'t':t} + + # Define the uncertain parameters with their mean and + # standard deviation + Inputs = Input() + priors = [] + for i in range(ndim): + Inputs.add_marginals() + Inputs.Marginals[i].name = "$\\theta_{"+str(i+1)+"}$" + Inputs.Marginals[i].dist_type = 'uniform' + Inputs.Marginals[i].parameters = [0, 1] + priors.append(np.random.uniform(0,1,1000)) + priors= np.swapaxes(np.array(priors),0,1) + + # Parameters for the convergence test + mini = 2**ndim + steps = [10,20,50] + steps = [mini, 6, 8, 10, 15,20,25,30,35,40,50] + + # Get the samples and model evaluations + train_samples = priors[:steps[-1]] + test_samples = priors[steps[-1]:] + test_data, test_std = Model.run_model_parallel(test_samples, mp = False) + +#%% RUN THE SURROGATES ON THE FIRST BVR CODE + + # Set the surrogate parameters + MetaMod = sm.MetaModel(Inputs) + MetaMod.meta_model_type = 'aPCE' + MetaMod.pce_reg_method = 'FastARD' + MetaMod.bootstrap_method = 'fast' + MetaMod.n_bootstrap_itrs = 1 + MetaMod.pce_deg = np.arange(1,2) + MetaMod.pce_q_norm = 0.85 if ndim < 5 else 0.5 + + # Properties for Physics-informed training + #MetaMod.LAR = True + MetaMod.apply_constraints = False + + # Init ExpDesign - the rest of the ExpDesign is set in convergence_test + ExpDesign = ExpDesigns(Inputs) + + # Start engine + engine = Engine(MetaMod, Model, ExpDesign) + + # Run the convergence test + results_FastArd = convergence_test(engine, steps, error, train_samples, test_samples, test_data) + + # Change the loss function base-type + new_type = 'ols' + engine.MetaModel.pce_reg_method = new_type + results_OLS = convergence_test(engine, steps, error, train_samples, test_samples, test_data) + + # Do OLS with Constraints + # The actual constraints can currently be found and changed in + # bayesvalidrox.surrogate_models.MetaModel.regression(). This interface + # will be improved in future releases + engine.MetaModel.apply_constraints = True + engine.MetaModel.init_type = 'zeros' + results_PI_0rand = convergence_test(engine, steps, error, train_samples, test_samples, test_data) + + # Plot the results + for key in results_FastArd[1]: + plt.plot(steps, results_OLS[1][key], linestyle = 'dashdot') + plt.scatter(steps, results_OLS[1][key], label = 'OLS') + plt.plot(steps, results_FastArd[1][key], linestyle = 'dashed') + plt.scatter(steps, results_FastArd[1][key], label = 'FastARD') + plt.plot(steps, results_PI_0rand[1][key], linestyle = 'dotted') + plt.scatter(steps, results_PI_0rand[1][key], label = 'constrained') + plt.legend() + plt.title(f'Results for {key}') + plt.show() + + # Get test statistics + meanOLS, test_std = results_OLS[0][-1].eval_metamodel(test_samples) + meanARD, test_std = results_FastArd[0][-1].eval_metamodel(test_samples) + meanPI, test_std = results_PI_0rand[0][-1].eval_metamodel(test_samples) + + # Plot test statistics + plt.plot(t, np.mean(meanOLS['Z'], axis = 0), label = 'OLS', linestyle = 'dashdot') + plt.plot(t, np.mean(meanARD['Z'], axis = 0), label = 'FastARD', linestyle = 'dashed') + plt.plot(t, np.mean(meanPI['Z'], axis = 0), label = 'constrained', linestyle = 'dotted') + plt.plot(t, mean_out, label = 'data') + plt.title('Approximation of mean') + plt.legend() + plt.show() + plt.plot(t, np.std(meanOLS['Z'], axis = 0), label = 'OLS', linestyle = 'dashdot') + plt.plot(t, np.std(meanARD['Z'], axis = 0), label = 'FastARD', linestyle = 'dashed') + plt.plot(t, np.std(meanPI['Z'], axis = 0), label = 'constrained', linestyle = 'dotted') + plt.plot(t, std_out, label = 'data') + plt.title('Approximation of std') + plt.legend() + plt.show() + + \ No newline at end of file diff --git a/examples/convergence_tests/testfunction.py b/examples/convergence_tests/testfunction.py new file mode 100644 index 0000000000000000000000000000000000000000..eead90bb1c47e728cc36281c1689776aef21579d --- /dev/null +++ b/examples/convergence_tests/testfunction.py @@ -0,0 +1,15 @@ +# -*- coding: utf-8 -*- +""" +Short testfunction for the convergence tests. +""" +import numpy as np + +def testfunction(x, t): + def sig(x): + return 1/(1 + np.exp(-x)) + # X is 2d array + x = x[0] + out = 30-np.sqrt(t*(x[1]+0.00000001))-x[0]*t-2*np.log(t+1)+x[0]/3-10*x[1]*np.tanh(t-5) -7/(x[0]+0.1)*x[1]*sig(t-9) + #out = -10*sig(t-8) + out /= 40 + return {'x_values': t, 'Z': out} \ No newline at end of file diff --git a/examples/ishigami/test_ishigami.py b/examples/ishigami/example_ishigami.py similarity index 80% rename from examples/ishigami/test_ishigami.py rename to examples/ishigami/example_ishigami.py index 313ad38280acfe6bf3a4b8c29b1f94d74da399b7..72c9dc2d31e93601cbbd60bc40b88a31a73bd5b9 100644 --- a/examples/ishigami/test_ishigami.py +++ b/examples/ishigami/example_ishigami.py @@ -15,8 +15,6 @@ of Stuttgart, www.iws.uni-stuttgart.de/lh2/ Pfaffenwaldring 61 70569 Stuttgart -Created on Wed Jul 10 2019 - """ import numpy as np @@ -27,13 +25,16 @@ import joblib import sys sys.path.append("../../src/bayesvalidrox/") -from pylink.pylink import PyLinkForwardModel -from surrogate_models.inputs import Input -from surrogate_models.surrogate_models import MetaModel -from surrogate_models.meta_model_engine import MetaModelEngine -from post_processing.post_processing import PostProcessing -from bayes_inference.bayes_inference import BayesInference -from bayes_inference.discrepancy import Discrepancy +from bayesvalidrox.pylink.pylink import PyLinkForwardModel +from bayesvalidrox.surrogate_models.inputs import Input +from bayesvalidrox.surrogate_models.exp_designs import ExpDesigns +from bayesvalidrox.surrogate_models.surrogate_models import MetaModel +#from bayesvalidrox.surrogate_models.meta_model_engine import MetaModelEngine +from bayesvalidrox.post_processing.post_processing import PostProcessing +from bayesvalidrox.bayes_inference.bayes_inference import BayesInference +from bayesvalidrox.bayes_inference.discrepancy import Discrepancy + +from bayesvalidrox.surrogate_models.engine import Engine import matplotlib matplotlib.use('agg') @@ -110,45 +111,44 @@ if __name__ == "__main__": # ------------------------------------------------ # ------ Experimental Design Configuration ------- # ------------------------------------------------ - MetaModelOpts.add_ExpDesign() + ExpDesign = ExpDesigns(Inputs) # One-shot (normal) or Sequential Adaptive (sequential) Design - MetaModelOpts.ExpDesign.method = 'normal' - MetaModelOpts.ExpDesign.n_init_samples = 50 + ExpDesign.n_init_samples = 50 # Sampling methods # 1) random 2) latin_hypercube 3) sobol 4) halton 5) hammersley 6) korobov # 7) chebyshev(FT) 8) grid(FT) 9) nested_grid(FT) 10)user - MetaModelOpts.ExpDesign.sampling_method = 'latin_hypercube' + ExpDesign.sampling_method = 'latin_hypercube' # Provide the experimental design object with a hdf5 file # MetaModelOpts.ExpDesign.hdf5_file = 'ExpDesign_Ishigami.hdf5' # Sequential experimental design (needed only for sequential ExpDesign) - MetaModelOpts.ExpDesign.n_new_samples = 1 - MetaModelOpts.ExpDesign.n_max_samples = 200 # 150 - MetaModelOpts.ExpDesign.mod_LOO_threshold = 1e-16 + ExpDesign.n_new_samples = 1 + ExpDesign.n_max_samples = 200 # 150 + ExpDesign.mod_LOO_threshold = 1e-16 # ------------------------------------------------ # ------- Sequential Design configuration -------- # ------------------------------------------------ # 1) None 2) 'equal' 3)'epsilon-decreasing' 4) 'adaptive' - MetaModelOpts.ExpDesign.tradeoff_scheme = None + ExpDesign.tradeoff_scheme = None # MetaModelOpts.ExpDesign.n_replication = 50 # -------- Exploration ------ # 1)'Voronoi' 2)'random' 3)'latin_hypercube' 4)'dual annealing' - MetaModelOpts.ExpDesign.explore_method = 'latin_hypercube' + ExpDesign.explore_method = 'latin_hypercube' # Use when 'dual annealing' chosen - MetaModelOpts.ExpDesign.max_func_itr = 200 + ExpDesign.max_func_itr = 200 # Use when 'Voronoi' or 'random' or 'latin_hypercube' chosen - MetaModelOpts.ExpDesign.n_canddidate = 1000 - MetaModelOpts.ExpDesign.n_cand_groups = 4 + ExpDesign.n_canddidate = 1000 + ExpDesign.n_cand_groups = 4 # -------- Exploitation ------ # 1)'BayesOptDesign' 2)'VarOptDesign' 3)'alphabetic' 4)'Space-filling' - MetaModelOpts.ExpDesign.exploit_method = 'Space-filling' + ExpDesign.exploit_method = 'Space-filling' # BayesOptDesign -> when data is available # 1)DKL (Kullback-Leibler Divergence) 2)DPP (D-Posterior-percision) @@ -157,28 +157,29 @@ if __name__ == "__main__": # VarBasedOptDesign -> when data is not available # Only with Vornoi >>> 1)Entropy 2)EIGF, 3)ALM, 4)LOOCV - MetaModelOpts.ExpDesign.util_func = 'ALM' + ExpDesign.util_func = 'ALM' # alphabetic # 1)D-Opt (D-Optimality) 2)A-Opt (A-Optimality) # 3)K-Opt (K-Optimality) # MetaModelOpts.ExpDesign.util_func = 'D-Opt' - MetaModelOpts.valid_samples = np.load("data/valid_samples.npy") - MetaModelOpts.valid_model_runs = {'Z': np.load("data/valid_outputs.npy")} + ExpDesign.valid_samples = np.load("data/valid_samples.npy") + ExpDesign.valid_model_runs = {'Z': np.load("data/valid_outputs.npy")} # >>>>>>>>>>>>>>>>>>>>>> Build Surrogate <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< - meta_model_engine = MetaModelEngine(MetaModelOpts) - meta_model_engine.run() - PCEModel = meta_model_engine.MetaModel + MetaModelOpts.ExpDesign = ExpDesign + engine = Engine(MetaModelOpts, Model, ExpDesign) + engine.start_engine() + engine.train_sequential() # Save PCE models with open(f'PCEModel_{Model.name}.pkl', 'wb') as output: - joblib.dump(PCEModel, output, 2) + joblib.dump(engine.MetaModel, output, 2) # ===================================================== # ========= POST PROCESSING OF METAMODELS =========== # ===================================================== - PostPCE = PostProcessing(PCEModel) + PostPCE = PostProcessing(engine) # Plot to check validation visually. PostPCE.valid_metamodel(n_samples=200) diff --git a/examples/model-comparison/test_model_comparison.py b/examples/model-comparison/example_model_comparison.py similarity index 75% rename from examples/model-comparison/test_model_comparison.py rename to examples/model-comparison/example_model_comparison.py index d5f523871d99b5115437c2f66e8a1ce2a845f503..d678898c178e9722445f08bd22e3ec93906e2ac7 100644 --- a/examples/model-comparison/test_model_comparison.py +++ b/examples/model-comparison/example_model_comparison.py @@ -14,27 +14,31 @@ University of Stuttgart, www.iws.uni-stuttgart.de/lh2/ Pfaffenwaldring 61 70569 Stuttgart -Created on Wed Oct 10 2021 - """ +from copy import deepcopy import numpy as np import scipy.io as io import pandas as pd import joblib import sys sys.path.append("../../src/bayesvalidrox/") - -from pylink.pylink import PyLinkForwardModel -from surrogate_models.inputs import Input -from surrogate_models.surrogate_models import MetaModel -from post_processing.post_processing import PostProcessing -from bayes_inference.bayes_inference import BayesInference +sys.path.append("../../src/") + +from bayesvalidrox.pylink.pylink import PyLinkForwardModel +from bayesvalidrox.surrogate_models.inputs import Input +from bayesvalidrox.surrogate_models.exp_designs import ExpDesigns +from bayesvalidrox.surrogate_models.surrogate_models import MetaModel +#from bayesvalidrox.surrogate_models.meta_model_engine import MetaModelEngine +from bayesvalidrox.post_processing.post_processing import PostProcessing +from bayesvalidrox.bayes_inference.bayes_inference import BayesInference +from bayesvalidrox.bayes_inference.discrepancy import Discrepancy from bayes_inference.bayes_model_comparison import BayesModelComparison -from bayes_inference.discrepancy import Discrepancy -if __name__ == "__main__": +from bayesvalidrox.surrogate_models.engine import Engine + +if __name__ == "__main__": # Read data sigma = 0.6 data = { @@ -168,33 +172,52 @@ if __name__ == "__main__": # ------------------------------------------------ # ------ Experimental Design Configuration ------- # ------------------------------------------------ - L2_MetaModelOpts.add_ExpDesign() + #L2_MetaModelOpts.add_ExpDesign() + L2_ExpDesign = ExpDesigns(L2_Inputs) # One-shot (normal) or Sequential Adaptive (sequential) Design - L2_MetaModelOpts.ExpDesign.method = 'normal' - L2_MetaModelOpts.ExpDesign.n_init_samples = 100 + L2_ExpDesign.n_init_samples = 100 # Sampling methods # 1) random 2) latin_hypercube 3) sobol 4) halton 5) hammersley # 6) chebyshev(FT) 7) grid(FT) 8)user - L2_MetaModelOpts.ExpDesign.sampling_method = 'latin_hypercube' + L2_ExpDesign.sampling_method = 'latin_hypercube' # ------ Nonlinear cosine model --------- - NL2_MetaModelOpts = L2_MetaModelOpts.copy_meta_model_opts(NL2_Inputs) + NL2_ExpDesign = ExpDesigns(NL2_Inputs) + NL2_ExpDesign.method = 'normal' + NL2_ExpDesign.n_init_samples = 100 + NL2_ExpDesign.sampling_method = 'latin_hypercube' + NL2_MetaModelOpts = deepcopy(L2_MetaModelOpts) + NL2_MetaModelOpts.input_obj = NL2_Inputs # ------ Nonlinear cosine model --------- - NL4_MetaModelOpts = L2_MetaModelOpts.copy_meta_model_opts(NL4_Inputs) + NL4_MetaModelOpts = deepcopy(L2_MetaModelOpts) + NL4_MetaModelOpts.input_obj = NL4_Inputs + NL4_ExpDesign = ExpDesigns(NL4_Inputs) + NL4_ExpDesign.method = 'normal' + NL4_ExpDesign.n_init_samples = 100 + NL4_ExpDesign.sampling_method = 'latin_hypercube' # >>>>>> Train the Surrogates <<<<<<<<<<< - L2_MetaModel = L2_MetaModelOpts.create_metamodel(myL2Model) - NL2_MetaModel = NL2_MetaModelOpts.create_metamodel(myNL2Model) - NL4_MetaModel = NL4_MetaModelOpts.create_metamodel(myNL4Model) + L2_engine = Engine(L2_MetaModelOpts, myL2Model, L2_ExpDesign) + L2_engine.start_engine() + L2_engine.train_normal() + NL2_engine = Engine(NL2_MetaModelOpts, myNL2Model, NL2_ExpDesign) + NL2_engine.start_engine() + NL2_engine.train_normal() + NL4_engine = Engine(NL4_MetaModelOpts, myNL4Model, NL4_ExpDesign) + NL4_engine.start_engine() + NL4_engine.train_normal() + #L2_MetaModel = L2_MetaModelOpts.create_metamodel(myL2Model) + #NL2_MetaModel = NL2_MetaModelOpts.create_metamodel(myNL2Model) + #NL4_MetaModel = NL4_MetaModelOpts.create_metamodel(myNL4Model) # ===================================================== # ========= POST PROCESSING OF METAMODELS =========== # ===================================================== # ---------- Linear model ------------- - L2_PostPCE = PostProcessing(L2_MetaModel, name=myL2Model.name) + L2_PostPCE = PostProcessing(L2_engine, name=myL2Model.name) # Plot to check validation visually. L2_PostPCE.valid_metamodel(n_samples=3) @@ -206,10 +229,10 @@ if __name__ == "__main__": L2_PostPCE.check_accuracy(n_samples=3000) # Plot the sobol indices - sobol_cell, total_sobol = L2_PostPCE.sobol_indices() + total_sobol = L2_PostPCE.sobol_indices() # ---------- Linear model ------------- - NL2_PostPCE = PostProcessing(NL2_MetaModel, name=myNL2Model.name) + NL2_PostPCE = PostProcessing(NL2_engine, name=myNL2Model.name) # Plot to check validation visually. NL2_PostPCE.valid_metamodel(n_samples=3) @@ -221,10 +244,10 @@ if __name__ == "__main__": NL2_PostPCE.check_accuracy(n_samples=3000) # Plot the sobol indices - sobol_cell, total_sobol = NL2_PostPCE.sobol_indices() + total_sobol = NL2_PostPCE.sobol_indices() # ------ Nonlinear cosine model --------- - NL4_PostPCE = PostProcessing(NL4_MetaModel, name=myNL4Model.name) + NL4_PostPCE = PostProcessing(NL4_engine, name=myNL4Model.name) # Plot to check validation visually. NL4_PostPCE.valid_metamodel(n_samples=3) @@ -236,7 +259,7 @@ if __name__ == "__main__": NL4_PostPCE.check_accuracy(n_samples=3000) # Plot the sobol indices - sobol_cell, total_sobol = NL4_PostPCE.sobol_indices() + total_sobol = NL4_PostPCE.sobol_indices() # ===================================================== # ========= BAYESIAN MULTIMODEL COMPARISON =========== @@ -249,15 +272,15 @@ if __name__ == "__main__": # ----- Define the options model ------- meta_models = { - "linear": L2_MetaModel, - "exponential": NL4_MetaModel, - "cosine": NL4_MetaModel + "linear": L2_engine, + "exponential": NL2_engine, + "cosine": NL4_engine } - # BME Bootstrap optuions + # BME Bootstrap options opts_bootstrap = { "bootstrap": True, - "n_samples": 10000, + "n_samples": 100,#0,#0, # TODO: difference between this and the n_bootstrap set below? "Discrepancy": DiscrepancyOpts, "emulator": True, "plot_post_pred": False @@ -266,10 +289,10 @@ if __name__ == "__main__": # Run model comparison BayesOpts = BayesModelComparison( justifiability=True, - n_bootstarp=1000, - just_n_meas=2 + n_bootstrap=100,#0,#00, + #just_n_meas=2 ) - output_dict = BayesOpts.create_model_comparison( + output_dict = BayesOpts.model_comparison_all( meta_models, opts_bootstrap ) diff --git a/examples/pollution/test_pollution.py b/examples/pollution/example_pollution.py similarity index 100% rename from examples/pollution/test_pollution.py rename to examples/pollution/example_pollution.py diff --git a/examples/pollution/test_valid_pollution.py b/examples/pollution/example_valid_pollution.py similarity index 87% rename from examples/pollution/test_valid_pollution.py rename to examples/pollution/example_valid_pollution.py index e2aacbe5d2186c38287e552ae588332150dd519b..74b87787b741a0c990c6d1ccbf06596b43256a57 100644 --- a/examples/pollution/test_valid_pollution.py +++ b/examples/pollution/example_valid_pollution.py @@ -13,8 +13,6 @@ of Stuttgart, www.iws.uni-stuttgart.de/lh2/ Pfaffenwaldring 61 70569 Stuttgart -Created on Fri Aug 9 2019 - """ import numpy as np @@ -25,12 +23,15 @@ import joblib import sys sys.path.append("../../src/bayesvalidrox/") -from pylink.pylink import PyLinkForwardModel -from surrogate_models.inputs import Input -from surrogate_models.surrogate_models import MetaModel -from post_processing.post_processing import PostProcessing -from bayes_inference.bayes_inference import BayesInference -from bayes_inference.discrepancy import Discrepancy +from bayesvalidrox.pylink.pylink import PyLinkForwardModel +from bayesvalidrox.surrogate_models.inputs import Input +from bayesvalidrox.surrogate_models.exp_designs import ExpDesigns +from bayesvalidrox.surrogate_models.surrogate_models import MetaModel +#from bayesvalidrox.surrogate_models.meta_model_engine import MetaModelEngine +from bayesvalidrox.post_processing.post_processing import PostProcessing +from bayesvalidrox.bayes_inference.bayes_inference import BayesInference +from bayesvalidrox.bayes_inference.discrepancy import Discrepancy +from bayesvalidrox.surrogate_models.engine import Engine if __name__ == "__main__": @@ -92,7 +93,7 @@ if __name__ == "__main__": # ===================================================== # ====== POLYNOMIAL CHAOS EXPANSION METAMODELS ====== # ===================================================== - MetaModelOpts = MetaModel(Inputs, Model) + MetaModelOpts = MetaModel(Inputs) # Select if you want to preserve the spatial/temporal depencencies MetaModelOpts.dim_red_method = 'PCA' @@ -136,27 +137,29 @@ if __name__ == "__main__": # MetaModelOpts.verbose = True # ------ Experimental Design -------- - MetaModelOpts.add_ExpDesign() + ExpDesign = ExpDesigns(Inputs) # One-shot (normal) or Sequential Adaptive (sequential) Design - MetaModelOpts.ExpDesign.method = 'normal' - MetaModelOpts.ExpDesign.n_init_samples = 150 + ExpDesign.method = 'normal' + ExpDesign.n_init_samples = 150 # Sampling methods # 1) random 2) latin_hypercube 3) sobol 4) halton 5) hammersley 6) korobov # 7) chebyshev(FT) 8) grid(FT) 9) nested_grid(FT) 10)user - MetaModelOpts.ExpDesign.sampling_method = 'latin_hypercube' + ExpDesign.sampling_method = 'latin_hypercube' # Provide the experimental design object with a hdf5 file # MetaModelOpts.ExpDesign.hdf5_file = 'ExpDesign_AnalyticFunc.hdf5' # >>>>>>>>>>>>>>>>>>>>>> Build Surrogate <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< # Adaptive sparse arbitrary polynomial chaos expansion - PCEModel = MetaModelOpts.create_metamodel() - + engine = Engine(MetaModelOpts, Model, ExpDesign) + engine.start_engine() + engine.train_normal() + # Save PCE models with open(f"PCEModel_{Model.name}.pkl", "wb") as output: - joblib.dump(PCEModel, output, 2) + joblib.dump(engine.MetaModel, output, 2) # Load the objects # with open(f"PCEModel_{Model.name}.pkl", "rb") as input: @@ -165,7 +168,7 @@ if __name__ == "__main__": # ===================================================== # ========= POST PROCESSING OF METAMODELS =========== # ===================================================== - PostPCE = PostProcessing(PCEModel) + PostPCE = PostProcessing(engine) # Plot to check validation visually. PostPCE.valid_metamodel(n_samples=3) @@ -188,14 +191,14 @@ if __name__ == "__main__": # ===================================================== # ======== BAYESIAN INFERENCE (CALIBRATION) ========== # ===================================================== - BayesOpts = BayesInference(PCEModel) + BayesOpts = BayesInference(engine) BayesOpts.emulator = True # Select the inference method BayesOpts.inference_method = "MCMC" # Set the MCMC parameters BayesOpts.mcmc_params = { - 'n_steps': 1e5, + 'n_steps': 1e3,#5, 'n_walkers': 30, 'multiprocessing': False, 'verbose': False @@ -263,20 +266,24 @@ if __name__ == "__main__": ValidInputs.Marginals[3].name = "$\\tau$" ValidInputs.Marginals[3].input_data = BayesCalib.posterior_df['$\\tau$'] - MetaModelOpts_valid = MetaModelOpts.copy_meta_model_opts( - ValidInputs, ValidModel) - ValidMetaModel = MetaModelOpts_valid.create_metamodel() + + import copy + MetaModelOpts_valid = copy.deepcopy(MetaModelOpts) + MetaModelOpts_valid.input_obj = ValidInputs + valid_engine = Engine(MetaModelOpts_valid, ValidModel, copy.deepcopy(ExpDesign)) + valid_engine.start_engine() + valid_engine.train_normal() # Save PCE models with open(f"PCEModel_{ValidModel.name}.pkl", "wb") as output: - joblib.dump(ValidMetaModel, output, 2) + joblib.dump(valid_engine.MetaModel, output, 2) # Load the objects # with open(f"PCEModel_{ValidModel.name}.pkl", "rb") as input: # ValidPCEModel = joblib.load(input) # ------- Baysian inference definition -------- - BayesOptsValid = BayesInference(ValidMetaModel) + BayesOptsValid = BayesInference(valid_engine) BayesOptsValid.name = "Valid" BayesOptsValid.emulator = True diff --git a/examples/umbridge_tsunamitutorial/example_umbridge_testmodel.py b/examples/umbridge_tsunamitutorial/example_umbridge_testmodel.py new file mode 100644 index 0000000000000000000000000000000000000000..22a0f750e96c4b7bf14913eb97f0040fb360a257 --- /dev/null +++ b/examples/umbridge_tsunamitutorial/example_umbridge_testmodel.py @@ -0,0 +1,77 @@ +# -*- coding: utf-8 -*- +""" +Example and test for using UM-Bridge with bayesvalidrox. +This example uses the `testmodel` and sets the model type explicitly as +UM-Bridge for the pylink model. + +An example for using UM-Bridge with an explicitly defined model can be found in +`example_umbridge_tsunamimodel.py` + +""" + +import joblib +import numpy as np +import umbridge +import bayesvalidrox as bv + +from bayesvalidrox.pylink.pylink import PyLinkForwardModel +from bayesvalidrox.surrogate_models.inputs import Input +from bayesvalidrox.surrogate_models.exp_designs import ExpDesigns +from bayesvalidrox.surrogate_models.surrogate_models import MetaModel +from bayesvalidrox.post_processing.post_processing import PostProcessing +from bayesvalidrox.surrogate_models.engine import Engine + + +if __name__ == '__main__': + + # This model has 2 inputs and four outputs + n_prior_sample = 1000 + priors = bv.Input() + priors.add_marginals() + priors.Marginals[0].name = 'x' + priors.Marginals[0].input_data = np.random.uniform(50,150,n_prior_sample) + + # Define the model directly via Pylink + model = PyLinkForwardModel() + model.link_type = 'umbridge' + model.host = 'http://testmodel.linusseelinger.de' + model.modelparams = {} + model.name = 'testmodel' + model.Output.names = ['y'] + model.x_values = np.array([0]) + + # Create the surrogate + surrogate_opts = MetaModel(priors) + + # Select the surrogate type and properties + surrogate_opts.meta_model_type = 'aPCE' + surrogate_opts.pce_reg_method = 'FastARD' + surrogate_opts.pce_deg = np.arange(1, 5) + surrogate_opts.pce_q_norm = 0.4 + + # Define the experimental design and sampling methods + ExpDesign = ExpDesigns(priors) + ExpDesign.n_init_samples = 50 + ExpDesign.sampling_method = 'latin-hypercube' + + # Start and run the engine + engine = Engine(surrogate_opts, model, ExpDesign) + engine.start_engine() + engine.train_normal(parallel = False) + print('Surrogate completed') + print('') + + # Save surrogate + with open('testmodel.pk1', 'wb') as output: + joblib.dump(engine.MetaModel, output, 2) + + # Post processing + L2_PostPCE = PostProcessing(engine) + L2_PostPCE.plot_moments(plot_type='line') + + # Plot to check validation visually. + L2_PostPCE.valid_metamodel(n_samples=1) + + # Compute and print RMSE error + L2_PostPCE.check_accuracy(n_samples=300) + total_sobol = L2_PostPCE.sobol_indices() diff --git a/examples/umbridge_tsunamitutorial/example_umbridge_tsunamitutorial.py b/examples/umbridge_tsunamitutorial/example_umbridge_tsunamitutorial.py new file mode 100644 index 0000000000000000000000000000000000000000..c456787d0c5d9d9714083b406895b8096a4d16ce --- /dev/null +++ b/examples/umbridge_tsunamitutorial/example_umbridge_tsunamitutorial.py @@ -0,0 +1,183 @@ +# -*- coding: utf-8 -*- +""" +Example and test for using UM-Bridge with bayesvalidrox. +Example model is the tsunami model described here: + https://um-bridge-benchmarks.readthedocs.io/en/docs/inverse-benchmarks/exahype-tsunami.html +It needs to run separately while starting this example. + docker run -it -p 4242:4242 -v ~/tsunami_output:/output linusseelinger/model-exahype-tsunami + +This example uses models that are exmplicitly defined as functions outside of +PyLink. An example for the link_type 'umbdridge' can be found in +`example_umbridge_testmodel.py`. + +""" + +import copy +import joblib +import numpy as np +import pandas as pd +import umbridge + +import bayesvalidrox as bv +from tsunami_model import tsunami_model + +if __name__ == '__main__': + # This model has 2 inputs and four outputs + n_prior_sample = 1000 + priors = bv.Input() + priors.add_marginals() + priors.Marginals[0].name = 'x' + priors.Marginals[0].input_data = np.random.uniform(50,150,n_prior_sample) + priors.add_marginals() + priors.Marginals[1].name = 'y' + priors.Marginals[1].input_data = np.random.uniform(50,150,n_prior_sample) + + # Define the model - level 0 + model0 = bv.PyLinkForwardModel() + model0.link_type = 'function' + model0.py_file = 'tsunami_model' + model0.name = 'tsunami_model' + model0.Output.names = ['T1', 'T2', 'H1', 'H2'] + #model.observations = data_dict1_times + + # Define the model - level 1 + model1 = bv.PyLinkForwardModel() + model1.link_type = 'function' + model1.py_file = 'tsunami_model1' + model1.name = 'tsunami_model1' + model1.Output.names = ['T1', 'T2', 'H1', 'H2'] + #model.observations = data_dict1_times + + # Create the surrogate + surrogate_opts0 = bv.MetaModel(priors, model0) + + # Select your metamodel method + surrogate_opts0.meta_model_type = 'aPCE' + surrogate_opts0.pce_reg_method = 'FastARD' + surrogate_opts0.pce_deg = np.arange(1, 5) + surrogate_opts0.pce_q_norm = 0.4#1.0 + + # Define ExpDesign - this is the same for both models + ExpDesign0 = bv.ExpDesigns(priors) + ExpDesign0.method = 'normal' + ExpDesign0.n_init_samples = 50 + ExpDesign0.sampling_method = 'latin-hypercube' + ExpDesign1 = copy.deepcopy(ExpDesign0) + + # Start and run the engine + engine0 = bv.Engine(surrogate_opts0, model0, ExpDesign0) + engine0.start_engine() + engine0.train_normal(parallel = False) + print('Surrogate 0 completed') + print('') + + # Create the surrogate + surrogate_opts1 = bv.MetaModel(priors, model1) + + # Select your metamodel method + surrogate_opts1.meta_model_type = 'aPCE' + surrogate_opts1.pce_reg_method = 'FastARD' + surrogate_opts1.pce_deg = np.arange(1, 5) + surrogate_opts1.pce_q_norm = 0.4#1.0 + + # Start and run the engine + engine1 = bv.Engine(surrogate_opts1, model1, ExpDesign1) + engine1.start_engine() + engine1.train_normal(parallel = False) + print('Surrogate 1 completed') + print('') + + # Save surrogate + with open('tsunami0.pk1', 'wb') as output: + joblib.dump(engine0.MetaModel, output, 2) + + # Save surrogate + with open('tsunami1.pk1', 'wb') as output: + joblib.dump(engine1.MetaModel, output, 2) + + # Post processing on model 1 + L2_PostPCE = bv.PostProcessing(engine1) + L2_PostPCE.plot_moments(plot_type='line') + # Plot to check validation visually. + L2_PostPCE.valid_metamodel(n_samples=1) + + # Compute and print RMSE error + L2_PostPCE.check_accuracy(n_samples=300) + total_sobol = L2_PostPCE.sobol_indices() + + # Get reference evaluation as 'true data' + true_data = tsunami_model(np.array([[90.0,60.0]])) + model0.observations = true_data + model1.observations = true_data + true_data_nox = copy.deepcopy(true_data) + true_data_nox.pop('x_values') + + # Direct surrogate evaluation + mean, std = engine1.MetaModel.eval_metamodel(np.array([[90.0,60.0]])) + + # Bayesian Inference + # Set uncertainty + obsData = pd.DataFrame(true_data_nox, columns=model0.Output.names) + DiscrepancyOpts = bv.Discrepancy('') + DiscrepancyOpts.type = 'Gaussian' + DiscrepancyOpts.parameters = (obsData*0.15)**2 + + # Parameter estimation / single model validation via TOM for model 1 + BayesOpts = bv.BayesInference(engine1) + BayesOpts.emulator= True + BayesOpts.plot_post_pred = True + #BayesOpts.inference_method = 'rejection' + BayesOpts.Discrepancy = DiscrepancyOpts + BayesOpts.bootstrap = True + BayesOpts.n_bootstrap_itrs = 10 + BayesOpts.bootstrap_noise = 0.05 + BayesOpts.out_dir = '' + + # Set the MCMC parameters + import emcee + BayesOpts.inference_method = "MCMC" + BayesOpts.mcmc_params = { + 'n_steps': 1e3, + 'n_walkers': 30, + 'moves': emcee.moves.KDEMove(), + 'multiprocessing': False, + 'verbose': False + } + + Bayes = BayesOpts.create_inference() + + # Pkl the inference results + with open(f'Bayes_{model0.name}.pkl', 'wb') as output: + joblib.dump(Bayes, output, 2) + + # Model Comparison + # Set the models + meta_models = { + "M0": engine0, + "M1": engine1, + } + + # BME Bootstrap options + opts_bootstrap = { + "bootstrap": True, + "n_samples": 1000, + "Discrepancy": DiscrepancyOpts, + "emulator": True, + "plot_post_pred": False + } + + # Run model comparison + BayesOpts = bv.BayesModelComparison( + justifiability=True, + n_bootstarp=10, + just_n_meas=2 + ) + output_dict = BayesOpts.create_model_comparison( + meta_models, + opts_bootstrap + ) + + # save model comparison results + with open('ModelComparison.pkl', 'wb') as f: + joblib.dump(output_dict, f) + \ No newline at end of file diff --git a/examples/umbridge_tsunamitutorial/tsunami_model.py b/examples/umbridge_tsunamitutorial/tsunami_model.py new file mode 100644 index 0000000000000000000000000000000000000000..2d837a9ae4bb27e8ef2ca622011e3e67012f2e94 --- /dev/null +++ b/examples/umbridge_tsunamitutorial/tsunami_model.py @@ -0,0 +1,16 @@ +# -*- coding: utf-8 -*- +""" +Runs the umbridge command for the tsunami model. +""" +import umbridge +import numpy as np + +def tsunami_model(params): + model = umbridge.HTTPModel('http://localhost:4242', 'forward') + out = np.array(model(np.ndarray.tolist(params), {'level':0})) + + return {'T1':out[:,0], 'T2':out[:,1], 'H1':out[:,2], 'H2':out[:,3], + 'x_values':[0]} + + + \ No newline at end of file diff --git a/examples/umbridge_tsunamitutorial/tsunami_model1.py b/examples/umbridge_tsunamitutorial/tsunami_model1.py new file mode 100644 index 0000000000000000000000000000000000000000..239670773cf71e84b4ef0caec35c4e024ca1bd66 --- /dev/null +++ b/examples/umbridge_tsunamitutorial/tsunami_model1.py @@ -0,0 +1,14 @@ +# -*- coding: utf-8 -*- +""" +Runs the umbridge command for the tsunami model on level 1. +""" +import umbridge +import numpy as np + +def tsunami_model1(params): + model = umbridge.HTTPModel('http://localhost:4242', 'forward') + out = np.array(model(np.ndarray.tolist(params), {'level':1})) + + return {'T1': out[:,0], 'T2': out[:,1], 'H1': out[:,2], 'H2': out[:,3], 'x_values': [0]} + + \ No newline at end of file diff --git a/setup.cfg b/setup.cfg index 78940cfb54d78b867d8d4447ee25162b9adfed91..b09a32ac89dc7ebcb5d503234d6b656eeb82fc8e 100644 --- a/setup.cfg +++ b/setup.cfg @@ -1,8 +1,8 @@ [metadata] name = bayesvalidrox -version = 0.0.5 -author = Farid Mohammadi -author_email = farid.mohammadi@iws.uni-stuttgart.de +version = 1.0.0 +author = Farid Mohammadi, Rebecca Kohlhaas +author_email = farid.mohammadi@iws.uni-stuttgart.de, rebecca.kohlhaas@iws.uni-stuttgart.de description = An open-source, object-oriented Python package for surrogate-assisted Bayesain Validation of computational models. long_description = file: README.md long_description_content_type = text/markdown @@ -20,19 +20,20 @@ package_dir = packages = find: python_requires = >=3.8 install_requires = - numpy==1.22.1 - pandas==1.2.4 - joblib==1.0.1 - matplotlib==3.4.2 + pandas==1.4.4 + joblib==1.1.1 + matplotlib==3.8.0 seaborn==0.11.1 scipy==1.7.3 - scikit-learn==0.24.2 + scikit-learn==1.3.1 tqdm==4.61.1 chaospy==4.3.3 emcee==3.0.2 corner==2.2.1 - h5py==3.2.1 + h5py==3.9.0 statsmodels==0.13.2 + multiprocess==0.70.16 + umbridge==1.2.4 [options.packages.find] where = src diff --git a/src/bayesvalidrox.egg-info/PKG-INFO b/src/bayesvalidrox.egg-info/PKG-INFO new file mode 100644 index 0000000000000000000000000000000000000000..279feebe3b7b4b5a53bdc43208dd65c926f06f2f --- /dev/null +++ b/src/bayesvalidrox.egg-info/PKG-INFO @@ -0,0 +1,87 @@ +Metadata-Version: 2.1 +Name: bayesvalidrox +Version: 1.0.0 +Summary: An open-source, object-oriented Python package for surrogate-assisted Bayesain Validation of computational models. +Home-page: https://git.iws.uni-stuttgart.de/inversemodeling/bayesian-validation +Author: Farid Mohammadi, Rebecca Kohlhaas +Author-email: farid.mohammadi@iws.uni-stuttgart.de, rebecca.kohlhaas@iws.uni-stuttgart.de +Classifier: Programming Language :: Python :: 3 +Classifier: License :: OSI Approved :: MIT License +Classifier: Operating System :: OS Independent +Requires-Python: >=3.8 +Description-Content-Type: text/markdown +License-File: LICENCE.md +Requires-Dist: pandas==1.4.4 +Requires-Dist: joblib==1.1.1 +Requires-Dist: matplotlib==3.8.0 +Requires-Dist: seaborn==0.11.1 +Requires-Dist: scipy==1.7.3 +Requires-Dist: scikit-learn==1.3.1 +Requires-Dist: tqdm==4.61.1 +Requires-Dist: chaospy==4.3.3 +Requires-Dist: emcee==3.0.2 +Requires-Dist: corner==2.2.1 +Requires-Dist: h5py==3.9.0 +Requires-Dist: statsmodels==0.13.2 +Requires-Dist: multiprocess==0.70.16 +Requires-Dist: umbridge==1.2.4 + +# BayesValidRox + +<div align="center"> + <img src="https://git.iws.uni-stuttgart.de/inversemodeling/bayesian-validation/-/raw/master/docs/logo/bayesvalidrox-logo.png" alt="bayesvalidrox logo"/> +</div> + +An open-source, object-oriented Python package for surrogate-assisted Bayesain Validation of computational models. +This framework provides an automated workflow for surrogate-based sensitivity analysis, Bayesian calibration, and validation of computational models with a modular structure. + +## Authors +- [@farid](https://git.iws.uni-stuttgart.de/farid) + +## Installation +The best practive is to create a virtual environment and install the package inside it. + +To create and activate the virtual environment run the following command in the terminal: +```bash + python3 -m venv bayes_env + cd bayes_env + source bin/activate +``` +You can replace `bayes_env` with your preferred name. For more information on virtual environments see [this link](https://packaging.python.org/en/latest/guides/installing-using-pip-and-virtual-environments/). + +Now, you can install the latest release of the package on PyPI inside the venv with: +```bash + pip install bayesvalidrox +``` +and installing the version on the master branch can be done by cloning this repo and installing: +```bash + git clone https://git.iws.uni-stuttgart.de/inversemodeling/bayesvalidrox.git + cd bayesvalidrox + pip install . +``` + +## Features +* Surrogate modeling with Polynomial Chaos Expansion +* Global sensitivity analysis using Sobol Indices +* Bayesian calibration with MCMC using `emcee` package +* Bayesian validation with model weights for multi-model setting + +## Requirements +* numpy==1.22.1 +* pandas==1.2.4 +* joblib==1.0.1 +* matplotlib==3.4.2 +* seaborn==0.11.1 +* scikit-learn==0.24.2 +* tqdm==4.61.1 +* chaospy==4.3.3 +* emcee==3.0.2 +* corner==2.2.1 +* h5py==3.2.1 +* statsmodels==0.13.2 + +## TexLive for Plotting with matplotlib +Here you need super user rights +```bash +sudo apt-get install dvipng texlive-latex-extra texlive-fonts-recommended cm-super +``` diff --git a/src/bayesvalidrox.egg-info/SOURCES.txt b/src/bayesvalidrox.egg-info/SOURCES.txt new file mode 100644 index 0000000000000000000000000000000000000000..344e9840627bb3e5a89593dbd9256472a8ef41d9 --- /dev/null +++ b/src/bayesvalidrox.egg-info/SOURCES.txt @@ -0,0 +1,46 @@ +LICENCE.md +README.md +pyproject.toml +setup.cfg +src/bayesvalidrox/__init__.py +src/bayesvalidrox/bayesvalidrox.mplstyle +src/bayesvalidrox.egg-info/PKG-INFO +src/bayesvalidrox.egg-info/SOURCES.txt +src/bayesvalidrox.egg-info/dependency_links.txt +src/bayesvalidrox.egg-info/requires.txt +src/bayesvalidrox.egg-info/top_level.txt +src/bayesvalidrox/bayes_inference/__init__.py +src/bayesvalidrox/bayes_inference/bayes_inference.py +src/bayesvalidrox/bayes_inference/bayes_model_comparison.py +src/bayesvalidrox/bayes_inference/discrepancy.py +src/bayesvalidrox/bayes_inference/mcmc.py +src/bayesvalidrox/post_processing/__init__.py +src/bayesvalidrox/post_processing/post_processing.py +src/bayesvalidrox/pylink/__init__.py +src/bayesvalidrox/pylink/pylink.py +src/bayesvalidrox/surrogate_models/__init__.py +src/bayesvalidrox/surrogate_models/adaptPlot.py +src/bayesvalidrox/surrogate_models/apoly_construction.py +src/bayesvalidrox/surrogate_models/bayes_linear.py +src/bayesvalidrox/surrogate_models/engine.py +src/bayesvalidrox/surrogate_models/eval_rec_rule.py +src/bayesvalidrox/surrogate_models/exp_designs.py +src/bayesvalidrox/surrogate_models/exploration.py +src/bayesvalidrox/surrogate_models/glexindex.py +src/bayesvalidrox/surrogate_models/input_space.py +src/bayesvalidrox/surrogate_models/inputs.py +src/bayesvalidrox/surrogate_models/meta_model_engine.py +src/bayesvalidrox/surrogate_models/orthogonal_matching_pursuit.py +src/bayesvalidrox/surrogate_models/reg_fast_ard.py +src/bayesvalidrox/surrogate_models/reg_fast_laplace.py +src/bayesvalidrox/surrogate_models/sequential_design.py +src/bayesvalidrox/surrogate_models/surrogate_models.py +tests/test_BayesModelComparison.py +tests/test_Discrepancy.py +tests/test_ExpDesign.py +tests/test_Input.py +tests/test_InputSpace.py +tests/test_MetaModel.py +tests/test_engine.py +tests/test_polyconst.py +tests/test_pylink.py \ No newline at end of file diff --git a/src/bayesvalidrox.egg-info/dependency_links.txt b/src/bayesvalidrox.egg-info/dependency_links.txt new file mode 100644 index 0000000000000000000000000000000000000000..8b137891791fe96927ad78e64b0aad7bded08bdc --- /dev/null +++ b/src/bayesvalidrox.egg-info/dependency_links.txt @@ -0,0 +1 @@ + diff --git a/src/bayesvalidrox.egg-info/requires.txt b/src/bayesvalidrox.egg-info/requires.txt new file mode 100644 index 0000000000000000000000000000000000000000..cc8edb95d2042c4d448c4885919eea0e9406e805 --- /dev/null +++ b/src/bayesvalidrox.egg-info/requires.txt @@ -0,0 +1,14 @@ +pandas==1.4.4 +joblib==1.1.1 +matplotlib==3.8.0 +seaborn==0.11.1 +scipy==1.7.3 +scikit-learn==1.3.1 +tqdm==4.61.1 +chaospy==4.3.3 +emcee==3.0.2 +corner==2.2.1 +h5py==3.9.0 +statsmodels==0.13.2 +multiprocess==0.70.16 +umbridge==1.2.4 diff --git a/src/bayesvalidrox.egg-info/top_level.txt b/src/bayesvalidrox.egg-info/top_level.txt new file mode 100644 index 0000000000000000000000000000000000000000..2753d5241cbf16d781d567f4c1b679ee870989a4 --- /dev/null +++ b/src/bayesvalidrox.egg-info/top_level.txt @@ -0,0 +1 @@ +bayesvalidrox diff --git a/src/bayesvalidrox/__init__.py b/src/bayesvalidrox/__init__.py index 55c14687472fe6ff00a2438f31b9ba9ecd2992cd..6c11bd3730d31b602b1b4538de1856de04ffc909 100644 --- a/src/bayesvalidrox/__init__.py +++ b/src/bayesvalidrox/__init__.py @@ -1,10 +1,12 @@ # -*- coding: utf-8 -*- -__version__ = "0.0.5" +__version__ = "1.0.0" from .pylink.pylink import PyLinkForwardModel from .surrogate_models.surrogate_models import MetaModel -from .surrogate_models.meta_model_engine import MetaModelEngine +#from .surrogate_models.meta_model_engine import MetaModelEngine +from .surrogate_models.engine import Engine from .surrogate_models.inputs import Input +from .surrogate_models.exp_designs import ExpDesigns from .post_processing.post_processing import PostProcessing from .bayes_inference.bayes_inference import BayesInference from .bayes_inference.bayes_model_comparison import BayesModelComparison @@ -16,7 +18,9 @@ __all__ = [ "Input", "Discrepancy", "MetaModel", - "MetaModelEngine", + #"MetaModelEngine", + "Engine", + "ExpDesigns", "PostProcessing", "BayesInference", "BayesModelComparison" diff --git a/src/bayesvalidrox/bayes_inference/bayes_inference.py b/src/bayesvalidrox/bayes_inference/bayes_inference.py index c8073ba76ebeb3249646e17b7f395f8a2472e2f6..01815f59a07f87426b4903ba21a79b95cc7c16d8 100644 --- a/src/bayesvalidrox/bayes_inference/bayes_inference.py +++ b/src/bayesvalidrox/bayes_inference/bayes_inference.py @@ -1,25 +1,25 @@ #!/usr/bin/env python3 # -*- coding: utf-8 -*- -import numpy as np -import os import copy -import pandas as pd -from tqdm import tqdm -from scipy import stats -import scipy.linalg as spla -import joblib -import seaborn as sns +import gc +import multiprocessing +import os + import corner import h5py -import multiprocessing -import gc -from sklearn.metrics import mean_squared_error, r2_score -from sklearn import preprocessing -from matplotlib.patches import Patch import matplotlib.lines as mlines -from matplotlib.backends.backend_pdf import PdfPages import matplotlib.pylab as plt +import numpy as np +import pandas as pd +import scipy.linalg as spla +import seaborn as sns +from matplotlib.backends.backend_pdf import PdfPages +from matplotlib.patches import Patch +from scipy import stats +from sklearn import preprocessing +from sklearn.metrics import mean_squared_error, r2_score +from tqdm import tqdm from .mcmc import MCMC @@ -28,6 +28,92 @@ plt.style.use(os.path.join(os.path.split(__file__)[0], '../', 'bayesvalidrox.mplstyle')) +# ------------------------------------------------------------------------- +def _kernel_rbf(X, hyperparameters): + """ + Isotropic squared exponential kernel. + + Higher l values lead to smoother functions and therefore to coarser + approximations of the training data. Lower l values make functions + more wiggly with wide uncertainty regions between training data points. + + sigma_f controls the marginal variance of b(x) + + Parameters + ---------- + X : ndarray of shape (n_samples_X, n_features) + + hyperparameters : Dict + Lambda characteristic length + sigma_f controls the marginal variance of b(x) + sigma_0 unresolvable error nugget term, interpreted as random + error that cannot be attributed to measurement error. + Returns + ------- + var_cov_matrix : ndarray of shape (n_samples_X,n_samples_X) + Kernel k(X, X). + + """ + from sklearn.gaussian_process.kernels import RBF + min_max_scaler = preprocessing.MinMaxScaler() + X_minmax = min_max_scaler.fit_transform(X) + + nparams = len(hyperparameters) + if nparams < 3: + raise AttributeError('Provide 3 parameters for the RBF kernel!') + + # characteristic length (0,1] + Lambda = hyperparameters[0] + # sigma_f controls the marginal variance of b(x) + sigma2_f = hyperparameters[1] + + rbf = RBF(length_scale=Lambda) + cov_matrix = sigma2_f * rbf(X_minmax) + + # (unresolvable error) nugget term that is interpreted as random + # error that cannot be attributed to measurement error. + sigma2_0 = hyperparameters[2:] + for i, j in np.ndindex(cov_matrix.shape): + cov_matrix[i, j] += np.sum(sigma2_0) if i == j else 0 + + return cov_matrix + + +# ------------------------------------------------------------------------- +def _logpdf(x, mean, cov): + """ + Computes the likelihood based on a multivariate normal distribution. + + Parameters + ---------- + x : TYPE + DESCRIPTION. + mean : array_like + Observation data. + cov : 2d array + Covariance matrix of the distribution. + + Returns + ------- + log_lik : float + Log likelihood. + + """ + + # Tranform into np arrays + x = np.array(x) + mean = np.array(mean) + cov = np.array(cov) + + n = len(mean) + L = spla.cholesky(cov, lower=True) + beta = np.sum(np.log(np.diag(L))) + dev = x - mean + alpha = dev.dot(spla.cho_solve((L, True), dev)) + log_lik = -0.5 * alpha - beta - n / 2. * np.log(2 * np.pi) + return log_lik + + class BayesInference: """ A class to perform Bayesian Analysis. @@ -42,7 +128,7 @@ class BayesInference: of the variance matrix for a multivariate normal likelihood. name : str, optional The type of analysis, either calibration (`Calib`) or validation - (`Valid`). The default is `'Calib'`. + (`Valid`). The default is `'Calib'`. # TODO: what is going on here for validation? emulator : bool, optional Analysis with emulator (MetaModel). The default is `True`. bootstrap : bool, optional @@ -55,11 +141,11 @@ class BayesInference: A dictionary with the selected indices of each model output. The default is `None`. If `None`, all measurement points are used in the analysis. - samples : array of shape (n_samples, n_params), optional + prior_samples : array of shape (n_samples, n_params), optional The samples to be used in the analysis. The default is `None`. If None the samples are drawn from the probablistic input parameter object of the MetaModel object. - n_samples : int, optional + n_prior_samples : int, optional Number of samples to be used in the analysis. The default is `500000`. If samples is not `None`, this argument will be assigned based on the number of samples given. @@ -125,25 +211,32 @@ class BayesInference: """ - def __init__(self, MetaModel, discrepancy=None, emulator=True, + def __init__(self, engine, discrepancy=None, emulator=True, name='Calib', bootstrap=False, req_outputs=None, - selected_indices=None, samples=None, n_samples=100000, + selected_indices=None, prior_samples=None, n_prior_samples=100000, measured_data=None, inference_method='rejection', mcmc_params=None, bayes_loocv=False, n_bootstrap_itrs=1, perturbed_data=[], bootstrap_noise=0.05, just_analysis=False, valid_metrics=['BME'], plot_post_pred=True, plot_map_pred=False, max_a_posteriori='mean', - corner_title_fmt='.2e'): - - self.MetaModel = MetaModel + corner_title_fmt='.2e', out_dir='', bmc=False): + + self.log_BME_tom = None + self.inf_entropy = None + self.log_BME = None + self.KLD = None + self.__mean_pce_prior_pred = None + if perturbed_data is None: + perturbed_data = [] + self.engine = engine self.Discrepancy = discrepancy self.emulator = emulator self.name = name self.bootstrap = bootstrap self.req_outputs = req_outputs self.selected_indices = selected_indices - self.samples = samples - self.n_samples = n_samples + self.prior_samples = prior_samples + self.n_prior_samples = n_prior_samples self.measured_data = measured_data self.inference_method = inference_method self.mcmc_params = mcmc_params @@ -157,45 +250,67 @@ class BayesInference: self.plot_map_pred = plot_map_pred self.max_a_posteriori = max_a_posteriori self.corner_title_fmt = corner_title_fmt + self.out_dir = out_dir + self.bmc = bmc # Set to True, if you want to cut short to only Model Comparison + + # Other properties and parameters (found in code, but never set) + self.error_model = False # TODO: no example or use case for this! + self.bias_inputs = None + self.measurement_error = None # TODO: what is this? + self.sigma2s = None + self.log_likes = None + self.n_tot_measurement = None + self.Discrepancy = None + self.posterior_df = None + self.error_MetaModel = None + self._mean_pce_prior_pred = None + self._std_pce_prior_pred = None + self.__model_prior_pred = None + self.MCMC_Obj = None + + # System settings + if os.name == 'nt': + print('') + print('WARNING: Performing the inference on windows can lead to reduced accuracy!') + print('') + self.dtype = np.longdouble + else: + self.dtype = np.float128 - # ------------------------------------------------------------------------- - def create_inference(self): + def setup_inference(self): """ - Starts the inference. - - Returns - ------- - BayesInference : obj - The Bayes inference object. - + This function sets up the inference by checking the inputs and getting + needed data. """ - - # Set some variables - MetaModel = self.MetaModel - Model = MetaModel.ModelObj - n_params = MetaModel.n_params - output_names = Model.Output.names - par_names = MetaModel.ExpDesign.par_names - - # If the prior is set by the user, take it. - if self.samples is None: - self.samples = MetaModel.ExpDesign.generate_samples( - self.n_samples, 'random') + Model = self.engine.Model + + # Create output directory + if self.out_dir == '': + self.out_dir = f'Outputs_Bayes_{self.engine.Model.name}_{self.name}' + os.makedirs(self.out_dir, exist_ok=True) + + # If the prior is set by the user, take it, else generate from ExpDes + if self.prior_samples is None: + print('Generating prior samples from the Experimental Design.') + self.prior_samples = self.engine.ExpDesign.generate_samples( + self.n_prior_samples, 'random') else: try: - samples = self.samples.values + samples = self.prior_samples.values except AttributeError: - samples = self.samples + samples = self.prior_samples # Take care of an additional Sigma2s - self.samples = samples[:, :n_params] + self.prior_samples = samples[:, :self.engine.MetaModel.n_params] # Update number of samples - self.n_samples = self.samples.shape[0] + self.n_prior_samples = self.prior_samples.shape[0] # ---------- Preparation of observation data ---------- - # Read observation data and perturb it if requested. + # Read observation data + # TODO: later use valid #of measurements. but here only get the model observations? if self.measured_data is None: + print('Reading the observation data.') self.measured_data = Model.read_observation(case=self.name) # Convert measured_data to a data frame if not isinstance(self.measured_data, pd.DataFrame): @@ -204,11 +319,13 @@ class BayesInference: # Extract the total number of measurement points if self.name.lower() == 'calib': self.n_tot_measurement = Model.n_obs - else: + elif self.name.lower() == 'valid': self.n_tot_measurement = Model.n_obs_valid + else: + raise AttributeError('The set inference type is not known! Use either `calib` or `valid`') # Find measurement error (if not given) for post predictive plot - if not hasattr(self, 'measurement_error'): + if self.measurement_error is None: if isinstance(self.Discrepancy, dict): Disc = self.Discrepancy['known'] else: @@ -221,373 +338,380 @@ class BayesInference: self.measurement_error = np.sqrt(Disc.parameters) except TypeError: pass + # TODO: need a transformation for given measurement error? - # ---------- Preparation of variance for covariance matrix ---------- - # Independent and identically distributed - total_sigma2 = dict() + # Get Discrepancy type opt_sigma_flag = isinstance(self.Discrepancy, dict) opt_sigma = None - for key_idx, key in enumerate(output_names): + # Option A: known error with unknown bias term + if opt_sigma_flag and opt_sigma is None: + opt_sigma = 'A' + # Option B: The sigma2 is known (no bias term) + elif self.Discrepancy.parameters is not None: + opt_sigma = 'B' + # Option C: The sigma2 is unknown (bias term including error) + elif not isinstance(self.Discrepancy.InputDisc, str): + opt_sigma = 'C' + self.Discrepancy.opt_sigma = opt_sigma + + # Set MCMC params if used + if self.inference_method.lower() == 'mcmc': + if self.mcmc_params is None: + self.mcmc_params = {} + par_list = ['init_samples', 'n_walkers', 'n_burn', 'n_steps', + 'moves', 'multiprocessing', 'verbose'] + init_val = [None, 100, 200, 100000, None, False, False] + for i in range(len(par_list)): + if par_list[i] not in list(self.mcmc_params.keys()): + self.mcmc_params[par_list[i]] = init_val[i] + # ------------------------------------------------------------------------- + def create_inference(self): + """ + Starts the inference. + + Returns + ------- + BayesInference : obj + The Bayes inference object. + + # TODO: should this function really return the class? + + """ + # Do general set up and check some parameters + self.setup_inference() + + # ---------- Preparation of variance for covariance matrix ---------- + # Independent and identically distributed # TODO: ?? + total_sigma2 = dict() + opt_sigma = self.Discrepancy.opt_sigma + for key_idx, key in enumerate(self.engine.Model.Output.names): # Find opt_sigma - if opt_sigma_flag and opt_sigma is None: - # Option A: known error with unknown bias term - opt_sigma = 'A' + sigma2 = None + if opt_sigma == 'A': known_discrepancy = self.Discrepancy['known'] self.Discrepancy = self.Discrepancy['infer'] sigma2 = np.array(known_discrepancy.parameters[key]) - elif opt_sigma == 'A' or self.Discrepancy.parameters is not None: - # Option B: The sigma2 is known (no bias term) - if opt_sigma == 'A': - sigma2 = np.array(known_discrepancy.parameters[key]) - else: - opt_sigma = 'B' - sigma2 = np.array(self.Discrepancy.parameters[key]) + elif opt_sigma == 'B': + sigma2 = np.array(self.Discrepancy.parameters[key]) - elif not isinstance(self.Discrepancy.InputDisc, str): - # Option C: The sigma2 is unknown (bias term including error) - opt_sigma = 'C' - self.Discrepancy.opt_sigma = opt_sigma + elif opt_sigma == 'C': n_measurement = self.measured_data[key].values.shape sigma2 = np.zeros((n_measurement[0])) - total_sigma2[key] = sigma2 - self.Discrepancy.opt_sigma = opt_sigma - self.Discrepancy.total_sigma2 = total_sigma2 + # TODO: can use this to debug! + self.Discrepancy.total_sigma2 = total_sigma2 # If inferred sigma2s obtained from e.g. calibration are given try: - self.sigma2s = self.Discrepancy.get_sample(self.n_samples) + self.sigma2s = self.Discrepancy.get_sample(self.n_prior_samples) except: - pass + pass # TODO: should an error be raised in this case? Should this at least be checked against opt_sigma? # ---------------- Bootstrap & TOM -------------------- if self.bootstrap or self.bayes_loocv or self.just_analysis: - if len(self.perturbed_data) == 0: - # zero mean noise Adding some noise to the observation function - self.perturbed_data = self._perturb_data( - self.measured_data, output_names - ) - else: - self.n_bootstrap_itrs = len(self.perturbed_data) - - # -------- Model Discrepancy ----------- - if hasattr(self, 'error_model') and self.error_model \ - and self.name.lower() != 'calib': - # Select posterior mean as MAP - MAP_theta = self.samples.mean(axis=0).reshape((1, n_params)) - # MAP_theta = stats.mode(self.samples,axis=0)[0] - - # Evaluate the (meta-)model at the MAP - y_MAP, y_std_MAP = MetaModel.eval_metamodel(samples=MAP_theta) - - # Train a GPR meta-model using MAP - self.error_MetaModel = MetaModel.create_model_error( - self.bias_inputs, y_MAP, Name=self.name - ) + self.perform_bootstrap(total_sigma2) + if self.bmc: + return self + else: + print('No bootstrap for TOM performed!') # TODO: stop the code? Use n_bootstrap = 1? - # ----------------------------------------------------- - # ----- Loop over the perturbed observation data ------ - # ----------------------------------------------------- - # Initilize arrays - logLikelihoods = np.zeros((self.n_samples, self.n_bootstrap_itrs), - dtype=np.float16) - BME_Corr = np.zeros((self.n_bootstrap_itrs)) - log_BME = np.zeros((self.n_bootstrap_itrs)) - KLD = np.zeros((self.n_bootstrap_itrs)) - inf_entropy = np.zeros((self.n_bootstrap_itrs)) - - # Compute the prior predtions - # Evaluate the MetaModel - if self.emulator: - y_hat, y_std = MetaModel.eval_metamodel(samples=self.samples) - self.__mean_pce_prior_pred = y_hat - self._std_pce_prior_pred = y_std + # ---------------- Parameter Bayesian inference ---------------- + # Convert to a dataframe if samples are provided after calibration. + if self.name.lower() == 'valid': + self.posterior_df = pd.DataFrame(self.prior_samples, columns=self.engine.ExpDesign.par_names) + # Instantiate the MCMC object + elif self.inference_method.lower() == 'mcmc': + #MCMC_Obj = MCMC(self) + # Decoupled MCMC from BayesInf + self.MCMC_Obj = MCMC(self.engine, self.mcmc_params, + self.Discrepancy, + # TODO: add this in when the error_MetaModel/error_model works + # self.BiasInputs, + self.bias_inputs, + self.error_model, self.req_outputs, + self.selected_indices, self.emulator, + self.out_dir, self.name) + self.posterior_df = self.MCMC_Obj.run_sampler( + self.measured_data, total_sigma2 + ) + # Rejection sampling + elif self.inference_method.lower() == 'rejection': + self.posterior_df = self._rejection_sampling() + else: + raise AttributeError('The chosen inference method is not available!') - # Correct the predictions with Model discrepancy - if hasattr(self, 'error_model') and self.error_model: - y_hat_corr, y_std = self.error_MetaModel.eval_model_error( - self.bias_inputs, self.__mean_pce_prior_pred - ) - self.__mean_pce_prior_pred = y_hat_corr - self._std_pce_prior_pred = y_std + # Provide posterior's summary + print('\n') + print('-' * 15 + 'Posterior summary' + '-' * 15) + pd.options.display.max_columns = None + pd.options.display.max_rows = None + print(self.posterior_df.describe()) + print('-' * 50) - # Surrogate model's error using RMSE of test data - if hasattr(MetaModel, 'rmse'): - surrError = MetaModel.rmse - else: - surrError = None + # -------- Model Discrepancy ----------- + if self.error_model and self.name.lower() == 'calib' and self.MCMC_Obj is not None: # TODO: where is this used + # and what does it actually do there? + self.create_error_model(opt_sigma=opt_sigma, + type_='posterior', sampler=self.MCMC_Obj) - else: - # Evaluate the original model - self.__model_prior_pred = self._eval_model( - samples=self.samples, key='PriorPred' - ) - surrError = None + # -------- Posterior predictive ----------- + self._posterior_predictive() - # Start the likelihood-BME computations for the perturbed data - for itr_idx, data in tqdm( - enumerate(self.perturbed_data), - total=self.n_bootstrap_itrs, - desc="Boostraping the BME calculations", ascii=True - ): + # ------------------ Visualization -------------------- + # Posterior parameters + self.plot_post_params(opt_sigma) - # ---------------- Likelihood calculation ---------------- - if self.emulator: - model_evals = self.__mean_pce_prior_pred - else: - model_evals = self.__model_prior_pred - - # Leave one out - if self.bayes_loocv or self.just_analysis: - self.selected_indices = np.nonzero(data)[0] - - # Prepare data dataframe - nobs = list(self.measured_data.count().values[1:]) - numbers = list(np.cumsum(nobs)) - indices = list(zip([0] + numbers, numbers)) - data_dict = { - output_names[i]: data[j:k] for i, (j, k) in - enumerate(indices) - } - - # Unknown sigma2 - if opt_sigma == 'C' or hasattr(self, 'sigma2s'): - logLikelihoods[:, itr_idx] = self.normpdf( - model_evals, data_dict, total_sigma2, - sigma2=self.sigma2s, std=surrError - ) - else: - # known sigma2 - logLikelihoods[:, itr_idx] = self.normpdf( - model_evals, data_dict, total_sigma2, - std=surrError - ) + # Plot MAP + if self.plot_map_pred: + self._plot_max_a_posteriori() - # ---------------- BME Calculations ---------------- - # BME (log) - log_BME[itr_idx] = np.log( - np.nanmean(np.exp(logLikelihoods[:, itr_idx], - dtype=np.float128)) - ) + # Plot log_BME dist + if self.bootstrap: + self.plot_log_BME() - # BME correction when using Emulator - if self.emulator: - BME_Corr[itr_idx] = self.__corr_factor_BME( - data_dict, total_sigma2, log_BME[itr_idx] - ) + # Plot posterior predictive + if self.plot_post_pred: + self._plot_post_predictive() - # Rejection Step - if 'kld' in list(map(str.lower, self.valid_metrics)) and\ - 'inf_entropy' in list(map(str.lower, self.valid_metrics)): - # Random numbers between 0 and 1 - unif = np.random.rand(1, self.n_samples)[0] - - # Reject the poorly performed prior - Likelihoods = np.exp(logLikelihoods[:, itr_idx], - dtype=np.float64) - accepted = (Likelihoods/np.max(Likelihoods)) >= unif - posterior = self.samples[accepted] - - # Posterior-based expectation of likelihoods - postExpLikelihoods = np.mean( - logLikelihoods[:, itr_idx][accepted] - ) + return self - # Calculate Kullback-Leibler Divergence - KLD[itr_idx] = postExpLikelihoods - log_BME[itr_idx] - - # Posterior-based expectation of prior densities - if 'inf_entropy' in list(map(str.lower, self.valid_metrics)): - n_thread = int(0.875 * multiprocessing.cpu_count()) - with multiprocessing.Pool(n_thread) as p: - postExpPrior = np.mean(np.concatenate( - p.map( - MetaModel.ExpDesign.JDist.pdf, - np.array_split(posterior.T, n_thread, axis=1)) - ) - ) - # Information Entropy based on Entropy paper Eq. 38 - inf_entropy[itr_idx] = log_BME[itr_idx] - postExpPrior - \ - postExpLikelihoods - - # Clear memory - gc.collect(generation=2) - - # ---------- Store metrics for perturbed data set ---------------- - # Likelihoods (Size: n_samples, n_bootstrap_itr) - self.log_likes = logLikelihoods - - # BME (log), KLD, infEntropy (Size: 1,n_bootstrap_itr) - self.log_BME = log_BME - - # BMECorrFactor (log) (Size: 1,n_bootstrap_itr) - if self.emulator: - self.log_BME_corr_factor = BME_Corr + def create_error_model(self, type_='posterior', opt_sigma='B', sampler=None): + """ + Creates an error model in the engine.MetaModel based on input dist + samples of the chosen type - if 'kld' in list(map(str.lower, self.valid_metrics)): - self.KLD = KLD - if 'inf_entropy' in list(map(str.lower, self.valid_metrics)): - self.inf_entropy = inf_entropy + Parameters + ---------- + opt_sigma : string, optional + Type of uncertainty description, only used if type_=='posterior'. + The default is 'B' + type_ : string + Type of parameter samples to use, either 'prior' or 'posterior'. + The default is 'posterior'. + sampler : MCMC, optional + Should be an MCMC object if type=='posterior' and MCMC is used in + the inference.In al other cases this parameter is not needed. - # BME = BME + BMECorrFactor - if self.emulator: - self.log_BME += self.log_BME_corr_factor + Returns + ------- + None. - # ---------------- Parameter Bayesian inference ---------------- - if self.inference_method.lower() == 'mcmc': - # Instantiate the MCMC object - MCMC_Obj = MCMC(self) - self.posterior_df = MCMC_Obj.run_sampler( - self.measured_data, total_sigma2 - ) + """ + n_params = self.engine.MetaModel.n_params - elif self.name.lower() == 'valid': - # Convert to a dataframe if samples are provided after calibration. - self.posterior_df = pd.DataFrame(self.samples, columns=par_names) + # Get MAP estimate from prior samples + if type_ == 'prior': + # Select prior ? mean as MAP + MAP_theta = self.prior_samples.mean(axis=0).reshape((1, n_params)) - else: - # Rejection sampling - self.posterior_df = self._rejection_sampling() + # Evaluate the (meta-)model at the MAP + y_MAP, y_std_MAP = self.engine.MetaModel.eval_metamodel(samples=MAP_theta) - # Provide posterior's summary - print('\n') - print('-'*15 + 'Posterior summary' + '-'*15) - pd.options.display.max_columns = None - pd.options.display.max_rows = None - print(self.posterior_df.describe()) - print('-'*50) + # Train a GPR meta-model using MAP + self.error_MetaModel = self.engine.MetaModel.create_model_error( + self.bias_inputs, y_MAP, self.measured_data, name=self.name + ) - # -------- Model Discrepancy ----------- - if hasattr(self, 'error_model') and self.error_model \ - and self.name.lower() == 'calib': + # Get MAP estimate from posterior samples + if type_ == 'posterior': if self.inference_method.lower() == 'mcmc': - self.error_MetaModel = MCMC_Obj.error_MetaModel + self.error_MetaModel = sampler.error_MetaModel else: # Select posterior mean as MAP if opt_sigma == "B": posterior_df = self.posterior_df.values else: - posterior_df = self.posterior_df.values[:, :-Model.n_outputs] + posterior_df = self.posterior_df.values[:, :-self.engine.Model.n_outputs] # Select posterior mean as Maximum a posteriori map_theta = posterior_df.mean(axis=0).reshape((1, n_params)) # map_theta = stats.mode(Posterior_df,axis=0)[0] # Evaluate the (meta-)model at the MAP - y_MAP, y_std_MAP = MetaModel.eval_metamodel(samples=map_theta) + y_MAP, y_std_MAP = self.engine.MetaModel.eval_metamodel(samples=map_theta) # Train a GPR meta-model using MAP - self.error_MetaModel = MetaModel.create_model_error( - self.bias_inputs, y_MAP, Name=self.name - ) - - # -------- Posterior perdictive ----------- - self._posterior_predictive() - - # ----------------------------------------------------- - # ------------------ Visualization -------------------- - # ----------------------------------------------------- - # Create Output directory, if it doesn't exist already. - out_dir = f'Outputs_Bayes_{Model.name}_{self.name}' - os.makedirs(out_dir, exist_ok=True) - - # -------- Posteior parameters -------- - if opt_sigma != "B": - par_names.extend( - [self.Discrepancy.InputDisc.Marginals[i].name for i - in range(len(self.Discrepancy.InputDisc.Marginals))] + self.error_MetaModel = self.engine.MetaModel.create_model_error( + self.bias_inputs, y_MAP, self.measured_data, name=self.name ) - # Pot with corner - figPosterior = corner.corner(self.posterior_df.to_numpy(), - labels=par_names, - quantiles=[0.15, 0.5, 0.85], - show_titles=True, - title_fmt=self.corner_title_fmt, - labelpad=0.2, - use_math_text=True, - title_kwargs={"fontsize": 28}, - plot_datapoints=False, - plot_density=False, - fill_contours=True, - smooth=0.5, - smooth1d=0.5) - # Loop over axes and set x limits - if opt_sigma == "B": - axes = np.array(figPosterior.axes).reshape( - (len(par_names), len(par_names)) - ) - for yi in range(len(par_names)): - ax = axes[yi, yi] - ax.set_xlim(MetaModel.bound_tuples[yi]) - for xi in range(yi): - ax = axes[yi, xi] - ax.set_xlim(MetaModel.bound_tuples[xi]) - plt.close() + def perform_bootstrap(self, total_sigma2): + """ + Perform bootstrap to get TOM (??) + + Parameters + ---------- + total_sigma2 : dict + Dictionary containing the sigma2 for the training(?) data + Returns + ------- + None. - # Turn off gridlines - for ax in figPosterior.axes: - ax.grid(False) + """ + MetaModel = self.engine.MetaModel + output_names = self.engine.Model.Output.names + opt_sigma = self.Discrepancy.opt_sigma - if self.emulator: - plotname = f'/Posterior_Dist_{Model.name}_emulator' + # Adding some zero mean noise to the observation function + if len(self.perturbed_data) == 0: + self.perturbed_data = self._perturb_data( + self.measured_data, output_names + ) else: - plotname = f'/Posterior_Dist_{Model.name}' + self.n_bootstrap_itrs = len(self.perturbed_data) - figPosterior.set_size_inches((24, 16)) - figPosterior.savefig(f'./{out_dir}{plotname}.pdf', - bbox_inches='tight') + # -------- Model Discrepancy ----------- + if self.error_model and self.name.lower() == 'valid': # TODO: what should be set so that this is tested? + print('Creating the error model.') + self.create_error_model(type_='prior') + # ----------------------------------------------------- + # ----- Loop over the perturbed observation data ------ + # ----------------------------------------------------- + # Initilize arrays + logLikelihoods = np.zeros((self.n_prior_samples, self.n_bootstrap_itrs), + dtype=np.float16) + BME_Corr = np.zeros(self.n_bootstrap_itrs) + log_BME = np.zeros(self.n_bootstrap_itrs) + KLD = np.zeros(self.n_bootstrap_itrs) + inf_entropy = np.zeros(self.n_bootstrap_itrs) + + # Compute the prior predictions + # Evaluate the MetaModel + if self.emulator: + print('Evaluating the metamodel on the prior samples.') + y_hat, y_std = MetaModel.eval_metamodel(samples=self.prior_samples) + self.__mean_pce_prior_pred = y_hat + self._std_pce_prior_pred = y_std + + # Correct the predictions with Model discrepancy + if self.error_model: # TODO this does not check for calib? + y_hat_corr, y_std = self.error_MetaModel.eval_model_error( + self.bias_inputs, self.__mean_pce_prior_pred) + self.__mean_pce_prior_pred = y_hat_corr + self._std_pce_prior_pred = y_std - # -------- Plot MAP -------- - if self.plot_map_pred: - self._plot_max_a_posteriori() + # Surrogate model's error using RMSE of test data + if MetaModel.rmse is not None: + surrError = MetaModel.rmse + else: + surrError = None + model_evals = self.__mean_pce_prior_pred - # -------- Plot log_BME dist -------- - if self.bootstrap: + # Evaluate the model + else: + print('Evaluating the model on the prior samples.') + self.__model_prior_pred = self._eval_model( + samples=self.prior_samples, key='PriorPred') + model_evals = self.__model_prior_pred + surrError = None + + # Start the likelihood-BME computations for the perturbed data + for itr_idx, data in tqdm( + enumerate(self.perturbed_data), + total=self.n_bootstrap_itrs, + desc="Bootstrapping the BME calculations", ascii=True + ): + + # ---------------- Likelihood calculation ---------------- + # Leave one out (see form of perturbed data) + if self.bayes_loocv or self.just_analysis: + # Consider only non-zero entries + self.selected_indices = np.nonzero(data)[0] + + # Prepare data dataframe # TODO: what's with this transformation? + nobs = list(self.measured_data.count().values[1:]) + numbers = list(np.cumsum(nobs)) + indices = list(zip([0] + numbers, numbers)) + data_dict = { + output_names[i]: data[j:k] for i, (j, k) in + enumerate(indices) + } + + # Unknown sigma2 + if opt_sigma == 'C' or self.sigma2s is not None: + logLikelihoods[:, itr_idx] = self.normpdf( + model_evals, data_dict, total_sigma2, + sigma2=self.sigma2s, std=surrError + ) + else: + # known sigma2 + logLikelihoods[:, itr_idx] = self.normpdf( + model_evals, data_dict, total_sigma2, + std=surrError + ) + # ---------------- BME Calculations ---------------- + # BME (log) + log_BME[itr_idx] = np.log( + np.nanmean(np.exp(logLikelihoods[:, itr_idx], + dtype=self.dtype)) + ) + + # BME correction when using Emulator + if self.emulator: + BME_Corr[itr_idx] = self._corr_factor_BME( + data_dict, total_sigma2, log_BME[itr_idx] + ) - # Computing the TOM performance - self.log_BME_tom = stats.chi2.rvs( - self.n_tot_measurement, size=self.log_BME.shape[0] + # Rejection Step + if 'kld' in list(map(str.lower, self.valid_metrics)) and \ + 'inf_entropy' in list(map(str.lower, self.valid_metrics)): # TODO: why and and not or? + # Random numbers between 0 and 1 + unif = np.random.rand(1, self.n_prior_samples)[0] + + # Reject the poorly performed prior + Likelihoods = np.exp(logLikelihoods[:, itr_idx], + dtype=np.float64) + accepted = (Likelihoods / np.max(Likelihoods)) >= unif + posterior = self.prior_samples[accepted] + + # Posterior-based expectation of likelihoods + postExpLikelihoods = np.mean( + logLikelihoods[:, itr_idx][accepted] ) - fig, ax = plt.subplots() - sns.kdeplot(self.log_BME_tom, ax=ax, color="green", shade=True) - sns.kdeplot( - self.log_BME, ax=ax, color="blue", shade=True, - label='Model BME') + # Calculate Kullback-Leibler Divergence + KLD[itr_idx] = postExpLikelihoods - log_BME[itr_idx] - ax.set_xlabel('log$_{10}$(BME)') - ax.set_ylabel('Probability density') + # Posterior-based expectation of prior densities + if 'inf_entropy' in list(map(str.lower, self.valid_metrics)): + n_thread = int(0.875 * multiprocessing.cpu_count()) + with multiprocessing.Pool(n_thread) as p: + postExpPrior = np.mean(np.concatenate( + p.map( + self.engine.ExpDesign.JDist.pdf, + np.array_split(posterior.T, n_thread, axis=1)) + ) + ) + # Information Entropy based on Entropy paper Eq. 38 + inf_entropy[itr_idx] = log_BME[itr_idx] - postExpPrior - postExpLikelihoods - legend_elements = [ - Patch(facecolor='green', edgecolor='green', label='TOM BME'), - Patch(facecolor='blue', edgecolor='blue', label='Model BME') - ] - ax.legend(handles=legend_elements) + # Clear memory + gc.collect(generation=2) - if self.emulator: - plotname = f'/BME_hist_{Model.name}_emulator' - else: - plotname = f'/BME_hist_{Model.name}' + # ---------- Store metrics for perturbed data set ---------------- + # Likelihoods (Size: n_samples, n_bootstrap_itr) + self.log_likes = logLikelihoods - plt.savefig(f'./{out_dir}{plotname}.pdf', bbox_inches='tight') - plt.show() - plt.close() + # BME (log), KLD, infEntropy (Size: 1,n_bootstrap_itr) + self.log_BME = log_BME - # -------- Posteior perdictives -------- - if self.plot_post_pred: - # Plot the posterior predictive - self._plot_post_predictive() + # BMECorrFactor (log) (Size: 1,n_bootstrap_itr) + # BME = BME + BMECorrFactor + if self.emulator: + self.log_BME += BME_Corr - return self + if 'kld' in list(map(str.lower, self.valid_metrics)): + self.KLD = KLD + if 'inf_entropy' in list(map(str.lower, self.valid_metrics)): + self.inf_entropy = inf_entropy # ------------------------------------------------------------------------- def _perturb_data(self, data, output_names): """ - Returns an array with n_bootstrap_itrs rowsof perturbed data. + Returns an array with n_bootstrap_itrs rows of perturbed data. The first row includes the original observation data. If `self.bayes_loocv` is True, a 2d-array will be returned with repeated rows and zero diagonal entries. @@ -597,7 +721,7 @@ class BayesInference: data : pandas DataFrame Observation data. output_names : list - List of the output names. + The output names. Returns ------- @@ -609,12 +733,11 @@ class BayesInference: obs_data = data[output_names].values n_measurement, n_outs = obs_data.shape self.n_tot_measurement = obs_data[~np.isnan(obs_data)].shape[0] - # Number of bootstrap iterations - if self.bayes_loocv: - self.n_bootstrap_itrs = self.n_tot_measurement # Pass loocv dataset if self.bayes_loocv: + # Number of bootstrap iterations + self.n_bootstrap_itrs = self.n_tot_measurement obs = obs_data.T[~np.isnan(obs_data.T)] final_data = np.repeat(np.atleast_2d(obs), self.n_bootstrap_itrs, axis=0) @@ -622,15 +745,18 @@ class BayesInference: return final_data else: + # Init return data with original data final_data = np.zeros( (self.n_bootstrap_itrs, self.n_tot_measurement) - ) + ) final_data[0] = obs_data.T[~np.isnan(obs_data.T)] for itrIdx in range(1, self.n_bootstrap_itrs): data = np.zeros((n_measurement, n_outs)) for idx in range(len(output_names)): + # Perturb the data std = np.nanstd(obs_data[:, idx]) if std == 0: + print('Note: Use std=0.01 for perturbation') std = 0.001 noise = std * noise_level data[:, idx] = np.add( @@ -642,45 +768,17 @@ class BayesInference: return final_data - # ------------------------------------------------------------------------- - def _logpdf(self, x, mean, cov): - """ - computes the likelihood based on a multivariate normal distribution. - - Parameters - ---------- - x : TYPE - DESCRIPTION. - mean : array_like - Observation data. - cov : 2d array - Covariance matrix of the distribution. - - Returns - ------- - log_lik : float - Log likelihood. - - """ - n = len(mean) - L = spla.cholesky(cov, lower=True) - beta = np.sum(np.log(np.diag(L))) - dev = x - mean - alpha = dev.dot(spla.cho_solve((L, True), dev)) - log_lik = -0.5 * alpha - beta - n / 2. * np.log(2 * np.pi) - return log_lik - # ------------------------------------------------------------------------- def _eval_model(self, samples=None, key='MAP'): """ - Evaluates Forward Model. + Evaluates Forward Model and zips the results Parameters ---------- samples : array of shape (n_samples, n_params), optional Parameter sets. The default is None. key : str, optional - Key string to be passed to the run_model_parallel method. + Descriptive key string for the run_model_parallel method. The default is 'MAP'. Returns @@ -689,18 +787,17 @@ class BayesInference: Model outputs. """ - MetaModel = self.MetaModel - Model = MetaModel.ModelObj + Model = self.engine.Model if samples is None: - self.samples = MetaModel.ExpDesign.generate_samples( - self.n_samples, 'random') + self.prior_samples = self.engine.ExpDesign.generate_samples( + self.n_prior_samples, 'random') else: - self.samples = samples - self.n_samples = len(samples) + self.prior_samples = samples + self.n_prior_samples = len(samples) model_outputs, _ = Model.run_model_parallel( - self.samples, key_str=key+self.name) + self.prior_samples, key_str=key + self.name) # Clean up # Zip the subdirectories @@ -713,55 +810,6 @@ class BayesInference: return model_outputs - # ------------------------------------------------------------------------- - def _kernel_rbf(self, X, hyperparameters): - """ - Isotropic squared exponential kernel. - - Higher l values lead to smoother functions and therefore to coarser - approximations of the training data. Lower l values make functions - more wiggly with wide uncertainty regions between training data points. - - sigma_f controls the marginal variance of b(x) - - Parameters - ---------- - X : ndarray of shape (n_samples_X, n_features) - - hyperparameters : Dict - Lambda characteristic length - sigma_f controls the marginal variance of b(x) - sigma_0 unresolvable error nugget term, interpreted as random - error that cannot be attributed to measurement error. - Returns - ------- - var_cov_matrix : ndarray of shape (n_samples_X,n_samples_X) - Kernel k(X, X). - - """ - from sklearn.gaussian_process.kernels import RBF - min_max_scaler = preprocessing.MinMaxScaler() - X_minmax = min_max_scaler.fit_transform(X) - - nparams = len(hyperparameters) - # characteristic length (0,1] - Lambda = hyperparameters[0] - # sigma_f controls the marginal variance of b(x) - sigma2_f = hyperparameters[1] - - # cov_matrix = sigma2_f*rbf_kernel(X_minmax, gamma = 1/Lambda**2) - - rbf = RBF(length_scale=Lambda) - cov_matrix = sigma2_f * rbf(X_minmax) - if nparams > 2: - # (unresolvable error) nugget term that is interpreted as random - # error that cannot be attributed to measurement error. - sigma2_0 = hyperparameters[2:] - for i, j in np.ndindex(cov_matrix.shape): - cov_matrix[i, j] += np.sum(sigma2_0) if i == j else 0 - - return cov_matrix - # ------------------------------------------------------------------------- def normpdf(self, outputs, obs_data, total_sigma2s, sigma2=None, std=None): """ @@ -777,7 +825,7 @@ class BayesInference: A dictionary/dataframe containing the observation data. total_sigma2s : dict A dictionary with known values of the covariance diagonal entries, - a.k.a sigma^2. + a.k.a. sigma^2. sigma2 : array, optional An array of the sigma^2 samples, when the covariance diagonal entries are unknown and are being jointly inferred. The default is @@ -793,16 +841,16 @@ class BayesInference: Likelihoods. """ - Model = self.MetaModel.ModelObj + Model = self.engine.Model logLik = 0.0 # Extract the requested model outputs for likelihood calulation if self.req_outputs is None: - req_outputs = Model.Output.names + req_outputs = Model.Output.names # TODO: should this then be saved as self.req_outputs? else: req_outputs = list(self.req_outputs) - # Loop over the outputs + # Loop over the output keys for idx, out in enumerate(req_outputs): # (Meta)Model Output @@ -814,26 +862,25 @@ class BayesInference: except AttributeError: data = obs_data[out][~np.isnan(obs_data[out])] - # Prepare sigma2s + # Prepare data uncertainty / error estimation (sigma2s) non_nan_indices = ~np.isnan(total_sigma2s[out]) tot_sigma2s = total_sigma2s[out][non_nan_indices][:nout] - # Add the std of the PCE is chosen as emulator. + # Add the std of the PCE if an emulator is used if self.emulator: if std is not None: - tot_sigma2s += std[out]**2 - - # Covariance Matrix - covMatrix = np.diag(tot_sigma2s) + tot_sigma2s += std[out] ** 2 # Select the data points to compare try: indices = self.selected_indices[out] except: indices = list(range(nout)) - covMatrix = np.diag(covMatrix[indices, indices]) - # If sigma2 is not given, use given total_sigma2s + # Set up Covariance Matrix + covMatrix = np.diag(np.diag(tot_sigma2s)[indices, indices]) + + # If sigma2 is not given, use given total_sigma2s and move to next itr if sigma2 is None: logLik += stats.multivariate_normal.logpdf( outputs[out][:, indices], data[indices], covMatrix) @@ -849,26 +896,24 @@ class BayesInference: # Covariance Matrix covMatrix = np.diag(tot_sigma2s) - if sigma2 is not None: - # Check the type error term - if hasattr(self, 'bias_inputs') and \ - not hasattr(self, 'error_model'): - # Infer a Bias model usig Gaussian Process Regression - bias_inputs = np.hstack( - (self.bias_inputs[out], - tot_outputs[s_idx].reshape(-1, 1))) - - params = sigma2[s_idx, idx*3:(idx+1)*3] - covMatrix = self._kernel_rbf(bias_inputs, params) - else: - # Infer equal sigma2s - try: - sigma_2 = sigma2[s_idx, idx] - except TypeError: - sigma_2 = 0.0 + # Check the type error term + if self.bias_inputs is not None and self.error_model is None: + # Infer a Bias model usig Gaussian Process Regression + bias_inputs = np.hstack( + (self.bias_inputs[out], + tot_outputs[s_idx].reshape(-1, 1))) + + params = sigma2[s_idx, idx * 3:(idx + 1) * 3] + covMatrix = _kernel_rbf(bias_inputs, params) + else: + # Infer equal sigma2s + try: + sigma_2 = sigma2[s_idx, idx] + except TypeError: + sigma_2 = 0.0 - covMatrix += sigma_2 * np.eye(nout) - # covMatrix = np.diag(sigma2 * total_sigma2s) + covMatrix += sigma_2 * np.eye(nout) + # covMatrix = np.diag(sigma2 * total_sigma2s) # Select the data points to compare try: @@ -878,86 +923,45 @@ class BayesInference: covMatrix = np.diag(covMatrix[indices, indices]) # Compute loglikelihood - logliks[s_idx] = self._logpdf( + logliks[s_idx] = _logpdf( tot_outputs[s_idx, indices], data[indices], covMatrix - ) - + ) logLik += logliks return logLik # ------------------------------------------------------------------------- - def _corr_factor_BME_old(self, Data, total_sigma2s, posterior): + def _corr_factor_BME(self, obs_data, total_sigma2s, logBME): """ Calculates the correction factor for BMEs. - """ - MetaModel = self.MetaModel - OrigModelOutput = MetaModel.ExpDesign.Y - Model = MetaModel.ModelObj - - # Posterior with guassian-likelihood - postDist = stats.gaussian_kde(posterior.T) - - # Remove NaN - Data = Data[~np.isnan(Data)] - total_sigma2s = total_sigma2s[~np.isnan(total_sigma2s)] - - # Covariance Matrix - covMatrix = np.diag(total_sigma2s[:self.n_tot_measurement]) - - # Extract the requested model outputs for likelihood calulation - if self.req_outputs is None: - OutputType = Model.Output.names - else: - OutputType = list(self.req_outputs) - - # SampleSize = OrigModelOutput[OutputType[0]].shape[0] - - - # Flatten the OutputType for OrigModel - TotalOutputs = np.concatenate([OrigModelOutput[x] for x in OutputType], 1) - - NrofBayesSamples = self.n_samples - # Evaluate MetaModel on the experimental design - Samples = MetaModel.ExpDesign.X - OutputRS, stdOutputRS = MetaModel.eval_metamodel(samples=Samples) - - # Reset the NrofSamples to NrofBayesSamples - self.n_samples = NrofBayesSamples - - # Flatten the OutputType for MetaModel - TotalPCEOutputs = np.concatenate([OutputRS[x] for x in OutputRS], 1) - TotalPCEstdOutputRS= np.concatenate([stdOutputRS[x] for x in stdOutputRS], 1) + + Parameters + ---------- + obs_data : dict + A dictionary/dataframe containing the observation data. + total_sigma2s : dict + A dictionary with known values of the covariance diagonal entries, + a.k.a sigma^2. + logBME : ?? + The log_BME obtained from the estimated likelihoods - logweight = 0 - for i, sample in enumerate(Samples): - # Compute likelilhood output vs RS - covMatrix = np.diag(TotalPCEstdOutputRS[i]**2) - logLik = self._logpdf(TotalOutputs[i], TotalPCEOutputs[i], covMatrix) - # Compute posterior likelihood of the collocation points - logpostLik = np.log(postDist.pdf(sample[:, None]))[0] - if logpostLik != -np.inf: - logweight += logLik + logpostLik - return logweight + Returns + ------- + np.log(weights) : ?? + Correction factors # TODO: factors or log of factors? - # ------------------------------------------------------------------------- - def __corr_factor_BME(self, obs_data, total_sigma2s, logBME): - """ - Calculates the correction factor for BMEs. """ - MetaModel = self.MetaModel - samples = MetaModel.ExpDesign.X - model_outputs = MetaModel.ExpDesign.Y - Model = MetaModel.ModelObj - n_samples = samples.shape[0] - # Extract the requested model outputs for likelihood calulation - output_names = Model.Output.names + MetaModel = self.engine.MetaModel + samples = self.engine.ExpDesign.X + model_outputs = self.engine.ExpDesign.Y + n_samples = samples.shape[0] + output_names = self.engine.Model.Output.names # Evaluate MetaModel on the experimental design and ValidSet OutputRS, stdOutputRS = MetaModel.eval_metamodel(samples=samples) - logLik_data = np.zeros((n_samples)) - logLik_model = np.zeros((n_samples)) + logLik_data = np.zeros(n_samples) + logLik_model = np.zeros(n_samples) # Loop over the outputs for idx, out in enumerate(output_names): @@ -986,7 +990,7 @@ class BayesInference: y_m_hat = OutputRS[out][i] # CovMatrix with the surrogate error - covMatrix = np.eye(len(y_m)) * 1/(2*np.pi) + covMatrix = np.eye(len(y_m)) * 1 / (2 * np.pi) # Select the data points to compare try: @@ -997,20 +1001,20 @@ class BayesInference: covMatrix_data = np.diag(covMatrix_data[indices, indices]) # Compute likelilhood output vs data - logLik_data[i] += self._logpdf( + logLik_data[i] += _logpdf( y_m_hat[indices], data[indices], covMatrix_data - ) + ) # Compute likelilhood output vs surrogate - logLik_model[i] += self._logpdf( + logLik_model[i] += _logpdf( y_m_hat[indices], y_m[indices], covMatrix - ) + ) # Weight logLik_data -= logBME - weights = np.mean(np.exp(logLik_model+logLik_data)) + weights = np.mean(np.exp(logLik_model + logLik_data)) return np.log(weights) @@ -1026,45 +1030,43 @@ class BayesInference: Posterior samples of the input parameters. """ + if self.prior_samples is None: + raise AttributeError('No prior samples available!') - MetaModel = self.MetaModel + if self.log_likes is None: + raise AttributeError('No log-likelihoods available!') + + # Get sigmas # TODO: is this data uncertainty? try: sigma2_prior = self.Discrepancy.sigma2_prior except: sigma2_prior = None - # Check if the discrepancy is defined as a distribution: - samples = self.samples - + # Combine samples and sigma2 for the return + samples = self.prior_samples if sigma2_prior is not None: samples = np.hstack((samples, sigma2_prior)) # Take the first column of Likelihoods (Observation data without noise) if self.just_analysis or self.bayes_loocv: - index = self.n_tot_measurement-1 - likelihoods = np.exp(self.log_likes[:, index], dtype=np.float128) + index = self.n_tot_measurement - 1 else: - likelihoods = np.exp(self.log_likes[:, 0], dtype=np.float128) + index = 0 + + # Use longdouble on windows, float128 on linux + likelihoods = np.exp(self.log_likes[:, index], dtype=self.dtype) n_samples = len(likelihoods) - norm_ikelihoods = likelihoods / np.max(likelihoods) + norm_likelihoods = likelihoods / np.max(likelihoods) # Normalize based on min if all Likelihoods are zero if all(likelihoods == 0.0): likelihoods = self.log_likes[:, 0] - norm_ikelihoods = likelihoods / np.min(likelihoods) + norm_likelihoods = likelihoods / np.min(likelihoods) - # Random numbers between 0 and 1 + # Reject the poorly performed prior compared to a uniform distribution unif = np.random.rand(1, n_samples)[0] - - # Reject the poorly performed prior - accepted_samples = samples[norm_ikelihoods >= unif] - - # Output the Posterior - par_names = MetaModel.ExpDesign.par_names - if sigma2_prior is not None: - for name in self.Discrepancy.name: - par_names.append(name) + accepted_samples = samples[norm_likelihoods >= unif] return pd.DataFrame(accepted_samples, columns=sigma2_prior) @@ -1086,25 +1088,21 @@ class BayesInference: """ - MetaModel = self.MetaModel - Model = MetaModel.ModelObj + MetaModel = self.engine.MetaModel + Model = self.engine.Model - # Make a directory to save the prior/posterior predictive - out_dir = f'Outputs_Bayes_{Model.name}_{self.name}' - os.makedirs(out_dir, exist_ok=True) - - # Read observation data and perturb it if requested + # Read observation data and perturb it if requested # TODO: where is the perturbation? if self.measured_data is None: self.measured_data = Model.read_observation(case=self.name) if not isinstance(self.measured_data, pd.DataFrame): self.measured_data = pd.DataFrame(self.measured_data) - # X_values - x_values = MetaModel.ExpDesign.x_values - + # X_values and prior sigma2 + x_values = self.engine.ExpDesign.x_values try: - sigma2_prior = self.Discrepancy.sigma2_prior + sigma2_prior = self.Discrepancy.sigma2_prior # TODO: what is this? Looks to be built for a different + # Discrepancy structure except: sigma2_prior = None @@ -1112,45 +1110,47 @@ class BayesInference: posterior_df = self.posterior_df # Take care of the sigma2 - if sigma2_prior is not None: + sigma2s = None + if sigma2_prior is not None: # TODO: why is this the if for this code? try: - sigma2s = posterior_df[self.Discrepancy.name].values + sigma2s = posterior_df[self.Discrepancy.name].values # TODO: what is Discrepancy.name? posterior_df = posterior_df.drop( labels=self.Discrepancy.name, axis=1 - ) + ) except: sigma2s = self.sigma2s # Posterior predictive if self.emulator: - if self.inference_method == 'rejection': - prior_pred = self.__mean_pce_prior_pred - if self.name.lower() != 'calib': - post_pred = self.__mean_pce_prior_pred + if self.inference_method.lower() == 'rejection': # TODO: combine these two? Why is there no + # post_pred_std for rejection sampling? + prior_pred = self._mean_pce_prior_pred + if self.name.lower() == 'valid': + post_pred = self._mean_pce_prior_pred post_pred_std = self._std_pce_prior_pred else: - post_pred, post_pred_std = MetaModel.eval_metamodel( + post_pred, post_pred_std = MetaModel.eval_metamodel( # TODO: recheck if this is needed samples=posterior_df.values - ) + ) - else: - if self.inference_method == 'rejection': + else: # TODO: see emulator version + if self.inference_method.lower() == 'rejection': prior_pred = self.__model_prior_pred - if self.name.lower() != 'calib': + if self.name.lower() == 'valid': post_pred = self.__mean_pce_prior_pred, post_pred_std = self._std_pce_prior_pred else: post_pred = self._eval_model( samples=posterior_df.values, key='PostPred' - ) + ) # Correct the predictions with Model discrepancy - if hasattr(self, 'error_model') and self.error_model: + if self.error_model: y_hat, y_std = self.error_MetaModel.eval_model_error( self.bias_inputs, post_pred - ) + ) post_pred, post_pred_std = y_hat, y_std - # Add discrepancy from likelihood Sample to the current posterior runs + # Add discrepancy from likelihood samples to the current posterior runs total_sigma2 = self.Discrepancy.total_sigma2 post_pred_withnoise = copy.deepcopy(post_pred) for varIdx, var in enumerate(Model.Output.names): @@ -1162,16 +1162,15 @@ class BayesInference: tot_sigma2 = clean_sigma2[:len(pred)] cov = np.diag(tot_sigma2) - # Check the type error term + # Account for additional error terms if sigma2_prior is not None: # Inferred sigma2s - if hasattr(self, 'bias_inputs') and \ - not hasattr(self, 'error_model'): + if self.bias_inputs is not None and self.error_model is None: # TODO: Infer a Bias model usig GPR bias_inputs = np.hstack(( self.bias_inputs[var], pred.reshape(-1, 1))) - params = sigma2s[i, varIdx*3:(varIdx+1)*3] - cov = self._kernel_rbf(bias_inputs, params) + params = sigma2s[i, varIdx * 3:(varIdx + 1) * 3] + cov = _kernel_rbf(bias_inputs, params) else: # Infer equal sigma2s try: @@ -1182,25 +1181,25 @@ class BayesInference: # Convert biasSigma2s to a covMatrix cov += sigma2 * np.eye(len(pred)) + # Add predictive metamodel error/uncertainty if self.emulator: - if hasattr(MetaModel, 'rmse') and \ - MetaModel.rmse is not None: + if MetaModel.rmse is not None: stdPCE = MetaModel.rmse[var] else: stdPCE = post_pred_std[var][i] # Expected value of variance (Assump: i.i.d stds) - cov += np.diag(stdPCE**2) + cov += np.diag(stdPCE ** 2) # Sample a multivariate normal distribution with mean of - # prediction and variance of cov + # posterior prediction and variance of cov post_pred_withnoise[var][i] = np.random.multivariate_normal( pred, cov, 1 - ) + ) # ----- Prior Predictive ----- if self.inference_method.lower() == 'rejection': # Create hdf5 metadata - hdf5file = f'{out_dir}/priorPredictive.hdf5' + hdf5file = f'{self.out_dir}/priorPredictive.hdf5' hdf5_exist = os.path.exists(hdf5file) if hdf5_exist: os.remove(hdf5file) @@ -1221,7 +1220,7 @@ class BayesInference: # ----- Posterior Predictive only model evaluations ----- # Create hdf5 metadata - hdf5file = out_dir+'/postPredictive_wo_noise.hdf5' + hdf5file = self.out_dir + '/postPredictive_wo_noise.hdf5' hdf5_exist = os.path.exists(hdf5file) if hdf5_exist: os.remove(hdf5file) @@ -1242,7 +1241,7 @@ class BayesInference: # ----- Posterior Predictive with noise ----- # Create hdf5 metadata - hdf5file = out_dir+'/postPredictive.hdf5' + hdf5file = self.out_dir + '/postPredictive.hdf5' hdf5_exist = os.path.exists(hdf5file) if hdf5_exist: os.remove(hdf5file) @@ -1275,11 +1274,9 @@ class BayesInference: """ - MetaModel = self.MetaModel - Model = MetaModel.ModelObj - out_dir = f'Outputs_Bayes_{Model.name}_{self.name}' + MetaModel = self.engine.MetaModel + Model = self.engine.Model opt_sigma = self.Discrepancy.opt_sigma - # -------- Find MAP and run MetaModel and origModel -------- # Compute the MAP if self.max_a_posteriori.lower() == 'mean': @@ -1290,6 +1287,8 @@ class BayesInference: map_theta = Posterior_df.mean(axis=0).reshape( (1, MetaModel.n_params)) else: + # TODO: here just a fix, no previous mention of Posterior_df! + Posterior_df = None map_theta = stats.mode(Posterior_df.values, axis=0)[0] # Prin report print("\nPoint estimator:\n", map_theta[0]) @@ -1313,10 +1312,9 @@ class BayesInference: Marker = 'x' # Create a PdfPages object - pdf = PdfPages(f'./{out_dir}MAP_PCE_vs_Model_{self.name}.pdf') + pdf = PdfPages(f'./{self.out_dir}MAP_PCE_vs_Model_{self.name}.pdf') fig = plt.figure() for i, key in enumerate(Model.Output.names): - y_val = map_orig_model[key] y_pce_val = map_metamodel_mean[key] y_pce_val_std = map_metamodel_std[key] @@ -1327,13 +1325,13 @@ class BayesInference: plt.plot( x_values, y_pce_val[i], color=Color[i], lw=2.0, marker=Marker, linestyle='--', label='$Y_{MAP}^{PCE}$' - ) + ) # plot the confidence interval plt.fill_between( - x_values, y_pce_val[i] - 1.96*y_pce_val_std[i], - y_pce_val[i] + 1.96*y_pce_val_std[i], + x_values, y_pce_val[i] - 1.96 * y_pce_val_std[i], + y_pce_val[i] + 1.96 * y_pce_val_std[i], color=Color[i], alpha=0.15 - ) + ) # Calculate the adjusted R_squared and RMSE R2 = r2_score(y_pce_val.reshape(-1, 1), y_val.reshape(-1, 1)) @@ -1348,7 +1346,7 @@ class BayesInference: fig.canvas.draw() p = leg.get_window_extent().inverse_transformed(ax.transAxes) ax.text( - p.p0[1]-0.05, p.p1[1]-0.25, + p.p0[1] - 0.05, p.p1[1] - 0.25, f'RMSE = {rmse:.3f}\n$R^2$ = {R2:.3f}', transform=ax.transAxes, color='black', bbox=dict(facecolor='none', edgecolor='black', @@ -1364,6 +1362,110 @@ class BayesInference: pdf.close() + def plot_post_params(self, opt_sigma): + """ + Plots the multivar. posterior parameter distribution. + + + Parameters + ---------- + opt_sigma : string + Type of uncertainty description available. + + Returns + ------- + None. + + """ + par_names = self.engine.ExpDesign.par_names + if opt_sigma != "B": + par_names.extend( + [self.Discrepancy.InputDisc.Marginals[i].name for i + in range(len(self.Discrepancy.InputDisc.Marginals))] + ) + # Pot with corner + figPosterior = corner.corner(self.posterior_df.to_numpy(), + labels=par_names, + quantiles=[0.15, 0.5, 0.85], + show_titles=True, + title_fmt=self.corner_title_fmt, + labelpad=0.2, + use_math_text=True, + title_kwargs={"fontsize": 28}, + plot_datapoints=False, + plot_density=False, + fill_contours=True, + smooth=0.5, + smooth1d=0.5) + + # Loop over axes and set x limits + if opt_sigma == "B": + axes = np.array(figPosterior.axes).reshape( + (len(par_names), len(par_names)) + ) + for yi in range(len(par_names)): + ax = axes[yi, yi] + ax.set_xlim(self.engine.ExpDesign.bound_tuples[yi]) + for xi in range(yi): + ax = axes[yi, xi] + ax.set_xlim(self.engine.ExpDesign.bound_tuples[xi]) + plt.close() + + # Turn off gridlines + for ax in figPosterior.axes: + ax.grid(False) + + if self.emulator: + plotname = f'/Posterior_Dist_{self.engine.Model.name}_emulator' + else: + plotname = f'/Posterior_Dist_{self.engine.Model.name}' + + figPosterior.set_size_inches((24, 16)) + figPosterior.savefig(f'./{self.out_dir}{plotname}.pdf', + bbox_inches='tight') + + plt.clf() + + def plot_log_BME(self): + """ + Plots the log_BME if bootstrap is active. + + Returns + ------- + None. + + """ + + # Computing the TOM performance + self.log_BME_tom = stats.chi2.rvs( + self.n_tot_measurement, size=self.log_BME.shape[0] + ) + + fig, ax = plt.subplots() + sns.kdeplot(self.log_BME_tom, ax=ax, color="green", shade=True) + sns.kdeplot( + self.log_BME, ax=ax, color="blue", shade=True, + label='Model BME') + + ax.set_xlabel('log$_{10}$(BME)') + ax.set_ylabel('Probability density') + + legend_elements = [ + Patch(facecolor='green', edgecolor='green', label='TOM BME'), + Patch(facecolor='blue', edgecolor='blue', label='Model BME') + ] + ax.legend(handles=legend_elements) + + if self.emulator: + plotname = f'/BME_hist_{self.engine.Model.name}_emulator' + else: + plotname = f'/BME_hist_{self.engine.Model.name}' + + plt.savefig(f'./{self.out_dir}{plotname}.pdf', bbox_inches='tight') + + plt.show() + plt.clf() + # ------------------------------------------------------------------------- def _plot_post_predictive(self): """ @@ -1375,8 +1477,7 @@ class BayesInference: """ - Model = self.MetaModel.ModelObj - out_dir = f'Outputs_Bayes_{Model.name}_{self.name}' + Model = self.engine.Model # Plot the posterior predictive for out_idx, out_name in enumerate(Model.Output.names): fig, ax = plt.subplots() @@ -1385,11 +1486,10 @@ class BayesInference: # --- Read prior and posterior predictive --- if self.inference_method == 'rejection' and \ - self.name.lower() != 'valid': + self.name.lower() == 'calib': # --- Prior --- # Load posterior predictive - f = h5py.File( - f'{out_dir}/priorPredictive.hdf5', 'r+') + f = h5py.File(f'{self.out_dir}/priorPredictive.hdf5', 'r+') try: x_coords = np.array(f[f"x_values/{out_name}"]) @@ -1398,10 +1498,8 @@ class BayesInference: X_values = np.repeat(x_coords, 10000) - prior_pred_df = {} - prior_pred_df[x_key] = X_values - prior_pred_df[out_name] = np.array( - f[f"EDY/{out_name}"])[:10000].flatten('F') + prior_pred_df = {x_key: X_values, out_name: np.array( + f[f"EDY/{out_name}"])[:10000].flatten('F')} prior_pred_df = pd.DataFrame(prior_pred_df) tags_post = ['prior'] * len(prior_pred_df) @@ -1411,16 +1509,13 @@ class BayesInference: f.close() # --- Posterior --- - f = h5py.File(f"{out_dir}/postPredictive.hdf5", 'r+') + f = h5py.File(f"{self.out_dir}/postPredictive.hdf5", 'r+') X_values = np.repeat( x_coords, np.array(f[f"EDY/{out_name}"]).shape[0]) - post_pred_df = {} - post_pred_df[x_key] = X_values - post_pred_df[out_name] = np.array( - f[f"EDY/{out_name}"]).flatten('F') - + post_pred_df = {x_key: X_values, out_name: np.array( + f[f"EDY/{out_name}"]).flatten('F')} post_pred_df = pd.DataFrame(post_pred_df) tags_post = ['posterior'] * len(post_pred_df) @@ -1448,7 +1543,7 @@ class BayesInference: ax.errorbar( x_coords, obs_data[out_name].values, - yerr=1.96*self.measurement_error[out_name], + yerr=1.96 * self.measurement_error[out_name], ecolor='g', fmt=' ', zorder=-1) # Add labels to the legend @@ -1466,7 +1561,7 @@ class BayesInference: else: # Load posterior predictive - f = h5py.File(f"{out_dir}/postPredictive.hdf5", 'r+') + f = h5py.File(f"{self.out_dir}/postPredictive.hdf5", 'r+') try: x_coords = np.array(f[f"x_values/{out_name}"]) @@ -1481,7 +1576,7 @@ class BayesInference: x_coords, mu, marker='o', color='b', label='Mean Post. Predictive') plt.fill_between( - x_coords, mu-1.96*std, mu+1.96*std, color='b', + x_coords, mu - 1.96 * std, mu + 1.96 * std, color='b', alpha=0.15) # --- Plot Data --- @@ -1490,11 +1585,11 @@ class BayesInference: 'ko', label='data', markeredgecolor='w') # --- Plot ExpDesign --- - orig_ED_Y = self.MetaModel.ExpDesign.Y[out_name] + orig_ED_Y = self.engine.ExpDesign.Y[out_name] for output in orig_ED_Y: plt.plot( x_coords, output, color='grey', alpha=0.15 - ) + ) # Add labels for axes plt.xlabel('Time [s]') @@ -1517,5 +1612,7 @@ class BayesInference: else: plotname = f'/Post_Prior_Perd_{Model.name}' - fig.savefig(f'./{out_dir}{plotname}_{out_name}.pdf', + fig.savefig(f'./{self.out_dir}{plotname}_{out_name}.pdf', bbox_inches='tight') + + plt.clf() diff --git a/src/bayesvalidrox/bayes_inference/bayes_model_comparison.py b/src/bayesvalidrox/bayes_inference/bayes_model_comparison.py index 4d829f61a118b7544298e469272fc05f5d0f0b7f..a26eaa886d6bfda11c23e0e2a490f9f93fee1c45 100644 --- a/src/bayesvalidrox/bayes_inference/bayes_model_comparison.py +++ b/src/bayesvalidrox/bayes_inference/bayes_model_comparison.py @@ -1,10 +1,7 @@ #!/usr/bin/env python3 # -*- coding: utf-8 -*- -""" -Created on Sat Aug 24 16:04:06 2019 -@author: farid -""" +import emcee import numpy as np import os from scipy import stats @@ -12,6 +9,7 @@ import seaborn as sns import matplotlib.patches as patches import matplotlib.colors as mcolors import matplotlib.pylab as plt +import pandas as pd from .bayes_inference import BayesInference # Load the mplstyle @@ -31,86 +29,89 @@ class BayesModelComparison: `True`. perturbed_data : array of shape (n_bootstrap_itrs, n_obs), optional User defined perturbed data. The default is `None`. - n_bootstarp : int + n_bootstrap : int Number of bootstrap iteration. The default is `1000`. data_noise_level : float A noise level to perturb the data set. The default is `0.01`. - just_n_meas : int - Number of measurements considered for visualization of the - justifiability results. """ def __init__(self, justifiability=True, perturbed_data=None, - n_bootstarp=1000, data_noise_level=0.01, just_n_meas=2): + n_bootstrap=1000, data_noise_level=0.01, + use_Bayes_settings = True, emulator = True, out_dir = 'Outputs_Comparison/'): + # TODO: check valid ranges of the parameters + self.justifiability = justifiability self.perturbed_data = perturbed_data - self.n_bootstarp = n_bootstarp + self.n_bootstrap = n_bootstrap self.data_noise_level = data_noise_level - self.just_n_meas = just_n_meas - + self.use_Bayes_settings = use_Bayes_settings + self.emulator = emulator + self.out_dir = out_dir + + # Other parameters + self.n_meas = None + self.BF_data = None + self.just_data = None + self.BME_dict = None + self.set_up = False + self.dtype = None + self.bayes_dict = None + self.just_bayes_dict = None + self.model_weights = None + self.model_weights_dict = None + self.just_model_weights_dict = None + + # -------------------------------------------------------------------------- - def create_model_comparison(self, model_dict, opts_dict): + def setup(self, model_dict): """ - Starts the two-stage model comparison. - Stage I: Compare models using Bayes factors. - Stage II: Compare models via justifiability analysis. - - Parameters - ---------- - model_dict : dict - A dictionary including the metamodels. - opts_dict : dict - A dictionary given the `BayesInference` options. - - Example: - - >>> opts_bootstrap = { - "bootstrap": True, - "n_samples": 10000, - "Discrepancy": DiscrepancyOpts, - "emulator": True, - "plot_post_pred": True - } + Initialize parameters that are needed for all types of model comparison Returns ------- - output : dict - A dictionary containing the objects and the model weights for the - comparison using Bayes factors and justifiability analysis. + None. """ + + if not isinstance(model_dict, dict): + raise Exception("To run model comparsion, you need to pass a " + "dictionary of models.") - # Bayes factor - bayes_dict_bf, model_weights_dict_bf = self.compare_models( - model_dict, opts_dict - ) - - output = { - 'Bayes objects BF': bayes_dict_bf, - 'Model weights BF': model_weights_dict_bf - } + # Extract model names + self.model_names = [*model_dict] - # Justifiability analysis - if self.justifiability: - bayes_dict_ja, model_weights_dict_ja = self.compare_models( - model_dict, opts_dict, justifiability=True - ) + # Compute total number of the measurement points + # TODO: there could be a different option for this here + Engine = list(model_dict.items())[0][1] + Engine.Model.read_observation() + self.n_meas = Engine.Model.n_obs - output['Bayes objects JA'] = bayes_dict_ja - output['Model weights JA'] = model_weights_dict_ja + # Find n_bootstrap + if self.perturbed_data is not None: + self.n_bootstrap = self.perturbed_data.shape[0] + + # Output directory + os.makedirs(self.out_dir, exist_ok=True) + + # System settings + if os.name == 'nt': + print('') + print('WARNING: Performing the inference on windows can lead to reduced accuracy!') + print('') + self.dtype=np.longdouble + else: + self.dtype=np.float128 - return output # -------------------------------------------------------------------------- - def compare_models(self, model_dict, opts_dict, justifiability=False): + def model_comparison_all(self, model_dict, opts_dict): """ - Passes the options to instantiates the BayesInference class for each - model and passes the options from `opts_dict`. Then, it starts the - computations. - It also creates a folder and saves the diagrams, e.g., Bayes factor - plot, confusion matrix, etc. + Perform all three types of model comparison: + * Bayes Factors + * Model weights + * Justifiability analysis Parameters ---------- @@ -118,50 +119,57 @@ class BayesModelComparison: A dictionary including the metamodels. opts_dict : dict A dictionary given the `BayesInference` options. - justifiability : bool, optional - Whether to perform the justifiability analysis. The default is - `False`. Returns ------- - bayes_dict : dict - A dictionary with `BayesInference` objects. - model_weights_dict : dict - A dictionary containing the model weights. + results : dict + A dictionary that contains the calculated BME values, model weights + and confusion matrix """ + self.calc_bayes_factors(model_dict, opts_dict) + self.calc_model_weights(model_dict, opts_dict) + self.calc_justifiability_analysis(model_dict, opts_dict) + + results = {'BME': self.BME_dict, 'Model weights': self.model_weights_dict, + 'Confusion matrix': self.confusion_matrix} + return results + - if not isinstance(model_dict, dict): - raise Exception("To run model comparsion, you need to pass a " - "dictionary of models.") + # -------------------------------------------------------------------------- + def calc_bayes_factors(self, model_dict, opts_dict): + """ + Calculate the BayesFactors for each pair of models in the model_dict + with respect to given data. - # Extract model names - self.model_names = [*model_dict] + Parameters + ---------- + model_dict : dict + A dictionary including the metamodels. + opts_dict : dict + A dictionary given the `BayesInference` options. - # Compute total number of the measurement points - MetaModel = list(model_dict.items())[0][1] - MetaModel.ModelObj.read_observation() - self.n_meas = MetaModel.ModelObj.n_obs + Returns + ------- + None. + """ + # Do the setup + if self.n_meas is None: + self.setup(model_dict) + # ----- Generate data ----- - # Find n_bootstrap - if self.perturbed_data is None: - n_bootstarp = self.n_bootstarp - else: - n_bootstarp = self.perturbed_data.shape[0] - # Create dataset - justData = self.generate_dataset( - model_dict, justifiability, n_bootstarp=n_bootstarp) + self.BF_data = self.generate_dataset( + model_dict, False, n_bootstrap=self.n_bootstrap) # Run create Interface for each model - bayes_dict = {} + self.bayes_dict = {} for model in model_dict.keys(): print("-"*20) print("Bayesian inference of {}.\n".format(model)) - BayesOpts = BayesInference(model_dict[model]) - + # Set BayesInference options for key, value in opts_dict.items(): if key in BayesOpts.__dict__.keys(): @@ -171,49 +179,147 @@ class BayesModelComparison: setattr(BayesOpts, key, value) # Pass justifiability data as perturbed data - BayesOpts.perturbed_data = justData - BayesOpts.just_analysis = justifiability + BayesOpts.bmc = True + BayesOpts.emulator= self.emulator + BayesOpts.just_analysis = False + BayesOpts.perturbed_data = self.BF_data - bayes_dict[model] = BayesOpts.create_inference() + self.bayes_dict[model] = BayesOpts.create_inference() print("-"*20) - # Compute model weights - BME_Dict = dict() - for modelName, bayesObj in bayes_dict.items(): - BME_Dict[modelName] = np.exp(bayesObj.log_BME, dtype=np.float128) + # Accumulate the BMEs + self.BME_dict = dict() + for modelName, bayesObj in self.bayes_dict.items(): + self.BME_dict[modelName] = np.exp(bayesObj.log_BME, dtype=self.dtype) + + # TODO: move the calculation of the Bayes Factors out of the plots to here! + # Create kde plot for bayes factors + self.plot_bayes_factor(self.BME_dict, 'kde_plot') + + + def calc_model_weights(self, model_dict, opts_dict): + """ + Calculate the model weights from BME evaluations for Bayes factors. - # BME correction in BayesInference class - model_weights = self.cal_model_weight( - BME_Dict, justifiability, n_bootstarp=n_bootstarp) + Parameters + ---------- + model_dict : TYPE + DESCRIPTION. + opts_dict : TYPE + DESCRIPTION. - # Plot model weights - if justifiability: - model_names = self.model_names - model_names.insert(0, 'Observation') + Returns + ------- + None. - # Split the model weights and save in a dict - list_ModelWeights = np.split( - model_weights, model_weights.shape[1]/self.n_meas, axis=1) - model_weights_dict = {key: weights for key, weights in - zip(model_names, list_ModelWeights)} + """ + # Get BMEs via Bayes Factors if not already done so + if self.BME_dict is None: + self.calc_bayes_factors(model_dict, opts_dict) + + # Calculate the model weights + self.model_weights = self.cal_model_weight( + self.BME_dict, False, n_bootstrap=self.n_bootstrap) - self.plot_just_analysis(model_weights_dict) - else: - # Create box plot for model weights - self.plot_model_weights(model_weights, 'model_weights') + # Create box plot for model weights + self.plot_model_weights(self.model_weights, 'model_weights') - # Create kde plot for bayes factors - self.plot_bayes_factor(BME_Dict, 'kde_plot') - # Store model weights in a dict - model_weights_dict = {key: weights for key, weights in - zip(self.model_names, model_weights)} + # ------------------------------------------------------------------------- + def calc_justifiability_analysis(self, model_dict, opts_dict): + """ + Perform justifiability analysis by calculating the confusion matrix + + Parameters + ---------- + model_dict : dict + A dictionary including the metamodels. + opts_dict : dict + A dictionary given the `BayesInference` options. + + Returns + ------- + confusion_matrix: dict + The averaged confusion matrix + + """ + # Do setup + if self.n_meas is None: + self.setup(model_dict) + + # Extend model names + model_names = self.model_names + if model_names[0]!= 'Observation': + model_names.insert(0, 'Observation') + + # Generate data + # TODO: generate the datset only if it does not exist yet + self.just_data = self.generate_dataset( + model_dict, True, n_bootstrap=self.n_bootstrap) + + # Run inference for each model if this is not available + if self.just_bayes_dict is None: + self.just_bayes_dict = {} + for model in model_dict.keys(): + print("-"*20) + print("Bayesian inference of {}.\n".format(model)) + BayesOpts = BayesInference(model_dict[model]) + + # Set BayesInference options + for key, value in opts_dict.items(): + if key in BayesOpts.__dict__.keys(): + if key == "Discrepancy" and isinstance(value, dict): + setattr(BayesOpts, key, value[model]) + else: + setattr(BayesOpts, key, value) + + # Pass justifiability data as perturbed data + BayesOpts.bmc = True + BayesOpts.emulator= self.emulator + BayesOpts.just_analysis = True + BayesOpts.perturbed_data = self.just_data + + self.just_bayes_dict[model] = BayesOpts.create_inference() + print("-"*20) + + # Compute model weights + self.BME_dict = dict() + for modelName, bayesObj in self.bayes_dict.items(): + self.BME_dict[modelName] = np.exp(bayesObj.log_BME, dtype=self.dtype) + + # BME correction in BayesInference class + just_model_weights = self.cal_model_weight( + self.BME_dict, True, n_bootstrap=self.n_bootstrap) + + # Split the model weights and save in a dict + list_ModelWeights = np.split( + just_model_weights, self.model_weights.shape[1]/self.n_meas, axis=1) + self.just_model_weights_dict = {key: weights for key, weights in + zip(model_names, list_ModelWeights)} + + # Confusion matrix over all measurement points + cf_m = pd.DataFrame() + cf_m['Generated by'] = model_names + for i in range(len(model_names)): + # Ignore 'Observation', this not in the model_weights_dict + # TODO: how to change the code so that it is included as well? + if i==0: + continue + avg = [] + for n in model_names: + avg.append(np.sum(self.just_model_weights_dict[n][i-1])) + + # Norm to sum to 1 for each 'Generated by' row + cf_m[model_names[i]] = avg/self.n_meas + self.confusion_matrix = cf_m + + # Plot model weights + self.plot_just_analysis() - return bayes_dict, model_weights_dict # ------------------------------------------------------------------------- def generate_dataset(self, model_dict, justifiability=False, - n_bootstarp=1): + n_bootstrap=1): """ Generates the perturbed data set for the Bayes factor calculations and the data set for the justifiability analysis. @@ -225,7 +331,7 @@ class BayesModelComparison: bool, optional Whether to perform the justifiability analysis. The default is `False`. - n_bootstarp : int, optional + n_bootstrap : int, optional Number of bootstrap iterations. The default is `1`. Returns @@ -236,33 +342,34 @@ class BayesModelComparison: """ # Compute some variables all_just_data = [] - metaModel = list(model_dict.items())[0][1] - out_names = metaModel.ModelObj.Output.names + Engine = list(model_dict.items())[0][1] + out_names = Engine.Model.Output.names # Perturb observations for Bayes Factor if self.perturbed_data is None: self.perturbed_data = self.__perturb_data( - metaModel.ModelObj.observations, out_names, n_bootstarp, + Engine.Model.observations, out_names, n_bootstrap, noise_level=self.data_noise_level) # Only for Bayes Factor if not justifiability: - return self.perturbed_data + return self.perturbed_data # TODO: why return this as self... and the other one not? Is this used again? # Evaluate metamodel runs = {} - for key, metaModel in model_dict.items(): - y_hat, _ = metaModel.eval_metamodel(nsamples=n_bootstarp) + for key, metaModel in model_dict.items(): # TODO: add check for emulator vs model + y_hat, _ = metaModel.eval_metamodel(nsamples=n_bootstrap) runs[key] = y_hat # Generate data - for i in range(n_bootstarp): - y_data = self.perturbed_data[i].reshape(1, -1) - justData = np.tril(np.repeat(y_data, y_data.shape[1], axis=0)) + for i in range(n_bootstrap): + y_data = self.perturbed_data[i].reshape(1, -1)# makes every entry in self.perturbed_data 2D by adding one dim outside + justData = np.tril(np.repeat(y_data, y_data.shape[1], axis=0)) # Lower triangle matrix from repeats of y_data + # TODO: why triangle matrix here? # Use surrogate runs for data-generating process for key, metaModel in model_dict.items(): model_data = np.array( - [runs[key][out][i] for out in out_names]).reshape(y_data.shape) + [runs[key][out][i] for out in out_names]).reshape(y_data.shape) # reshapes model runs to match y_data justData = np.vstack(( justData, np.tril(np.repeat(model_data, model_data.shape[1], axis=0)) @@ -280,7 +387,7 @@ class BayesModelComparison: # ------------------------------------------------------------------------- def __perturb_data(self, data, output_names, n_bootstrap, noise_level): """ - Returns an array with n_bootstrap_itrs rowsof perturbed data. + Returns an array with n_bootstrap_itrs rows of perturbed data. The first row includes the original observation data. If `self.bayes_loocv` is True, a 2d-array will be returned with repeated rows and zero diagonal entries. @@ -322,13 +429,13 @@ class BayesModelComparison: return final_data # ------------------------------------------------------------------------- - def cal_model_weight(self, BME_Dict, justifiability=False, n_bootstarp=1): + def cal_model_weight(self, BME_dict, justifiability=False, n_bootstrap=1): """ Normalize the BME (Asumption: Model Prior weights are equal for models) Parameters ---------- - BME_Dict : dict + BME_dict : dict A dictionary containing the BME values. Returns @@ -338,12 +445,12 @@ class BayesModelComparison: """ # Stack the BME values for all models - all_BME = np.vstack(list(BME_Dict.values())) + all_BME = np.vstack(list(BME_dict.values())) if justifiability: # Compute expected log_BME for justifiabiliy analysis all_BME = all_BME.reshape( - all_BME.shape[0], -1, n_bootstarp).mean(axis=2) + all_BME.shape[0], -1, n_bootstrap).mean(axis=2) # Model weights model_weights = np.divide(all_BME, np.nansum(all_BME, axis=0)) @@ -366,16 +473,16 @@ class BayesModelComparison: None. """ - - directory = 'Outputs_Comparison/' - os.makedirs(directory, exist_ok=True) + model_weights_dict = self.just_model_weights_dict Color = [*mcolors.TABLEAU_COLORS] names = [*model_weights_dict] + # Plot weights for each 'Generated by' model_names = [model.replace('_', '$-$') for model in self.model_names] for name in names: fig, ax = plt.subplots() for i, model in enumerate(model_names[1:]): + #print(model, i) plt.plot(list(range(1, self.n_meas+1)), model_weights_dict[name][i], color=Color[i], marker='o', @@ -388,13 +495,12 @@ class BayesModelComparison: ax.set_xticks(list(range(1, self.n_meas+1))) plt.legend(loc="best") fig.savefig( - f'{directory}modelWeights_{name}.svg', bbox_inches='tight' + f'{self.out_dir}modelWeights_{name}.svg', bbox_inches='tight' ) plt.close() - # Confusion matrix for some measurement points - epsilon = 1 if self.just_n_meas != 1 else 0 - for index in range(0, self.n_meas+epsilon, self.just_n_meas): + # Confusion matrix for each measurement point + for index in range(0, self.n_meas): weights = np.array( [model_weights_dict[key][:, index] for key in model_weights_dict] ) @@ -409,10 +515,26 @@ class BayesModelComparison: g.set_xlabel(r"\textbf{Data generated by:}", labelpad=15) g.set_ylabel(r"\textbf{Model weight for:}", labelpad=15) g.figure.savefig( - f"{directory}confusionMatrix_ND_{index+1}.pdf", + f"{self.out_dir}confusionMatrix_ND_{index+1}.pdf", bbox_inches='tight' ) plt.close() + + # Plot the averaged confusion matrix + out_names = names[1:] + cf = self.confusion_matrix[out_names].to_numpy() + g = sns.heatmap(cf.T, annot=True, cmap='Blues', xticklabels=model_names, + yticklabels=model_names[1:], annot_kws={"size": 24}) + g.xaxis.tick_top() + g.xaxis.set_label_position('top') + g.set_xlabel(r"\textbf{Data generated by:}", labelpad=15) + g.set_ylabel(r"\textbf{Model weight for:}", labelpad=15) + g.figure.savefig( + f"{self.out_dir}confusionMatrix_full.pdf", + bbox_inches='tight' + ) + plt.close() + # ------------------------------------------------------------------------- def plot_model_weights(self, model_weights, plot_name): @@ -432,13 +554,9 @@ class BayesModelComparison: None. """ - font_size = 40 - # mkdir for plots - directory = 'Outputs_Comparison/' - os.makedirs(directory, exist_ok=True) - # Create figure fig, ax = plt.subplots() + font_size = 40 # Filter data using np.isnan mask = ~np.isnan(model_weights.T) @@ -466,44 +584,35 @@ class BayesModelComparison: for median in bp['medians']: median.set(color='#b2df8a', linewidth=2) - # change the style of fliers and their fill - # for flier in bp['fliers']: - # flier.set(marker='o', color='#e7298a', alpha=0.75) - - # Custom x-axis labels + # Customize the axes model_names = [model.replace('_', '$-$') for model in self.model_names] ax.set_xticklabels(model_names) - ax.set_ylabel('Weight', fontsize=font_size) - - # Title - plt.title('Posterior Model Weights') - - # Set y lim ax.set_ylim((-0.05, 1.05)) - - # Set size of the ticks for t in ax.get_xticklabels(): t.set_fontsize(font_size) for t in ax.get_yticklabels(): t.set_fontsize(font_size) + # Title + plt.title('Posterior Model Weights') + # Save the figure fig.savefig( - f'./{directory}{plot_name}.pdf', bbox_inches='tight' + f'./{self.out_dir}{plot_name}.pdf', bbox_inches='tight' ) plt.close() # ------------------------------------------------------------------------- - def plot_bayes_factor(self, BME_Dict, plot_name=''): + def plot_bayes_factor(self, BME_dict, plot_name=''): """ Plots the Bayes factor distibutions in a :math:`N_m \\times N_m` matrix, where :math:`N_m` is the number of the models. Parameters ---------- - BME_Dict : dict + BME_dict : dict A dictionary containing the BME values of the models. plot_name : str, optional Plot name. The default is ''. @@ -513,16 +622,11 @@ class BayesModelComparison: None. """ - + # Plot setup font_size = 40 - - # mkdir for plots - directory = 'Outputs_Comparison/' - os.makedirs(directory, exist_ok=True) - Colors = ["blue", "green", "gray", "brown"] - model_names = list(BME_Dict.keys()) + model_names = list(BME_dict.keys()) nModels = len(model_names) # Plots @@ -544,7 +648,7 @@ class BayesModelComparison: # Null hypothesis: key_j is the better model BayesFactor = np.log10( - np.divide(BME_Dict[key_i], BME_Dict[key_j]) + np.divide(BME_dict[key_i], BME_dict[key_j]) ) # sns.kdeplot(BayesFactor, ax=ax, color=Colors[i], shade=True) @@ -637,10 +741,8 @@ class BayesModelComparison: fontsize=fsize, color=Colors[i], transform=ax.transAxes) - # Defining custom 'ylim' values. + # Customize axes custom_ylim = (0, 1.05) - - # Setting the values for all axes. plt.setp(axes, ylim=custom_ylim) # set labels @@ -652,7 +754,7 @@ class BayesModelComparison: plt.subplots_adjust(wspace=0.2, hspace=0.1) plt.savefig( - f'./{directory}Bayes_Factor{plot_name}.pdf', bbox_inches='tight' + f'./{self.out_dir}Bayes_Factor{plot_name}.pdf', bbox_inches='tight' ) plt.close() diff --git a/src/bayesvalidrox/bayes_inference/discrepancy.py b/src/bayesvalidrox/bayes_inference/discrepancy.py index 0f52c4f0d0afe314fdc73c388f6da5a8aa93ca06..b3c235ebeb6d6ae9e109ca862cc522cc21efb45e 100644 --- a/src/bayesvalidrox/bayes_inference/discrepancy.py +++ b/src/bayesvalidrox/bayes_inference/discrepancy.py @@ -36,7 +36,7 @@ class Discrepancy: * Option B: With unknown redidual covariance matrix \\(\\Sigma\\), paramethrized as \\(\\Sigma(\\theta_{\\epsilon})=\\sigma^2 \\textbf{I}_ {N_{out}}\\) with unknown residual variances \\(\\sigma^2\\). - This term will be jointly infer with the uncertain input parameters. For + This term will be jointly infered with the uncertain input parameters. For the inversion, you need to define a prior marginal via `Input` class. Note that \\(\\sigma^2\\) is only a single scalar multiplier for the diagonal entries of the covariance matrix \\(\\Sigma\\). @@ -58,10 +58,17 @@ class Discrepancy: """ def __init__(self, InputDisc='', disc_type='Gaussian', parameters=None): + # Set the values self.InputDisc = InputDisc self.disc_type = disc_type self.parameters = parameters - + + # Other inits + self.ExpDesign = None + self.n_samples = None + self.sigma2_prior = None + self.name = None + self.opt_sigma = None # This will be set in the inference class and used in mcmc # ------------------------------------------------------------------------- def get_sample(self, n_samples): """ @@ -79,16 +86,28 @@ class Discrepancy: \\(\\sigma^2\\) samples. """ - self.n_samples = n_samples - ExpDesign = ExpDesigns(self.InputDisc) - self.sigma2_prior = ExpDesign.generate_ED( - n_samples, sampling_method='random', max_pce_deg=1 + self.n_samples = n_samples # TODO: not used again in here - needed from the outside? + + if self.InputDisc == '': + raise AttributeError('Cannot create new samples, please provide input distributions') + + # Create and store BoundTuples + self.ExpDesign = ExpDesigns(self.InputDisc) + self.ExpDesign.sampling_method = 'random' + + # TODO: why does it call 'generate_ED' instead of 'generate_samples? + # ExpDesign.bound_tuples, onp_sigma, prior_space needed from the outside + # Discrepancy opt_sigma, InputDisc needed from the outside + # TODO: opt_sigma not defined here, but called from the outside?? + self.ExpDesign.generate_ED( + n_samples, max_pce_deg=1 ) - # Store BoundTuples - self.ExpDesign = ExpDesign + # TODO: need to recheck the following line + # This used to simply be the return from the call above + self.sigma2_prior = self.ExpDesign.X # Naive approach: Fit a gaussian kernel to the provided data - self.ExpDesign.JDist = stats.gaussian_kde(ExpDesign.raw_data) + self.ExpDesign.JDist = stats.gaussian_kde(self.ExpDesign.raw_data) # Save the names of sigmas if len(self.InputDisc.Marginals) != 0: diff --git a/src/bayesvalidrox/bayes_inference/mcmc.py b/src/bayesvalidrox/bayes_inference/mcmc.py index 6b9ca94823fb7064baa2f0588d0f97fb4c9d1d44..49748bce7c18ee3153954f85524795f9bf3ef519 100755 --- a/src/bayesvalidrox/bayes_inference/mcmc.py +++ b/src/bayesvalidrox/bayes_inference/mcmc.py @@ -9,12 +9,178 @@ import matplotlib.pyplot as plt from matplotlib.backends.backend_pdf import PdfPages import multiprocessing import scipy.stats as st -from scipy.linalg import cholesky as chol -import warnings +from scipy import stats import shutil +import scipy.linalg as spla +from sklearn import preprocessing os.environ["OMP_NUM_THREADS"] = "1" +# ------------------------------------------------------------------------- +def _check_ranges(theta, ranges): # TODO: this is a replica of exp_designs.check_ranges + """ + This function checks if theta lies in the given ranges. + + Parameters + ---------- + theta : array + Proposed parameter set. + ranges : nested list + List of the praremeter ranges. + + Returns + ------- + c : bool + If it lies in the given range, it return True else False. + + """ + c = True + # traverse in the list1 + for i, bounds in enumerate(ranges): + x = theta[i] + # condition check + if x < bounds[0] or x > bounds[1]: + c = False + return c + return c + +# ------------------------------------------------------------------------- +def gelman_rubin(chain, return_var=False): + """ + The potential scale reduction factor (PSRF) defined by the variance + within one chain, W, with the variance between chains B. + Both variances are combined in a weighted sum to obtain an estimate of + the variance of a parameter \\( \\theta \\).The square root of the + ratio of this estimates variance to the within chain variance is called + the potential scale reduction. + For a well converged chain it should approach 1. Values greater than + 1.1 typically indicate that the chains have not yet fully converged. + + Source: http://joergdietrich.github.io/emcee-convergence.html + + https://github.com/jwalton3141/jwalton3141.github.io/blob/master/assets/posts/ESS/rwmh.py + + Parameters + ---------- + chain : array (n_walkers, n_steps, n_params) + The emcee ensamples. + + Returns + ------- + R_hat : float + The Gelman-Robin values. + + """ + chain = np.array(chain) + m_chains, n_iters = chain.shape[:2] + + # Calculate between-chain variance + θb = np.mean(chain, axis=1) + θbb = np.mean(θb, axis=0) + B_over_n = ((θbb - θb)**2).sum(axis=0) + B_over_n /= (m_chains - 1) + + # Calculate within-chain variances + ssq = np.var(chain, axis=1, ddof=1) + W = np.mean(ssq, axis=0) + + # (over) estimate of variance + var_θ = W * (n_iters - 1) / n_iters + B_over_n + + if return_var: + return var_θ + else: + # The square root of the ratio of this estimates variance to the + # within chain variance + R_hat = np.sqrt(var_θ / W) + return R_hat + +# ------------------------------------------------------------------------- +def _kernel_rbf(X, hyperparameters): + """ + Isotropic squared exponential kernel. + + Higher l values lead to smoother functions and therefore to coarser + approximations of the training data. Lower l values make functions + more wiggly with wide uncertainty regions between training data points. + + sigma_f controls the marginal variance of b(x) + + Parameters + ---------- + X : ndarray of shape (n_samples_X, n_features) + + hyperparameters : Dict + Lambda characteristic length + sigma_f controls the marginal variance of b(x) + sigma_0 unresolvable error nugget term, interpreted as random + error that cannot be attributed to measurement error. + Returns + ------- + var_cov_matrix : ndarray of shape (n_samples_X,n_samples_X) + Kernel k(X, X). + + """ + from sklearn.gaussian_process.kernels import RBF + min_max_scaler = preprocessing.MinMaxScaler() + X_minmax = min_max_scaler.fit_transform(X) + + nparams = len(hyperparameters) + if nparams < 3: + raise AttributeError('Provide 3 parameters for the RBF kernel!') + + # characteristic length (0,1] + Lambda = hyperparameters[0] + # sigma_f controls the marginal variance of b(x) + sigma2_f = hyperparameters[1] + + rbf = RBF(length_scale=Lambda) + cov_matrix = sigma2_f * rbf(X_minmax) + + # (unresolvable error) nugget term that is interpreted as random + # error that cannot be attributed to measurement error. + sigma2_0 = hyperparameters[2:] + for i, j in np.ndindex(cov_matrix.shape): + cov_matrix[i, j] += np.sum(sigma2_0) if i == j else 0 + + return cov_matrix + + +# ------------------------------------------------------------------------- +def _logpdf(x, mean, cov): + """ + Computes the likelihood based on a multivariate normal distribution. + + Parameters + ---------- + x : TYPE + DESCRIPTION. + mean : array_like + Observation data. + cov : 2d array + Covariance matrix of the distribution. + + Returns + ------- + log_lik : float + Log likelihood. + + """ + + # Tranform into np arrays + x = np.array(x) + mean = np.array(mean) + cov = np.array(cov) + + n = len(mean) + L = spla.cholesky(cov, lower=True) + beta = np.sum(np.log(np.diag(L))) + dev = x - mean + alpha = dev.dot(spla.cho_solve((L, True), dev)) + log_lik = -0.5 * alpha - beta - n / 2. * np.log(2 * np.pi) + return log_lik + + class MCMC: """ A class for bayesian inference via a Markov-Chain Monte-Carlo (MCMC) @@ -40,66 +206,85 @@ class MCMC: Bayes object. """ - def __init__(self, BayesOpts): - - self.BayesOpts = BayesOpts + def __init__(self, engine, mcmc_params, Discrepancy, bias_inputs, + error_model, req_outputs, selected_indices, emulator, + out_dir, name, BiasInputs = None): + + # TODO: maybe would be worth to make this a child class of BayesInf? + # Inputs + #self.BayesOpts = BayesOpts + self.engine = engine + self.Discrepancy = Discrepancy + + # Get the needed properties from the BayesInf class + self.bias_inputs = bias_inputs + self.error_model = error_model + self.BiasInputs = BiasInputs + self.selected_indices = selected_indices + self.req_outputs = req_outputs + self.emulator = emulator + self.out_dir = out_dir + self.name = name + + # Param inits + self.counter = 0 + self.observation = None + self.total_sigma2 = None + self.error_MetaModel = None + + # Get MCMC parameters from BayesOpts + self.initsamples = mcmc_params['init_samples'] + if isinstance(self.initsamples, pd.DataFrame): + self.initsamples = self.initsamples.values + self.nsteps = int(mcmc_params['n_steps']) + self.nwalkers = int(mcmc_params['n_walkers']) + self.nburn = mcmc_params['n_burn'] + self.moves = mcmc_params['moves'] + self.mp = mcmc_params['multiprocessing'] + self.verbose = mcmc_params['verbose'] def run_sampler(self, observation, total_sigma2): + """ + Run the MCMC sampler for the given observations and stdevs. - BayesObj = self.BayesOpts - MetaModel = BayesObj.MetaModel - Model = MetaModel.ModelObj - Discrepancy = self.BayesOpts.Discrepancy - n_cpus = Model.n_cpus - priorDist = MetaModel.ExpDesign.JDist - ndim = MetaModel.n_params - self.counter = 0 - output_dir = f'Outputs_Bayes_{Model.name}_{self.BayesOpts.name}' - if not os.path.exists(output_dir): - os.makedirs(output_dir) + Parameters + ---------- + observation : TYPE + DESCRIPTION. + total_sigma2 : TYPE + DESCRIPTION. + + Returns + ------- + Posterior_df : TYPE + DESCRIPTION. + """ + # Get init values + engine = self.engine + Discrepancy = self.Discrepancy + n_cpus = engine.Model.n_cpus + ndim = engine.MetaModel.n_params + if not os.path.exists(self.out_dir): + os.makedirs(self.out_dir) + + # Save inputs self.observation = observation self.total_sigma2 = total_sigma2 - # Unpack mcmc parameters given to BayesObj.mcmc_params - self.initsamples = None - self.nwalkers = 100 - self.nburn = 200 - self.nsteps = 100000 - self.moves = None - self.mp = False - self.verbose = False - - # Extract initial samples - if 'init_samples' in BayesObj.mcmc_params: - self.initsamples = BayesObj.mcmc_params['init_samples'] - if isinstance(self.initsamples, pd.DataFrame): - self.initsamples = self.initsamples.values - - # Extract number of steps per walker - if 'n_steps' in BayesObj.mcmc_params: - self.nsteps = int(BayesObj.mcmc_params['n_steps']) - # Extract number of walkers (chains) - if 'n_walkers' in BayesObj.mcmc_params: - self.nwalkers = int(BayesObj.mcmc_params['n_walkers']) - # Extract moves - if 'moves' in BayesObj.mcmc_params: - self.moves = BayesObj.mcmc_params['moves'] - # Extract multiprocessing - if 'multiprocessing' in BayesObj.mcmc_params: - self.mp = BayesObj.mcmc_params['multiprocessing'] - # Extract verbose - if 'verbose' in BayesObj.mcmc_params: - self.verbose = BayesObj.mcmc_params['verbose'] - # Set initial samples np.random.seed(0) if self.initsamples is None: try: + # Version 1 # TODO: recheck this code, it it a mix of old and new + priorDist = self.engine.ExpDesign.JDist initsamples = priorDist.sample(self.nwalkers).T + +# initsamples = engine.ExpDesign.JDist.sample(self.nwalkers).T +# initsamples = np.swapaxes(np.array([initsamples]),0,1) # TODO: test if this still works with multiple input dists except: # when aPCE selected - gaussian kernel distribution - inputSamples = MetaModel.ExpDesign.raw_data.T + inputSamples = engine.ExpDesign.raw_data.T random_indices = np.random.choice( len(inputSamples), size=self.nwalkers, replace=False ) @@ -125,31 +310,27 @@ class MCMC: initsamples[:, idx_dim] = dist.rvs(size=self.nwalkers) # Update lower and upper - MetaModel.ExpDesign.bound_tuples = bound_tuples + engine.ExpDesign.bound_tuples = bound_tuples # Check if sigma^2 needs to be inferred - if Discrepancy.opt_sigma != 'B': + if Discrepancy.opt_sigma != 'B': # TODO: why !='B'? sigma2_samples = Discrepancy.get_sample(self.nwalkers) # Update initsamples initsamples = np.hstack((initsamples, sigma2_samples)) - - # Update ndim ndim = initsamples.shape[1] # Discrepancy bound disc_bound_tuple = Discrepancy.ExpDesign.bound_tuples # Update bound_tuples - MetaModel.ExpDesign.bound_tuples += disc_bound_tuple + engine.ExpDesign.bound_tuples += disc_bound_tuple print("\n>>>> Bayesian inference with MCMC for " - f"{self.BayesOpts.name} started. <<<<<<") + f"{self.name} started. <<<<<<") - # Set up the backend - filename = f"{output_dir}/emcee_sampler.h5" - backend = emcee.backends.HDFBackend(filename) - # Clear the backend in case the file already exists + # Set up the backend and clear it in case the file already exists + backend = emcee.backends.HDFBackend(f"{self.out_dir}/emcee_sampler.h5") backend.reset(self.nwalkers, ndim) # Define emcee sampler @@ -176,8 +357,8 @@ class MCMC: ) # Reset sampler - sampler.reset() pos = pos.coords + sampler.reset() else: pos = initsamples @@ -193,7 +374,8 @@ class MCMC: self.nwalkers, ndim, self.log_posterior, moves=self.moves, backend=backend, vectorize=True ) - + print(f'ndim: {ndim}') + print(f'initsamples.shape: {initsamples.shape}') # Check if a burn-in phase is needed! if self.initsamples is None: # Burn-in @@ -228,8 +410,9 @@ class MCMC: continue # Train model discrepancy/error - if hasattr(BayesObj, 'errorModel') and BayesObj.errorModel \ - and not sampler.iteration % 3 * autocorreverynsteps: + # TODO: add this back in when the error model is actually working + # and this is not dependent on BayesObj + if self.error_model and not sampler.iteration % 3 * autocorreverynsteps: try: self.error_MetaModel = self.train_error_model(sampler) except: @@ -251,14 +434,14 @@ class MCMC: # output current autocorrelation estimate if self.verbose: - print(f"Mean autocorr time estimate: {np.nanmean(tau):.3f}") - list_gr = np.round(self.gelman_rubin(sampler.chain), 3) + print(f"Mean autocorr. time estimate: {np.nanmean(tau):.3f}") + list_gr = np.round(gelman_rubin(sampler.chain), 3) print("Gelman-Rubin Test*: ", list_gr) # check convergence converged = np.all(tau*autocorreverynsteps < sampler.iteration) converged &= np.all(np.abs(tauold - tau) / tau < 0.01) - converged &= np.all(self.gelman_rubin(sampler.chain) < 1.1) + converged &= np.all(gelman_rubin(sampler.chain) < 1.1) if converged: break @@ -277,37 +460,37 @@ class MCMC: thin = int(0.5*np.nanmin(tau)) if int(0.5*np.nanmin(tau)) != 0 else 1 finalsamples = sampler.get_chain(discard=burnin, flat=True, thin=thin) acc_fr = np.nanmean(sampler.acceptance_fraction) - list_gr = np.round(self.gelman_rubin(sampler.chain[:, burnin:]), 3) + list_gr = np.round(gelman_rubin(sampler.chain[:, burnin:]), 3) # Print summary print('\n') print('-'*15 + 'Posterior diagnostics' + '-'*15) - print(f"mean auto-correlation time: {np.nanmean(tau):.3f}") - print(f"thin: {thin}") - print(f"burn-in: {burnin}") - print(f"flat chain shape: {finalsamples.shape}") - print(f"Mean acceptance fraction: {acc_fr:.3f}") - print("Gelman-Rubin Test*: ", list_gr) + print(f"Mean auto-correlation time: {np.nanmean(tau):.3f}") + print(f"Thin: {thin}") + print(f"Burn-in: {burnin}") + print(f"Flat chain shape: {finalsamples.shape}") + print(f"Mean acceptance fraction*: {acc_fr:.3f}") + print("Gelman-Rubin Test**: ", list_gr) print("\n* This value must lay between 0.234 and 0.5.") - print("* These values must be smaller than 1.1.") + print("** These values must be smaller than 1.1.") print('-'*50) - print(f"\n>>>> Bayesian inference with MCMC for {self.BayesOpts.name} " + print(f"\n>>>> Bayesian inference with MCMC for {self.name} " "successfully completed. <<<<<<\n") # Extract parameter names and their prior ranges - par_names = MetaModel.ExpDesign.par_names + par_names = engine.ExpDesign.par_names if Discrepancy.opt_sigma != 'B': for i in range(len(Discrepancy.InputDisc.Marginals)): par_names.append(Discrepancy.InputDisc.Marginals[i].name) - params_range = MetaModel.ExpDesign.bound_tuples + params_range = engine.ExpDesign.bound_tuples # Plot traces if self.verbose and self.nsteps < 10000: - pdf = PdfPages(output_dir+'/traceplots.pdf') + pdf = PdfPages(self.out_dir+'/traceplots.pdf') fig = plt.figure() for parIdx in range(ndim): # Set up the axes with gridspec @@ -334,7 +517,6 @@ class MCMC: # Destroy the current plot plt.clf() - pdf.close() # plot development of autocorrelation estimate @@ -348,33 +530,9 @@ class MCMC: plt.ylim(0, np.nanmax(taus)+0.1*(np.nanmax(taus)-np.nanmin(taus))) plt.xlabel("number of steps") plt.ylabel(r"mean $\hat{\tau}$") - fig1.savefig(f"{output_dir}/autocorrelation_time.pdf", + fig1.savefig(f"{self.out_dir}/autocorrelation_time.pdf", bbox_inches='tight') - # logml_dict = self.marginal_llk_emcee(sampler, self.nburn, logp=None, - # maxiter=5000) - # print('\nThe Bridge Sampling Estimation is " - # f"{logml_dict['logml']:.5f}.') - - # # Posterior-based expectation of posterior probablity - # postExpPostLikelihoods = np.mean(sampler.get_log_prob(flat=True) - # [self.nburn*self.nwalkers:]) - - # # Posterior-based expectation of prior densities - # postExpPrior = np.mean(self.log_prior(emcee_trace.T)) - - # # Posterior-based expectation of likelihoods - # postExpLikelihoods_emcee = postExpPostLikelihoods - postExpPrior - - # # Calculate Kullback-Leibler Divergence - # KLD_emcee = postExpLikelihoods_emcee - logml_dict['logml'] - # print("Kullback-Leibler divergence: %.5f"%KLD_emcee) - - # # Information Entropy based on Entropy paper Eq. 38 - # infEntropy_emcee = logml_dict['logml'] - postExpPrior - - # postExpLikelihoods_emcee - # print("Information Entropy: %.5f" %infEntropy_emcee) - Posterior_df = pd.DataFrame(finalsamples, columns=par_names) return Posterior_df @@ -397,9 +555,9 @@ class MCMC: returned otherwise an array. """ - - MetaModel = self.BayesOpts.MetaModel - Discrepancy = self.BayesOpts.Discrepancy + engine = self.engine + MetaModel = engine.MetaModel + Discrepancy = self.Discrepancy # Find the number of sigma2 parameters if Discrepancy.opt_sigma != 'B': @@ -409,15 +567,15 @@ class MCMC: n_sigma2 = len(disc_bound_tuples) else: n_sigma2 = -len(theta) - prior_dist = MetaModel.ExpDesign.prior_space - params_range = MetaModel.ExpDesign.bound_tuples + prior_dist = engine.ExpDesign.prior_space + params_range = engine.ExpDesign.bound_tuples theta = theta if theta.ndim != 1 else theta.reshape((1, -1)) nsamples = theta.shape[0] logprior = -np.inf*np.ones(nsamples) for i in range(nsamples): # Check if the sample is within the parameters' range - if self._check_ranges(theta[i], params_range): + if _check_ranges(theta[i], params_range): # Check if all dists are uniform, if yes priors are equal. if all(MetaModel.input_obj.Marginals[i].dist_type == 'uniform' for i in range(MetaModel.n_params)): @@ -429,7 +587,7 @@ class MCMC: # Check if bias term needs to be inferred if Discrepancy.opt_sigma != 'B': - if self._check_ranges(theta[i, -n_sigma2:], + if _check_ranges(theta[i, -n_sigma2:], disc_bound_tuples): if all('unif' in disc_marginals[i].dist_type for i in range(Discrepancy.ExpDesign.ndim)): @@ -461,37 +619,35 @@ class MCMC: Log likelihood. """ - - BayesOpts = self.BayesOpts - MetaModel = BayesOpts.MetaModel - Discrepancy = self.BayesOpts.Discrepancy + MetaModel = self.engine.MetaModel + Discrepancy = self.Discrepancy # Find the number of sigma2 parameters if Discrepancy.opt_sigma != 'B': disc_bound_tuples = Discrepancy.ExpDesign.bound_tuples n_sigma2 = len(disc_bound_tuples) - else: - n_sigma2 = -len(theta) - # Check if bias term needs to be inferred - if Discrepancy.opt_sigma != 'B': + # Check if bias term should be inferred sigma2 = theta[:, -n_sigma2:] theta = theta[:, :-n_sigma2] else: + n_sigma2 = -len(theta) sigma2 = None + theta = theta if theta.ndim != 1 else theta.reshape((1, -1)) # Evaluate Model/MetaModel at theta - mean_pred, BayesOpts._std_pce_prior_pred = self.eval_model(theta) + mean_pred, _std_pce_prior_pred = self.eval_model(theta) # Surrogate model's error using RMSE of test data surrError = MetaModel.rmse if hasattr(MetaModel, 'rmse') else None # Likelihood - log_like = BayesOpts.normpdf( + log_like = self.normpdf( mean_pred, self.observation, self.total_sigma2, sigma2, std=surrError ) - return log_like + # TODO: give the second return argument back to BayesInf (parameter of the same name) + return log_like, _std_pce_prior_pred # ------------------------------------------------------------------------- def log_posterior(self, theta): @@ -520,7 +676,7 @@ class MCMC: # Compute log prior log_prior = self.log_prior(theta) # Compute log Likelihood - log_likelihood = self.log_likelihood(theta) + log_likelihood, _std_pce_prior_pred = self.log_likelihood(theta) return log_prior + log_likelihood else: @@ -535,7 +691,7 @@ class MCMC: # Compute loLikelihoods if non_inf_idx.size != 0: - log_likelihood[non_inf_idx] = self.log_likelihood( + log_likelihood[non_inf_idx], _std_pce_prior_pred = self.log_likelihood( theta[non_inf_idx] ) @@ -559,14 +715,12 @@ class MCMC: Std of model prediction. """ + engine = self.engine + Model = engine.Model - BayesObj = self.BayesOpts - MetaModel = BayesObj.MetaModel - Model = MetaModel.ModelObj - - if BayesObj.emulator: + if self.emulator: # Evaluate the MetaModel - mean_pred, std_pred = MetaModel.eval_metamodel(samples=theta) + mean_pred, std_pred = engine.MetaModel.eval_metamodel(samples=theta) else: # Evaluate the origModel mean_pred, std_pred = dict(), dict() @@ -587,9 +741,9 @@ class MCMC: # Add one to the counter self.counter += 1 - if hasattr(self, 'error_MetaModel') and BayesObj.error_model: + if self.error_MetaModel is not None and self.error_model: meanPred, stdPred = self.error_MetaModel.eval_model_error( - BayesObj.BiasInputs, mean_pred + self.BiasInputs, mean_pred ) return mean_pred, std_pred @@ -610,8 +764,7 @@ class MCMC: A error model. """ - BayesObj = self.BayesOpts - MetaModel = BayesObj.MetaModel + MetaModel = self.engine.MetaModel # Prepare the poster samples try: @@ -636,274 +789,126 @@ class MCMC: # Train a GPR meta-model using MAP error_MetaModel = MetaModel.create_model_error( - BayesObj.BiasInputs, y_map, name='Calib') + self.BiasInputs, y_map, name='Calib') return error_MetaModel - + # ------------------------------------------------------------------------- - def gelman_rubin(self, chain, return_var=False): + def normpdf(self, outputs, obs_data, total_sigma2s, sigma2=None, std=None): """ - The potential scale reduction factor (PSRF) defined by the variance - within one chain, W, with the variance between chains B. - Both variances are combined in a weighted sum to obtain an estimate of - the variance of a parameter \\( \\theta \\).The square root of the - ratio of this estimates variance to the within chain variance is called - the potential scale reduction. - For a well converged chain it should approach 1. Values greater than - 1.1 typically indicate that the chains have not yet fully converged. - - Source: http://joergdietrich.github.io/emcee-convergence.html - - https://github.com/jwalton3141/jwalton3141.github.io/blob/master/assets/posts/ESS/rwmh.py + Calculates the likelihood of simulation outputs compared with + observation data. Parameters ---------- - chain : array (n_walkers, n_steps, n_params) - The emcee ensamples. + outputs : dict + A dictionary containing the simulation outputs as array of shape + (n_samples, n_measurement) for each model output. + obs_data : dict + A dictionary/dataframe containing the observation data. + total_sigma2s : dict + A dictionary with known values of the covariance diagonal entries, + a.k.a. sigma^2. + sigma2 : array, optional + An array of the sigma^2 samples, when the covariance diagonal + entries are unknown and are being jointly inferred. The default is + None. + std : dict, optional + A dictionary containing the root mean squared error as array of + shape (n_samples, n_measurement) for each model output. The default + is None. Returns ------- - R_hat : float - The Gelman-Robin values. + logLik : array of shape (n_samples) + Likelihoods. """ - m_chains, n_iters = chain.shape[:2] + Model = self.engine.Model + logLik = 0.0 - # Calculate between-chain variance - θb = np.mean(chain, axis=1) - θbb = np.mean(θb, axis=0) - B_over_n = ((θbb - θb)**2).sum(axis=0) - B_over_n /= (m_chains - 1) - - # Calculate within-chain variances - ssq = np.var(chain, axis=1, ddof=1) - W = np.mean(ssq, axis=0) - - # (over) estimate of variance - var_θ = W * (n_iters - 1) / n_iters + B_over_n - - if return_var: - return var_θ + # Extract the requested model outputs for likelihood calulation + if self.req_outputs is None: + req_outputs = Model.Output.names # TODO: should this then be saved as self.req_outputs? else: - # The square root of the ratio of this estimates variance to the - # within chain variance - R_hat = np.sqrt(var_θ / W) - return R_hat + req_outputs = list(self.req_outputs) - # ------------------------------------------------------------------------- - def marginal_llk_emcee(self, sampler, nburn=None, logp=None, maxiter=1000): - """ - The Bridge Sampling Estimator of the Marginal Likelihood based on - https://gist.github.com/junpenglao/4d2669d69ddfe1d788318264cdcf0583 - - Parameters - ---------- - sampler : TYPE - MultiTrace, result of MCMC run. - nburn : int, optional - Number of burn-in step. The default is None. - logp : TYPE, optional - Model Log-probability function. The default is None. - maxiter : int, optional - Maximum number of iterations. The default is 1000. + # Loop over the output keys + for idx, out in enumerate(req_outputs): - Returns - ------- - marg_llk : dict - Estimated Marginal log-Likelihood. - - """ - r0, tol1, tol2 = 0.5, 1e-10, 1e-4 + # (Meta)Model Output + nsamples, nout = outputs[out].shape - if logp is None: - logp = sampler.log_prob_fn - - # Split the samples into two parts - # Use the first 50% for fiting the proposal distribution - # and the second 50% in the iterative scheme. - if nburn is None: - mtrace = sampler.chain - else: - mtrace = sampler.chain[:, nburn:, :] - - nchain, len_trace, nrofVars = mtrace.shape - - N1_ = len_trace // 2 - N1 = N1_*nchain - N2 = len_trace*nchain - N1 - - samples_4_fit = np.zeros((nrofVars, N1)) - samples_4_iter = np.zeros((nrofVars, N2)) - effective_n = np.zeros((nrofVars)) + # Prepare data and remove NaN + try: + data = obs_data[out].values[~np.isnan(obs_data[out])] + except AttributeError: + data = obs_data[out][~np.isnan(obs_data[out])] - # matrix with already transformed samples - for var in range(nrofVars): + # Prepare data uncertainty / error estimation (sigma2s) + non_nan_indices = ~np.isnan(total_sigma2s[out]) + tot_sigma2s = total_sigma2s[out][non_nan_indices][:nout] - # for fitting the proposal - x = mtrace[:, :N1_, var] + # Add the std of the PCE if an emulator is used + if self.emulator: + if std is not None: + tot_sigma2s += std[out] ** 2 - samples_4_fit[var, :] = x.flatten() - # for the iterative scheme - x2 = mtrace[:, N1_:, var] - samples_4_iter[var, :] = x2.flatten() + # Select the data points to compare + try: + indices = self.selected_indices[out] + except: + indices = list(range(nout)) - # effective sample size of samples_4_iter, scalar - effective_n[var] = self._my_ESS(x2) + # Set up Covariance Matrix + covMatrix = np.diag(np.diag(tot_sigma2s)[indices, indices]) - # median effective sample size (scalar) - neff = np.median(effective_n) + # If sigma2 is not given, use given total_sigma2s and move to next itr + if sigma2 is None: + logLik += stats.multivariate_normal.logpdf( + outputs[out][:, indices], data[indices], covMatrix) + continue - # get mean & covariance matrix and generate samples from proposal - m = np.mean(samples_4_fit, axis=1) - V = np.cov(samples_4_fit) - L = chol(V, lower=True) + # Loop over each run/sample and calculate logLikelihood + logliks = np.zeros(nsamples) + for s_idx in range(nsamples): - # Draw N2 samples from the proposal distribution - gen_samples = m[:, None] + np.dot( - L, st.norm.rvs(0, 1, size=samples_4_iter.shape) - ) + # Simulation run + tot_outputs = outputs[out] - # Evaluate proposal distribution for posterior & generated samples - q12 = st.multivariate_normal.logpdf(samples_4_iter.T, m, V) - q22 = st.multivariate_normal.logpdf(gen_samples.T, m, V) + # Covariance Matrix + covMatrix = np.diag(tot_sigma2s) - # Evaluate unnormalized posterior for posterior & generated samples - q11 = logp(samples_4_iter.T) - q21 = logp(gen_samples.T) + # Check the type error term + if self.bias_inputs is not None and self.error_model is None: + # Infer a Bias model usig Gaussian Process Regression + bias_inputs = np.hstack( + (self.bias_inputs[out], + tot_outputs[s_idx].reshape(-1, 1))) - # Run iterative scheme: - tmp = self._iterative_scheme( - N1, N2, q11, q12, q21, q22, r0, neff, tol1, maxiter, 'r' - ) - if ~np.isfinite(tmp['logml']): - warnings.warn( - "logml could not be estimated within maxiter, rerunning with " - "adjusted starting value. Estimate might be more variable than" - " usual.") - # use geometric mean as starting value - r0_2 = np.sqrt(tmp['r_vals'][-2]*tmp['r_vals'][-1]) - tmp = self._iterative_scheme( - q11, q12, q21, q22, r0_2, neff, tol2, maxiter, 'logml' + params = sigma2[s_idx, idx * 3:(idx + 1) * 3] + covMatrix = _kernel_rbf(bias_inputs, params) + else: + # Infer equal sigma2s + try: + sigma_2 = sigma2[s_idx, idx] + except TypeError: + sigma_2 = 0.0 + + covMatrix += sigma_2 * np.eye(nout) + # covMatrix = np.diag(sigma2 * total_sigma2s) + + # Select the data points to compare + try: + indices = self.selected_indices[out] + except: + indices = list(range(nout)) + covMatrix = np.diag(covMatrix[indices, indices]) + + # Compute loglikelihood + logliks[s_idx] = _logpdf( + tot_outputs[s_idx, indices], data[indices], covMatrix ) + logLik += logliks + return logLik - marg_llk = dict( - logml=tmp['logml'], niter=tmp['niter'], method="normal", - q11=q11, q12=q12, q21=q21, q22=q22 - ) - return marg_llk - - # ------------------------------------------------------------------------- - def _iterative_scheme(self, N1, N2, q11, q12, q21, q22, r0, neff, tol, - maxiter, criterion): - """ - Iterative scheme as proposed in Meng and Wong (1996) to estimate the - marginal likelihood - - """ - l1 = q11 - q12 - l2 = q21 - q22 - # To increase numerical stability, - # subtracting the median of l1 from l1 & l2 later - lstar = np.median(l1) - s1 = neff/(neff + N2) - s2 = N2/(neff + N2) - r = r0 - r_vals = [r] - logml = np.log(r) + lstar - criterion_val = 1 + tol - - i = 0 - while (i <= maxiter) & (criterion_val > tol): - rold = r - logmlold = logml - numi = np.exp(l2 - lstar)/(s1 * np.exp(l2 - lstar) + s2 * r) - deni = 1/(s1 * np.exp(l1 - lstar) + s2 * r) - if np.sum(~np.isfinite(numi))+np.sum(~np.isfinite(deni)) > 0: - warnings.warn( - """Infinite value in iterative scheme, returning NaN. - Try rerunning with more samples.""") - r = (N1/N2) * np.sum(numi)/np.sum(deni) - r_vals.append(r) - logml = np.log(r) + lstar - i += 1 - if criterion == 'r': - criterion_val = np.abs((r - rold)/r) - elif criterion == 'logml': - criterion_val = np.abs((logml - logmlold)/logml) - - if i >= maxiter: - return dict(logml=np.NaN, niter=i, r_vals=np.asarray(r_vals)) - else: - return dict(logml=logml, niter=i) - - # ------------------------------------------------------------------------- - def _my_ESS(self, x): - """ - Compute the effective sample size of estimand of interest. - Vectorised implementation. - https://github.com/jwalton3141/jwalton3141.github.io/blob/master/assets/posts/ESS/rwmh.py - - - Parameters - ---------- - x : array of shape (n_walkers, n_steps) - MCMC Samples. - - Returns - ------- - int - Effective sample size. - - """ - m_chains, n_iters = x.shape - - def variogram(t): - variogram = ((x[:, t:] - x[:, :(n_iters - t)])**2).sum() - variogram /= (m_chains * (n_iters - t)) - return variogram - - post_var = self.gelman_rubin(x, return_var=True) - - t = 1 - rho = np.ones(n_iters) - negative_autocorr = False - - # Iterate until the sum of consecutive estimates of autocorrelation is - # negative - while not negative_autocorr and (t < n_iters): - rho[t] = 1 - variogram(t) / (2 * post_var) - - if not t % 2: - negative_autocorr = sum(rho[t-1:t+1]) < 0 - - t += 1 - - return int(m_chains*n_iters / (1 + 2*rho[1:t].sum())) - - # ------------------------------------------------------------------------- - def _check_ranges(self, theta, ranges): - """ - This function checks if theta lies in the given ranges. - - Parameters - ---------- - theta : array - Proposed parameter set. - ranges : nested list - List of the praremeter ranges. - - Returns - ------- - c : bool - If it lies in the given range, it return True else False. - - """ - c = True - # traverse in the list1 - for i, bounds in enumerate(ranges): - x = theta[i] - # condition check - if x < bounds[0] or x > bounds[1]: - c = False - return c - return c diff --git a/src/bayesvalidrox/post_processing/post_processing.py b/src/bayesvalidrox/post_processing/post_processing.py index 4db354bbd541affdc50a8dce37eb293188091f73..6520a40f9f2393798f6b8abac026b9ed38fe33ca 100644 --- a/src/bayesvalidrox/post_processing/post_processing.py +++ b/src/bayesvalidrox/post_processing/post_processing.py @@ -32,8 +32,11 @@ class PostProcessing: expected to be performed change this to `'valid'`. """ - def __init__(self, MetaModel, name='calib'): - self.MetaModel = MetaModel + def __init__(self, engine, name='calib'): + self.engine = engine + self.MetaModel = engine.MetaModel + self.ExpDesign = engine.ExpDesign + self.ModelObj = engine.Model self.name = name # ------------------------------------------------------------------------- @@ -60,13 +63,13 @@ class PostProcessing: bar_plot = True if plot_type == 'bar' else False meta_model_type = self.MetaModel.meta_model_type - Model = self.MetaModel.ModelObj + Model = self.ModelObj # Read Monte-Carlo reference - self.mc_reference = Model.read_mc_reference() + self.mc_reference = Model.read_observation('mc_ref') # Set the x values - x_values_orig = self.MetaModel.ExpDesign.x_values + x_values_orig = self.engine.ExpDesign.x_values # Compute the moments with the PCEModel object self.pce_means, self.pce_stds = self.compute_pce_moments() @@ -170,7 +173,7 @@ class PostProcessing: """ MetaModel = self.MetaModel - Model = MetaModel.ModelObj + Model = self.ModelObj if samples is None: self.n_samples = n_samples @@ -179,7 +182,7 @@ class PostProcessing: self.n_samples = samples.shape[0] # Extract x_values - x_values = MetaModel.ExpDesign.x_values + x_values = self.engine.ExpDesign.x_values if model_out_dict is not None: self.model_out_dict = model_out_dict @@ -229,7 +232,7 @@ class PostProcessing: """ MetaModel = self.MetaModel - Model = MetaModel.ModelObj + Model = self.ModelObj # Set the number of samples if n_samples: @@ -237,8 +240,8 @@ class PostProcessing: elif samples is not None: self.n_samples = samples.shape[0] else: - raise Exception("Please provide either samples or pass number of " - "samples!") + raise Exception("Please provide either samples or pass the number" + " of samples!") # Generate random samples if necessary Samples = self._get_sample() if samples is None else samples @@ -291,9 +294,10 @@ class PostProcessing: None. """ + engine = self.engine PCEModel = self.MetaModel - n_init_samples = PCEModel.ExpDesign.n_init_samples - n_total_samples = PCEModel.ExpDesign.X.shape[0] + n_init_samples = engine.ExpDesign.n_init_samples + n_total_samples = engine.ExpDesign.X.shape[0] newpath = f'Outputs_PostProcessing_{self.name}/seq_design_diagnostics/' if not os.path.exists(newpath): @@ -301,9 +305,9 @@ class PostProcessing: plotList = ['Modified LOO error', 'Validation error', 'KLD', 'BME', 'RMSEMean', 'RMSEStd', 'Hellinger distance'] - seqList = [PCEModel.SeqModifiedLOO, PCEModel.seqValidError, - PCEModel.SeqKLD, PCEModel.SeqBME, PCEModel.seqRMSEMean, - PCEModel.seqRMSEStd, PCEModel.SeqDistHellinger] + seqList = [engine.SeqModifiedLOO, engine.seqValidError, + engine.SeqKLD, engine.SeqBME, engine.seqRMSEMean, + engine.seqRMSEStd, engine.SeqDistHellinger] markers = ('x', 'o', 'd', '*', '+') colors = ('k', 'darkgreen', 'b', 'navy', 'darkred') @@ -323,14 +327,14 @@ class PostProcessing: # Extract the values from dict sorted_seq_opt = {} # Number of replications - n_reps = PCEModel.ExpDesign.n_replication + n_reps = engine.ExpDesign.n_replication # Get the list of utility function names # Handle if only one UtilityFunction is provided - if not isinstance(PCEModel.ExpDesign.util_func, list): - util_funcs = [PCEModel.ExpDesign.util_func] + if not isinstance(engine.ExpDesign.util_func, list): + util_funcs = [engine.ExpDesign.util_func] else: - util_funcs = PCEModel.ExpDesign.util_func + util_funcs = engine.ExpDesign.util_func for util in util_funcs: sortedSeq = {} @@ -359,8 +363,8 @@ class PostProcessing: for patch in bp['boxes']: patch.set(facecolor=fill_color[idx]) - if PCEModel.ExpDesign.n_new_samples != 1: - step1 = PCEModel.ExpDesign.n_new_samples + if engine.ExpDesign.n_new_samples != 1: + step1 = engine.ExpDesign.n_new_samples step2 = 1 else: step1 = 5 @@ -440,8 +444,8 @@ class PostProcessing: else: for idx, name in enumerate(name_util): seq_values = seq_dict[name] - if PCEModel.ExpDesign.n_new_samples != 1: - step = PCEModel.ExpDesign.n_new_samples + if engine.ExpDesign.n_new_samples != 1: + step = engine.ExpDesign.n_new_samples else: step = 1 x_idx = np.arange(n_init_samples, n_total_samples+1, step) @@ -570,7 +574,7 @@ class PostProcessing: sobol_cell_, total_sobol_ = {}, {} - for output in PCEModel.ModelObj.Output.names: + for output in self.ModelObj.Output.names: n_meas_points = len(coeffs_dict[f'b_{b_i+1}'][output]) @@ -671,7 +675,7 @@ class PostProcessing: # Compute the sobol indices according to Ref. 2 if PCEModel.dim_red_method.lower() == 'pca': - n_c_points = PCEModel.ExpDesign.Y[output].shape[1] + n_c_points = self.engine.ExpDesign.Y[output].shape[1] PCA = PCEModel.pca[f'b_{b_i+1}'][output] compPCA = PCA.components_ nComp = compPCA.shape[0] @@ -689,7 +693,7 @@ class PostProcessing: for tIdx in range(n_c_points): var_Y_t = np.var( - PCEModel.ExpDesign.Y[output][:, tIdx]) + self.engine.ExpDesign.Y[output][:, tIdx]) if var_Y_t == 0.0: term1, term2 = 0.0, 0.0 else: @@ -718,7 +722,7 @@ class PostProcessing: S_Z_i = total_sobol_array[ParIdx] for tIdx in range(n_c_points): - var_Y_t = np.var(PCEModel.ExpDesign.Y[output][:, tIdx]) + var_Y_t = np.var(self.engine.ExpDesign.Y[output][:, tIdx]) if var_Y_t == 0.0: term1, term2 = 0.0, 0.0 else: @@ -758,12 +762,12 @@ class PostProcessing: total_sobol_all[k][i] = v self.total_sobol = {} - for output in PCEModel.ModelObj.Output.names: + for output in self.ModelObj.Output.names: self.total_sobol[output] = np.mean(total_sobol_all[output], axis=0) # ---------------- Plot ----------------------- - par_names = PCEModel.ExpDesign.par_names - x_values_orig = PCEModel.ExpDesign.x_values + par_names = self.engine.ExpDesign.par_names + x_values_orig = self.engine.ExpDesign.x_values newpath = (f'Outputs_PostProcessing_{self.name}/') if not os.path.exists(newpath): @@ -771,7 +775,7 @@ class PostProcessing: fig = plt.figure() - for outIdx, output in enumerate(PCEModel.ModelObj.Output.names): + for outIdx, output in enumerate(self.ModelObj.Output.names): # Extract total Sobol indices total_sobol = self.total_sobol[output] @@ -873,7 +877,7 @@ class PostProcessing: # ------ Residuals vs. predicting variables ------ # Check the assumptions of linearity and independence fig1 = plt.figure() - for i, par in enumerate(MetaModel.ExpDesign.par_names): + for i, par in enumerate(self.engine.ExpDesign.par_names): plt.title(f"{key}: Residuals vs. {par}") plt.scatter( x=samples[:, i], y=residuals, color='blue', edgecolor='k') @@ -922,7 +926,7 @@ class PostProcessing: ax = plt.gca() _, p = stats.shapiro(residuals) if p < 0.01: - annText = "The residuals seem to come from Gaussian process." + annText = "The residuals seem to come from a Gaussian Process." else: annText = "The normality assumption may not hold." at = AnchoredText(annText, prop=dict(size=30), frameon=True, @@ -961,7 +965,7 @@ class PostProcessing: self.n_samples = 1000 PCEModel = self.MetaModel - Model = self.MetaModel.ModelObj + Model = self.ModelObj n_samples = self.n_samples # Create 3D-Grid @@ -1063,7 +1067,7 @@ class PostProcessing: """ MetaModel = self.MetaModel - outputs = MetaModel.ModelObj.Output.names + outputs = self.ModelObj.Output.names pce_means_b = {} pce_stds_b = {} @@ -1149,8 +1153,7 @@ class PostProcessing: """ if n_samples is None: n_samples = self.n_samples - MetaModel = self.MetaModel - self.samples = MetaModel.ExpDesign.generate_samples( + self.samples = self.ExpDesign.generate_samples( n_samples, sampling_method='random') return self.samples @@ -1174,7 +1177,7 @@ class PostProcessing: Dictionary of results. """ - Model = self.MetaModel.ModelObj + Model = self.ModelObj if samples is None: samples = self._get_sample() @@ -1274,7 +1277,7 @@ class PostProcessing: None. """ - Model = self.MetaModel.ModelObj + Model = self.ModelObj newpath = f'Outputs_PostProcessing_{self.name}/' if not os.path.exists(newpath): diff --git a/src/bayesvalidrox/pylink/pylink.py b/src/bayesvalidrox/pylink/pylink.py index 7af4a14b8f8acb62c21862d5df4a527dc7fe57b9..637f42317e6f97815e51ce0b331b61c03f26a85b 100644 --- a/src/bayesvalidrox/pylink/pylink.py +++ b/src/bayesvalidrox/pylink/pylink.py @@ -1,5 +1,9 @@ #!/usr/bin/env python3 # -*- coding: utf-8 -*- +""" +Calls to the model and evaluations +""" + from dataclasses import dataclass import os @@ -13,6 +17,45 @@ import multiprocessing from functools import partial import tqdm +#from multiprocessing import get_context +from multiprocess import get_context + + + +def within_range(out, minout, maxout): + """ + Checks if all the values in out lie between minout and maxout + + Parameters + ---------- + out : array or list + Data to check against range + minout : int + Lower bound of the range + maxout : int + Upper bound of the range + + Returns + ------- + inside : bool + True if all values in out are in the specified range + + """ + try: + out = np.array(out) + except: + raise AttributeError('The given values should be a 1D array, but are not') + if out.ndim != 1: + raise AttributeError('The given values should be a 1D array, but are not') + + if minout > maxout: + raise ValueError('The lower and upper bounds do not form a valid range, they might be switched') + + inside = False + if (out > minout).all() and (out < maxout).all(): + inside = True + return inside + class PyLinkForwardModel(object): """ @@ -25,7 +68,7 @@ class PyLinkForwardModel(object): ---------- link_type : str The type of the wrapper. The default is `'pylink'`. This runs the - third-party software or an executable using a sell command with given + third-party software or an executable using a shell command with given input files. Second option is `'function'` which assumed that model can be run using a function written separately in a Python script. @@ -141,18 +184,17 @@ class PyLinkForwardModel(object): self.observations_valid = obs_dict_valid self.mc_reference = mc_ref_dict - # ------------------------------------------------------------------------- - def within_range(self, out, minout, maxout): - inside = False - if (out > minout).all() and (out < maxout).all(): - inside = True - return inside - # ------------------------------------------------------------------------- def read_observation(self, case='calib'): """ Reads/prepare the observation/measurement data for calibration. + + Parameters + ---------- + case : str + The type of observation to read in. Can be either 'calib', + 'valid' or 'mc_ref' Returns ------- @@ -160,68 +202,55 @@ class PyLinkForwardModel(object): A dataframe with the calibration data. """ + # TOOD: check that what is read in/transformed matches the expected form of data/reference if case.lower() == 'calib': if isinstance(self.observations, dict) and bool(self.observations): - obs = pd.DataFrame.from_dict(self.observations) + self.observations = pd.DataFrame.from_dict(self.observations) elif self.meas_file is not None: file_path = os.path.join(os.getcwd(), self.meas_file) - obs = pd.read_csv(file_path, delimiter=',') + self.observations = pd.read_csv(file_path, delimiter=',') elif isinstance(self.observations, pd.DataFrame): - obs = self.observations + self.observations = self.observations else: raise Exception("Please provide the observation data as a " "dictionary via observations attribute or pass" " the csv-file path to MeasurementFile " "attribute") + # Compute the number of observation + self.n_obs = self.observations[self.Output.names].notnull().sum().values.sum() + return self.observations + elif case.lower() == 'valid': if isinstance(self.observations_valid, dict) and \ bool(self.observations_valid): - obs = pd.DataFrame.from_dict(self.observations_valid) + self.observations_valid = pd.DataFrame.from_dict(self.observations_valid) elif self.meas_file_valid is not None: file_path = os.path.join(os.getcwd(), self.meas_file_valid) - obs = pd.read_csv(file_path, delimiter=',') + self.observations_valid = pd.read_csv(file_path, delimiter=',') elif isinstance(self.observations_valid, pd.DataFrame): - obs = self.observations_valid + self.observations_valid = self.observations_valid else: raise Exception("Please provide the observation data as a " - "dictionary via Observations attribute or pass" + "dictionary via observations_valid attribute or pass" " the csv-file path to MeasurementFile " "attribute") - - # Compute the number of observation - n_obs = obs[self.Output.names].notnull().sum().values.sum() - - if case.lower() == 'calib': - self.observations = obs - self.n_obs = n_obs - return self.observations - elif case.lower() == 'valid': - self.observations_valid = obs - self.n_obs_valid = n_obs + # Compute the number of observation + self.n_obs_valid = self.observations_valid[self.Output.names].notnull().sum().values.sum() return self.observations_valid - - # ------------------------------------------------------------------------- - def read_mc_reference(self): - """ - Is used, if a Monte-Carlo reference is available for - further in-depth post-processing after meta-model training. - - Returns - ------- - None - - """ - if self.mc_ref_file is None and \ - isinstance(self.mc_reference, pd.DataFrame): + + elif case.lower() == 'mc_ref': + if self.mc_ref_file is None and \ + isinstance(self.mc_reference, pd.DataFrame): + return self.mc_reference + elif isinstance(self.mc_reference, dict) and bool(self.mc_reference): + self.mc_reference = pd.DataFrame.from_dict(self.mc_reference) + elif self.mc_ref_file is not None: + file_path = os.path.join(os.getcwd(), self.mc_ref_file) + self.mc_reference = pd.read_csv(file_path, delimiter=',') + else: + self.mc_reference = None return self.mc_reference - elif isinstance(self.mc_reference, dict) and bool(self.mc_reference): - self.mc_reference = pd.DataFrame.from_dict(self.mc_reference) - elif self.mc_ref_file is not None: - file_path = os.path.join(os.getcwd(), self.mc_ref_file) - self.mc_reference = pd.read_csv(file_path, delimiter=',') - else: - self.mc_reference = None - return self.mc_reference + # ------------------------------------------------------------------------- def read_output(self): @@ -316,9 +345,8 @@ class PyLinkForwardModel(object): Process = os.system(f'./../{command}') if Process != 0: print('\nMessage 1:') - print(f'\tIf value of \'{Process}\' is a non-zero value, ' - 'then compilation problems \n' % Process) - + print(f'\tIf the value of \'{Process}\' is a non-zero value' + ', then compilation problems occur \n' % Process) os.chdir("..") # Read the output @@ -368,6 +396,7 @@ class PyLinkForwardModel(object): os.makedirs(newpath) # Copy the necessary files to the directories + print(self.input_template) for in_temp in self.input_template: # Input file(s) of the model shutil.copy2(in_temp, newpath) @@ -399,6 +428,7 @@ class PyLinkForwardModel(object): self.exe_path = os.getcwd() # Run the model + print(new_command) output = self.run_command(new_command, self.Output.file_names) return output @@ -438,6 +468,16 @@ class PyLinkForwardModel(object): # Initilization n_c_points = len(c_points) all_outputs = {} + + # If the link type is UM-Bridge, then no parallel needs to be started from here + if self.link_type.lower() == 'umbridge': + import umbridge + if not hasattr(self, 'x_values'): + raise AttributeError('For model type `umbridge` the attribute `x_values` needs to be set for the model!') + # Init model + #model = umbridge.HTTPModel('http://localhost:4242', 'forward') + self.model = umbridge.HTTPModel(self.host, 'forward') # TODO: is this always forward? + Function = self.uMBridge_model # Extract the function if self.link_type.lower() == 'function': @@ -454,17 +494,45 @@ class PyLinkForwardModel(object): # Run forward model if n_c_points == 1 or not mp: - if self.link_type.lower() == 'function': - group_results = Function(c_points, **self.func_args) + if n_c_points== 1: + if self.link_type.lower() == 'function' or self.link_type.lower() == 'umbridge': + group_results = Function(c_points, **self.func_args) + else: + group_results = self.run_forwardmodel( + (c_points[0], prevRun_No, key_str) + ) else: - group_results = self.run_forwardmodel( - (c_points[0], prevRun_No, key_str) - ) + for i in range(c_points.shape[0]): + if i == 0: + if self.link_type.lower() == 'function' or self.link_type.lower() == 'umbridge': + group_results = Function(np.array([c_points[0]]), **self.func_args) + else: + group_results = self.run_forwardmodel( + (c_points[0], prevRun_No, key_str) + ) + for key in group_results: + if key != 'x_values': + group_results[key] = [group_results[key]] + else: + if self.link_type.lower() == 'function' or self.link_type.lower() == 'umbridge': + res = Function(np.array([c_points[i]]), **self.func_args) + else: + res = self.run_forwardmodel( + (c_points[i], prevRun_No, key_str) + ) + for key in res: + if key != 'x_values': + group_results[key].append(res[key]) + + for key in group_results: + if key != 'x_values': + group_results[key]= np.array(group_results[key]) elif self.multi_process or mp: - with multiprocessing.Pool(n_cpus) as p: - - if self.link_type.lower() == 'function': + with get_context('spawn').Pool(n_cpus) as p: + #with multiprocessing.Pool(n_cpus) as p: + + if self.link_type.lower() == 'function' or self.link_type.lower() == 'umbridge': imap_var = p.imap(partial(Function, **self.func_args), c_points[:, np.newaxis]) else: @@ -499,7 +567,7 @@ class PyLinkForwardModel(object): if len(NaN_idx) != 0: print('\n') print('*'*20) - print("\nThe following parametersets have been removed:\n", + print("\nThe following parameter sets have been removed:\n", c_points[NaN_idx]) print("\n") print('*'*20) @@ -516,10 +584,85 @@ class PyLinkForwardModel(object): ) return all_outputs, new_c_points + + def uMBridge_model(self, params): + """ + Function that calls a UMBridge model and transforms its output into the + shape expected for the surrogate. + + Parameters + ---------- + params : 2d np.array, shape (#samples, #params) + The parameter values for which the model is run. + + Returns + ------- + dict + The transformed model outputs. + + """ + # Run the model + #out = np.array(model(np.ndarray.tolist(params), {'level':0})) + out = np.array(self.model(np.ndarray.tolist(params), self.modelparams)) + + # Sort into dict + out_dict = {} + cnt = 0 + for key in self.Output.names: + # # If needed resort into single-value outputs + # if self.output_type == 'single-valued': + # if out.shape[1]>1: # TODO: this doesn't fully seem correct?? + # for i in range(out[:,key]): # TODO: this doesn't fully seem correct?? + # new_key = key+str(i) + # if new_key not in self.Output.names: + # self.Output.names.append(new_key) + # if i == 0: + # self.Ouptut.names.remove(key) + # out_dict[new_key] = out[:,cnt,i] # TODO: not sure about this, need to test + # else: + # out_dict[key] = out[:,cnt] + # + # + # else: + out_dict[key] = out[:,cnt] + cnt += 1 + + + ## TODO: how to deal with the x-values? + #if self.output_type == 'single-valued': + # out_dict['x_values'] = [0] + #else: + # out_dict['x_values'] = np.arange(0,out[:,0].shape[0],1) + out_dict['x_values'] = self.x_values + + #return {'T1':out[:,0], 'T2':out[:,1], 'H1':out[:,2], 'H2':out[:,3], + # 'x_values':[0]} + return out_dict # ------------------------------------------------------------------------- def _store_simulations(self, c_points, all_outputs, NaN_idx, key_str, prevRun_No): + """ + + + Parameters + ---------- + c_points : TYPE + DESCRIPTION. + all_outputs : TYPE + DESCRIPTION. + NaN_idx : TYPE + DESCRIPTION. + key_str : TYPE + DESCRIPTION. + prevRun_No : TYPE + DESCRIPTION. + + Returns + ------- + None. + + """ # Create hdf5 metadata if key_str == '': @@ -542,7 +685,6 @@ class PyLinkForwardModel(object): # ---------- Save outputs ---------- for varIdx, var in enumerate(self.Output.names): - if not hdf5_exist: grpY = file.create_group("EDY/"+var) else: @@ -656,6 +798,6 @@ class PyLinkForwardModel(object): shutil.rmtree(path) print("\n") - print(f'{dir_name}.zip file has been created successfully!\n') + print(f'{dir_name}.zip has been created successfully!\n') return diff --git a/src/bayesvalidrox/surrogate_models/__init__.py b/src/bayesvalidrox/surrogate_models/__init__.py index 70bfb20f570464c2907a0a4128f4ed99b6c13736..6d8ce9f1c58fa154f2af63f0fb5a44097695df33 100644 --- a/src/bayesvalidrox/surrogate_models/__init__.py +++ b/src/bayesvalidrox/surrogate_models/__init__.py @@ -1,7 +1,12 @@ # -*- coding: utf-8 -*- - +from .engine import Engine +from .exp_designs import ExpDesigns +from .input_space import InputSpace from .surrogate_models import MetaModel __all__ = [ - "MetaModel" + "MetaModel", + "InputSpace", + "ExpDesigns", + "Engine" ] diff --git a/src/bayesvalidrox/surrogate_models/apoly_construction.py b/src/bayesvalidrox/surrogate_models/apoly_construction.py index a7914c7deac51c2180aa6858207ccf0bac5c1f02..40830fe8aaa94248df4828c0c49bd4d23e755abd 100644 --- a/src/bayesvalidrox/surrogate_models/apoly_construction.py +++ b/src/bayesvalidrox/surrogate_models/apoly_construction.py @@ -32,6 +32,8 @@ def apoly_construction(Data, degree): The coefficients of the univariate orthonormal polynomials. """ + if Data.ndim !=1: + raise AttributeError('Data should be a 1D array') # Initialization dd = degree + 1 diff --git a/src/bayesvalidrox/surrogate_models/bayes_linear.py b/src/bayesvalidrox/surrogate_models/bayes_linear.py index a7d6b5929a83fc89d15d7ab8f369187d0542923c..3bd827ac0ecc5b3a38116b21767e8a8799593b24 100644 --- a/src/bayesvalidrox/surrogate_models/bayes_linear.py +++ b/src/bayesvalidrox/surrogate_models/bayes_linear.py @@ -32,7 +32,7 @@ class BayesianLinearRegression(RegressorMixin,LinearModel): def _center_data(self,X,y): ''' Centers data''' - X = as_float_array(X,self.copy_X) + X = as_float_array(X,copy = self.copy_X) # normalisation should be done in preprocessing! X_std = np.ones(X.shape[1], dtype = X.dtype) if self.fit_intercept: @@ -138,7 +138,7 @@ class EBLinearRegression(BayesianLinearRegression): normalize=True, perfect_fit_tol = 1e-6, alpha = 1, copy_X = True, verbose = False): super(EBLinearRegression,self).__init__(n_iter, tol, fit_intercept, copy_X, verbose) if optimizer not in ['em','fp']: - raise ValueError('Optimizer can be either "em" of "fp" ') + raise ValueError('Optimizer can be either "em" or "fp" ') self.optimizer = optimizer self.alpha = alpha self.perfect_fit = False @@ -156,7 +156,7 @@ class EBLinearRegression(BayesianLinearRegression): def _center_data(self,X,y): ''' Centers data''' - X = as_float_array(X,self.copy_X) + X = as_float_array(X,copy = self.copy_X) # normalisation should be done in preprocessing! X_std = np.ones(X.shape[1], dtype = X.dtype) if self.fit_intercept: diff --git a/src/bayesvalidrox/surrogate_models/desktop.ini b/src/bayesvalidrox/surrogate_models/desktop.ini new file mode 100644 index 0000000000000000000000000000000000000000..632de13ae6b61cecf0d9fdbf9c97cfb16bfb51a4 --- /dev/null +++ b/src/bayesvalidrox/surrogate_models/desktop.ini @@ -0,0 +1,2 @@ +[LocalizedFileNames] +exploration.py=@exploration.py,0 diff --git a/src/bayesvalidrox/surrogate_models/meta_model_engine.py b/src/bayesvalidrox/surrogate_models/engine.py similarity index 63% rename from src/bayesvalidrox/surrogate_models/meta_model_engine.py rename to src/bayesvalidrox/surrogate_models/engine.py index 2df2dee5390ae4e6dc7eb88343c2469dbd88aad6..27c117a790d588c3216fe17540419480d15e9790 100644 --- a/src/bayesvalidrox/surrogate_models/meta_model_engine.py +++ b/src/bayesvalidrox/surrogate_models/engine.py @@ -1,66 +1,303 @@ -#!/usr/bin/env python3 # -*- coding: utf-8 -*- """ -Created on Fri Jan 28 09:21:18 2022 +Engine to train the surrogate -@author: farid """ +from copy import deepcopy, copy +import joblib +from joblib import Parallel, delayed +import matplotlib.pyplot as plt +import multiprocessing import numpy as np +import os +import pandas as pd +import pathlib +import scipy.optimize as opt from scipy import stats, signal, linalg, sparse from scipy.spatial import distance -from copy import deepcopy, copy -from tqdm import tqdm -import scipy.optimize as opt from sklearn.metrics import mean_squared_error -import multiprocessing -import matplotlib.pyplot as plt -import sys -import os -import gc import seaborn as sns -from joblib import Parallel, delayed +import sys +from tqdm import tqdm + +from bayesvalidrox.bayes_inference.bayes_inference import BayesInference +from bayesvalidrox.bayes_inference.discrepancy import Discrepancy from .exploration import Exploration -class MetaModelEngine(): - """ Sequential experimental design - This class provieds method for trainig the meta-model in an iterative - manners. - The main method to execute the task is `train_seq_design`, which - recieves a model object and returns the trained metamodel. +def hellinger_distance(P, Q): """ + Hellinger distance between two continuous distributions. - def __init__(self, meta_model_opts): - self.MetaModel = meta_model_opts + The maximum distance 1 is achieved when P assigns probability zero to + every set to which Q assigns a positive probability, and vice versa. + 0 (identical) and 1 (maximally different) - # ------------------------------------------------------------------------- - def run(self): - - Model = self.MetaModel.ModelObj - self.MetaModel.n_params = len(self.MetaModel.input_obj.Marginals) - self.MetaModel.ExpDesignFlag = 'normal' - # --- Prepare pce degree --- - if self.MetaModel.meta_model_type.lower() == 'pce': - if type(self.MetaModel.pce_deg) is not np.ndarray: - self.MetaModel.pce_deg = np.array(self.MetaModel.pce_deg) - - if self.MetaModel.ExpDesign.method == 'normal': - self.MetaModel.ExpDesignFlag = 'normal' - self.MetaModel.train_norm_design(verbose=True) - - elif self.MetaModel.ExpDesign.method == 'sequential': - self.train_seq_design() + Parameters + ---------- + P : array + Reference likelihood. + Q : array + Estimated likelihood. + + Returns + ------- + float + Hellinger distance of two distributions. + + """ + P = np.array(P) + Q = np.array(Q) + + mu1 = P.mean() + Sigma1 = np.std(P) + + mu2 = Q.mean() + Sigma2 = np.std(Q) + + term1 = np.sqrt(2 * Sigma1 * Sigma2 / (Sigma1 ** 2 + Sigma2 ** 2)) + + term2 = np.exp(-.25 * (mu1 - mu2) ** 2 / (Sigma1 ** 2 + Sigma2 ** 2)) + + H_squared = 1 - term1 * term2 + + return np.sqrt(H_squared) + + +def logpdf(x, mean, cov): + """ + Computes the likelihood based on a multivariate normal distribution. + + Parameters + ---------- + x : TYPE + DESCRIPTION. + mean : array_like + Observation data. + cov : 2d array + Covariance matrix of the distribution. + + Returns + ------- + log_lik : float + Log likelihood. + + """ + n = len(mean) + L = linalg.cholesky(cov, lower=True) + beta = np.sum(np.log(np.diag(L))) + dev = x - mean + alpha = dev.dot(linalg.cho_solve((L, True), dev)) + log_lik = -0.5 * alpha - beta - n / 2. * np.log(2 * np.pi) + + return log_lik + + +def subdomain(Bounds, n_new_samples): + """ + Divides a domain defined by Bounds into subdomains. + + Parameters + ---------- + Bounds : list of tuples + List of lower and upper bounds. + n_new_samples : int + Number of samples to divide the domain for. + + Returns + ------- + Subdomains : List of tuples of tuples + Each tuple of tuples divides one set of bounds into n_new_samples parts. + + """ + n_params = len(Bounds) + n_subdomains = n_new_samples + 1 + LinSpace = np.zeros((n_params, n_subdomains)) + + for i in range(n_params): + LinSpace[i] = np.linspace(start=Bounds[i][0], stop=Bounds[i][1], + num=n_subdomains) + Subdomains = [] + for k in range(n_subdomains - 1): + mylist = [] + for i in range(n_params): + mylist.append((LinSpace[i, k + 0], LinSpace[i, k + 1])) + Subdomains.append(tuple(mylist)) + + return Subdomains + + +class Engine: + + def __init__(self, MetaMod, Model, ExpDes): + self.MetaModel = MetaMod + self.Model = Model + self.ExpDesign = ExpDes + self.parallel = False + self.trained = False + + # Init other parameters + self.bound_tuples = None + self.errorModel = None + self.LCerror = None + self.n_obs = None + self.observations = None + self.out_names = None + self.seqMinDist = None + self.seqRMSEStd = None + self.SeqKLD = None + self.SeqDistHellinger = None + self.SeqBME = None + self.seqValidError = None + self.SeqModifiedLOO = None + self.valid_likelihoods = None + self._y_hat_prev = None + + def start_engine(self) -> None: + """ + Do all the preparations that need to be run before the actual training + + Returns + ------- + None + + """ + self.out_names = self.Model.Output.names + self.MetaModel.out_names = self.out_names + + def train_normal(self, parallel=False, verbose=False, save=False) -> None: + """ + Trains surrogate on static samples only. + Samples are taken from the experimental design and the specified + model is run on them. + Alternatively the samples can be read in from a provided hdf5 file. + + + Returns + ------- + None + + """ + if self.out_names == 'None': + self.start_engine() + + ExpDesign = self.ExpDesign + MetaModel = self.MetaModel + + # Read ExpDesign (training and targets) from the provided hdf5 + if ExpDesign.hdf5_file is not None: + # TODO: need to run 'generate_ED' as well after this or not? + ExpDesign.read_from_file(self.out_names) + else: + # Check if an old hdf5 file exists: if yes, rename it + hdf5file = f'ExpDesign_{self.Model.name}.hdf5' + if os.path.exists(hdf5file): + # os.rename(hdf5file, 'old_'+hdf5file) + file = pathlib.Path(hdf5file) + file.unlink() + + # Prepare X samples + # For training the surrogate use ExpDesign.X_tr, ExpDesign.X is for the model to run on + ExpDesign.generate_ED(ExpDesign.n_init_samples, + #transform=True, + max_pce_deg=np.max(MetaModel.pce_deg)) + + # Run simulations at X + if not hasattr(ExpDesign, 'Y') or ExpDesign.Y is None: + print('\n Now the forward model needs to be run!\n') + ED_Y, up_ED_X = self.Model.run_model_parallel(ExpDesign.X, mp=parallel) + ExpDesign.Y = ED_Y else: - raise Exception("The method for experimental design you requested" - " has not been implemented yet.") + # Check if a dict has been passed. + if not type(ExpDesign.Y) is dict: + raise Exception('Please provide either a dictionary or a hdf5' + 'file to ExpDesign.hdf5_file argument.') + + # Separate output dict and x-values + if 'x_values' in ExpDesign.Y: + ExpDesign.x_values = ExpDesign.Y['x_values'] + del ExpDesign.Y['x_values'] + else: + print('No x_values are given, this might lead to issues during PostProcessing') + + # Fit the surrogate + MetaModel.fit(ExpDesign.X, ExpDesign.Y, parallel, verbose) + + # Save what there is to save + if save: + # Save surrogate + with open(f'surrogates/surrogate_{self.Model.name}.pk1', 'wb') as output: + joblib.dump(MetaModel, output, 2) + + # Zip the model run directories + if self.Model.link_type.lower() == 'pylink' and \ + self.ExpDesign.sampling_method.lower() != 'user': + self.Model.zip_subdirs(self.Model.name, f'{self.Model.name}_') + + # Set that training was done + self.trained = True + + def train_sequential(self, parallel=False, verbose=False) -> None: + """ + Train the surrogate in a sequential manner. + First build and train evereything on the static samples, then iterate + choosing more samples and refitting the surrogate on them. - # Zip the model run directories - if self.MetaModel.ModelObj.link_type.lower() == 'pylink' and\ - self.MetaModel.ExpDesign.sampling_method.lower() != 'user': - Model.zip_subdirs(Model.name, f'{Model.name}_') + Returns + ------- + None + + """ + # self.train_normal(parallel, verbose) + self.parallel = parallel + self.train_seq_design(parallel, verbose) # ------------------------------------------------------------------------- - def train_seq_design(self): + def eval_metamodel(self, samples=None, nsamples=None, + sampling_method='random', return_samples=False): + """ + Evaluates metamodel at the requested samples. One can also generate + nsamples. + + Parameters + ---------- + samples : array of shape (n_samples, n_params), optional + Samples to evaluate metamodel at. The default is None. + nsamples : int, optional + Number of samples to generate, if no `samples` is provided. The + default is None. + sampling_method : str, optional + Type of sampling, if no `samples` is provided. The default is + 'random'. + return_samples : bool, optional + Retun samples, if no `samples` is provided. The default is False. + + Returns + ------- + mean_pred : dict + Mean of the predictions. + std_pred : dict + Standard deviatioon of the predictions. + """ + # Generate or transform (if need be) samples + if samples is None: + # Generate + samples = self.ExpDesign.generate_samples( + nsamples, + sampling_method + ) + + # Transformation to other space is to be done in the MetaModel + # TODO: sort the transformations better + mean_pred, std_pred = self.MetaModel.eval_metamodel(samples) + + if return_samples: + return mean_pred, std_pred, samples + else: + return mean_pred, std_pred + + # ------------------------------------------------------------------------- + def train_seq_design(self, parallel=False, verbose=False): """ Starts the adaptive sequential design for refining the surrogate model by selecting training points in a sequential manner. @@ -71,62 +308,68 @@ class MetaModelEngine(): Meta model object. """ - Model = self.MetaModel.ModelObj - # MetaModel = self.MetaModel - self.Model = Model + self.parallel = parallel # Initialization - self.MetaModel.SeqModifiedLOO = {} - self.MetaModel.seqValidError = {} - self.MetaModel.SeqBME = {} - self.MetaModel.SeqKLD = {} - self.MetaModel.SeqDistHellinger = {} - self.MetaModel.seqRMSEMean = {} - self.MetaModel.seqRMSEStd = {} - self.MetaModel.seqMinDist = [] + self.SeqModifiedLOO = {} + self.seqValidError = {} + self.SeqBME = {} + self.SeqKLD = {} + self.SeqDistHellinger = {} + self.seqRMSEMean = {} + self.seqRMSEStd = {} + self.seqMinDist = [] + + if not hasattr(self.MetaModel, 'valid_samples') or self.MetaModel.valid_samples is None: + self.ExpDesign.valid_samples = [] + self.ExpDesign.valid_model_runs = [] + self.valid_likelihoods = [] + + # validError = None # Determine the metamodel type if self.MetaModel.meta_model_type.lower() != 'gpe': pce = True else: pce = False - mc_ref = True if bool(Model.mc_reference) else False + mc_ref = True if bool(self.Model.mc_reference) else False if mc_ref: - Model.read_mc_reference() - - if not hasattr(self.MetaModel, 'valid_samples'): - self.MetaModel.valid_samples = [] - self.MetaModel.valid_model_runs = [] - self.MetaModel.valid_likelihoods = [] + self.Model.read_observation('mc_ref') # Get the parameters - max_n_samples = self.MetaModel.ExpDesign.n_max_samples - mod_LOO_threshold = self.MetaModel.ExpDesign.mod_LOO_threshold - n_canddidate = self.MetaModel.ExpDesign.n_canddidate - post_snapshot = self.MetaModel.ExpDesign.post_snapshot - n_replication = self.MetaModel.ExpDesign.n_replication - util_func = self.MetaModel.ExpDesign.util_func - output_name = Model.Output.names - validError = None + max_n_samples = self.ExpDesign.n_max_samples + mod_LOO_threshold = self.ExpDesign.mod_LOO_threshold + n_canddidate = self.ExpDesign.n_canddidate + post_snapshot = self.ExpDesign.post_snapshot + n_replication = self.ExpDesign.n_replication + util_func = self.ExpDesign.util_func + output_name = self.out_names + # Handle if only one UtilityFunctions is provided if not isinstance(util_func, list): - util_func = [self.MetaModel.ExpDesign.util_func] + util_func = [self.ExpDesign.util_func] # Read observations or MCReference - if len(Model.observations) != 0 or Model.meas_file is not None: - self.observations = Model.read_observation() + # TODO: recheck the logic in this if statement + if (len(self.Model.observations) != 0 or self.Model.meas_file is not None) and hasattr(self.MetaModel, + 'Discrepancy'): + self.observations = self.Model.read_observation() obs_data = self.observations else: obs_data = [] + # TODO: TotalSigma2 not defined if not in this else??? + # TODO: no self.observations if in here TotalSigma2 = {} - # TODO: ---------- Initial self.MetaModel ---------- - # self.MetaModel.train_norm_design(parallel=False, verbose=True) - self.MetaModel.train_norm_design(verbose=True) + + # ---------- Initial self.MetaModel ---------- + if not self.trained: + self.train_normal(parallel=parallel, verbose=verbose) + initMetaModel = deepcopy(self.MetaModel) # Validation error if validation set is provided. - if self.MetaModel.valid_model_runs: - init_rmse, init_valid_error = self.__validError(initMetaModel) + if self.ExpDesign.valid_model_runs: + init_rmse, init_valid_error = self._validError() # initMetaModel) init_valid_error = list(init_valid_error.values()) else: init_rmse = None @@ -136,36 +379,39 @@ class MetaModelEngine(): TotalSigma2 = self.MetaModel.Discrepancy.parameters # Calculate the initial BME - out = self.__BME_Calculator( - initMetaModel, obs_data, TotalSigma2, init_rmse) + out = self._BME_Calculator( + obs_data, TotalSigma2, init_rmse) init_BME, init_KLD, init_post, init_likes, init_dist_hellinger = out print(f"\nInitial BME: {init_BME:.2f}") print(f"Initial KLD: {init_KLD:.2f}") # Posterior snapshot (initial) if post_snapshot: - parNames = self.MetaModel.ExpDesign.par_names + parNames = self.ExpDesign.par_names print('Posterior snapshot (initial) is being plotted...') - self.__posteriorPlot(init_post, parNames, 'SeqPosterior_init') + self._posteriorPlot(init_post, parNames, 'SeqPosterior_init') # Check the convergence of the Mean & Std if mc_ref and pce: - init_rmse_mean, init_rmse_std = self.__error_Mean_Std() + init_rmse_mean, init_rmse_std = self._error_Mean_Std() print(f"Initial Mean and Std error: {init_rmse_mean:.2f}," f" {init_rmse_std:.2f}") # Read the initial experimental design - Xinit = initMetaModel.ExpDesign.X - init_n_samples = len(initMetaModel.ExpDesign.X) - initYprev = initMetaModel.ModelOutputDict + Xinit = self.ExpDesign.X + init_n_samples = len(self.ExpDesign.X) + initYprev = self.ExpDesign.Y # initMetaModel.ModelOutputDict + # self.MetaModel.ModelOutputDict = self.ExpDesign.Y initLCerror = initMetaModel.LCerror n_itrs = max_n_samples - init_n_samples + # Get some initial statistics # Read the initial ModifiedLOO + init_mod_LOO = [] if pce: Scores_all, varExpDesignY = [], [] for out_name in output_name: - y = self.MetaModel.ExpDesign.Y[out_name] + y = self.ExpDesign.Y[out_name] Scores_all.append(list( self.MetaModel.score_dict['b_1'][out_name].values())) if self.MetaModel.dim_red_method.lower() == 'pca': @@ -177,25 +423,22 @@ class MetaModelEngine(): Scores = [item for sublist in Scores_all for item in sublist] weights = [item for sublist in varExpDesignY for item in sublist] - init_mod_LOO = [np.average([1-score for score in Scores], + init_mod_LOO = [np.average([1 - score for score in Scores], weights=weights)] prevMetaModel_dict = {} - # Replicate the sequential design + # prevExpDesign_dict = {} + # Can run sequential design multiple times for comparison for repIdx in range(n_replication): - print(f'\n>>>> Replication: {repIdx+1}<<<<') - - # To avoid changes ub original aPCE object - self.MetaModel.ExpDesign.X = Xinit - self.MetaModel.ExpDesign.Y = initYprev - self.MetaModel.LCerror = initLCerror + print(f'\n>>>> Replication: {repIdx + 1}<<<<') + # util_func: the function to use inside the type of exploitation for util_f in util_func: print(f'\n>>>> Utility Function: {util_f} <<<<') # To avoid changes ub original aPCE object - self.MetaModel.ExpDesign.X = Xinit - self.MetaModel.ExpDesign.Y = initYprev - self.MetaModel.LCerror = initLCerror + self.ExpDesign.X = Xinit + self.ExpDesign.Y = initYprev + self.ExpDesign.LCerror = initLCerror # Set the experimental design Xprev = Xinit @@ -203,18 +446,17 @@ class MetaModelEngine(): Yprev = initYprev Xfull = [] - Yfull = [] # Store the initial ModifiedLOO if pce: print("\nInitial ModifiedLOO:", init_mod_LOO) SeqModifiedLOO = np.array(init_mod_LOO) - if len(self.MetaModel.valid_model_runs) != 0: + if len(self.ExpDesign.valid_model_runs) != 0: SeqValidError = np.array(init_valid_error) # Check if data is provided - if len(obs_data) != 0: + if len(obs_data) != 0 and hasattr(self.MetaModel, 'Discrepancy'): SeqBME = np.array([init_BME]) SeqKLD = np.array([init_KLD]) SeqDistHellinger = np.array([init_dist_hellinger]) @@ -225,44 +467,44 @@ class MetaModelEngine(): # ------- Start Sequential Experimental Design ------- postcnt = 1 - for itr_no in range(1, n_itrs+1): + for itr_no in range(1, n_itrs + 1): print(f'\n>>>> Iteration number {itr_no} <<<<') # Save the metamodel prediction before updating prevMetaModel_dict[itr_no] = deepcopy(self.MetaModel) + # prevExpDesign_dict[itr_no] = deepcopy(self.ExpDesign) if itr_no > 1: - pc_model = prevMetaModel_dict[itr_no-1] + pc_model = prevMetaModel_dict[itr_no - 1] self._y_hat_prev, _ = pc_model.eval_metamodel( samples=Xfull[-1].reshape(1, -1)) - del prevMetaModel_dict[itr_no-1] + del prevMetaModel_dict[itr_no - 1] # Optimal Bayesian Design - self.MetaModel.ExpDesignFlag = 'sequential' - Xnew, updatedPrior = self.opt_SeqDesign(TotalSigma2, - n_canddidate, - util_f) + # self.MetaModel.ExpDesignFlag = 'sequential' + Xnew, updatedPrior = self.choose_next_sample(TotalSigma2, + n_canddidate, + util_f) S = np.min(distance.cdist(Xinit, Xnew, 'euclidean')) - self.MetaModel.seqMinDist.append(S) + self.seqMinDist.append(S) print(f"\nmin Dist from OldExpDesign: {S:2f}") print("\n") # Evaluate the full model response at the new sample - Ynew, _ = Model.run_model_parallel( + Ynew, _ = self.Model.run_model_parallel( Xnew, prevRun_No=total_n_samples - ) + ) total_n_samples += Xnew.shape[0] # ------ Plot the surrogate model vs Origninal Model ------ - if hasattr(self.MetaModel, 'adapt_verbose') and \ - self.MetaModel.adapt_verbose: + if self.ExpDesign.adapt_verbose: from .adaptPlot import adaptPlot y_hat, std_hat = self.MetaModel.eval_metamodel( samples=Xnew - ) + ) adaptPlot( self.MetaModel, Ynew, y_hat, std_hat, plotED=False - ) + ) # -------- Retrain the surrogate model ------- # Extend new experimental design @@ -271,18 +513,19 @@ class MetaModelEngine(): # Updating experimental design Y for out_name in output_name: Yfull = np.vstack((Yprev[out_name], Ynew[out_name])) - self.MetaModel.ModelOutputDict[out_name] = Yfull + self.ExpDesign.Y[out_name] = Yfull # Pass new design to the metamodel object - self.MetaModel.ExpDesign.sampling_method = 'user' - self.MetaModel.ExpDesign.X = Xfull - self.MetaModel.ExpDesign.Y = self.MetaModel.ModelOutputDict + self.ExpDesign.sampling_method = 'user' + self.ExpDesign.X = Xfull + # self.ExpDesign.Y = self.MetaModel.ModelOutputDict # Save the Experimental Design for next iteration Xprev = Xfull - Yprev = self.MetaModel.ModelOutputDict + Yprev = self.ExpDesign.Y # Pass the new prior as the input + # TODO: another look at this - no difference apc to pce to gpe? self.MetaModel.input_obj.poly_coeffs_flag = False if updatedPrior is not None: self.MetaModel.input_obj.poly_coeffs_flag = True @@ -294,14 +537,14 @@ class MetaModelEngine(): self.MetaModel.input_obj.Marginals[i].raw_data = x # Train the surrogate model for new ExpDesign - self.MetaModel.train_norm_design(parallel=False) + self.train_normal(parallel=False) # -------- Evaluate the retrained surrogate model ------- # Extract Modified LOO from Output if pce: Scores_all, varExpDesignY = [], [] for out_name in output_name: - y = self.MetaModel.ExpDesign.Y[out_name] + y = self.ExpDesign.Y[out_name] Scores_all.append(list( self.MetaModel.score_dict['b_1'][out_name].values())) if self.MetaModel.dim_red_method.lower() == 'pca': @@ -316,15 +559,15 @@ class MetaModelEngine(): weights = [item for sublist in varExpDesignY for item in sublist] ModifiedLOO = [np.average( - [1-score for score in Scores], weights=weights)] + [1 - score for score in Scores], weights=weights)] print('\n') print(f"Updated ModifiedLOO {util_f}:\n", ModifiedLOO) print('\n') # Compute the validation error - if self.MetaModel.valid_model_runs: - rmse, validError = self.__validError(self.MetaModel) + if self.ExpDesign.valid_model_runs: + rmse, validError = self._validError() # self.MetaModel) ValidError = list(validError.values()) else: rmse = None @@ -333,15 +576,14 @@ class MetaModelEngine(): if pce: SeqModifiedLOO = np.vstack( (SeqModifiedLOO, ModifiedLOO)) - if len(self.MetaModel.valid_model_runs) != 0: + if len(self.ExpDesign.valid_model_runs) != 0: SeqValidError = np.vstack( (SeqValidError, ValidError)) # -------- Caclulation of BME as accuracy metric ------- # Check if data is provided if len(obs_data) != 0: # Calculate the initial BME - out = self.__BME_Calculator(self.MetaModel, obs_data, - TotalSigma2, rmse) + out = self._BME_Calculator(obs_data, TotalSigma2, rmse) BME, KLD, Posterior, likes, DistHellinger = out print('\n') print(f"Updated BME: {BME:.2f}") @@ -349,18 +591,18 @@ class MetaModelEngine(): print('\n') # Plot some snapshots of the posterior - step_snapshot = self.MetaModel.ExpDesign.step_snapshot + step_snapshot = self.ExpDesign.step_snapshot if post_snapshot and postcnt % step_snapshot == 0: - parNames = self.MetaModel.ExpDesign.par_names + parNames = self.ExpDesign.par_names print('Posterior snapshot is being plotted...') - self.__posteriorPlot(Posterior, parNames, - f'SeqPosterior_{postcnt}') + self._posteriorPlot(Posterior, parNames, + f'SeqPosterior_{postcnt}') postcnt += 1 # Check the convergence of the Mean&Std if mc_ref and pce: print('\n') - RMSE_Mean, RMSE_std = self.__error_Mean_Std() + RMSE_Mean, RMSE_std = self._error_Mean_Std() print(f"Updated Mean and Std error: {RMSE_Mean:.2f}, " f"{RMSE_std:.2f}") print('\n') @@ -384,26 +626,26 @@ class MetaModelEngine(): if len(obs_data) != 0: del out print() - print('-'*50) + print('-' * 50) print() # Store updated ModifiedLOO and BME in dictonary - strKey = f'{util_f}_rep_{repIdx+1}' + strKey = f'{util_f}_rep_{repIdx + 1}' if pce: - self.MetaModel.SeqModifiedLOO[strKey] = SeqModifiedLOO - if len(self.MetaModel.valid_model_runs) != 0: - self.MetaModel.seqValidError[strKey] = SeqValidError + self.SeqModifiedLOO[strKey] = SeqModifiedLOO + if len(self.ExpDesign.valid_model_runs) != 0: + self.seqValidError[strKey] = SeqValidError # Check if data is provided if len(obs_data) != 0: - self.MetaModel.SeqBME[strKey] = SeqBME - self.MetaModel.SeqKLD[strKey] = SeqKLD + self.SeqBME[strKey] = SeqBME + self.SeqKLD[strKey] = SeqKLD if hasattr(self.MetaModel, 'valid_likelihoods') and \ - self.MetaModel.valid_likelihoods: - self.MetaModel.SeqDistHellinger[strKey] = SeqDistHellinger + self.valid_likelihoods: + self.SeqDistHellinger[strKey] = SeqDistHellinger if mc_ref and pce: - self.MetaModel.seqRMSEMean[strKey] = seqRMSEMean - self.MetaModel.seqRMSEStd[strKey] = seqRMSEStd + self.seqRMSEMean[strKey] = seqRMSEMean + self.seqRMSEStd[strKey] = seqRMSEStd # return self.MetaModel @@ -422,7 +664,7 @@ class MetaModelEngine(): Candidate samples. index : int Model output index. - UtilMethod : string, optional + util_func : string, optional Exploitation utility function. The default is 'Entropy'. Returns @@ -432,18 +674,19 @@ class MetaModelEngine(): """ MetaModel = self.MetaModel - ED_X = MetaModel.ExpDesign.X - out_dict_y = MetaModel.ExpDesign.Y - out_names = MetaModel.ModelObj.Output.names + ED_X = self.ExpDesign.X + out_dict_y = self.ExpDesign.Y + out_names = self.out_names # Run the Metamodel for the candidate X_can = X_can.reshape(1, -1) Y_PC_can, std_PC_can = MetaModel.eval_metamodel(samples=X_can) + score = None if util_func.lower() == 'alm': # ----- Entropy/MMSE/active learning MacKay(ALM) ----- # Compute perdiction variance of the old model - canPredVar = {key: std_PC_can[key]**2 for key in out_names} + canPredVar = {key: std_PC_can[key] ** 2 for key in out_names} varPCE = np.zeros((len(out_names), X_can.shape[0])) for KeyIdx, key in enumerate(out_names): @@ -458,7 +701,7 @@ class MetaModelEngine(): # Compute perdiction error and variance of the old model predError = {key: Y_PC_can[key] for key in out_names} - canPredVar = {key: std_PC_can[key]**2 for key in out_names} + canPredVar = {key: std_PC_can[key] ** 2 for key in out_names} # Compute perdiction error and variance of the old model # Eq (5) from Liu et al.(2018) @@ -466,10 +709,10 @@ class MetaModelEngine(): for KeyIdx, key in enumerate(out_names): residual = predError[key] - out_dict_y[key][int(index)] var = canPredVar[key] - EIGF_PCE[KeyIdx] = np.max(residual**2 + var, axis=1) + EIGF_PCE[KeyIdx] = np.max(residual ** 2 + var, axis=1) score = np.max(EIGF_PCE, axis=0) - return -1 * score # -1 is for minimization instead of maximization + return -1 * score # -1 is for minimization instead of maximization # ------------------------------------------------------------------------- def util_BayesianActiveDesign(self, y_hat, std, sigma2Dict, var='DKL'): @@ -483,8 +726,8 @@ class MetaModelEngine(): Parameters ---------- - X_can : array of shape (n_samples, n_params) - Candidate samples. + y_hat : unknown + std : unknown sigma2Dict : dict A dictionary containing the measurement errors (sigma^2). var : string, optional @@ -499,33 +742,39 @@ class MetaModelEngine(): # Get the data obs_data = self.observations - n_obs = self.Model.n_obs + # TODO: this should be optimizable to be calculated explicitly + if hasattr(self.Model, 'n_obs'): + n_obs = self.Model.n_obs + else: + n_obs = self.n_obs mc_size = 10000 # Sample a distribution for a normal dist # with Y_mean_can as the mean and Y_std_can as std. Y_MC, std_MC = {}, {} - logPriorLikelihoods = np.zeros((mc_size)) + logPriorLikelihoods = np.zeros(mc_size) for key in list(y_hat): - cov = np.diag(std[key]**2) - rv = stats.multivariate_normal(mean=y_hat[key], cov=cov) + cov = np.diag(std[key] ** 2) + print(key, y_hat[key], std[key]) + # TODO: added the allow_singular = True here + rv = stats.multivariate_normal(mean=y_hat[key], cov=cov, allow_singular=True) Y_MC[key] = rv.rvs(size=mc_size) logPriorLikelihoods += rv.logpdf(Y_MC[key]) std_MC[key] = np.zeros((mc_size, y_hat[key].shape[0])) # Likelihood computation (Comparison of data and simulation # results via PCE with candidate design) - likelihoods = self.__normpdf(Y_MC, std_MC, obs_data, sigma2Dict) + likelihoods = self._normpdf(Y_MC, std_MC, obs_data, sigma2Dict) # Rejection Step # Random numbers between 0 and 1 unif = np.random.rand(1, mc_size)[0] # Reject the poorly performed prior - accepted = (likelihoods/np.max(likelihoods)) >= unif + accepted = (likelihoods / np.max(likelihoods)) >= unif # Prior-based estimation of BME - logBME = np.log(np.nanmean(likelihoods), dtype=np.float128) + logBME = np.log(np.nanmean(likelihoods), dtype=np.longdouble) # float128) # Posterior-based expectation of likelihoods postLikelihoods = likelihoods[accepted] @@ -537,6 +786,7 @@ class MetaModelEngine(): # Utility function Eq.2 in Ref. (2) # Posterior covariance matrix after observing data y # Kullback-Leibler Divergence (Sergey's paper) + U_J_d = None if var == 'DKL': # TODO: Calculate the correction factor for BME @@ -572,15 +822,15 @@ class MetaModelEngine(): AIC = -2 * maxlogL + 2 * nModelParams # 2 * nModelParams * (nModelParams+1) / (n_obs-nModelParams-1) penTerm = 0 - U_J_d = 1*(AIC + penTerm) + U_J_d = 1 * (AIC + penTerm) # Deviance information criterion elif var == 'DIC': # D_theta_bar = np.mean(-2 * Likelihoods) N_star_p = 0.5 * np.var(np.log(likelihoods[likelihoods != 0])) - Likelihoods_theta_mean = self.__normpdf( + Likelihoods_theta_mean = self._normpdf( y_hat, std, obs_data, sigma2Dict - ) + ) DIC = -2 * np.log(Likelihoods_theta_mean) + 2 * N_star_p U_J_d = DIC @@ -597,129 +847,7 @@ class MetaModelEngine(): del Y_MC del std_MC - return -1 * U_J_d # -1 is for minimization instead of maximization - - # ------------------------------------------------------------------------- - def update_metamodel(self, MetaModel, output, y_hat_can, univ_p_val, index, - new_pca=False): - BasisIndices = MetaModel.basis_dict[output]["y_"+str(index+1)] - clf_poly = MetaModel.clf_poly[output]["y_"+str(index+1)] - Mn = clf_poly.coef_ - Sn = clf_poly.sigma_ - beta = clf_poly.alpha_ - active = clf_poly.active_ - Psi = self.MetaModel.create_psi(BasisIndices, univ_p_val) - - Sn_new_inv = np.linalg.inv(Sn) - Sn_new_inv += beta * np.dot(Psi[:, active].T, Psi[:, active]) - Sn_new = np.linalg.inv(Sn_new_inv) - - Mn_new = np.dot(Sn_new_inv, Mn[active]).reshape(-1, 1) - Mn_new += beta * np.dot(Psi[:, active].T, y_hat_can) - Mn_new = np.dot(Sn_new, Mn_new).flatten() - - # Compute the old and new moments of PCEs - mean_old = Mn[0] - mean_new = Mn_new[0] - std_old = np.sqrt(np.sum(np.square(Mn[1:]))) - std_new = np.sqrt(np.sum(np.square(Mn_new[1:]))) - - # Back transformation if PCA is selected. - if MetaModel.dim_red_method.lower() == 'pca': - old_pca = MetaModel.pca[output] - mean_old = old_pca.mean_[index] - mean_old += np.sum(mean_old * old_pca.components_[:, index]) - std_old = np.sqrt(np.sum(std_old**2 * - old_pca.components_[:, index]**2)) - mean_new = new_pca.mean_[index] - mean_new += np.sum(mean_new * new_pca.components_[:, index]) - std_new = np.sqrt(np.sum(std_new**2 * - new_pca.components_[:, index]**2)) - # print(f"mean_old: {mean_old:.2f} mean_new: {mean_new:.2f}") - # print(f"std_old: {std_old:.2f} std_new: {std_new:.2f}") - # Store the old and new moments of PCEs - results = { - 'mean_old': mean_old, - 'mean_new': mean_new, - 'std_old': std_old, - 'std_new': std_new - } - return results - - # ------------------------------------------------------------------------- - def util_BayesianDesign_old(self, X_can, X_MC, sigma2Dict, var='DKL'): - """ - Computes scores based on Bayesian sequential design criterion (var). - - Parameters - ---------- - X_can : array of shape (n_samples, n_params) - Candidate samples. - sigma2Dict : dict - A dictionary containing the measurement errors (sigma^2). - var : string, optional - Bayesian design criterion. The default is 'DKL'. - - Returns - ------- - float - Score. - - """ - - # To avoid changes ub original aPCE object - Model = self.Model - MetaModel = deepcopy(self.MetaModel) - old_EDY = MetaModel.ExpDesign.Y - - # Evaluate the PCE metamodels using the candidate design - Y_PC_can, Y_std_can = self.MetaModel.eval_metamodel( - samples=np.array([X_can]) - ) - - # Generate y from posterior predictive - m_size = 100 - y_hat_samples = {} - for idx, key in enumerate(Model.Output.names): - means, stds = Y_PC_can[key][0], Y_std_can[key][0] - y_hat_samples[key] = np.random.multivariate_normal( - means, np.diag(stds), m_size) - - # Create the SparseBayes-based PCE metamodel: - MetaModel.input_obj.poly_coeffs_flag = False - univ_p_val = self.MetaModel.univ_basis_vals(X_can) - G_n_m_all = np.zeros((m_size, len(Model.Output.names), Model.n_obs)) - - for i in range(m_size): - for idx, key in enumerate(Model.Output.names): - if MetaModel.dim_red_method.lower() == 'pca': - # Equal number of components - new_outputs = np.vstack( - (old_EDY[key], y_hat_samples[key][i]) - ) - new_pca, _ = MetaModel.pca_transformation(new_outputs) - target = new_pca.transform( - y_hat_samples[key][i].reshape(1, -1) - )[0] - else: - new_pca, target = False, y_hat_samples[key][i] - - for j in range(len(target)): - - # Update surrogate - result = self.update_metamodel( - MetaModel, key, target[j], univ_p_val, j, new_pca) - - # Compute Expected Information Gain (Eq. 39) - G_n_m = np.log(result['std_old']/result['std_new']) - 1./2 - G_n_m += result['std_new']**2 / (2*result['std_old']**2) - G_n_m += (result['mean_new'] - result['mean_old'])**2 /\ - (2*result['std_old']**2) - - G_n_m_all[i, idx, j] = G_n_m - - U_J_d = G_n_m_all.mean(axis=(1, 2)).mean() - return -1 * U_J_d + return -1 * U_J_d # -1 is for minimization instead of maximization # ------------------------------------------------------------------------- def util_BayesianDesign(self, X_can, X_MC, sigma2Dict, var='DKL'): @@ -730,6 +858,7 @@ class MetaModelEngine(): ---------- X_can : array of shape (n_samples, n_params) Candidate samples. + X_MC : unknown sigma2Dict : dict A dictionary containing the measurement errors (sigma^2). var : string, optional @@ -744,7 +873,7 @@ class MetaModelEngine(): # To avoid changes ub original aPCE object MetaModel = self.MetaModel - out_names = MetaModel.ModelObj.Output.names + out_names = self.out_names if X_can.ndim == 1: X_can = X_can.reshape(1, -1) @@ -754,12 +883,13 @@ class MetaModelEngine(): Y_MC, Y_MC_std = MetaModel.eval_metamodel(samples=X_MC) # Old Experimental design - oldExpDesignX = MetaModel.ExpDesign.X - oldExpDesignY = MetaModel.ExpDesign.Y + oldExpDesignX = self.ExpDesign.X + oldExpDesignY = self.ExpDesign.Y # Evaluate the PCE metamodels at that location ??? Y_PC_can, Y_std_can = MetaModel.eval_metamodel(samples=X_can) PCE_Model_can = deepcopy(MetaModel) + engine_can = deepcopy(self) # Add the candidate to the ExpDesign NewExpDesignX = np.vstack((oldExpDesignX, X_can)) @@ -767,33 +897,36 @@ class MetaModelEngine(): for key in oldExpDesignY.keys(): NewExpDesignY[key] = np.vstack( (oldExpDesignY[key], Y_PC_can[key]) - ) + ) - PCE_Model_can.ExpDesign.sampling_method = 'user' - PCE_Model_can.ExpDesign.X = NewExpDesignX - PCE_Model_can.ModelOutputDict = NewExpDesignY - PCE_Model_can.ExpDesign.Y = NewExpDesignY + engine_can.ExpDesign.sampling_method = 'user' + engine_can.ExpDesign.X = NewExpDesignX + # engine_can.ModelOutputDict = NewExpDesignY + engine_can.ExpDesign.Y = NewExpDesignY # Train the model for the observed data using x_can - PCE_Model_can.input_obj.poly_coeffs_flag = False - PCE_Model_can.train_norm_design(parallel=False) + engine_can.MetaModel.input_obj.poly_coeffs_flag = False + engine_can.start_engine() + engine_can.train_normal(parallel=False) + engine_can.MetaModel.fit(NewExpDesignX, NewExpDesignY) + # engine_can.train_norm_design(parallel=False) # Set the ExpDesign to its original values - PCE_Model_can.ExpDesign.X = oldExpDesignX - PCE_Model_can.ModelOutputDict = oldExpDesignY - PCE_Model_can.ExpDesign.Y = oldExpDesignY + engine_can.ExpDesign.X = oldExpDesignX + engine_can.ModelOutputDict = oldExpDesignY + engine_can.ExpDesign.Y = oldExpDesignY if var.lower() == 'mi': - # Mutual information based on Krause et al + # Mutual information based on Krause et al. # Adapted from Beck & Guillas (MICE) paper - _, std_PC_can = PCE_Model_can.eval_metamodel(samples=X_can) + _, std_PC_can = engine_can.MetaModel.eval_metamodel(samples=X_can) std_can = {key: std_PC_can[key] for key in out_names} std_old = {key: Y_std_can[key] for key in out_names} varPCE = np.zeros((len(out_names))) for i, key in enumerate(out_names): - varPCE[i] = np.mean(std_old[key]**2/std_can[key]**2) + varPCE[i] = np.mean(std_old[key] ** 2 / std_can[key] ** 2) score = np.mean(varPCE) return -1 * score @@ -804,14 +937,14 @@ class MetaModelEngine(): # metrics, 51 (2009), pp. 130–145. # Evaluate the MetaModel at the given samples - Y_MC_can, Y_MC_std_can = PCE_Model_can.eval_metamodel(samples=X_MC) + Y_MC_can, Y_MC_std_can = engine_can.MetaModel.eval_metamodel(samples=X_MC) # Compute the score score = [] for i, key in enumerate(out_names): - pce_var = Y_MC_std_can[key]**2 - pce_var_can = Y_MC_std[key]**2 - score.append(np.mean(pce_var-pce_var_can, axis=0)) + pce_var = Y_MC_std_can[key] ** 2 + pce_var_can = Y_MC_std[key] ** 2 + score.append(np.mean(pce_var - pce_var_can, axis=0)) score = np.mean(score) return -1 * score @@ -821,28 +954,29 @@ class MetaModelEngine(): MCsize = X_MC.shape[0] ESS = 0 - while ((ESS > MCsize) or (ESS < 1)): + likelihoods = None + while (ESS > MCsize) or (ESS < 1): # Enriching Monte Carlo samples if need be if ESS != 0: - X_MC = self.MetaModel.ExpDesign.generate_samples( + X_MC = self.ExpDesign.generate_samples( MCsize, 'random' - ) + ) # Evaluate the MetaModel at the given samples Y_MC, std_MC = PCE_Model_can.eval_metamodel(samples=X_MC) # Likelihood computation (Comparison of data and simulation # results via PCE with candidate design) - likelihoods = self.__normpdf( + likelihoods = self._normpdf( Y_MC, std_MC, self.observations, sigma2Dict - ) + ) # Check the Effective Sample Size (1<ESS<MCsize) - ESS = 1 / np.sum(np.square(likelihoods/np.sum(likelihoods))) + ESS = 1 / np.sum(np.square(likelihoods / np.sum(likelihoods))) # Enlarge sample size if it doesn't fulfill the criteria - if ((ESS > MCsize) or (ESS < 1)): + if (ESS > MCsize) or (ESS < 1): print("--- increasing MC size---") MCsize *= 10 ESS = 0 @@ -852,19 +986,20 @@ class MetaModelEngine(): unif = np.random.rand(1, MCsize)[0] # Reject the poorly performed prior - accepted = (likelihoods/np.max(likelihoods)) >= unif + accepted = (likelihoods / np.max(likelihoods)) >= unif # -------------------- Utility functions -------------------- # Utility function Eq.2 in Ref. (2) # Kullback-Leibler Divergence (Sergey's paper) + U_J_d = None if var == 'DKL': # Prior-based estimation of BME - logBME = np.log(np.nanmean(likelihoods, dtype=np.float128)) + logBME = np.log(np.nanmean(likelihoods, dtype=np.longdouble)) # float128)) # Posterior-based expectation of likelihoods - postLikelihoods = likelihoods[accepted] - postExpLikelihoods = np.mean(np.log(postLikelihoods)) + # postLikelihoods = likelihoods[accepted] + # postExpLikelihoods = np.mean(np.log(postLikelihoods)) # Haun et al implementation U_J_d = np.mean(np.log(likelihoods[likelihoods != 0]) - logBME) @@ -899,6 +1034,8 @@ class MetaModelEngine(): postExpLikelihoods = np.mean(np.log(postLikelihoods)) # Posterior-based expectation of prior densities + logPriorLikelihoods = [] + logPriorLikelihoods[accepted] = None # TODO: this is not defined here, just a fix postExpPrior = np.mean(logPriorLikelihoods[accepted]) infEntropy = logBME - postExpPrior - postExpLikelihoods @@ -925,41 +1062,7 @@ class MetaModelEngine(): del Y_MC del std_MC - return -1 * U_J_d # -1 is for minimization instead of maximization - - # ------------------------------------------------------------------------- - def subdomain(self, Bounds, n_new_samples): - """ - Divides a domain defined by Bounds into sub domains. - - Parameters - ---------- - Bounds : list of tuples - List of lower and upper bounds. - n_new_samples : TYPE - DESCRIPTION. - - Returns - ------- - Subdomains : TYPE - DESCRIPTION. - - """ - n_params = self.MetaModel.n_params - n_subdomains = n_new_samples + 1 - LinSpace = np.zeros((n_params, n_subdomains)) - - for i in range(n_params): - LinSpace[i] = np.linspace(start=Bounds[i][0], stop=Bounds[i][1], - num=n_subdomains) - Subdomains = [] - for k in range(n_subdomains-1): - mylist = [] - for i in range(n_params): - mylist.append((LinSpace[i, k+0], LinSpace[i, k+1])) - Subdomains.append(tuple(mylist)) - - return Subdomains + return -1 * U_J_d # -1 is for minimization instead of maximization # ------------------------------------------------------------------------- def run_util_func(self, method, candidates, index, sigma2Dict=None, @@ -1002,7 +1105,7 @@ class MetaModelEngine(): elif method.lower() == 'bayesactdesign': NCandidate = candidates.shape[0] - U_J_d = np.zeros((NCandidate)) + U_J_d = np.zeros(NCandidate) # Evaluate all candidates y_can, std_can = self.MetaModel.eval_metamodel(samples=candidates) # loop through candidates @@ -1010,23 +1113,26 @@ class MetaModelEngine(): desc="BAL Design"): y_hat = {key: items[idx] for key, items in y_can.items()} std = {key: items[idx] for key, items in std_can.items()} + + # print(y_hat) + # print(std) U_J_d[idx] = self.util_BayesianActiveDesign( y_hat, std, sigma2Dict, var) elif method.lower() == 'bayesoptdesign': NCandidate = candidates.shape[0] - U_J_d = np.zeros((NCandidate)) + U_J_d = np.zeros(NCandidate) for idx, X_can in tqdm(enumerate(candidates), ascii=True, desc="OptBayesianDesign"): U_J_d[idx] = self.util_BayesianDesign(X_can, X_MC, sigma2Dict, var) - return (index, -1 * U_J_d) + return index, -1 * U_J_d # ------------------------------------------------------------------------- def dual_annealing(self, method, Bounds, sigma2Dict, var, Run_No, verbose=False): """ - Exploration algorithim to find the optimum parameter space. + Exploration algorithm to find the optimum parameter space. Parameters ---------- @@ -1037,6 +1143,7 @@ class MetaModelEngine(): List of lower and upper boundaries of parameters. sigma2Dict : dict A dictionary containing the measurement errors (sigma^2). + var : unknown Run_No : int Run number. verbose : bool, optional @@ -1052,28 +1159,29 @@ class MetaModelEngine(): """ Model = self.Model - max_func_itr = self.MetaModel.ExpDesign.max_func_itr + max_func_itr = self.ExpDesign.max_func_itr - if method == 'VarOptDesign': + Res_Global = None + if method.lower() == 'varoptdesign': Res_Global = opt.dual_annealing(self.util_VarBasedDesign, bounds=Bounds, args=(Model, var), maxfun=max_func_itr) - elif method == 'BayesOptDesign': + elif method.lower() == 'bayesoptdesign': Res_Global = opt.dual_annealing(self.util_BayesianDesign, bounds=Bounds, args=(Model, sigma2Dict, var), maxfun=max_func_itr) if verbose: - print(f"global minimum: xmin = {Res_Global.x}, " + print(f"Global minimum: xmin = {Res_Global.x}, " f"f(xmin) = {Res_Global.fun:.6f}, nfev = {Res_Global.nfev}") - return (Run_No, Res_Global.x) + return Run_No, Res_Global.x # ------------------------------------------------------------------------- - def tradoff_weights(self, tradeoff_scheme, old_EDX, old_EDY): + def tradeoff_weights(self, tradeoff_scheme, old_EDX, old_EDY): """ Calculates weights for exploration scores based on the requested scheme: `None`, `equal`, `epsilon-decreasing` and `adaptive`. @@ -1081,7 +1189,7 @@ class MetaModelEngine(): `None`: No exploration. `equal`: Same weights for exploration and exploitation scores. `epsilon-decreasing`: Start with more exploration and increase the - influence of exploitation along the way with a exponential decay + influence of exploitation along the way with an exponential decay function `adaptive`: An adaptive method based on: Liu, Haitao, Jianfei Cai, and Yew-Soon Ong. "An adaptive sampling @@ -1105,6 +1213,8 @@ class MetaModelEngine(): Exploitation weight. """ + exploration_weight = None + if tradeoff_scheme is None: exploration_weight = 0 @@ -1114,24 +1224,24 @@ class MetaModelEngine(): elif tradeoff_scheme == 'epsilon-decreasing': # epsilon-decreasing scheme # Start with more exploration and increase the influence of - # exploitation along the way with a exponential decay function - initNSamples = self.MetaModel.ExpDesign.n_init_samples - n_max_samples = self.MetaModel.ExpDesign.n_max_samples + # exploitation along the way with an exponential decay function + initNSamples = self.ExpDesign.n_init_samples + n_max_samples = self.ExpDesign.n_max_samples - itrNumber = (self.MetaModel.ExpDesign.X.shape[0] - initNSamples) - itrNumber //= self.MetaModel.ExpDesign.n_new_samples + itrNumber = (self.ExpDesign.X.shape[0] - initNSamples) + itrNumber //= self.ExpDesign.n_new_samples - tau2 = -(n_max_samples-initNSamples-1) / np.log(1e-8) - exploration_weight = signal.exponential(n_max_samples-initNSamples, + tau2 = -(n_max_samples - initNSamples - 1) / np.log(1e-8) + exploration_weight = signal.exponential(n_max_samples - initNSamples, 0, tau2, False)[itrNumber] elif tradeoff_scheme == 'adaptive': # Extract itrNumber - initNSamples = self.MetaModel.ExpDesign.n_init_samples - n_max_samples = self.MetaModel.ExpDesign.n_max_samples - itrNumber = (self.MetaModel.ExpDesign.X.shape[0] - initNSamples) - itrNumber //= self.MetaModel.ExpDesign.n_new_samples + initNSamples = self.ExpDesign.n_init_samples + # n_max_samples = self.ExpDesign.n_max_samples + itrNumber = (self.ExpDesign.X.shape[0] - initNSamples) + itrNumber //= self.ExpDesign.n_new_samples if itrNumber == 0: exploration_weight = 0.5 @@ -1148,7 +1258,7 @@ class MetaModelEngine(): pce_y_prev = np.array(list(self._y_hat_prev.values()))[:, 0] mseCVError = mean_squared_error(pce_y_prev, y) - exploration_weight = min([0.5*mseError/mseCVError, 1]) + exploration_weight = min([0.5 * mseError / mseCVError, 1]) # Exploitation weight exploitation_weight = 1 - exploration_weight @@ -1156,7 +1266,7 @@ class MetaModelEngine(): return exploration_weight, exploitation_weight # ------------------------------------------------------------------------- - def opt_SeqDesign(self, sigma2, n_candidates=5, var='DKL'): + def choose_next_sample(self, sigma2=None, n_candidates=5, var='DKL'): """ Runs optimal sequential design. @@ -1168,7 +1278,7 @@ class MetaModelEngine(): n_candidates : int, optional Number of candidate samples. The default is 5. var : string, optional - Utility function. The default is None. + Utility function. The default is None. # TODO: default is set to DKL, not none Raises ------ @@ -1182,76 +1292,110 @@ class MetaModelEngine(): """ # Initialization - MetaModel = self.MetaModel - Bounds = MetaModel.bound_tuples - n_new_samples = MetaModel.ExpDesign.n_new_samples - explore_method = MetaModel.ExpDesign.explore_method - exploit_method = MetaModel.ExpDesign.exploit_method - n_cand_groups = MetaModel.ExpDesign.n_cand_groups - tradeoff_scheme = MetaModel.ExpDesign.tradeoff_scheme - - old_EDX = MetaModel.ExpDesign.X - old_EDY = MetaModel.ExpDesign.Y.copy() - ndim = MetaModel.ExpDesign.X.shape[1] - OutputNames = MetaModel.ModelObj.Output.names + Bounds = self.ExpDesign.bound_tuples + n_new_samples = self.ExpDesign.n_new_samples + explore_method = self.ExpDesign.explore_method + exploit_method = self.ExpDesign.exploit_method + n_cand_groups = self.ExpDesign.n_cand_groups + tradeoff_scheme = self.ExpDesign.tradeoff_scheme + + old_EDX = self.ExpDesign.X + old_EDY = self.ExpDesign.Y.copy() + ndim = self.ExpDesign.X.shape[1] + OutputNames = self.out_names # ----------------------------------------- # ----------- CUSTOMIZED METHODS ---------- # ----------------------------------------- # Utility function exploit_method provided by user if exploit_method.lower() == 'user': - - Xnew, filteredSamples = MetaModel.ExpDesign.ExploitFunction(self) + # TODO: is the exploit_method meant here? + if not hasattr(self.ExpDesign, 'ExploitFunction') or self.ExpDesign.ExploitFunction is None: + raise AttributeError( + 'Function `ExploitFunction` not given to the ExpDesign, thus cannor run user-defined sequential' + 'scheme') + # TODO: syntax does not fully match the rest - can test this?? + Xnew, filteredSamples = self.ExpDesign.ExploitFunction(self) print("\n") print("\nXnew:\n", Xnew) return Xnew, filteredSamples - # ----------------------------------------- - # ---------- EXPLORATION METHODS ---------- - # ----------------------------------------- + # Dual-Annealing works differently from the rest, so deal with this first + # Here exploration and exploitation are performed simulataneously if explore_method == 'dual annealing': # ------- EXPLORATION: OPTIMIZATION ------- import time start_time = time.time() # Divide the domain to subdomains - args = [] - subdomains = self.subdomain(Bounds, n_new_samples) - for i in range(n_new_samples): - args.append((exploit_method, subdomains[i], sigma2, var, i)) + subdomains = subdomain(Bounds, n_new_samples) # Multiprocessing - pool = multiprocessing.Pool(multiprocessing.cpu_count()) + if self.parallel: + args = [] + for i in range(n_new_samples): + args.append((exploit_method, subdomains[i], sigma2, var, i)) + pool = multiprocessing.Pool(multiprocessing.cpu_count()) - # With Pool.starmap_async() - results = pool.starmap_async(self.dual_annealing, args).get() + # With Pool.starmap_async() + results = pool.starmap_async(self.dual_annealing, args).get() - # Close the pool - pool.close() + # Close the pool + pool.close() + # Without multiprocessing + else: + results = [] + for i in range(n_new_samples): + results.append(self.dual_annealing(exploit_method, subdomains[i], sigma2, var, i)) + # New sample Xnew = np.array([results[i][1] for i in range(n_new_samples)]) - print("\nXnew:\n", Xnew) + # Computational cost elapsed_time = time.time() - start_time print("\n") - print(f"elapsed_time: {round(elapsed_time,2)} sec.") - print('-'*20) + print(f"Elapsed_time: {round(elapsed_time, 2)} sec.") + print('-' * 20) + + return Xnew, None + + # Generate needed Exploration class + explore = Exploration(self.ExpDesign, n_candidates) + explore.w = 100 # * ndim #500 # TODO: where does this value come from? + + # Select criterion (mc-intersite-proj-th, mc-intersite-proj) + explore.mc_criterion = 'mc-intersite-proj' - elif explore_method == 'LOOCV': + # Generate the candidate samples + # TODO: here use the sampling method provided by the expdesign? + # sampling_method = self.ExpDesign.sampling_method + + # TODO: changed this from 'random' for LOOCV + # TODO: these are commented out as they are not used !? + # if explore_method == 'LOOCV': + # allCandidates = self.ExpDesign.generate_samples(n_candidates, + # sampling_method) + # else: + # allCandidates, scoreExploration = explore.get_exploration_samples() + + # ----------------------------------------- + # ---------- EXPLORATION METHODS ---------- + # ----------------------------------------- + if explore_method == 'LOOCV': # ----------------------------------------------------------------- # TODO: LOOCV model construnction based on Feng et al. (2020) # 'LOOCV': # Initilize the ExploitScore array # Generate random samples - allCandidates = MetaModel.ExpDesign.generate_samples(n_candidates, - 'random') + allCandidates = self.ExpDesign.generate_samples(n_candidates, + 'random') # Construct error model based on LCerror - errorModel = MetaModel.create_ModelError(old_EDX, self.LCerror) + errorModel = self.MetaModel.create_ModelError(old_EDX, self.LCerror) self.errorModel.append(copy(errorModel)) # Evaluate the error models for allCandidates @@ -1266,7 +1410,7 @@ class MetaModelEngine(): else: # ------- EXPLORATION: SPACE-FILLING DESIGN ------- # Generate candidate samples from Exploration class - explore = Exploration(MetaModel, n_candidates) + explore = Exploration(self.ExpDesign, n_candidates) explore.w = 100 # * ndim #500 # Select criterion (mc-intersite-proj-th, mc-intersite-proj) explore.mc_criterion = 'mc-intersite-proj' @@ -1276,6 +1420,20 @@ class MetaModelEngine(): if ndim == 2: def plotter(points, allCandidates, Method, scoreExploration=None): + """ + unknown + + Parameters + ---------- + points + allCandidates + Method + scoreExploration + + Returns + ------- + + """ if Method == 'Voronoi': from scipy.spatial import Voronoi, voronoi_plot_2d vor = Voronoi(points) @@ -1289,7 +1447,7 @@ class MetaModelEngine(): ax1.scatter(allCandidates[:, 0], allCandidates[:, 1], s=10, c='b', marker="o", label='Design candidates') for i in range(points.shape[0]): - txt = 'p'+str(i+1) + txt = 'p' + str(i + 1) ax1.annotate(txt, (points[i, 0], points[i, 1])) if scoreExploration is not None: for i in range(allCandidates.shape[0]): @@ -1305,44 +1463,44 @@ class MetaModelEngine(): # ----------------------------------------- # --------- EXPLOITATION METHODS ---------- # ----------------------------------------- - if exploit_method == 'BayesOptDesign' or\ - exploit_method == 'BayesActDesign': + if exploit_method.lower() == 'bayesoptdesign' or \ + exploit_method.lower() == 'bayesactdesign': # ------- Calculate Exoploration weight ------- # Compute exploration weight based on trade off scheme - explore_w, exploit_w = self.tradoff_weights(tradeoff_scheme, - old_EDX, - old_EDY) + explore_w, exploit_w = self.tradeoff_weights(tradeoff_scheme, + old_EDX, + old_EDY) print(f"\n Exploration weight={explore_w:0.3f} " f"Exploitation weight={exploit_w:0.3f}\n") # ------- EXPLOITATION: BayesOptDesign & ActiveLearning ------- if explore_w != 1.0: + # Check if all needed properties are set + if not hasattr(self.ExpDesign, 'max_func_itr'): + raise AttributeError('max_func_itr not given to the experimental design') # Create a sample pool for rejection sampling MCsize = 15000 - X_MC = MetaModel.ExpDesign.generate_samples(MCsize, 'random') - candidates = MetaModel.ExpDesign.generate_samples( - MetaModel.ExpDesign.max_func_itr, 'latin_hypercube') + X_MC = self.ExpDesign.generate_samples(MCsize, 'random') + candidates = self.ExpDesign.generate_samples( + n_candidates, 'latin_hypercube') # Split the candidates in groups for multiprocessing split_cand = np.array_split( candidates, n_cand_groups, axis=0 - ) - - results = Parallel(n_jobs=-1, backend='multiprocessing')( + ) + # print(candidates) + # print(split_cand) + if self.parallel: + results = Parallel(n_jobs=-1, backend='multiprocessing')( delayed(self.run_util_func)( exploit_method, split_cand[i], i, sigma2, var, X_MC) for i in range(n_cand_groups)) - # out = map(self.run_util_func, - # [exploit_method]*n_cand_groups, - # split_cand, - # range(n_cand_groups), - # [sigma2] * n_cand_groups, - # [var] * n_cand_groups, - # [X_MC] * n_cand_groups - # ) - # results = list(out) + else: + results = [] + for i in range(n_cand_groups): + results.append(self.run_util_func(exploit_method, split_cand[i], i, sigma2, var, X_MC)) # Retrieve the results and append them U_J_d = np.concatenate([results[NofE][1] for NofE in @@ -1357,18 +1515,6 @@ class MetaModelEngine(): if explore_method == 'Voronoi': U_J_d = np.mean(U_J_d.reshape(-1, n_candidates), axis=1) - # create surrogate model for U_J_d - # from sklearn.preprocessing import MinMaxScaler - # # Take care of inf entries - # good_indices = [i for i, arr in enumerate(U_J_d) - # if np.isfinite(arr).all()] - # scaler = MinMaxScaler() - # X_S = scaler.fit_transform(candidates[good_indices]) - # gp = MetaModel.gaussian_process_emulator( - # X_S, U_J_d[good_indices], autoSelect=False - # ) - # U_J_d = gp.predict(scaler.transform(allCandidates)) - # Normalize U_J_d norm_U_J_d = U_J_d / np.sum(U_J_d) else: @@ -1376,6 +1522,30 @@ class MetaModelEngine(): # ------- Calculate Total score ------- # ------- Trade off between EXPLORATION & EXPLOITATION ------- + # Accumulate the samples + finalCandidates = np.concatenate((allCandidates, candidates), axis=0) + finalCandidates = np.unique(finalCandidates, axis=0) + + # Calculations take into account both exploration and exploitation + # samples without duplicates + totalScore = np.zeros(finalCandidates.shape[0]) + # self.totalScore = totalScore + + for cand_idx in range(finalCandidates.shape[0]): + # find candidate indices + idx1 = np.where(allCandidates == finalCandidates[cand_idx])[0] + idx2 = np.where(candidates == finalCandidates[cand_idx])[0] + + # exploration + if idx1.shape[0] > 0: + idx1 = idx1[0] + totalScore[cand_idx] += explore_w * scoreExploration[idx1] + + # exploitation + if idx2.shape[0] > 0: + idx2 = idx2[0] + totalScore[cand_idx] += exploit_w * norm_U_J_d[idx2] + # Total score totalScore = exploit_w * norm_U_J_d totalScore += explore_w * scoreExploration @@ -1405,26 +1575,31 @@ class MetaModelEngine(): # select the requested number of samples Xnew[i] = newSamples[np.argmax(maxminScore)] else: - Xnew = allCandidates[sorted_idxtotalScore[:n_new_samples]] + # Changed this from allCandiates to full set of candidates + # TODO: still not changed for e.g. 'Voronoi' + Xnew = finalCandidates[sorted_idxtotalScore[:n_new_samples]] + - elif exploit_method == 'VarOptDesign': + elif exploit_method.lower() == 'varoptdesign': # ------- EXPLOITATION: VarOptDesign ------- UtilMethod = var # ------- Calculate Exoploration weight ------- # Compute exploration weight based on trade off scheme - explore_w, exploit_w = self.tradoff_weights(tradeoff_scheme, - old_EDX, - old_EDY) + explore_w, exploit_w = self.tradeoff_weights(tradeoff_scheme, + old_EDX, + old_EDY) print(f"\nweightExploration={explore_w:0.3f} " f"weightExploitation={exploit_w:0.3f}") # Generate candidate samples from Exploration class nMeasurement = old_EDY[OutputNames[0]].shape[1] + # print(UtilMethod) + # Find sensitive region if UtilMethod == 'LOOCV': - LCerror = MetaModel.LCerror + LCerror = self.MetaModel.LCerror allModifiedLOO = np.zeros((len(old_EDX), len(OutputNames), nMeasurement)) for y_idx, y_key in enumerate(OutputNames): @@ -1433,11 +1608,12 @@ class MetaModelEngine(): LCerror[y_key][key]) ExploitScore = np.max(np.max(allModifiedLOO, axis=1), axis=1) + # print(allModifiedLOO.shape) elif UtilMethod in ['EIGF', 'ALM']: # ----- All other in ['EIGF', 'ALM'] ----- # Initilize the ExploitScore array - ExploitScore = np.zeros((len(old_EDX), len(OutputNames))) + # ExploitScore = np.zeros((len(old_EDX), len(OutputNames))) # Split the candidates in groups for multiprocessing if explore_method != 'Voronoi': @@ -1466,14 +1642,6 @@ class MetaModelEngine(): # Close the pool pool.close() - # out = map(self.run_util_func, - # [exploit_method]*len(goodSampleIdx), - # split_cand, - # range(len(goodSampleIdx)), - # [sigma2] * len(goodSampleIdx), - # [var] * len(goodSampleIdx) - # ) - # results = list(out) # Retrieve the results and append them if explore_method == 'Voronoi': @@ -1495,6 +1663,9 @@ class MetaModelEngine(): # Normalize U_J_d ExploitScore = ExploitScore / np.sum(ExploitScore) totalScore = exploit_w * ExploitScore + # print(totalScore.shape) + # print(explore_w) + # print(scoreExploration.shape) totalScore += explore_w * scoreExploration temp = totalScore.copy() @@ -1516,7 +1687,7 @@ class MetaModelEngine(): # select the requested number of samples Xnew[i] = newSamples[np.argmax(maxminScore)] - elif exploit_method == 'alphabetic': + elif exploit_method.lower() == 'alphabetic': # ------- EXPLOITATION: ALPHABETIC ------- Xnew = self.util_AlphOptDesign(allCandidates, var) @@ -1538,9 +1709,10 @@ class MetaModelEngine(): raise NameError('The requested design method is not available.') print("\n") - print("\nRun No. {}:".format(old_EDX.shape[0]+1)) + print("\nRun No. {}:".format(old_EDX.shape[0] + 1)) print("Xnew:\n", Xnew) + # TODO: why does it also return None? return Xnew, None # ------------------------------------------------------------------------- @@ -1555,7 +1727,7 @@ class MetaModelEngine(): Arguments --------- - NCandidate : int + candidates : int? Number of candidate points to be searched var : string @@ -1566,40 +1738,41 @@ class MetaModelEngine(): X_new : array of shape (1, n_params) The new sampling location in the input space. """ - MetaModelOrig = self - Model = self.Model + MetaModelOrig = self # TODO: this doesn't fully seem correct? n_new_samples = MetaModelOrig.ExpDesign.n_new_samples NCandidate = candidates.shape[0] # TODO: Loop over outputs - OutputName = Model.Output.names[0] + OutputName = self.out_names[0] # To avoid changes ub original aPCE object - MetaModel = deepcopy(MetaModelOrig) + # MetaModel = deepcopy(MetaModelOrig) # Old Experimental design - oldExpDesignX = MetaModel.ExpDesign.X + oldExpDesignX = self.ExpDesign.X # TODO: Only one psi can be selected. # Suggestion: Go for the one with the highest LOO error - Scores = list(MetaModel.score_dict[OutputName].values()) - ModifiedLOO = [1-score for score in Scores] + # TODO: this is just a patch, need to look at again! + Scores = list(self.MetaModel.score_dict['b_1'][OutputName].values()) + ModifiedLOO = [1 - score for score in Scores] outIdx = np.argmax(ModifiedLOO) # Initialize Phi to save the criterion's values - Phi = np.zeros((NCandidate)) + Phi = np.zeros(NCandidate) - BasisIndices = MetaModelOrig.basis_dict[OutputName]["y_"+str(outIdx+1)] + # TODO: also patched here + BasisIndices = self.MetaModel.basis_dict['b_1'][OutputName]["y_" + str(outIdx + 1)] P = len(BasisIndices) # ------ Old Psi ------------ - univ_p_val = MetaModelOrig.univ_basis_vals(oldExpDesignX) - Psi = MetaModelOrig.create_psi(BasisIndices, univ_p_val) + univ_p_val = self.MetaModel.univ_basis_vals(oldExpDesignX) + Psi = self.MetaModel.create_psi(BasisIndices, univ_p_val) # ------ New candidates (Psi_c) ------------ # Assemble Psi_c - univ_p_val_c = self.univ_basis_vals(candidates) - Psi_c = self.create_psi(BasisIndices, univ_p_val_c) + univ_p_val_c = self.MetaModel.univ_basis_vals(candidates) + Psi_c = self.MetaModel.create_psi(BasisIndices, univ_p_val_c) for idx in range(NCandidate): @@ -1608,10 +1781,9 @@ class MetaModelEngine(): # Information matrix PsiTPsi = np.dot(Psi_cand.T, Psi_cand) - M = PsiTPsi / (len(oldExpDesignX)+1) + M = PsiTPsi / (len(oldExpDesignX) + 1) - if np.linalg.cond(PsiTPsi) > 1e-12 \ - and np.linalg.cond(PsiTPsi) < 1 / sys.float_info.epsilon: + if 1e-12 < np.linalg.cond(PsiTPsi) < 1 / sys.float_info.epsilon: # faster invM = linalg.solve(M, sparse.eye(PsiTPsi.shape[0]).toarray()) else: @@ -1622,20 +1794,21 @@ class MetaModelEngine(): # Optimality criteria according to Section 4.5.1 in Ref. # D-Opt - if var == 'D-Opt': - Phi[idx] = (np.linalg.det(invM)) ** (1/P) + if var.lower() == 'd-opt': + Phi[idx] = (np.linalg.det(invM)) ** (1 / P) # A-Opt - elif var == 'A-Opt': + elif var.lower() == 'a-opt': Phi[idx] = np.trace(invM) # K-Opt - elif var == 'K-Opt': + elif var.lower() == 'k-opt': Phi[idx] = np.linalg.cond(M) else: + # print(var.lower()) raise Exception('The optimality criterion you requested has ' - 'not been implemented yet!') + 'not been implemented yet!') # find an optimal point subset to add to the initial design # by minimization of the Phi @@ -1647,16 +1820,40 @@ class MetaModelEngine(): return Xnew # ------------------------------------------------------------------------- - def __normpdf(self, y_hat_pce, std_pce, obs_data, total_sigma2s, - rmse=None): + def _normpdf(self, y_hat_pce, std_pce, obs_data, total_sigma2s, + rmse=None): + """ + Calculated gaussian likelihood for given y+std based on given obs+sigma + # TODO: is this understanding correct? + + Parameters + ---------- + y_hat_pce : dict of 2d np arrays + Mean output of the surrogate. + std_pce : dict of 2d np arrays + Standard deviation output of the surrogate. + obs_data : dict of 1d np arrays + Observed data. + total_sigma2s : pandas dataframe, matches obs_data + Estimated uncertainty for the observed data. + rmse : dict, optional + RMSE values from validation of the surrogate. The default is None. + + Returns + ------- + likelihoods : dict of float + The likelihood for each surrogate eval in y_hat_pce compared to the + observations (?). + + """ - Model = self.Model likelihoods = 1.0 # Loop over the outputs - for idx, out in enumerate(Model.Output.names): + for idx, out in enumerate(self.out_names): # (Meta)Model Output + # print(y_hat_pce[out]) nsamples, nout = y_hat_pce[out].shape # Prepare data and remove NaN @@ -1671,37 +1868,37 @@ class MetaModelEngine(): # Surrogate error if valid dataset is given. if rmse is not None: - tot_sigma2s += rmse[out]**2 + tot_sigma2s += rmse[out] ** 2 else: - tot_sigma2s += np.mean(std_pce[out])**2 + tot_sigma2s += np.mean(std_pce[out]) ** 2 likelihoods *= stats.multivariate_normal.pdf( y_hat_pce[out], data, np.diag(tot_sigma2s), allow_singular=True) + # TODO: remove this here self.Likelihoods = likelihoods return likelihoods # ------------------------------------------------------------------------- - def __corr_factor_BME(self, obs_data, total_sigma2s, logBME): + def _corr_factor_BME(self, obs_data, total_sigma2s, logBME): """ Calculates the correction factor for BMEs. """ MetaModel = self.MetaModel - samples = MetaModel.ExpDesign.X # valid_samples - model_outputs = MetaModel.ExpDesign.Y # valid_model_runs - Model = MetaModel.ModelObj + samples = self.ExpDesign.X # valid_samples + model_outputs = self.ExpDesign.Y # valid_model_runs n_samples = samples.shape[0] # Extract the requested model outputs for likelihood calulation - output_names = Model.Output.names + output_names = self.out_names # TODO: Evaluate MetaModel on the experimental design and ValidSet OutputRS, stdOutputRS = MetaModel.eval_metamodel(samples=samples) - logLik_data = np.zeros((n_samples)) - logLik_model = np.zeros((n_samples)) + logLik_data = np.zeros(n_samples) + logLik_model = np.zeros(n_samples) # Loop over the outputs for idx, out in enumerate(output_names): @@ -1722,7 +1919,6 @@ class MetaModelEngine(): covMatrix_data = np.diag(tot_sigma2s) for i, sample in enumerate(samples): - # Simulation run y_m = model_outputs[out][i] @@ -1731,62 +1927,51 @@ class MetaModelEngine(): # CovMatrix with the surrogate error # covMatrix = np.diag(stdOutputRS[out][i]**2) - covMatrix = np.diag((y_m-y_m_hat)**2) + # covMatrix = np.diag((y_m - y_m_hat) ** 2) covMatrix = np.diag( - np.mean((model_outputs[out]-OutputRS[out]), axis=0)**2 - ) + np.mean((model_outputs[out] - OutputRS[out]), axis=0) ** 2 + ) # Compute likelilhood output vs data - logLik_data[i] += self.__logpdf( + logLik_data[i] += logpdf( y_m_hat, data, covMatrix_data - ) + ) # Compute likelilhood output vs surrogate - logLik_model[i] += self.__logpdf(y_m_hat, y_m, covMatrix) + logLik_model[i] += logpdf(y_m_hat, y_m, covMatrix) # Weight logLik_data -= logBME - weights = np.exp(logLik_model+logLik_data) + weights = np.exp(logLik_model + logLik_data) return np.log(np.mean(weights)) # ------------------------------------------------------------------------- - def __logpdf(self, x, mean, cov): + def _posteriorPlot(self, posterior, par_names, key): """ - computes the likelihood based on a multivariate normal distribution. + Plot the posterior of a specific key as a corner plot Parameters ---------- - x : TYPE - DESCRIPTION. - mean : array_like - Observation data. - cov : 2d array - Covariance matrix of the distribution. + posterior : 2d np.array + Samples of the posterior. + par_names : list of strings + List of the parameter names. + key : string + Output key that this posterior belongs to. Returns ------- - log_lik : float - Log likelihood. + figPosterior : corner.corner + Plot of the posterior. """ - n = len(mean) - L = linalg.cholesky(cov, lower=True) - beta = np.sum(np.log(np.diag(L))) - dev = x - mean - alpha = dev.dot(linalg.cho_solve((L, True), dev)) - log_lik = -0.5 * alpha - beta - n / 2. * np.log(2 * np.pi) - - return log_lik - - # ------------------------------------------------------------------------- - def __posteriorPlot(self, posterior, par_names, key): # Initialization - newpath = (r'Outputs_SeqPosteriorComparison/posterior') + newpath = r'Outputs_SeqPosteriorComparison/posterior' os.makedirs(newpath, exist_ok=True) - bound_tuples = self.MetaModel.bound_tuples + bound_tuples = self.ExpDesign.bound_tuples n_params = len(par_names) font_size = 40 if n_params == 2: @@ -1826,57 +2011,36 @@ class MetaModelEngine(): return figPosterior # ------------------------------------------------------------------------- - def __hellinger_distance(self, P, Q): + def _BME_Calculator(self, obs_data, sigma2Dict, rmse=None): """ - Hellinger distance between two continuous distributions. - - The maximum distance 1 is achieved when P assigns probability zero to - every set to which Q assigns a positive probability, and vice versa. - 0 (identical) and 1 (maximally different) + This function computes the Bayesian model evidence (BME) via Monte + Carlo integration. Parameters ---------- - P : array - Reference likelihood. - Q : array - Estimated likelihood. + obs_data : dict of 1d np arrays + Observed data. + sigma2Dict : pandas dataframe, matches obs_data + Estimated uncertainty for the observed data. + rmse : dict of floats, optional + RMSE values for each output-key. The dafault is None. Returns ------- - float - Hellinger distance of two distributions. - - """ - mu1 = P.mean() - Sigma1 = np.std(P) - - mu2 = Q.mean() - Sigma2 = np.std(Q) - - term1 = np.sqrt(2*Sigma1*Sigma2 / (Sigma1**2 + Sigma2**2)) - - term2 = np.exp(-.25 * (mu1 - mu2)**2 / (Sigma1**2 + Sigma2**2)) - - H_squared = 1 - term1 * term2 - - return np.sqrt(H_squared) - - # ------------------------------------------------------------------------- - def __BME_Calculator(self, MetaModel, obs_data, sigma2Dict, rmse=None): - """ - This function computes the Bayesian model evidence (BME) via Monte - Carlo integration. - + (logBME, KLD, X_Posterior, Likelihoods, distHellinger) + """ # Initializations - if hasattr(MetaModel, 'valid_likelihoods'): - valid_likelihoods = MetaModel.valid_likelihoods + # TODO: this just does not make sense, recheck from old commits + if self.valid_likelihoods is not None: + valid_likelihoods = self.valid_likelihoods else: valid_likelihoods = [] + valid_likelihoods = np.array(valid_likelihoods) - post_snapshot = MetaModel.ExpDesign.post_snapshot - if post_snapshot or len(valid_likelihoods) != 0: - newpath = (r'Outputs_SeqPosteriorComparison/likelihood_vs_ref') + post_snapshot = self.ExpDesign.post_snapshot + if post_snapshot or valid_likelihoods.shape[0] != 0: + newpath = r'Outputs_SeqPosteriorComparison/likelihood_vs_ref' os.makedirs(newpath, exist_ok=True) SamplingMethod = 'random' @@ -1887,21 +2051,21 @@ class MetaModelEngine(): while (ESS > MCsize) or (ESS < 1): # Generate samples for Monte Carlo simulation - X_MC = MetaModel.ExpDesign.generate_samples( + X_MC = self.ExpDesign.generate_samples( MCsize, SamplingMethod - ) + ) # Monte Carlo simulation for the candidate design - Y_MC, std_MC = MetaModel.eval_metamodel(samples=X_MC) + Y_MC, std_MC = self.MetaModel.eval_metamodel(samples=X_MC) # Likelihood computation (Comparison of data and # simulation results via PCE with candidate design) - Likelihoods = self.__normpdf( + Likelihoods = self._normpdf( Y_MC, std_MC, obs_data, sigma2Dict, rmse - ) + ) # Check the Effective Sample Size (1000<ESS<MCsize) - ESS = 1 / np.sum(np.square(Likelihoods/np.sum(Likelihoods))) + ESS = 1 / np.sum(np.square(Likelihoods / np.sum(Likelihoods))) # Enlarge sample size if it doesn't fulfill the criteria if (ESS > MCsize) or (ESS < 1): @@ -1914,7 +2078,7 @@ class MetaModelEngine(): unif = np.random.rand(1, MCsize)[0] # Reject the poorly performed prior - accepted = (Likelihoods/np.max(Likelihoods)) >= unif + accepted = (Likelihoods / np.max(Likelihoods)) >= unif X_Posterior = X_MC[accepted] # ------------------------------------------------------------ @@ -1930,26 +2094,29 @@ class MetaModelEngine(): postExpLikelihoods = np.mean(np.log(Likelihoods[accepted])) # Posterior-based expectation of prior densities - postExpPrior = np.mean( - np.log(MetaModel.ExpDesign.JDist.pdf(X_Posterior.T)) - ) + # TODO: this is commented out, as it is not used again + # postExpPrior = np.mean( + # np.log(self.ExpDesign.JDist.pdf(X_Posterior.T)) + # ) # Calculate Kullback-Leibler Divergence # KLD = np.mean(np.log(Likelihoods[Likelihoods!=0])- logBME) KLD = postExpLikelihoods - logBME # Information Entropy based on Entropy paper Eq. 38 - infEntropy = logBME - postExpPrior - postExpLikelihoods + # infEntropy = logBME - postExpPrior - postExpLikelihoods # If post_snapshot is True, plot likelihood vs refrence if post_snapshot or valid_likelihoods: # Hellinger distance - ref_like = np.log(valid_likelihoods[valid_likelihoods > 0]) + valid_likelihoods = np.array(valid_likelihoods) + ref_like = np.log(valid_likelihoods[(valid_likelihoods > 0)]) est_like = np.log(Likelihoods[Likelihoods > 0]) - distHellinger = self.__hellinger_distance(ref_like, est_like) + distHellinger = hellinger_distance(ref_like, est_like) idx = len([name for name in os.listdir(newpath) if 'Likelihoods_' in name and os.path.isfile(os.path.join(newpath, name))]) + fig, ax = plt.subplots() try: sns.kdeplot(np.log(valid_likelihoods[valid_likelihoods > 0]), @@ -1975,11 +2142,9 @@ class MetaModelEngine(): distHellinger = 0.0 # Bayesian inference with Emulator only for 2D problem - if post_snapshot and MetaModel.n_params == 2 and not idx % 5: - from bayes_inference.bayes_inference import BayesInference - from bayes_inference.discrepancy import Discrepancy - import pandas as pd - BayesOpts = BayesInference(MetaModel) + if post_snapshot and self.MetaModel.n_params == 2 and not idx % 5: + BayesOpts = BayesInference(self) + BayesOpts.emulator = True BayesOpts.plot_post_pred = False @@ -1992,155 +2157,95 @@ class MetaModelEngine(): 'n_walkers': 30, 'moves': emcee.moves.KDEMove(), 'verbose': False - } + } # ----- Define the discrepancy model ------- - obs_data = pd.DataFrame(obs_data, columns=self.Model.Output.names) + # TODO: check with Farid if this first line is how it should be + BayesOpts.measured_data = obs_data + obs_data = pd.DataFrame(obs_data, columns=self.out_names) BayesOpts.measurement_error = obs_data + # TODO: shouldn't the uncertainty be sigma2Dict instead of obs_data? # # -- (Option B) -- DiscrepancyOpts = Discrepancy('') DiscrepancyOpts.type = 'Gaussian' - DiscrepancyOpts.parameters = obs_data**2 + DiscrepancyOpts.parameters = obs_data ** 2 BayesOpts.Discrepancy = DiscrepancyOpts # Start the calibration/inference Bayes_PCE = BayesOpts.create_inference() X_Posterior = Bayes_PCE.posterior_df.values - return (logBME, KLD, X_Posterior, Likelihoods, distHellinger) + return logBME, KLD, X_Posterior, Likelihoods, distHellinger # ------------------------------------------------------------------------- - def __validError(self, MetaModel): + def _validError(self): + """ + Evaluate the metamodel on the validation samples and calculate the + error against the corresponding model runs - # MetaModel = self.MetaModel - Model = MetaModel.ModelObj - OutputName = Model.Output.names + Returns + ------- + rms_error : dict + RMSE for each validation run. + valid_error : dict + Normed (?)RMSE for each validation run. + """ # Extract the original model with the generated samples - valid_samples = MetaModel.valid_samples - valid_model_runs = MetaModel.valid_model_runs + valid_model_runs = self.ExpDesign.valid_model_runs # Run the PCE model with the generated samples - valid_PCE_runs, _ = MetaModel.eval_metamodel(samples=valid_samples) + valid_PCE_runs, _ = self.MetaModel.eval_metamodel(samples=self.ExpDesign.valid_samples) rms_error = {} valid_error = {} # Loop over the keys and compute RMSE error. - for key in OutputName: + for key in self.out_names: rms_error[key] = mean_squared_error( valid_model_runs[key], valid_PCE_runs[key], multioutput='raw_values', sample_weight=None, squared=False) # Validation error - valid_error[key] = (rms_error[key]**2) + valid_error[key] = (rms_error[key] ** 2) valid_error[key] /= np.var(valid_model_runs[key], ddof=1, axis=0) # Print a report table print("\n>>>>> Updated Errors of {} <<<<<".format(key)) print("\nIndex | RMSE | Validation Error") - print('-'*35) - print('\n'.join(f'{i+1} | {k:.3e} | {j:.3e}' for i, (k, j) + print('-' * 35) + print('\n'.join(f'{i + 1} | {k:.3e} | {j:.3e}' for i, (k, j) in enumerate(zip(rms_error[key], valid_error[key])))) return rms_error, valid_error # ------------------------------------------------------------------------- - def __error_Mean_Std(self): + def _error_Mean_Std(self): + """ + Calculates the error in the overall mean and std approximation of the + surrogate against the mc-reference provided to the model. + This can only be applied to metamodels of polynomial type - MetaModel = self.MetaModel - # Extract the mean and std provided by user - df_MCReference = MetaModel.ModelObj.mc_reference + Returns + ------- + RMSE_Mean : float + RMSE of the means + RMSE_std : float + RMSE of the standard deviations + """ # Compute the mean and std based on the MetaModel - pce_means, pce_stds = self._compute_pce_moments(MetaModel) + pce_means, pce_stds = self.MetaModel._compute_pce_moments() # Compute the root mean squared error - for output in MetaModel.ModelObj.Output.names: - + for output in self.out_names: # Compute the error between mean and std of MetaModel and OrigModel RMSE_Mean = mean_squared_error( - df_MCReference['mean'], pce_means[output], squared=False - ) + self.Model.mc_reference['mean'], pce_means[output], squared=False + ) RMSE_std = mean_squared_error( - df_MCReference['std'], pce_means[output], squared=False - ) + self.Model.mc_reference['std'], pce_stds[output], squared=False + ) return RMSE_Mean, RMSE_std - - # ------------------------------------------------------------------------- - def _compute_pce_moments(self, MetaModel): - """ - Computes the first two moments using the PCE-based meta-model. - - Returns - ------- - pce_means: dict - The first moment (mean) of the surrogate. - pce_stds: dict - The second moment (standard deviation) of the surrogate. - - """ - outputs = MetaModel.ModelObj.Output.names - pce_means_b = {} - pce_stds_b = {} - - # Loop over bootstrap iterations - for b_i in range(MetaModel.n_bootstrap_itrs): - # Loop over the metamodels - coeffs_dicts = MetaModel.coeffs_dict[f'b_{b_i+1}'].items() - means = {} - stds = {} - for output, coef_dict in coeffs_dicts: - - pce_mean = np.zeros((len(coef_dict))) - pce_var = np.zeros((len(coef_dict))) - - for index, values in coef_dict.items(): - idx = int(index.split('_')[1]) - 1 - coeffs = MetaModel.coeffs_dict[f'b_{b_i+1}'][output][index] - - # Mean = c_0 - if coeffs[0] != 0: - pce_mean[idx] = coeffs[0] - else: - clf_poly = MetaModel.clf_poly[f'b_{b_i+1}'][output] - pce_mean[idx] = clf_poly[index].intercept_ - # Var = sum(coeffs[1:]**2) - pce_var[idx] = np.sum(np.square(coeffs[1:])) - - # Save predictions for each output - if MetaModel.dim_red_method.lower() == 'pca': - PCA = MetaModel.pca[f'b_{b_i+1}'][output] - means[output] = PCA.inverse_transform(pce_mean) - stds[output] = PCA.inverse_transform(np.sqrt(pce_var)) - else: - means[output] = pce_mean - stds[output] = np.sqrt(pce_var) - - # Save predictions for each bootstrap iteration - pce_means_b[b_i] = means - pce_stds_b[b_i] = stds - - # Change the order of nesting - mean_all = {} - for i in sorted(pce_means_b): - for k, v in pce_means_b[i].items(): - if k not in mean_all: - mean_all[k] = [None] * len(pce_means_b) - mean_all[k][i] = v - std_all = {} - for i in sorted(pce_stds_b): - for k, v in pce_stds_b[i].items(): - if k not in std_all: - std_all[k] = [None] * len(pce_stds_b) - std_all[k][i] = v - - # Back transformation if PCA is selected. - pce_means, pce_stds = {}, {} - for output in outputs: - pce_means[output] = np.mean(mean_all[output], axis=0) - pce_stds[output] = np.mean(std_all[output], axis=0) - - return pce_means, pce_stds diff --git a/src/bayesvalidrox/surrogate_models/exp_designs.py b/src/bayesvalidrox/surrogate_models/exp_designs.py index a078aec9c19c5a85a637ba50d02c48459ceea6d3..ce1745903c776049c797e5585b60d45463d93325 100644 --- a/src/bayesvalidrox/surrogate_models/exp_designs.py +++ b/src/bayesvalidrox/surrogate_models/exp_designs.py @@ -1,31 +1,61 @@ #!/usr/bin/env python3 # -*- coding: utf-8 -*- +""" +Experimental design with associated sampling methods +""" -import numpy as np -import math import itertools +import math + import chaospy -import scipy.stats as st -from tqdm import tqdm +import h5py +import numpy as np from .apoly_construction import apoly_construction +from .input_space import InputSpace -class ExpDesigns: +# ------------------------------------------------------------------------- +def check_ranges(theta, ranges): + """ + This function checks if theta lies in the given ranges. + + Parameters + ---------- + theta : array + Proposed parameter set. + ranges : nested list + The parameter ranges. + + Returns + ------- + c : bool + If it lies in the given range, it returns True else False. + + """ + c = True + # traverse in the list1 + for i, bounds in enumerate(ranges): + x = theta[i] + # condition check + if x < bounds[0] or x > bounds[1]: + c = False + return c + return c + + +class ExpDesigns(InputSpace): """ This class generates samples from the prescribed marginals for the model parameters using the `Input` object. Attributes ---------- - Input : obj + input_object : obj Input object containing the parameter marginals, i.e. name, distribution type and distribution parameters or available raw data. - method : str - Type of the experimental design. The default is `'normal'`. Other - option is `'sequential'`. - meta_Model : str - Type of the meta_model. + meta_Model_type : str + Type of the meta_Model_type. sampling_method : str Name of the sampling method for the experimental design. The following sampling method are supported: @@ -112,17 +142,18 @@ class ExpDesigns: - K-Opt (K-Optimality) """ - def __init__(self, Input, method='normal', meta_Model='pce', - sampling_method='random', hdf5_file=None, - n_new_samples=1, n_max_samples=None, mod_LOO_threshold=1e-16, - tradeoff_scheme=None, n_canddidate=1, explore_method='random', - exploit_method='Space-filling', util_func='Space-filling', - n_cand_groups=4, n_replication=1, post_snapshot=False, - step_snapshot=1, max_a_post=[], adapt_verbose=False): - - self.InputObj = Input - self.method = method - self.meta_Model = meta_Model + def __init__(self, input_object, meta_Model_type='pce', sampling_method='random', hdf5_file=None, + n_new_samples=1, n_max_samples=None, mod_LOO_threshold=1e-16, tradeoff_scheme=None, n_canddidate=1, + explore_method='random', exploit_method='Space-filling', util_func='Space-filling', n_cand_groups=4, + n_replication=1, post_snapshot=False, step_snapshot=1, max_a_post=None, adapt_verbose=False, + max_func_itr=1): + + super().__init__(input_object, meta_Model_type) + if max_a_post is None: + max_a_post = [] + + self.InputObj = input_object + self.meta_Model_type = meta_Model_type self.sampling_method = sampling_method self.hdf5_file = hdf5_file self.n_new_samples = n_new_samples @@ -139,10 +170,21 @@ class ExpDesigns: self.step_snapshot = step_snapshot self.max_a_post = max_a_post self.adapt_verbose = adapt_verbose + self.max_func_itr = max_func_itr + + # Other + self.apce = None + self.n_init_samples = None + self.n_samples = None + self.ndim = None + self.X = None + self.Y = None + + # Init + self.check_valid_inputs() # ------------------------------------------------------------------------- - def generate_samples(self, n_samples, sampling_method='random', - transform=False): + def generate_samples(self, n_samples, sampling_method='random'): """ Generates samples with given sampling method @@ -152,9 +194,6 @@ class ExpDesigns: Number of requested samples. sampling_method : str, optional Sampling method. The default is `'random'`. - transform : bool, optional - Transformation via an isoprobabilistic transformation method. The - default is `False`. Returns ------- @@ -165,15 +204,14 @@ class ExpDesigns: try: samples = chaospy.generate_samples( int(n_samples), domain=self.origJDist, rule=sampling_method - ) + ) except: samples = self.random_sampler(int(n_samples)).T return samples.T # ------------------------------------------------------------------------- - def generate_ED(self, n_samples, sampling_method='random', transform=False, - max_pce_deg=None): + def generate_ED(self, n_samples, max_pce_deg=None): """ Generates experimental designs (training set) with the given method. @@ -181,49 +219,33 @@ class ExpDesigns: ---------- n_samples : int Number of requested training points. - sampling_method : str, optional - Sampling method. The default is `'random'`. - transform : bool, optional - Isoprobabilistic transformation. The default is `False`. max_pce_deg : int, optional Maximum PCE polynomial degree. The default is `None`. - + Returns ------- - samples : array of shape (n_samples, n_params) - Selected training samples. + None """ - Inputs = self.InputObj - self.ndim = len(Inputs.Marginals) - if not hasattr(self, 'n_init_samples'): - self.n_init_samples = self.ndim + 1 + if n_samples < 0: + raise ValueError('A negative number of samples cannot be created. Please provide positive n_samples') n_samples = int(n_samples) - # Check if PCE or aPCE metamodel is selected. - if self.meta_Model.lower() == 'apce': - self.apce = True - else: - self.apce = False - - # Check if input is given as dist or input_data. - if len(Inputs.Marginals[0].input_data): - self.input_data_given = True - else: - self.input_data_given = False - - # Get the bounds if input_data are directly defined by user: - if self.input_data_given: - for i in range(self.ndim): - low_bound = np.min(Inputs.Marginals[i].input_data) - up_bound = np.max(Inputs.Marginals[i].input_data) - Inputs.Marginals[i].parameters = [low_bound, up_bound] + if self.n_init_samples is None: + self.n_init_samples = n_samples # Generate the samples based on requested method - self.raw_data, self.bound_tuples = self.init_param_space(max_pce_deg) + self.init_param_space(max_pce_deg) + samples = None + sampling_method = self.sampling_method # Pass user-defined samples as ED if sampling_method == 'user': + if self.X is None: + raise AttributeError('User-defined sampling cannot proceed as no samples provided. Please add them to ' + 'this class as attribute X') + if not self.X.ndim == 2: + raise AttributeError('The provided samples shuld have 2 dimensions') samples = self.X self.n_samples = len(samples) @@ -236,7 +258,7 @@ class ExpDesigns: elif sampling_method == 'PCM' or \ sampling_method == 'LSCM': - samples = self.pcm_sampler(max_pce_deg) + samples = self.pcm_sampler(n_samples, max_pce_deg) else: # Create ExpDesign in the actual space using chaospy @@ -252,208 +274,62 @@ class ExpDesigns: samples = chaospy.generate_samples(n_samples, domain=self.JDist, rule=sampling_method).T - # Transform samples to the original space - if transform: - tr_samples = self.transform( - samples, - method=sampling_method - ) - if sampling_method == 'user' or not self.apce: - return samples, tr_samples - else: - return tr_samples, samples - else: - return samples + self.X = samples - # ------------------------------------------------------------------------- - def init_param_space(self, max_deg=None): + def read_from_file(self, out_names): """ - Initializes parameter space. + Reads in the ExpDesign from a provided h5py file and saves the results. Parameters ---------- - max_deg : int, optional - Maximum degree. The default is `None`. + out_names : list of strings + The keys that are in the outputs (y) saved in the provided file. Returns ------- - raw_data : array of shape (n_params, n_samples) - Raw data. - bound_tuples : list of tuples - A list containing lower and upper bounds of parameters. + None. """ - Inputs = self.InputObj - ndim = self.ndim - rosenblatt_flag = Inputs.Rosenblatt - mc_size = 50000 - - # Save parameter names - self.par_names = [] - for parIdx in range(ndim): - self.par_names.append(Inputs.Marginals[parIdx].name) - - # Create a multivariate probability distribution - if max_deg is not None: - JDist, poly_types = self.build_dist(rosenblatt=rosenblatt_flag) - self.JDist, self.poly_types = JDist, poly_types - - if self.input_data_given: - - self.MCSize = len(Inputs.Marginals[0].input_data) - self.raw_data = np.zeros((ndim, self.MCSize)) - - for parIdx in range(ndim): - # Save parameter names - try: - self.raw_data[parIdx] = np.array( - Inputs.Marginals[parIdx].input_data) - except: - self.raw_data[parIdx] = self.JDist[parIdx].sample(mc_size) - - else: - # Generate random samples based on parameter distributions - self.raw_data = chaospy.generate_samples(mc_size, - domain=self.JDist) - - # Create orthogonal polynomial coefficients if necessary - if self.apce and max_deg is not None and Inputs.poly_coeffs_flag: - self.polycoeffs = {} - for parIdx in tqdm(range(ndim), ascii=True, - desc="Computing orth. polynomial coeffs"): - poly_coeffs = apoly_construction( - self.raw_data[parIdx], - max_deg - ) - self.polycoeffs[f'p_{parIdx+1}'] = poly_coeffs - - # Extract moments - for parIdx in range(ndim): - mu = np.mean(self.raw_data[parIdx]) - std = np.std(self.raw_data[parIdx]) - self.InputObj.Marginals[parIdx].moments = [mu, std] - - # Generate the bounds based on given inputs for marginals - bound_tuples = [] - for i in range(ndim): - if Inputs.Marginals[i].dist_type == 'unif': - low_bound, up_bound = Inputs.Marginals[i].parameters - else: - low_bound = np.min(self.raw_data[i]) - up_bound = np.max(self.raw_data[i]) - - bound_tuples.append((low_bound, up_bound)) - - self.bound_tuples = tuple(bound_tuples) + if self.hdf5_file is None: + raise AttributeError('ExpDesign cannot be read in, please provide hdf5 file first') - return self.raw_data, self.bound_tuples + # Read hdf5 file + f = h5py.File(self.hdf5_file, 'r+') - # ------------------------------------------------------------------------- - def build_dist(self, rosenblatt): - """ - Creates the polynomial types to be passed to univ_basis_vals method of - the MetaModel object. - - Parameters - ---------- - rosenblatt : bool - Rosenblatt transformation flag. + # Read EDX and pass it to ExpDesign object + try: + self.X = np.array(f["EDX/New_init_"]) + except KeyError: + self.X = np.array(f["EDX/init_"]) - Returns - ------- - orig_space_dist : object - A chaospy JDist object or a gaussian_kde object. - poly_types : list - List of polynomial types for the parameters. + # Update number of initial samples + self.n_init_samples = self.X.shape[0] - """ - Inputs = self.InputObj - all_data = [] - all_dist_types = [] - orig_joints = [] - poly_types = [] - - for parIdx in range(self.ndim): - - if Inputs.Marginals[parIdx].dist_type is None: - data = Inputs.Marginals[parIdx].input_data - all_data.append(data) - dist_type = None - else: - dist_type = Inputs.Marginals[parIdx].dist_type - params = Inputs.Marginals[parIdx].parameters - - if rosenblatt: - polytype = 'hermite' - dist = chaospy.Normal() - - elif dist_type is None: - polytype = 'arbitrary' - dist = None - - elif 'unif' in dist_type.lower(): - polytype = 'legendre' - dist = chaospy.Uniform(lower=params[0], upper=params[1]) - - elif 'norm' in dist_type.lower() and \ - 'log' not in dist_type.lower(): - polytype = 'hermite' - dist = chaospy.Normal(mu=params[0], sigma=params[1]) - - elif 'gamma' in dist_type.lower(): - polytype = 'laguerre' - dist = chaospy.Gamma(shape=params[0], - scale=params[1], - shift=params[2]) - - elif 'beta' in dist_type.lower(): - polytype = 'jacobi' - dist = chaospy.Beta(alpha=params[0], beta=params[1], - lower=params[2], upper=params[3]) - - elif 'lognorm' in dist_type.lower(): - polytype = 'hermite' - mu = np.log(params[0]**2/np.sqrt(params[0]**2 + params[1]**2)) - sigma = np.sqrt(np.log(1 + params[1]**2 / params[0]**2)) - dist = chaospy.LogNormal(mu, sigma) - # dist = chaospy.LogNormal(mu=params[0], sigma=params[1]) - - elif 'expon' in dist_type.lower(): - polytype = 'arbitrary' - dist = chaospy.Exponential(scale=params[0], shift=params[1]) - - elif 'weibull' in dist_type.lower(): - polytype = 'arbitrary' - dist = chaospy.Weibull(shape=params[0], scale=params[1], - shift=params[2]) + # Read EDX and pass it to ExpDesign object + self.Y = {} - else: - message = (f"DistType {dist_type} for parameter" - f"{parIdx+1} is not available.") - raise ValueError(message) - - if self.input_data_given or self.apce: - polytype = 'arbitrary' - - # Store dists and poly_types - orig_joints.append(dist) - poly_types.append(polytype) - all_dist_types.append(dist_type) - - # Prepare final output to return - if None in all_dist_types: - # Naive approach: Fit a gaussian kernel to the provided data - Data = np.asarray(all_data) - orig_space_dist = st.gaussian_kde(Data) - self.prior_space = orig_space_dist - else: - orig_space_dist = chaospy.J(*orig_joints) - self.prior_space = st.gaussian_kde(orig_space_dist.sample(10000)) - - return orig_space_dist, poly_types + # Extract x values + try: + self.Y["x_values"] = dict() + for varIdx, var in enumerate(out_names): + x = np.array(f[f"x_values/{var}"]) + self.Y["x_values"][var] = x + except KeyError: + self.Y["x_values"] = np.array(f["x_values"]) + + # Store the output + for varIdx, var in enumerate(out_names): + try: + y = np.array(f[f"EDY/{var}/New_init_"]) + except KeyError: + y = np.array(f[f"EDY/{var}/init_"]) + self.Y[var] = y + f.close() + print(f'Experimental Design is read in from file {self.hdf5_file}') + print('') # ------------------------------------------------------------------------- - def random_sampler(self, n_samples): + def random_sampler(self, n_samples, max_deg=None): """ Samples the given raw data randomly. @@ -461,6 +337,11 @@ class ExpDesigns: ---------- n_samples : int Number of requested samples. + + max_deg : int, optional + Maximum degree. The default is `None`. + This will be used to run init_param_space, if it has not been done + until now. Returns ------- @@ -468,6 +349,11 @@ class ExpDesigns: The sampling locations in the input space. """ + if self.raw_data is None: + self.init_param_space(max_deg) + else: + if np.array(self.raw_data).ndim != 2: + raise AttributeError('The given raw data for sampling should have two dimensions') samples = np.zeros((n_samples, self.ndim)) sample_size = self.raw_data.shape[1] @@ -479,20 +365,28 @@ class ExpDesigns: # store the raw data with given random indices samples[:, pa_idx] = self.raw_data[pa_idx, rand_idx] else: + if self.JDist is None: + raise AttributeError('Sampling cannot proceed, build ExpDesign with max_deg != 0 to create JDist!') try: + # Use resample if JDist is of type gaussian_kde samples = self.JDist.resample(int(n_samples)).T except AttributeError: + # Use sample if JDist is of type chaospy.J samples = self.JDist.sample(int(n_samples)).T + # If there is only one input transform the samples + if self.ndim == 1: + samples = np.swapaxes(np.atleast_2d(samples), 0, 1) + # Check if all samples are in the bound_tuples for idx, param_set in enumerate(samples): - if not self._check_ranges(param_set, self.bound_tuples): + if not check_ranges(param_set, self.bound_tuples): try: proposed_sample = chaospy.generate_samples( 1, domain=self.JDist, rule='random').T[0] except: proposed_sample = self.JDist.resample(1).T[0] - while not self._check_ranges(proposed_sample, - self.bound_tuples): + while not check_ranges(proposed_sample, + self.bound_tuples): try: proposed_sample = chaospy.generate_samples( 1, domain=self.JDist, rule='random').T[0] @@ -503,15 +397,18 @@ class ExpDesigns: return samples # ------------------------------------------------------------------------- - def pcm_sampler(self, max_deg): + def pcm_sampler(self, n_samples, max_deg): """ Generates collocation points based on the root of the polynomial degrees. Parameters ---------- + n_samples : int + Number of requested samples. max_deg : int - Maximum degree defined by user. + Maximum degree defined by user. Will also be used to run + init_param_space if that has not been done beforehand. Returns ------- @@ -520,40 +417,64 @@ class ExpDesigns: """ + if self.raw_data is None: + self.init_param_space(max_deg) + raw_data = self.raw_data # Guess the closest degree to self.n_samples def M_uptoMax(deg): + """ + ?? + Parameters + ---------- + deg : int + Degree. + + Returns + ------- + list of ..? + """ result = [] - for d in range(1, deg+1): - result.append(math.factorial(self.ndim+d) // + for d in range(1, deg + 1): + result.append(math.factorial(self.ndim + d) // (math.factorial(self.ndim) * math.factorial(d))) return np.array(result) - guess_Deg = np.where(M_uptoMax(max_deg) > self.n_samples)[0][0] + guess_Deg = np.where(M_uptoMax(max_deg) > n_samples)[0][0] - c_points = np.zeros((guess_Deg+1, self.ndim)) + c_points = np.zeros((guess_Deg + 1, self.ndim)) def PolynomialPa(parIdx): + """ + ??? + Parameters + ---------- + parIdx + + Returns + ------- + + """ return apoly_construction(self.raw_data[parIdx], max_deg) for i in range(self.ndim): - poly_coeffs = PolynomialPa(i)[guess_Deg+1][::-1] + poly_coeffs = PolynomialPa(i)[guess_Deg + 1][::-1] c_points[:, i] = np.trim_zeros(np.roots(poly_coeffs)) # Construction of optimal integration points - Prod = itertools.product(np.arange(1, guess_Deg+2), repeat=self.ndim) + Prod = itertools.product(np.arange(1, guess_Deg + 2), repeat=self.ndim) sort_dig_unique_combos = np.array(list(filter(lambda x: x, Prod))) # Ranking relatively mean - Temp = np.empty(shape=[0, guess_Deg+1]) + Temp = np.empty(shape=[0, guess_Deg + 1]) for j in range(self.ndim): - s = abs(c_points[:, j]-np.mean(raw_data[j])) + s = abs(c_points[:, j] - np.mean(raw_data[j])) Temp = np.append(Temp, [s], axis=0) temp = Temp.T index_CP = np.sort(temp, axis=0) - sort_cpoints = np.empty((0, guess_Deg+1)) + sort_cpoints = np.empty((0, guess_Deg + 1)) for j in range(self.ndim): sort_cp = c_points[index_CP[:, j], j] @@ -563,8 +484,9 @@ class ExpDesigns: sort_unique_combos = np.empty(shape=[0, self.ndim]) for i in range(len(sort_dig_unique_combos)): sort_un_comb = [] + sort_uni_comb = None for j in range(self.ndim): - SortUC = sort_cpoints[j, sort_dig_unique_combos[i, j]-1] + SortUC = sort_cpoints[j, sort_dig_unique_combos[i, j] - 1] sort_un_comb.append(SortUC) sort_uni_comb = np.asarray(sort_un_comb) sort_unique_combos = np.vstack((sort_unique_combos, sort_uni_comb)) @@ -576,162 +498,3 @@ class ExpDesigns: opt_col_points = sort_unique_combos[0:self.n_samples] return opt_col_points - - # ------------------------------------------------------------------------- - def transform(self, X, params=None, method=None): - """ - Transform the samples via either a Rosenblatt or an isoprobabilistic - transformation. - - Parameters - ---------- - X : array of shape (n_samples,n_params) - Samples to be transformed. - method : string - If transformation method is 'user' transform X, else just pass X. - - Returns - ------- - tr_X: array of shape (n_samples,n_params) - Transformed samples. - - """ - if self.InputObj.Rosenblatt: - self.origJDist, _ = self.build_dist(False) - if method == 'user': - tr_X = self.JDist.inv(self.origJDist.fwd(X.T)).T - else: - # Inverse to original spcace -- generate sample ED - tr_X = self.origJDist.inv(self.JDist.fwd(X.T)).T - else: - # Transform samples via an isoprobabilistic transformation - n_samples, n_params = X.shape - Inputs = self.InputObj - origJDist = self.JDist - poly_types = self.poly_types - - disttypes = [] - for par_i in range(n_params): - disttypes.append(Inputs.Marginals[par_i].dist_type) - - # Pass non-transformed X, if arbitrary PCE is selected. - if None in disttypes or self.input_data_given or self.apce: - return X - - cdfx = np.zeros((X.shape)) - tr_X = np.zeros((X.shape)) - - for par_i in range(n_params): - - # Extract the parameters of the original space - disttype = disttypes[par_i] - if disttype is not None: - dist = origJDist[par_i] - else: - dist = None - polytype = poly_types[par_i] - cdf = np.vectorize(lambda x: dist.cdf(x)) - - # Extract the parameters of the transformation space based on - # polyType - if polytype == 'legendre' or disttype == 'uniform': - # Generate Y_Dists based - params_Y = [-1, 1] - dist_Y = st.uniform(loc=params_Y[0], - scale=params_Y[1]-params_Y[0]) - inv_cdf = np.vectorize(lambda x: dist_Y.ppf(x)) - - elif polytype == 'hermite' or disttype == 'norm': - params_Y = [0, 1] - dist_Y = st.norm(loc=params_Y[0], scale=params_Y[1]) - inv_cdf = np.vectorize(lambda x: dist_Y.ppf(x)) - - elif polytype == 'laguerre' or disttype == 'gamma': - params_Y = [1, params[1]] - dist_Y = st.gamma(loc=params_Y[0], scale=params_Y[1]) - inv_cdf = np.vectorize(lambda x: dist_Y.ppf(x)) - - # Compute CDF_x(X) - cdfx[:, par_i] = cdf(X[:, par_i]) - - # Compute invCDF_y(cdfx) - tr_X[:, par_i] = inv_cdf(cdfx[:, par_i]) - - return tr_X - - # ------------------------------------------------------------------------- - def fit_dist(self, y): - """ - Fits the known distributions to the data. - - Parameters - ---------- - y : array of shape (n_samples) - Data to be fitted. - - Returns - ------- - sel_dist: string - Selected distribution type from `lognorm`, `norm`, `uniform` or - `expon`. - params : list - Parameters corresponding to the selected distibution type. - - """ - dist_results = [] - params = {} - dist_names = ['lognorm', 'norm', 'uniform', 'expon'] - for dist_name in dist_names: - dist = getattr(st, dist_name) - - try: - if dist_name != 'lognorm': - param = dist.fit(y) - else: - param = dist.fit(np.exp(y), floc=0) - except: - param = dist.fit(y) - - params[dist_name] = param - # Applying the Kolmogorov-Smirnov test - D, p = st.kstest(y, dist_name, args=param) - dist_results.append((dist_name, D)) - - # select the best fitted distribution - sel_dist, D = (min(dist_results, key=lambda item: item[1])) - - if sel_dist == 'uniform': - params[sel_dist] = [params[sel_dist][0], params[sel_dist][0] + - params[sel_dist][1]] - if D < 0.05: - return sel_dist, params[sel_dist] - else: - return None, None - - # ------------------------------------------------------------------------- - def _check_ranges(self, theta, ranges): - """ - This function checks if theta lies in the given ranges. - - Parameters - ---------- - theta : array - Proposed parameter set. - ranges : nested list - List of the praremeter ranges. - - Returns - ------- - c : bool - If it lies in the given range, it return True else False. - - """ - c = True - # traverse in the list1 - for i, bounds in enumerate(ranges): - x = theta[i] - # condition check - if x < bounds[0] or x > bounds[1]: - c = False - return c - return c diff --git a/src/bayesvalidrox/surrogate_models/exploration.py b/src/bayesvalidrox/surrogate_models/exploration.py index cb3ccfcd4a15e26b2292973167d01efedd5a9a62..67decae2bfef6d397bafbc10abdcb35ff77a63a3 100644 --- a/src/bayesvalidrox/surrogate_models/exploration.py +++ b/src/bayesvalidrox/surrogate_models/exploration.py @@ -1,5 +1,8 @@ #!/usr/bin/env python3 # -*- coding: utf-8 -*- +""" +Exploration for sequential training of metamodels +""" import numpy as np from scipy.spatial import distance @@ -16,8 +19,8 @@ class Exploration: Attributes ---------- - MetaModel : obj - MetaModel object. + ExpDesign : obj + ExpDesign object. n_candidate : int Number of candidate samples. mc_criterion : str @@ -28,10 +31,10 @@ class Exploration: training set. """ - def __init__(self, MetaModel, n_candidate, + def __init__(self, ExpDesign, n_candidate, mc_criterion='mc-intersite-proj-th'): - self.MetaModel = MetaModel - self.Marginals = [] + self.closestPoints = None + self.ExpDesign = ExpDesign self.n_candidate = n_candidate self.mc_criterion = mc_criterion self.w = 100 @@ -48,8 +51,7 @@ class Exploration: exploration_scores: arrays of shape (n_candidate) Exploration scores. """ - MetaModel = self.MetaModel - explore_method = MetaModel.ExpDesign.explore_method + explore_method = self.ExpDesign.explore_method print("\n") print(f' The {explore_method}-Method is selected as the exploration ' @@ -82,7 +84,7 @@ class Exploration: mc_criterion = self.mc_criterion n_candidate = self.n_candidate # Get the Old ExpDesign #samples - old_ED_X = self.MetaModel.ExpDesign.X + old_ED_X = self.ExpDesign.X ndim = old_ED_X.shape[1] # calculate error #averageErrors @@ -202,8 +204,7 @@ class Exploration: exploration_scores: arrays of shape (n_candidate) Exploration scores. """ - MetaModel = self.MetaModel - explore_method = MetaModel.ExpDesign.explore_method + explore_method = self.ExpDesign.explore_method mc_criterion = self.mc_criterion if all_candidates is None: n_candidate = self.n_candidate @@ -211,13 +212,13 @@ class Exploration: n_candidate = all_candidates.shape[0] # Get the Old ExpDesign #samples - old_ED_X = MetaModel.ExpDesign.X + old_ED_X = self.ExpDesign.X ndim = old_ED_X.shape[1] # ----- Compute the number of random points ----- if all_candidates is None: # Generate MC Samples - all_candidates = MetaModel.ExpDesign.generate_samples( + all_candidates = self.ExpDesign.generate_samples( self.n_candidate, explore_method ) self.all_candidates = all_candidates @@ -294,15 +295,13 @@ class Exploration: all_candidates: list of arrays A list of samples in each voronoi cell. """ - MetaModel = self.MetaModel - n_samples = samples.shape[0] ndim = samples.shape[1] # Compute the number of random points n_points = w * samples.shape[0] # Generate w random points in the domain for each sample - points = MetaModel.ExpDesign.generate_samples(n_points, 'random') + points = self.ExpDesign.generate_samples(n_points, 'random') self.all_candidates = points # Calculate the nearest sample to each point @@ -367,102 +366,3 @@ class Exploration: else: return distances**2 -#if __name__ == "__main__": -# import scipy.stats as stats -# import matplotlib.pyplot as plt -# import matplotlib as mpl -# import matplotlib.cm as cm -# plt.rc('font', family='sans-serif', serif='Arial') -# plt.rc('figure', figsize = (12, 8)) -# -# def plotter(old_ED_X, all_candidates, exploration_scores): -# global Bounds -# -# from scipy.spatial import Voronoi, voronoi_plot_2d -# vor = Voronoi(old_ED_X) -# -# fig = voronoi_plot_2d(vor) -# -# # find min/max values for normalization -## minima = min(exploration_scores) -## maxima = max(exploration_scores) -## -## # normalize chosen colormap -## norm = mpl.colors.Normalize(vmin=minima, vmax=maxima, clip=True) -## mapper = cm.ScalarMappable(norm=norm, cmap=cm.Blues_r) -## -## for r in range(len(vor.point_region)): -## region = vor.regions[vor.point_region[r]] -## if not -1 in region: -## polygon = [vor.vertices[i] for i in region] -## plt.fill(*zip(*polygon), color=mapper.to_rgba(exploration_scores[r])) -# -# -# ax1 = fig.add_subplot(111) -# -# ax1.scatter(old_ED_X[:,0], old_ED_X[:,1], s=10, c='r', marker="s", label='Old Design Points') -# for i in range(old_ED_X.shape[0]): -# txt = 'p'+str(i+1) -# ax1.annotate(txt, (old_ED_X[i,0],old_ED_X[i,1])) -# -## for i in range(NrofCandGroups): -## Candidates = all_candidates['group_'+str(i+1)] -## ax1.scatter(Candidates[:,0],Candidates[:,1], s=10, c='b', marker="o", label='Design candidates') -# ax1.scatter(all_candidates[:,0],all_candidates[:,1], s=10, c='b', marker="o", label='Design candidates') -# -# ax1.set_xlim(Bounds[0][0], Bounds[0][1]) -# ax1.set_ylim(Bounds[1][0], Bounds[1][1]) -# -# plt.legend(loc='best'); -# plt.show() -# -# def voronoi_volumes(points): -# from scipy.spatial import Voronoi, ConvexHull -# v = Voronoi(points) -# vol = np.zeros(v.npoints) -# -# for i, reg_num in enumerate(v.point_region): -# indices = v.regions[reg_num] -# if -1 in indices: # some regions can be opened -# vol[i] = np.inf -# else: -# -# #print("reg_num={0: 3.3f} X1={1: 3.3f} X2={2: 3.3f}".format(reg_num, v.points[reg_num-1, 0], v.points[reg_num-1, 1])) -# vol[i] = ConvexHull(v.vertices[indices]).volume -# -# print('-'*40) -# for i in range(nrofSamples): -# print("idx={0:d} X1={1: 3.3f} X2={2: 3.3f} Volume={3: 3.3f}".format(i+1, v.points[i, 0], v.points[i, 1], vol[i])) -# -# return vol -# -# NofPa = 2 -# -# Bounds = ((-5,10), (0,15)) -# -# nrofSamples = 10 -# old_ED_X = np.zeros((nrofSamples, NofPa)) -# for idx in range(NofPa): -# Loc = Bounds[idx][0] -# Scale = Bounds[idx][1] - Bounds[idx][0] -# old_ED_X[:,idx] = stats.uniform(loc=Loc, scale=Scale).rvs(size=nrofSamples) -# -# -# nNewCandidate = 40 -# -# # New Function -# volumes = voronoi_volumes(old_ED_X) -# -# -# # SUMO -# Exploration = Exploration(Bounds, old_ED_X, nNewCandidate) -# -# #all_candidates, Score = Exploration.get_vornoi_samples() -# all_candidates, Score = Exploration.get_mc_samples() -# -# print('-'*40) -## for i in range(nrofSamples): -## print("idx={0:d} X1={1: 3.3f} X2={2: 3.3f} Volume={3: 3.3f}".format(i+1, old_ED_X[i,0], old_ED_X[i,1], vornoi.areas[i])) -# -# plotter(old_ED_X, all_candidates, volumes) - diff --git a/src/bayesvalidrox/surrogate_models/glexindex.py b/src/bayesvalidrox/surrogate_models/glexindex.py index 6d9ba3c2f3c02be8e2ca04be6f95779ed0825ad8..90877331ec121750e7f81e32a4b69edbc9a110ba 100644 --- a/src/bayesvalidrox/surrogate_models/glexindex.py +++ b/src/bayesvalidrox/surrogate_models/glexindex.py @@ -58,16 +58,8 @@ def glexindex(start, stop=None, dimensions=1, cross_truncation=1., start, stop, _ = numpy.broadcast_arrays(start, stop, numpy.empty(dimensions)) cross_truncation = cross_truncation*numpy.ones(2) - indices = _glexindex(start, stop, cross_truncation) - if indices.size: - indices = indices[glexsort(indices.T, graded=graded, reverse=reverse)] - return indices - - -def _glexindex(start, stop, cross_truncation=1.): - """Backend for the glexindex function.""" - # At the beginning the current list of indices just ranges over the - # last dimension. + + # Moved here from _glexindex bound = stop.max() dimensions = len(start) start = numpy.clip(start, a_min=0, a_max=None) @@ -100,8 +92,21 @@ def _glexindex(start, stop, cross_truncation=1.): upper = cross_truncate(indices, stop-1, cross_truncation[1]) indices = indices[lower ^ upper] - return numpy.array(indices, dtype=int).reshape(-1, dimensions) - + indices = numpy.array(indices, dtype=int).reshape(-1, dimensions) + if indices.size: + # moved here from glexsort + keys = indices.T + keys_ = numpy.atleast_2d(keys) + if reverse: + keys_ = keys_[::-1] + + indices_sort = numpy.array(numpy.lexsort(keys_)) + if graded: + indices_sort = indices_sort[numpy.argsort( + numpy.sum(keys_[:, indices_sort], axis=0))].T + + indices = indices[indices_sort] + return indices def cross_truncate(indices, bound, norm): r""" @@ -154,57 +159,3 @@ def cross_truncate(indices, bound, norm): assert numpy.all(out[numpy.all(indices == 0, axis=-1)]) return out - - -def glexsort( - keys: numpy.typing.ArrayLike, - graded: bool = False, - reverse: bool = False, -) -> numpy.ndarray: - """ - Sort keys using graded lexicographical ordering. - Same as ``numpy.lexsort``, but also support graded and reverse - lexicographical ordering. - Args: - keys: - Values to sort. - graded: - Graded sorting, meaning the indices are always sorted by the index - sum. E.g. ``(2, 2, 2)`` has a sum of 6, and will therefore be - consider larger than both ``(3, 1, 1)`` and ``(1, 1, 3)``. - reverse: - Reverse lexicographical sorting meaning that ``(1, 3)`` is - considered smaller than ``(3, 1)``, instead of the opposite. - Returns: - Array of indices that sort the keys along the specified axis. - Examples: - >>> indices = numpy.array([[0, 0, 0, 1, 2, 1], - ... [1, 2, 0, 0, 0, 1]]) - >>> indices[:, numpy.lexsort(indices)] - array([[0, 1, 2, 0, 1, 0], - [0, 0, 0, 1, 1, 2]]) - >>> indices[:, numpoly.glexsort(indices)] - array([[0, 1, 2, 0, 1, 0], - [0, 0, 0, 1, 1, 2]]) - >>> indices[:, numpoly.glexsort(indices, reverse=True)] - array([[0, 0, 0, 1, 1, 2], - [0, 1, 2, 0, 1, 0]]) - >>> indices[:, numpoly.glexsort(indices, graded=True)] - array([[0, 1, 0, 2, 1, 0], - [0, 0, 1, 0, 1, 2]]) - >>> indices[:, numpoly.glexsort(indices, graded=True, reverse=True)] - array([[0, 0, 1, 0, 1, 2], - [0, 1, 0, 2, 1, 0]]) - >>> indices = numpy.array([4, 5, 6, 3, 2, 1]) - >>> indices[numpoly.glexsort(indices)] - array([1, 2, 3, 4, 5, 6]) - """ - keys_ = numpy.atleast_2d(keys) - if reverse: - keys_ = keys_[::-1] - - indices = numpy.array(numpy.lexsort(keys_)) - if graded: - indices = indices[numpy.argsort( - numpy.sum(keys_[:, indices], axis=0))].T - return indices diff --git a/src/bayesvalidrox/surrogate_models/input_space.py b/src/bayesvalidrox/surrogate_models/input_space.py new file mode 100644 index 0000000000000000000000000000000000000000..9576462d8de15b292aa6210072c905fca68a2382 --- /dev/null +++ b/src/bayesvalidrox/surrogate_models/input_space.py @@ -0,0 +1,411 @@ +#!/usr/bin/env python3 +# -*- coding: utf-8 -*- +""" +Input space built from set prior distributions +""" + +import numpy as np +import chaospy +import scipy.stats as st +from tqdm import tqdm + + +# noinspection SpellCheckingInspection +class InputSpace: + """ + This class generates the input space for the metamodel from the + distributions provided using the `Input` object. + + Attributes + ---------- + Input : obj + Input object containing the parameter marginals, i.e. name, + distribution type and distribution parameters or available raw data. + meta_Model_type : str + Type of the meta_Model_type. + + """ + + def __init__(self, input_object, meta_Model_type='pce'): + self.InputObj = input_object + self.meta_Model_type = meta_Model_type + + # Other + self.apce = None + self.bound_tuples = None + self.input_data_given = None + self.JDist = None + self.MCSize = None + self.ndim = None + self.origJDist = None + self.par_names = None + self.poly_types = None + self.prior_space = None + self.raw_data = None + + # Init + self.check_valid_inputs() + + def check_valid_inputs(self) -> None: + """ + Check if the given InputObj is valid to use for further calculations: + 1) Has some Marginals + 2) The Marginals have valid priors + 3) All Marginals given as the same type (samples vs dist) + + Returns + ------- + None + + """ + Inputs = self.InputObj + self.ndim = len(Inputs.Marginals) + + # Check if PCE or aPCE metamodel is selected. + # TODO: test also for 'pce'?? + if self.meta_Model_type.lower() == 'apce': + self.apce = True + else: + self.apce = False + + # check if marginals given + if not self.ndim >= 1: + raise AssertionError('Cannot build distributions if no marginals are given') + + # check that each marginal is valid + for marginals in Inputs.Marginals: + if len(marginals.input_data) == 0: + if marginals.dist_type is None: + raise AssertionError('Not all marginals were provided priors') + if np.array(marginals.input_data).shape[0] and (marginals.dist_type is not None): + raise AssertionError('Both samples and distribution type are given. Please choose only one.') + + # Check if input is given as dist or input_data. + self.input_data_given = -1 + for marg in Inputs.Marginals: + size = np.array(marg.input_data).shape[0] + if size and abs(self.input_data_given) != 1: + self.input_data_given = 2 + break + if (not size) and self.input_data_given > 0: + self.input_data_given = 2 + break + if not size: + self.input_data_given = 0 + if size: + self.input_data_given = 1 + + if self.input_data_given == 2: + raise AssertionError('Distributions cannot be built as the priors have different types') + + # Get the bounds if input_data are directly defined by user: + if self.input_data_given: + for i in range(self.ndim): + low_bound = np.min(Inputs.Marginals[i].input_data) + up_bound = np.max(Inputs.Marginals[i].input_data) + Inputs.Marginals[i].parameters = [low_bound, up_bound] + + # ------------------------------------------------------------------------- + def init_param_space(self, max_deg=None): + """ + Initializes parameter space. + + Parameters + ---------- + max_deg : int, optional + Maximum degree. The default is `None`. + + Returns + ------- + raw_data : array of shape (n_params, n_samples) + Raw data. + bound_tuples : list of tuples + A list containing lower and upper bounds of parameters. + + """ + # Recheck all before running! + self.check_valid_inputs() + + Inputs = self.InputObj + ndim = self.ndim + rosenblatt_flag = Inputs.Rosenblatt + mc_size = 50000 + + # Save parameter names + self.par_names = [] + for parIdx in range(ndim): + self.par_names.append(Inputs.Marginals[parIdx].name) + + # Create a multivariate probability distribution + # TODO: change this to make max_deg obligatory? at least in some specific cases? + if max_deg is not None: + JDist, poly_types = self.build_polytypes(rosenblatt=rosenblatt_flag) + self.JDist, self.poly_types = JDist, poly_types + + if self.input_data_given: + self.MCSize = len(Inputs.Marginals[0].input_data) + self.raw_data = np.zeros((ndim, self.MCSize)) + + for parIdx in range(ndim): + # Save parameter names + try: + self.raw_data[parIdx] = np.array( + Inputs.Marginals[parIdx].input_data) + except: + self.raw_data[parIdx] = self.JDist[parIdx].sample(mc_size) + + else: + # Generate random samples based on parameter distributions + self.raw_data = chaospy.generate_samples(mc_size, + domain=self.JDist) + + # Extract moments + for parIdx in range(ndim): + mu = np.mean(self.raw_data[parIdx]) + std = np.std(self.raw_data[parIdx]) + self.InputObj.Marginals[parIdx].moments = [mu, std] + + # Generate the bounds based on given inputs for marginals + bound_tuples = [] + for i in range(ndim): + if Inputs.Marginals[i].dist_type == 'unif': + low_bound = Inputs.Marginals[i].parameters[0] + up_bound = Inputs.Marginals[i].parameters[1] + else: + low_bound = np.min(self.raw_data[i]) + up_bound = np.max(self.raw_data[i]) + + bound_tuples.append((low_bound, up_bound)) + + self.bound_tuples = tuple(bound_tuples) + + # ------------------------------------------------------------------------- + def build_polytypes(self, rosenblatt): + """ + Creates the polynomial types to be passed to univ_basis_vals method of + the MetaModel object. + + Parameters + ---------- + rosenblatt : bool + Rosenblatt transformation flag. + + Returns + ------- + orig_space_dist : object + A chaospy JDist object or a gaussian_kde object. + poly_types : list + A list of polynomial types for the parameters. + + """ + Inputs = self.InputObj + + all_data = [] + all_dist_types = [] + orig_joints = [] + poly_types = [] + params = None + + for parIdx in range(self.ndim): + + if Inputs.Marginals[parIdx].dist_type is None: + data = Inputs.Marginals[parIdx].input_data + all_data.append(data) + dist_type = None + else: + dist_type = Inputs.Marginals[parIdx].dist_type + params = Inputs.Marginals[parIdx].parameters + + if rosenblatt: + polytype = 'hermite' + dist = chaospy.Normal() + + elif dist_type is None: + polytype = 'arbitrary' + dist = None + + elif 'unif' in dist_type.lower(): + polytype = 'legendre' + if not np.array(params).shape[0] >= 2: + raise AssertionError('Distribution has too few parameters!') + dist = chaospy.Uniform(lower=params[0], upper=params[1]) + + elif 'norm' in dist_type.lower() and \ + 'log' not in dist_type.lower(): + if not np.array(params).shape[0] >= 2: + raise AssertionError('Distribution has too few parameters!') + polytype = 'hermite' + dist = chaospy.Normal(mu=params[0], sigma=params[1]) + + elif 'gamma' in dist_type.lower(): + polytype = 'laguerre' + if not np.array(params).shape[0] >= 3: + raise AssertionError('Distribution has too few parameters!') + dist = chaospy.Gamma(shape=params[0], + scale=params[1], + shift=params[2]) + + elif 'beta' in dist_type.lower(): + if not np.array(params).shape[0] >= 4: + raise AssertionError('Distribution has too few parameters!') + polytype = 'jacobi' + dist = chaospy.Beta(alpha=params[0], beta=params[1], + lower=params[2], upper=params[3]) + + elif 'lognorm' in dist_type.lower(): + polytype = 'hermite' + if not np.array(params).shape[0] >= 2: + raise AssertionError('Distribution has too few parameters!') + mu = np.log(params[0] ** 2 / np.sqrt(params[0] ** 2 + params[1] ** 2)) + sigma = np.sqrt(np.log(1 + params[1] ** 2 / params[0] ** 2)) + dist = chaospy.LogNormal(mu, sigma) + # dist = chaospy.LogNormal(mu=params[0], sigma=params[1]) + + elif 'expon' in dist_type.lower(): + polytype = 'exponential' + if not np.array(params).shape[0] >= 2: + raise AssertionError('Distribution has too few parameters!') + dist = chaospy.Exponential(scale=params[0], shift=params[1]) + + elif 'weibull' in dist_type.lower(): + polytype = 'weibull' + if not np.array(params).shape[0] >= 3: + raise AssertionError('Distribution has too few parameters!') + dist = chaospy.Weibull(shape=params[0], scale=params[1], + shift=params[2]) + + else: + message = (f"DistType {dist_type} for parameter" + f"{parIdx + 1} is not available.") + raise ValueError(message) + + if self.input_data_given or self.apce: + polytype = 'arbitrary' + + # Store dists and poly_types + orig_joints.append(dist) + poly_types.append(polytype) + all_dist_types.append(dist_type) + + # Prepare final output to return + if None in all_dist_types: + # Naive approach: Fit a gaussian kernel to the provided data + Data = np.asarray(all_data) + try: + orig_space_dist = st.gaussian_kde(Data) + except: + raise ValueError('The samples provided to the Marginals should be 1D only') + self.prior_space = orig_space_dist + else: + orig_space_dist = chaospy.J(*orig_joints) + try: + self.prior_space = st.gaussian_kde(orig_space_dist.sample(10000)) + except: + raise ValueError('Parameter values are not valid, please set differently') + + return orig_space_dist, poly_types + + # ------------------------------------------------------------------------- + def transform(self, X, params=None, method=None): + """ + Transforms the samples via either a Rosenblatt or an isoprobabilistic + transformation. + + Parameters + ---------- + X : array of shape (n_samples,n_params) + Samples to be transformed. + params : list + Parameters for laguerre/gamma-type distribution. + method : string + If transformation method is 'user' transform X, else just pass X. + + Returns + ------- + tr_X: array of shape (n_samples,n_params) + Transformed samples. + + """ + # Check for built JDist + if self.JDist is None: + raise AttributeError('Call function init_param_space first to create JDist') + + # Check if X is 2d + if X.ndim != 2: + raise AttributeError('X should have two dimensions') + + # Check if size of X matches Marginals + if X.shape[1] != self.ndim: + raise AttributeError( + 'The second dimension of X should be the same size as the number of marginals in the InputObj') + + if self.InputObj.Rosenblatt: + self.origJDist, _ = self.build_polytypes(False) + if method == 'user': + tr_X = self.JDist.inv(self.origJDist.fwd(X.T)).T + else: + # Inverse to original spcace -- generate sample ED + tr_X = self.origJDist.inv(self.JDist.fwd(X.T)).T + else: + # Transform samples via an isoprobabilistic transformation + n_samples, n_params = X.shape + Inputs = self.InputObj + origJDist = self.JDist + poly_types = self.poly_types + + disttypes = [] + for par_i in range(n_params): + disttypes.append(Inputs.Marginals[par_i].dist_type) + + # Pass non-transformed X, if arbitrary PCE is selected. + if None in disttypes or self.input_data_given or self.apce: + return X + + cdfx = np.zeros(X.shape) + tr_X = np.zeros(X.shape) + + # TODO: this transformation takes quite a while, + # especially for many samples to transform, can it be improved? + for par_i in range(n_params):#tqdm(range(n_params), + # desc='Transforming the input samples'): + + # Extract the parameters of the original space + disttype = disttypes[par_i] + if disttype is not None: + dist = origJDist[par_i] + else: + dist = None + polytype = poly_types[par_i] + cdf = np.vectorize(lambda x: dist.cdf(x)) + + # Extract the parameters of the transformation space based on + # polyType + inv_cdf = None + if polytype == 'legendre' or disttype == 'uniform': + # Generate Y_Dists based + params_Y = [-1, 1] + dist_Y = st.uniform(loc=params_Y[0], + scale=params_Y[1] - params_Y[0]) + inv_cdf = np.vectorize(lambda x: dist_Y.ppf(x)) + + elif polytype == 'hermite' or disttype == 'norm': + params_Y = [0, 1] + dist_Y = st.norm(loc=params_Y[0], scale=params_Y[1]) + inv_cdf = np.vectorize(lambda x: dist_Y.ppf(x)) + + elif polytype == 'laguerre' or disttype == 'gamma': + if params is None: + raise AttributeError('Additional parameters have to be set for the gamma distribution!') + params_Y = [1, params[1]] + + # TOOD: update the call to the gamma function, seems like source code has been changed! + dist_Y = st.gamma(loc=params_Y[0], scale=params_Y[1]) + inv_cdf = np.vectorize(lambda x: dist_Y.ppf(x)) + + # Compute CDF_x(X) + cdfx[:, par_i] = cdf(X[:, par_i]) + + # Compute invCDF_y(cdfx) + tr_X[:, par_i] = inv_cdf(cdfx[:, par_i]) + + return tr_X diff --git a/src/bayesvalidrox/surrogate_models/inputs.py b/src/bayesvalidrox/surrogate_models/inputs.py index 783e82b053cc458be712b588b7fde3a0f3c8decb..40ae36337fa84c0bb9758e488f983ba29cdb9e77 100644 --- a/src/bayesvalidrox/surrogate_models/inputs.py +++ b/src/bayesvalidrox/surrogate_models/inputs.py @@ -1,5 +1,9 @@ #!/usr/bin/env python3 # -*- coding: utf-8 -*- +""" +Inputs and related marginal distributions +""" + class Input: """ @@ -17,17 +21,18 @@ class Input: ------- Marginals can be defined as following: - >>> Inputs.add_marginals() - >>> Inputs.Marginals[0].name = 'X_1' - >>> Inputs.Marginals[0].dist_type = 'uniform' - >>> Inputs.Marginals[0].parameters = [-5, 5] + >>> inputs = Inputs() + >>> inputs.add_marginals() + >>> inputs.Marginals[0].name = 'X_1' + >>> inputs.Marginals[0].dist_type = 'uniform' + >>> inputs.Marginals[0].parameters = [-5, 5] If there is no common data is avaliable, the input data can be given as following: - >>> Inputs.add_marginals() - >>> Inputs.Marginals[0].name = 'X_1' - >>> Inputs.Marginals[0].input_data = input_data + >>> inputs.add_marginals() + >>> inputs.Marginals[0].name = 'X_1' + >>> inputs.Marginals[0].input_data = [0,0,1,0] """ poly_coeffs_flag = True @@ -60,12 +65,12 @@ class Marginal: dist_type : string Name of the distribution. The default is `None`. parameters : list - List of the parameters corresponding to the distribution type. The + Parameters corresponding to the distribution type. The default is `None`. input_data : array Available input data. The default is `[]`. moments : list - List of the moments. + Moments of the distribution. The default is `None`. """ def __init__(self): diff --git a/src/bayesvalidrox/surrogate_models/orthogonal_matching_pursuit.py b/src/bayesvalidrox/surrogate_models/orthogonal_matching_pursuit.py index d4f99b8a19bb5dbdf41f093bd454c80c63a321bb..96ef9c1d50b10b587ad0846d41733fc7f1cedfe8 100644 --- a/src/bayesvalidrox/surrogate_models/orthogonal_matching_pursuit.py +++ b/src/bayesvalidrox/surrogate_models/orthogonal_matching_pursuit.py @@ -282,7 +282,7 @@ class OrthogonalMatchingPursuit(LinearModel, RegressorMixin): # only the trace is, to save memory) PsiM = np.dot(psi, inv_inf_matrix) - h = np.sum(np.multiply(PsiM, psi), axis=1, dtype=np.float128) + h = np.sum(np.multiply(PsiM, psi), axis=1, dtype=np.longdouble) # ------ Calculate Error Loocv for each measurement point ---- # Residuals diff --git a/src/bayesvalidrox/surrogate_models/reg_fast_ard.py b/src/bayesvalidrox/surrogate_models/reg_fast_ard.py index 44073da8e78642ba3b3914f6ce55a2d01986b1f1..fdd0ee7470dc5d0bdccd354cee16f6257ec01b02 100755 --- a/src/bayesvalidrox/surrogate_models/reg_fast_ard.py +++ b/src/bayesvalidrox/surrogate_models/reg_fast_ard.py @@ -236,7 +236,7 @@ class RegressionFastARD(LinearModel, RegressorMixin): self.var_y = False A = np.PINF * np.ones(n_features) - active = np.zeros(n_features, dtype=np.bool) + active = np.zeros(n_features, dtype=bool) if self.start is not None and not hasattr(self, 'active_'): start = self.start @@ -286,9 +286,9 @@ class RegressionFastARD(LinearModel, RegressorMixin): # raise warning in case cholesky fails if warning_flag == 1: warnings.warn(("Cholesky decomposition failed! Algorithm uses " - "pinvh, which is significantly slower, if you " + "pinvh, which is significantly slower. If you " "use RVR it is advised to change parameters of " - "kernel")) + "the kernel!")) # compute quality & sparsity parameters s, q, S, Q = self._sparsity_quality(XX, XXd, XY, XYa, Aa, Ri, @@ -319,7 +319,7 @@ class RegressionFastARD(LinearModel, RegressorMixin): if converged or i == self.n_iter - 1: if converged and self.verbose: - print('Algorithm converged !') + print('Algorithm converged!') break # after last update of alpha & beta update parameters diff --git a/src/bayesvalidrox/surrogate_models/reg_fast_laplace.py b/src/bayesvalidrox/surrogate_models/reg_fast_laplace.py index bdff324ede818a42d226e9aa55aaf01666ca8fc8..7fdcb5cf6e93c396d32eae2b0aad87a194a9cba4 100644 --- a/src/bayesvalidrox/surrogate_models/reg_fast_laplace.py +++ b/src/bayesvalidrox/surrogate_models/reg_fast_laplace.py @@ -75,7 +75,7 @@ class RegressionFastLaplace(): def _center_data(self, X, y): ''' Centers data''' - X = as_float_array(X, self.copy_X) + X = as_float_array(X, copy = self.copy_X) # normalisation should be done in preprocessing! X_std = np.ones(X.shape[1], dtype=X.dtype) @@ -307,7 +307,7 @@ class RegressionFastLaplace(): # recomputation # zero if regressor has not been chosen yet if not ind_global_to_local[ind_L_max]: - raise Exception('cannot recompute index{0} -- not yet\ + raise Exception('Cannot recompute index{0} -- not yet\ part of the model!'.format(ind_L_max)) Sigma = np.atleast_2d(Sigma) mu = np.atleast_2d(mu) diff --git a/src/bayesvalidrox/surrogate_models/sequential_design.py b/src/bayesvalidrox/surrogate_models/sequential_design.py deleted file mode 100644 index fc81dcd4529ca0708dfba47385aef4415992eb3e..0000000000000000000000000000000000000000 --- a/src/bayesvalidrox/surrogate_models/sequential_design.py +++ /dev/null @@ -1,2187 +0,0 @@ -#!/usr/bin/env python3 -# -*- coding: utf-8 -*- -""" -Created on Fri Jan 28 09:21:18 2022 - -@author: farid -""" -import numpy as np -from scipy import stats, signal, linalg, sparse -from scipy.spatial import distance -from copy import deepcopy, copy -from tqdm import tqdm -import scipy.optimize as opt -from sklearn.metrics import mean_squared_error -import multiprocessing -import matplotlib.pyplot as plt -import sys -import os -import gc -import seaborn as sns -from joblib import Parallel, delayed -import resource -from .exploration import Exploration - - -class SeqDesign(): - """ Sequential experimental design - This class provieds method for trainig the meta-model in an iterative - manners. - The main method to execute the task is `train_seq_design`, which - recieves a model object and returns the trained metamodel. - """ - - # ------------------------------------------------------------------------- - def train_seq_design(self, MetaModel): - """ - Starts the adaptive sequential design for refining the surrogate model - by selecting training points in a sequential manner. - - Parameters - ---------- - Model : object - An object containing all model specifications. - - Returns - ------- - MetaModel : object - Meta model object. - - """ - # MetaModel = self - Model = MetaModel.ModelObj - self.MetaModel = MetaModel - self.Model = Model - - # Initialization - MetaModel.SeqModifiedLOO = {} - MetaModel.seqValidError = {} - MetaModel.SeqBME = {} - MetaModel.SeqKLD = {} - MetaModel.SeqDistHellinger = {} - MetaModel.seqRMSEMean = {} - MetaModel.seqRMSEStd = {} - MetaModel.seqMinDist = [] - pce = True if MetaModel.meta_model_type.lower() != 'gpe' else False - mc_ref = True if bool(Model.mc_reference) else False - if mc_ref: - Model.read_mc_reference() - - if not hasattr(MetaModel, 'valid_likelihoods'): - MetaModel.valid_samples = [] - MetaModel.valid_model_runs = [] - MetaModel.valid_likelihoods = [] - - # Get the parameters - max_n_samples = MetaModel.ExpDesign.n_max_samples - mod_LOO_threshold = MetaModel.ExpDesign.mod_LOO_threshold - n_canddidate = MetaModel.ExpDesign.n_canddidate - post_snapshot = MetaModel.ExpDesign.post_snapshot - n_replication = MetaModel.ExpDesign.n_replication - util_func = MetaModel.ExpDesign.util_func - output_name = Model.Output.names - validError = None - # Handle if only one UtilityFunctions is provided - if not isinstance(util_func, list): - util_func = [MetaModel.ExpDesign.util_func] - - # Read observations or MCReference - if len(Model.observations) != 0 or Model.meas_file is not None: - self.observations = Model.read_observation() - obs_data = self.observations - else: - obs_data = [] - TotalSigma2 = {} - # ---------- Initial MetaModel ---------- - initMetaModel = deepcopy(MetaModel) - - # Validation error if validation set is provided. - if len(MetaModel.valid_model_runs) != 0: - init_rmse, init_valid_error = self.__validError(initMetaModel) - init_valid_error = list(init_valid_error.values()) - else: - init_rmse = None - - # Check if discrepancy is provided - if len(obs_data) != 0 and hasattr(MetaModel, 'Discrepancy'): - TotalSigma2 = MetaModel.Discrepancy.parameters - - # Calculate the initial BME - out = self.__BME_Calculator( - initMetaModel, obs_data, TotalSigma2, init_rmse) - init_BME, init_KLD, init_post, init_likes, init_dist_hellinger = out - print(f"\nInitial BME: {init_BME:.2f}") - print(f"Initial KLD: {init_KLD:.2f}") - - # Posterior snapshot (initial) - if post_snapshot: - parNames = MetaModel.ExpDesign.par_names - print('Posterior snapshot (initial) is being plotted...') - self.__posteriorPlot(init_post, parNames, 'SeqPosterior_init') - - # Check the convergence of the Mean & Std - if mc_ref and pce: - init_rmse_mean, init_rmse_std = self.__error_Mean_Std() - print(f"Initial Mean and Std error: {init_rmse_mean}," - f" {init_rmse_std}") - - # Read the initial experimental design - Xinit = initMetaModel.ExpDesign.X - init_n_samples = len(MetaModel.ExpDesign.X) - initYprev = initMetaModel.ModelOutputDict - initLCerror = initMetaModel.LCerror - n_itrs = max_n_samples - init_n_samples - - # Read the initial ModifiedLOO - if pce: - Scores_all, varExpDesignY = [], [] - for out_name in output_name: - y = initMetaModel.ExpDesign.Y[out_name] - Scores_all.append(list( - initMetaModel.score_dict['b_1'][out_name].values())) - if MetaModel.dim_red_method.lower() == 'pca': - pca = MetaModel.pca['b_1'][out_name] - components = pca.transform(y) - varExpDesignY.append(np.var(components, axis=0)) - else: - varExpDesignY.append(np.var(y, axis=0)) - - Scores = [item for sublist in Scores_all for item in sublist] - weights = [item for sublist in varExpDesignY for item in sublist] - init_mod_LOO = [np.average([1-score for score in Scores], - weights=weights)] - - prevMetaModel_dict = {} - # Replicate the sequential design - for repIdx in range(n_replication): - print(f'\n>>>> Replication: {repIdx+1}<<<<') - - # To avoid changes ub original aPCE object - MetaModel.ExpDesign.X = Xinit - MetaModel.ExpDesign.Y = initYprev - MetaModel.LCerror = initLCerror - - for util_f in util_func: - print(f'\n>>>> Utility Function: {util_f} <<<<') - # To avoid changes ub original aPCE object - MetaModel.ExpDesign.X = Xinit - MetaModel.ExpDesign.Y = initYprev - MetaModel.LCerror = initLCerror - - # Set the experimental design - Xprev = Xinit - total_n_samples = init_n_samples - Yprev = initYprev - - Xfull = [] - Yfull = [] - - # Store the initial ModifiedLOO - if pce: - print("\nInitial ModifiedLOO:", init_mod_LOO) - SeqModifiedLOO = np.array(init_mod_LOO) - - if len(MetaModel.valid_model_runs) != 0: - SeqValidError = np.array(init_valid_error) - - # Check if data is provided - if len(obs_data) != 0: - SeqBME = np.array([init_BME]) - SeqKLD = np.array([init_KLD]) - SeqDistHellinger = np.array([init_dist_hellinger]) - - if mc_ref and pce: - seqRMSEMean = np.array([init_rmse_mean]) - seqRMSEStd = np.array([init_rmse_std]) - - # ------- Start Sequential Experimental Design ------- - postcnt = 1 - for itr_no in range(1, n_itrs+1): - print(f'\n>>>> Iteration number {itr_no} <<<<') - - # Save the metamodel prediction before updating - prevMetaModel_dict[itr_no] = deepcopy(MetaModel) - if itr_no > 1: - pc_model = prevMetaModel_dict[itr_no-1] - self._y_hat_prev, _ = pc_model.eval_metamodel( - samples=Xfull[-1].reshape(1, -1)) - - # Optimal Bayesian Design - m_1 = resource.getrusage(resource.RUSAGE_SELF).ru_maxrss/1024 - MetaModel.ExpDesignFlag = 'sequential' - Xnew, updatedPrior = self.opt_SeqDesign(TotalSigma2, - n_canddidate, - util_f) - m_2 = resource.getrusage(resource.RUSAGE_SELF).ru_maxrss/1024 - S = np.min(distance.cdist(Xinit, Xnew, 'euclidean')) - MetaModel.seqMinDist.append(S) - print(f"\nmin Dist from OldExpDesign: {S:2f}") - print("\n") - - # Evaluate the full model response at the new sample - Ynew, _ = Model.run_model_parallel( - Xnew, prevRun_No=total_n_samples - ) - total_n_samples += Xnew.shape[0] - # ------ Plot the surrogate model vs Origninal Model ------ - if hasattr(MetaModel, 'adapt_verbose') and \ - MetaModel.adapt_verbose: - from .adaptPlot import adaptPlot - y_hat, std_hat = MetaModel.eval_metamodel(samples=Xnew) - adaptPlot(MetaModel, Ynew, y_hat, std_hat, plotED=False) - - # -------- Retrain the surrogate model ------- - # Extend new experimental design - Xfull = np.vstack((Xprev, Xnew)) - - # Updating experimental design Y - for out_name in output_name: - Yfull = np.vstack((Yprev[out_name], Ynew[out_name])) - MetaModel.ModelOutputDict[out_name] = Yfull - - # Pass new design to the metamodel object - MetaModel.ExpDesign.sampling_method = 'user' - MetaModel.ExpDesign.X = Xfull - MetaModel.ExpDesign.Y = MetaModel.ModelOutputDict - - # Save the Experimental Design for next iteration - Xprev = Xfull - Yprev = MetaModel.ModelOutputDict - - # Pass the new prior as the input - MetaModel.input_obj.poly_coeffs_flag = False - if updatedPrior is not None: - MetaModel.input_obj.poly_coeffs_flag = True - print("updatedPrior:", updatedPrior.shape) - # Arbitrary polynomial chaos - for i in range(updatedPrior.shape[1]): - MetaModel.input_obj.Marginals[i].dist_type = None - x = updatedPrior[:, i] - MetaModel.input_obj.Marginals[i].raw_data = x - - # Train the surrogate model for new ExpDesign - MetaModel.train_norm_design(parallel=False) - m_3 = resource.getrusage(resource.RUSAGE_SELF).ru_maxrss/1024 - - # -------- Evaluate the retrained surrogate model ------- - # Extract Modified LOO from Output - if pce: - Scores_all, varExpDesignY = [], [] - for out_name in output_name: - y = MetaModel.ExpDesign.Y[out_name] - Scores_all.append(list( - MetaModel.score_dict['b_1'][out_name].values())) - if MetaModel.dim_red_method.lower() == 'pca': - pca = MetaModel.pca['b_1'][out_name] - components = pca.transform(y) - varExpDesignY.append(np.var(components, - axis=0)) - else: - varExpDesignY.append(np.var(y, axis=0)) - Scores = [item for sublist in Scores_all for item - in sublist] - weights = [item for sublist in varExpDesignY for item - in sublist] - ModifiedLOO = [np.average( - [1-score for score in Scores], weights=weights)] - - print('\n') - print(f"Updated ModifiedLOO {util_f}:\n", ModifiedLOO) - print('\n') - - # Compute the validation error - if len(MetaModel.valid_model_runs) != 0: - rmse, validError = self.__validError(MetaModel) - ValidError = list(validError.values()) - else: - rmse = None - - # Store updated ModifiedLOO - if pce: - SeqModifiedLOO = np.vstack( - (SeqModifiedLOO, ModifiedLOO)) - if len(MetaModel.valid_model_runs) != 0: - SeqValidError = np.vstack( - (SeqValidError, ValidError)) - m_4 = resource.getrusage(resource.RUSAGE_SELF).ru_maxrss/1024 - # -------- Caclulation of BME as accuracy metric ------- - # Check if data is provided - if len(obs_data) != 0: - # Calculate the initial BME - out = self.__BME_Calculator(MetaModel, obs_data, - TotalSigma2, rmse) - BME, KLD, Posterior, likes, DistHellinger = out - print('\n') - print(f"Updated BME: {BME:.2f}") - print(f"Updated KLD: {KLD:.2f}") - print('\n') - - # Plot some snapshots of the posterior - step_snapshot = MetaModel.ExpDesign.step_snapshot - if post_snapshot and postcnt % step_snapshot == 0: - parNames = MetaModel.ExpDesign.par_names - print('Posterior snapshot is being plotted...') - self.__posteriorPlot(Posterior, parNames, - f'SeqPosterior_{postcnt}') - postcnt += 1 - m_5 = resource.getrusage(resource.RUSAGE_SELF).ru_maxrss/1024 - - # Check the convergence of the Mean&Std - if mc_ref and pce: - print('\n') - RMSE_Mean, RMSE_std = self.__error_Mean_Std() - print(f"Updated Mean and Std error: {RMSE_Mean:.2f}, " - f"{RMSE_std:.2f}") - print('\n') - - # Store the updated BME & KLD - # Check if data is provided - if len(obs_data) != 0: - SeqBME = np.vstack((SeqBME, BME)) - SeqKLD = np.vstack((SeqKLD, KLD)) - SeqDistHellinger = np.vstack((SeqDistHellinger, - DistHellinger)) - if mc_ref and pce: - seqRMSEMean = np.vstack((seqRMSEMean, RMSE_Mean)) - seqRMSEStd = np.vstack((seqRMSEStd, RMSE_std)) - - if pce and any(LOO < mod_LOO_threshold - for LOO in ModifiedLOO): - break - - print(f"Memory itr {itr_no}: I: {m_2-m_1:.2f} MB") - print(f"Memory itr {itr_no}: II: {m_3-m_2:.2f} MB") - print(f"Memory itr {itr_no}: III: {m_4-m_3:.2f} MB") - print(f"Memory itr {itr_no}: IV: {m_5-m_4:.2f} MB") - m_6 = resource.getrusage(resource.RUSAGE_SELF).ru_maxrss/1024 - print(f"Memory itr {itr_no}: total: {m_6:.2f} MB") - - # Clean up - if len(obs_data) != 0: - del out - gc.collect() - print() - print('-'*50) - print() - - # Store updated ModifiedLOO and BME in dictonary - strKey = f'{util_f}_rep_{repIdx+1}' - if pce: - MetaModel.SeqModifiedLOO[strKey] = SeqModifiedLOO - if len(MetaModel.valid_model_runs) != 0: - MetaModel.seqValidError[strKey] = SeqValidError - - # Check if data is provided - if len(obs_data) != 0: - MetaModel.SeqBME[strKey] = SeqBME - MetaModel.SeqKLD[strKey] = SeqKLD - if len(MetaModel.valid_likelihoods) != 0: - MetaModel.SeqDistHellinger[strKey] = SeqDistHellinger - if mc_ref and pce: - MetaModel.seqRMSEMean[strKey] = seqRMSEMean - MetaModel.seqRMSEStd[strKey] = seqRMSEStd - - return MetaModel - - # ------------------------------------------------------------------------- - def util_VarBasedDesign(self, X_can, index, util_func='Entropy'): - """ - Computes the exploitation scores based on: - active learning MacKay(ALM) and active learning Cohn (ALC) - Paper: Sequential Design with Mutual Information for Computer - Experiments (MICE): Emulation of a Tsunami Model by Beck and Guillas - (2016) - - Parameters - ---------- - X_can : array of shape (n_samples, n_params) - Candidate samples. - index : int - Model output index. - UtilMethod : string, optional - Exploitation utility function. The default is 'Entropy'. - - Returns - ------- - float - Score. - - """ - MetaModel = self.MetaModel - ED_X = MetaModel.ExpDesign.X - out_dict_y = MetaModel.ExpDesign.Y - out_names = MetaModel.ModelObj.Output.names - - # Run the Metamodel for the candidate - X_can = X_can.reshape(1, -1) - Y_PC_can, std_PC_can = MetaModel.eval_metamodel(samples=X_can) - - if util_func.lower() == 'alm': - # ----- Entropy/MMSE/active learning MacKay(ALM) ----- - # Compute perdiction variance of the old model - canPredVar = {key: std_PC_can[key]**2 for key in out_names} - - varPCE = np.zeros((len(out_names), X_can.shape[0])) - for KeyIdx, key in enumerate(out_names): - varPCE[KeyIdx] = np.max(canPredVar[key], axis=1) - score = np.max(varPCE, axis=0) - - elif util_func.lower() == 'eigf': - # ----- Expected Improvement for Global fit ----- - # Find closest EDX to the candidate - distances = distance.cdist(ED_X, X_can, 'euclidean') - index = np.argmin(distances) - - # Compute perdiction error and variance of the old model - predError = {key: Y_PC_can[key] for key in out_names} - canPredVar = {key: std_PC_can[key]**2 for key in out_names} - - # Compute perdiction error and variance of the old model - # Eq (5) from Liu et al.(2018) - EIGF_PCE = np.zeros((len(out_names), X_can.shape[0])) - for KeyIdx, key in enumerate(out_names): - residual = predError[key] - out_dict_y[key][int(index)] - var = canPredVar[key] - EIGF_PCE[KeyIdx] = np.max(residual**2 + var, axis=1) - score = np.max(EIGF_PCE, axis=0) - - return -1 * score # -1 is for minimization instead of maximization - - # ------------------------------------------------------------------------- - def util_BayesianActiveDesign(self, X_can, sigma2Dict, var='DKL'): - """ - Computes scores based on Bayesian active design criterion (var). - - It is based on the following paper: - Oladyshkin, Sergey, Farid Mohammadi, Ilja Kroeker, and Wolfgang Nowak. - "Bayesian3 active learning for the gaussian process emulator using - information theory." Entropy 22, no. 8 (2020): 890. - - Parameters - ---------- - X_can : array of shape (n_samples, n_params) - Candidate samples. - sigma2Dict : dict - A dictionary containing the measurement errors (sigma^2). - var : string, optional - BAL design criterion. The default is 'DKL'. - - Returns - ------- - float - Score. - - """ - - # Evaluate the PCE metamodels at that location ??? - Y_mean_can, Y_std_can = self.MetaModel.eval_metamodel( - samples=np.array([X_can]) - ) - - # Get the data - obs_data = self.observations - n_obs = self.Model.n_obs - # TODO: Analytical DKL - # Sample a distribution for a normal dist - # with Y_mean_can as the mean and Y_std_can as std. - - # priorMean, priorSigma2, Obs = np.empty((0)),np.empty((0)),np.empty((0)) - - # for key in list(Y_mean_can): - # # concatenate the measurement error - # Obs = np.hstack((Obs,ObservationData[key])) - - # # concatenate the mean and variance of prior predictive - # means, stds = Y_mean_can[key][0], Y_std_can[key][0] - # priorMean = np.hstack((priorSigma2,means)) - # priorSigma2 = np.hstack((priorSigma2,stds**2)) - - # # Covariance Matrix of prior - # covPrior = np.zeros((priorSigma2.shape[0], priorSigma2.shape[0]), float) - # np.fill_diagonal(covPrior, priorSigma2) - - # # Covariance Matrix of Likelihood - # covLikelihood = np.zeros((sigma2Dict.shape[0], sigma2Dict.shape[0]), float) - # np.fill_diagonal(covLikelihood, sigma2Dict) - - # # Calculate moments of the posterior (Analytical derivation) - # n = priorSigma2.shape[0] - # covPost = np.dot(np.dot(covPrior,np.linalg.inv(covPrior+(covLikelihood/n))),covLikelihood/n) - - # meanPost = np.dot(np.dot(covPrior,np.linalg.inv(covPrior+(covLikelihood/n))) , Obs) + \ - # np.dot(np.dot(covPrior,np.linalg.inv(covPrior+(covLikelihood/n))), - # priorMean/n) - # # Compute DKL from prior to posterior - # term1 = np.trace(np.dot(np.linalg.inv(covPrior),covPost)) - # deltaMean = priorMean-meanPost - # term2 = np.dot(np.dot(deltaMean,np.linalg.inv(covPrior)),deltaMean[:,None]) - # term3 = np.log(np.linalg.det(covPrior)/np.linalg.det(covPost)) - # DKL = 0.5 * (term1 + term2 - n + term3)[0] - - # ---------- Inner MC simulation for computing Utility Value ---------- - # Estimation of the integral via Monte Varlo integration - MCsize = 20000 - ESS = 0 - - while ((ESS > MCsize) or (ESS < 1)): - - # Sample a distribution for a normal dist - # with Y_mean_can as the mean and Y_std_can as std. - Y_MC, std_MC = {}, {} - logPriorLikelihoods = np.zeros((MCsize)) - for key in list(Y_mean_can): - means, stds = Y_mean_can[key][0], Y_std_can[key][0] - # cov = np.zeros((means.shape[0], means.shape[0]), float) - # np.fill_diagonal(cov, stds**2) - - Y_MC[key] = np.zeros((MCsize, n_obs)) - logsamples = np.zeros((MCsize, n_obs)) - for i in range(n_obs): - NormalDensity = stats.norm(means[i], stds[i]) - Y_MC[key][:, i] = NormalDensity.rvs(MCsize) - logsamples[:, i] = NormalDensity.logpdf(Y_MC[key][:, i]) - - logPriorLikelihoods = np.sum(logsamples, axis=1) - std_MC[key] = np.zeros((MCsize, means.shape[0])) - - # Likelihood computation (Comparison of data and simulation - # results via PCE with candidate design) - likelihoods = self.__normpdf(Y_MC, std_MC, obs_data, sigma2Dict) - - # Check the Effective Sample Size (1<ESS<MCsize) - ESS = 1 / np.sum(np.square(likelihoods/np.nansum(likelihoods))) - - # Enlarge sample size if it doesn't fulfill the criteria - if ((ESS > MCsize) or (ESS < 1)): - MCsize *= 10 - ESS = 0 - - # Rejection Step - # Random numbers between 0 and 1 - unif = np.random.rand(1, MCsize)[0] - - # Reject the poorly performed prior - accepted = (likelihoods/np.max(likelihoods)) >= unif - - # Prior-based estimation of BME - logBME = np.log(np.nanmean(likelihoods)) - - # Posterior-based expectation of likelihoods - postLikelihoods = likelihoods[accepted] - postExpLikelihoods = np.mean(np.log(postLikelihoods)) - - # Posterior-based expectation of prior densities - postExpPrior = np.mean(logPriorLikelihoods[accepted]) - - # Utility function Eq.2 in Ref. (2) - # Posterior covariance matrix after observing data y - # Kullback-Leibler Divergence (Sergey's paper) - if var == 'DKL': - - # TODO: Calculate the correction factor for BME - # BMECorrFactor = self.BME_Corr_Weight(PCE_SparseBayes_can, - # ObservationData, sigma2Dict) - # BME += BMECorrFactor - # Haun et al implementation - # U_J_d = np.mean(np.log(Likelihoods[Likelihoods!=0])- logBME) - U_J_d = postExpLikelihoods - logBME - - # Marginal log likelihood - elif var == 'BME': - U_J_d = logBME - - # Entropy-based information gain - elif var == 'infEntropy': - logBME = np.log(np.nanmean(likelihoods)) - infEntropy = logBME - postExpPrior - postExpLikelihoods - U_J_d = infEntropy * -1 # -1 for minimization - - # Bayesian information criterion - elif var == 'BIC': - coeffs = self.MetaModel.coeffs_dict.values() - nModelParams = max(len(v) for val in coeffs for v in val.values()) - maxL = np.nanmax(likelihoods) - U_J_d = -2 * np.log(maxL) + np.log(n_obs) * nModelParams - - # Akaike information criterion - elif var == 'AIC': - coeffs = self.MetaModel.coeffs_dict.values() - nModelParams = max(len(v) for val in coeffs for v in val.values()) - maxlogL = np.log(np.nanmax(likelihoods)) - AIC = -2 * maxlogL + 2 * nModelParams - # 2 * nModelParams * (nModelParams+1) / (n_obs-nModelParams-1) - penTerm = 0 - U_J_d = 1*(AIC + penTerm) - - # Deviance information criterion - elif var == 'DIC': - # D_theta_bar = np.mean(-2 * Likelihoods) - N_star_p = 0.5 * np.var(np.log(likelihoods[likelihoods != 0])) - Likelihoods_theta_mean = self.__normpdf( - Y_mean_can, Y_std_can, obs_data, sigma2Dict - ) - DIC = -2 * np.log(Likelihoods_theta_mean) + 2 * N_star_p - - U_J_d = DIC - - else: - print('The algorithm you requested has not been implemented yet!') - - # Handle inf and NaN (replace by zero) - if np.isnan(U_J_d) or U_J_d == -np.inf or U_J_d == np.inf: - U_J_d = 0.0 - - # Clear memory - del likelihoods - del Y_MC - del std_MC - gc.collect(generation=2) - - return -1 * U_J_d # -1 is for minimization instead of maximization - - # ------------------------------------------------------------------------- - def update_metamodel(self, MetaModel, output, y_hat_can, univ_p_val, index, - new_pca=False): - BasisIndices = MetaModel.basis_dict[output]["y_"+str(index+1)] - clf_poly = MetaModel.clf_poly[output]["y_"+str(index+1)] - Mn = clf_poly.coef_ - Sn = clf_poly.sigma_ - beta = clf_poly.alpha_ - active = clf_poly.active_ - Psi = self.MetaModel.create_psi(BasisIndices, univ_p_val) - - Sn_new_inv = np.linalg.inv(Sn) - Sn_new_inv += beta * np.dot(Psi[:, active].T, Psi[:, active]) - Sn_new = np.linalg.inv(Sn_new_inv) - - Mn_new = np.dot(Sn_new_inv, Mn[active]).reshape(-1, 1) - Mn_new += beta * np.dot(Psi[:, active].T, y_hat_can) - Mn_new = np.dot(Sn_new, Mn_new).flatten() - - # Compute the old and new moments of PCEs - mean_old = Mn[0] - mean_new = Mn_new[0] - std_old = np.sqrt(np.sum(np.square(Mn[1:]))) - std_new = np.sqrt(np.sum(np.square(Mn_new[1:]))) - - # Back transformation if PCA is selected. - if MetaModel.dim_red_method.lower() == 'pca': - old_pca = MetaModel.pca[output] - mean_old = old_pca.mean_[index] - mean_old += np.sum(mean_old * old_pca.components_[:, index]) - std_old = np.sqrt(np.sum(std_old**2 * - old_pca.components_[:, index]**2)) - mean_new = new_pca.mean_[index] - mean_new += np.sum(mean_new * new_pca.components_[:, index]) - std_new = np.sqrt(np.sum(std_new**2 * - new_pca.components_[:, index]**2)) - # print(f"mean_old: {mean_old:.2f} mean_new: {mean_new:.2f}") - # print(f"std_old: {std_old:.2f} std_new: {std_new:.2f}") - # Store the old and new moments of PCEs - results = { - 'mean_old': mean_old, - 'mean_new': mean_new, - 'std_old': std_old, - 'std_new': std_new - } - return results - - # ------------------------------------------------------------------------- - def util_BayesianDesign_old(self, X_can, X_MC, sigma2Dict, var='DKL'): - """ - Computes scores based on Bayesian sequential design criterion (var). - - Parameters - ---------- - X_can : array of shape (n_samples, n_params) - Candidate samples. - sigma2Dict : dict - A dictionary containing the measurement errors (sigma^2). - var : string, optional - Bayesian design criterion. The default is 'DKL'. - - Returns - ------- - float - Score. - - """ - - # To avoid changes ub original aPCE object - Model = self.Model - MetaModel = deepcopy(self.MetaModel) - old_EDY = MetaModel.ExpDesign.Y - - # Evaluate the PCE metamodels using the candidate design - Y_PC_can, Y_std_can = self.MetaModel.eval_metamodel( - samples=np.array([X_can]) - ) - - # Generate y from posterior predictive - m_size = 100 - y_hat_samples = {} - for idx, key in enumerate(Model.Output.names): - means, stds = Y_PC_can[key][0], Y_std_can[key][0] - y_hat_samples[key] = np.random.multivariate_normal( - means, np.diag(stds), m_size) - - # Create the SparseBayes-based PCE metamodel: - MetaModel.input_obj.poly_coeffs_flag = False - univ_p_val = self.MetaModel.univ_basis_vals(X_can) - G_n_m_all = np.zeros((m_size, len(Model.Output.names), Model.n_obs)) - - for i in range(m_size): - for idx, key in enumerate(Model.Output.names): - if MetaModel.dim_red_method.lower() == 'pca': - # Equal number of components - new_outputs = np.vstack( - (old_EDY[key], y_hat_samples[key][i]) - ) - new_pca, _ = MetaModel.pca_transformation(new_outputs) - target = new_pca.transform( - y_hat_samples[key][i].reshape(1, -1) - )[0] - else: - new_pca, target = False, y_hat_samples[key][i] - - for j in range(len(target)): - - # Update surrogate - result = self.update_metamodel( - MetaModel, key, target[j], univ_p_val, j, new_pca) - - # Compute Expected Information Gain (Eq. 39) - G_n_m = np.log(result['std_old']/result['std_new']) - 1./2 - G_n_m += result['std_new']**2 / (2*result['std_old']**2) - G_n_m += (result['mean_new'] - result['mean_old'])**2 /\ - (2*result['std_old']**2) - - G_n_m_all[i, idx, j] = G_n_m - - U_J_d = G_n_m_all.mean(axis=(1, 2)).mean() - return -1 * U_J_d - - # ------------------------------------------------------------------------- - def util_BayesianDesign(self, X_can, X_MC, sigma2Dict, var='DKL'): - """ - Computes scores based on Bayesian sequential design criterion (var). - - Parameters - ---------- - X_can : array of shape (n_samples, n_params) - Candidate samples. - sigma2Dict : dict - A dictionary containing the measurement errors (sigma^2). - var : string, optional - Bayesian design criterion. The default is 'DKL'. - - Returns - ------- - float - Score. - - """ - - # To avoid changes ub original aPCE object - Model = self.Model - MetaModel = deepcopy(self.MetaModel) - out_names = MetaModel.ModelObj.Output.names - if X_can.ndim == 1: - X_can = X_can.reshape(1, -1) - - # Compute the mean and std based on the MetaModel - # pce_means, pce_stds = self._compute_pce_moments(MetaModel) - if var == 'ALC': - Y_MC, Y_MC_std = MetaModel.eval_metamodel(samples=X_MC) - - # Old Experimental design - oldExpDesignX = MetaModel.ExpDesign.X - oldExpDesignY = MetaModel.ExpDesign.Y - - # Evaluate the PCE metamodels at that location ??? - Y_PC_can, Y_std_can = MetaModel.eval_metamodel(samples=X_can) - - # Add all suggestion as new ExpDesign - NewExpDesignX = np.vstack((oldExpDesignX, X_can)) - - NewExpDesignY = {} - for key in oldExpDesignY.keys(): - try: - NewExpDesignY[key] = np.vstack((oldExpDesignY[key], - Y_PC_can[key])) - except: - NewExpDesignY[key] = oldExpDesignY[key] - - MetaModel.ExpDesign.sampling_method = 'user' - MetaModel.ExpDesign.X = NewExpDesignX - MetaModel.ExpDesign.Y = NewExpDesignY - - # Train the model for the observed data using x_can - MetaModel.input_obj.poly_coeffs_flag = False - MetaModel.train_norm_design(parallel=False) - PCE_Model_can = MetaModel - - if var.lower() == 'mi': - # Mutual information based on Krause et al - # Adapted from Beck & Guillas (MICE) paper - _, std_PC_can = PCE_Model_can.eval_metamodel(samples=X_can) - std_can = {key: std_PC_can[key] for key in out_names} - - std_old = {key: Y_std_can[key] for key in out_names} - - varPCE = np.zeros((len(out_names))) - for i, key in enumerate(out_names): - varPCE[i] = np.mean(std_old[key]**2/std_can[key]**2) - score = np.mean(varPCE) - - return -1 * score - - elif var.lower() == 'alc': - # Active learning based on Gramyc and Lee - # Adaptive design and analysis of supercomputer experiments Techno- - # metrics, 51 (2009), pp. 130–145. - - # Evaluate the MetaModel at the given samples - Y_MC_can, Y_MC_std_can = PCE_Model_can.eval_metamodel(samples=X_MC) - - # Compute the score - score = [] - for i, key in enumerate(out_names): - pce_var = Y_MC_std_can[key]**2 - pce_var_can = Y_MC_std[key]**2 - score.append(np.mean(pce_var-pce_var_can, axis=0)) - score = np.mean(score) - - return -1 * score - - # ---------- Inner MC simulation for computing Utility Value ---------- - # Estimation of the integral via Monte Varlo integration - MCsize = X_MC.shape[0] - ESS = 0 - - while ((ESS > MCsize) or (ESS < 1)): - - # Enriching Monte Carlo samples if need be - if ESS != 0: - X_MC = self.MetaModel.ExpDesign.generate_samples( - MCsize, 'random' - ) - - # Evaluate the MetaModel at the given samples - Y_MC, std_MC = PCE_Model_can.eval_metamodel(samples=X_MC) - - # Likelihood computation (Comparison of data and simulation - # results via PCE with candidate design) - likelihoods = self.__normpdf( - Y_MC, std_MC, self.observations, sigma2Dict - ) - - # Check the Effective Sample Size (1<ESS<MCsize) - ESS = 1 / np.sum(np.square(likelihoods/np.sum(likelihoods))) - - # Enlarge sample size if it doesn't fulfill the criteria - if ((ESS > MCsize) or (ESS < 1)): - print("--- increasing MC size---") - MCsize *= 10 - ESS = 0 - - # Rejection Step - # Random numbers between 0 and 1 - unif = np.random.rand(1, MCsize)[0] - - # Reject the poorly performed prior - accepted = (likelihoods/np.max(likelihoods)) >= unif - - # -------------------- Utility functions -------------------- - # Utility function Eq.2 in Ref. (2) - # Kullback-Leibler Divergence (Sergey's paper) - if var == 'DKL': - - # Prior-based estimation of BME - logBME = np.log(np.nanmean(likelihoods, dtype=np.float128)) - - # Posterior-based expectation of likelihoods - postLikelihoods = likelihoods[accepted] - postExpLikelihoods = np.mean(np.log(postLikelihoods)) - - # Haun et al implementation - U_J_d = np.mean(np.log(likelihoods[likelihoods != 0]) - logBME) - - # U_J_d = np.sum(G_n_m_all) - # Ryan et al (2014) implementation - # importanceWeights = Likelihoods[Likelihoods!=0]/np.sum(Likelihoods[Likelihoods!=0]) - # U_J_d = np.mean(importanceWeights*np.log(Likelihoods[Likelihoods!=0])) - logBME - - # U_J_d = postExpLikelihoods - logBME - - # Marginal likelihood - elif var == 'BME': - - # Prior-based estimation of BME - logBME = np.log(np.nanmean(likelihoods)) - U_J_d = logBME - - # Bayes risk likelihood - elif var == 'BayesRisk': - - U_J_d = -1 * np.var(likelihoods) - - # Entropy-based information gain - elif var == 'infEntropy': - # Prior-based estimation of BME - logBME = np.log(np.nanmean(likelihoods)) - - # Posterior-based expectation of likelihoods - postLikelihoods = likelihoods[accepted] / np.nansum(likelihoods[accepted]) - postExpLikelihoods = np.mean(np.log(postLikelihoods)) - - # Posterior-based expectation of prior densities - postExpPrior = np.mean(logPriorLikelihoods[accepted]) - - infEntropy = logBME - postExpPrior - postExpLikelihoods - - U_J_d = infEntropy * -1 # -1 for minimization - - # D-Posterior-precision - elif var == 'DPP': - X_Posterior = X_MC[accepted] - # covariance of the posterior parameters - U_J_d = -np.log(np.linalg.det(np.cov(X_Posterior))) - - # A-Posterior-precision - elif var == 'APP': - X_Posterior = X_MC[accepted] - # trace of the posterior parameters - U_J_d = -np.log(np.trace(np.cov(X_Posterior))) - - else: - print('The algorithm you requested has not been implemented yet!') - - # Clear memory - del likelihoods - del Y_MC - del std_MC - gc.collect(generation=2) - - return -1 * U_J_d # -1 is for minimization instead of maximization - - # ------------------------------------------------------------------------- - def subdomain(self, Bounds, n_new_samples): - """ - Divides a domain defined by Bounds into sub domains. - - Parameters - ---------- - Bounds : list of tuples - List of lower and upper bounds. - n_new_samples : TYPE - DESCRIPTION. - - Returns - ------- - Subdomains : TYPE - DESCRIPTION. - - """ - n_params = self.MetaModel.n_params - n_subdomains = n_new_samples + 1 - LinSpace = np.zeros((n_params, n_subdomains)) - - for i in range(n_params): - LinSpace[i] = np.linspace(start=Bounds[i][0], stop=Bounds[i][1], - num=n_subdomains) - Subdomains = [] - for k in range(n_subdomains-1): - mylist = [] - for i in range(n_params): - mylist.append((LinSpace[i, k+0], LinSpace[i, k+1])) - Subdomains.append(tuple(mylist)) - - return Subdomains - - # ------------------------------------------------------------------------- - def run_util_func(self, method, candidates, index, sigma2Dict=None, - var=None, X_MC=None): - """ - Runs the utility function based on the given method. - - Parameters - ---------- - method : string - Exploitation method: `VarOptDesign`, `BayesActDesign` and - `BayesOptDesign`. - candidates : array of shape (n_samples, n_params) - All candidate parameter sets. - index : int - ExpDesign index. - sigma2Dict : dict, optional - A dictionary containing the measurement errors (sigma^2). The - default is None. - var : string, optional - Utility function. The default is None. - X_MC : TYPE, optional - DESCRIPTION. The default is None. - - Returns - ------- - index : TYPE - DESCRIPTION. - List - Scores. - - """ - - if method.lower() == 'varoptdesign': - # U_J_d = self.util_VarBasedDesign(candidates, index, var) - U_J_d = np.zeros((candidates.shape[0])) - for idx, X_can in tqdm(enumerate(candidates), ascii=True, - desc="varoptdesign"): - U_J_d[idx] = self.util_VarBasedDesign(X_can, index, var) - - elif method.lower() == 'bayesactdesign': - NCandidate = candidates.shape[0] - U_J_d = np.zeros((NCandidate)) - for idx, X_can in tqdm(enumerate(candidates), ascii=True, - desc="OptBayesianDesign"): - U_J_d[idx] = self.util_BayesianActiveDesign(X_can, sigma2Dict, - var) - elif method.lower() == 'bayesoptdesign': - NCandidate = candidates.shape[0] - U_J_d = np.zeros((NCandidate)) - for idx, X_can in tqdm(enumerate(candidates), ascii=True, - desc="OptBayesianDesign"): - U_J_d[idx] = self.util_BayesianDesign(X_can, X_MC, sigma2Dict, - var) - return (index, -1 * U_J_d) - - # ------------------------------------------------------------------------- - def dual_annealing(self, method, Bounds, sigma2Dict, var, Run_No, - verbose=False): - """ - Exploration algorithim to find the optimum parameter space. - - Parameters - ---------- - method : string - Exploitation method: `VarOptDesign`, `BayesActDesign` and - `BayesOptDesign`. - Bounds : list of tuples - List of lower and upper boundaries of parameters. - sigma2Dict : dict - A dictionary containing the measurement errors (sigma^2). - Run_No : int - Run number. - verbose : bool, optional - Print out a summary. The default is False. - - Returns - ------- - Run_No : int - Run number. - array - Optimial candidate. - - """ - - Model = self.Model - max_func_itr = self.MetaModel.ExpDesign.max_func_itr - - if method == 'VarOptDesign': - Res_Global = opt.dual_annealing(self.util_VarBasedDesign, - bounds=Bounds, - args=(Model, var), - maxfun=max_func_itr) - - elif method == 'BayesOptDesign': - Res_Global = opt.dual_annealing(self.util_BayesianDesign, - bounds=Bounds, - args=(Model, sigma2Dict, var), - maxfun=max_func_itr) - - if verbose: - print(f"global minimum: xmin = {Res_Global.x}, " - f"f(xmin) = {Res_Global.fun:.6f}, nfev = {Res_Global.nfev}") - - return (Run_No, Res_Global.x) - - # ------------------------------------------------------------------------- - def tradoff_weights(self, tradeoff_scheme, old_EDX, old_EDY): - """ - Calculates weights for exploration scores based on the requested - scheme: `None`, `equal`, `epsilon-decreasing` and `adaptive`. - - `None`: No exploration. - `equal`: Same weights for exploration and exploitation scores. - `epsilon-decreasing`: Start with more exploration and increase the - influence of exploitation along the way with a exponential decay - function - `adaptive`: An adaptive method based on: - Liu, Haitao, Jianfei Cai, and Yew-Soon Ong. "An adaptive sampling - approach for Kriging metamodeling by maximizing expected prediction - error." Computers & Chemical Engineering 106 (2017): 171-182. - - Parameters - ---------- - tradeoff_scheme : string - Trade-off scheme for exloration and exploitation scores. - old_EDX : array (n_samples, n_params) - Old experimental design (training points). - old_EDY : dict - Old model responses (targets). - - Returns - ------- - exploration_weight : float - Exploration weight. - exploitation_weight: float - Exploitation weight. - - """ - if tradeoff_scheme is None: - exploration_weight = 0 - - elif tradeoff_scheme == 'equal': - exploration_weight = 0.5 - - elif tradeoff_scheme == 'epsilon-decreasing': - # epsilon-decreasing scheme - # Start with more exploration and increase the influence of - # exploitation along the way with a exponential decay function - initNSamples = self.MetaModel.ExpDesign.n_init_samples - n_max_samples = self.MetaModel.ExpDesign.n_max_samples - - itrNumber = (self.MetaModel.ExpDesign.X.shape[0] - initNSamples) - itrNumber //= self.MetaModel.ExpDesign.n_new_samples - - tau2 = -(n_max_samples-initNSamples-1) / np.log(1e-8) - exploration_weight = signal.exponential(n_max_samples-initNSamples, - 0, tau2, False)[itrNumber] - - elif tradeoff_scheme == 'adaptive': - - # Extract itrNumber - initNSamples = self.MetaModel.ExpDesign.n_init_samples - n_max_samples = self.MetaModel.ExpDesign.n_max_samples - itrNumber = (self.MetaModel.ExpDesign.X.shape[0] - initNSamples) - itrNumber //= self.MetaModel.ExpDesign.n_new_samples - - if itrNumber == 0: - exploration_weight = 0.5 - else: - # New adaptive trade-off according to Liu et al. (2017) - # Mean squared error for last design point - last_EDX = old_EDX[-1].reshape(1, -1) - lastPCEY, _ = self.MetaModel.eval_metamodel(samples=last_EDX) - pce_y = np.array(list(lastPCEY.values()))[:, 0] - y = np.array(list(old_EDY.values()))[:, -1, :] - mseError = mean_squared_error(pce_y, y) - - # Mean squared CV - error for last design point - pce_y_prev = np.array(list(self._y_hat_prev.values()))[:, 0] - mseCVError = mean_squared_error(pce_y_prev, y) - - exploration_weight = min([0.5*mseError/mseCVError, 1]) - - # Exploitation weight - exploitation_weight = 1 - exploration_weight - - return exploration_weight, exploitation_weight - - # ------------------------------------------------------------------------- - def opt_SeqDesign(self, sigma2, n_candidates=5, var='DKL'): - """ - Runs optimal sequential design. - - Parameters - ---------- - sigma2 : dict, optional - A dictionary containing the measurement errors (sigma^2). The - default is None. - n_candidates : int, optional - Number of candidate samples. The default is 5. - var : string, optional - Utility function. The default is None. - - Raises - ------ - NameError - Wrong utility function. - - Returns - ------- - Xnew : array (n_samples, n_params) - Selected new training point(s). - """ - - # Initialization - MetaModel = self.MetaModel - Bounds = MetaModel.bound_tuples - n_new_samples = MetaModel.ExpDesign.n_new_samples - explore_method = MetaModel.ExpDesign.explore_method - exploit_method = MetaModel.ExpDesign.exploit_method - n_cand_groups = MetaModel.ExpDesign.n_cand_groups - tradeoff_scheme = MetaModel.ExpDesign.tradeoff_scheme - - old_EDX = MetaModel.ExpDesign.X - old_EDY = MetaModel.ExpDesign.Y.copy() - ndim = MetaModel.ExpDesign.X.shape[1] - OutputNames = MetaModel.ModelObj.Output.names - - # ----------------------------------------- - # ----------- CUSTOMIZED METHODS ---------- - # ----------------------------------------- - # Utility function exploit_method provided by user - if exploit_method.lower() == 'user': - - Xnew, filteredSamples = MetaModel.ExpDesign.ExploitFunction(self) - - print("\n") - print("\nXnew:\n", Xnew) - - return Xnew, filteredSamples - - # ----------------------------------------- - # ---------- EXPLORATION METHODS ---------- - # ----------------------------------------- - if explore_method == 'dual annealing': - # ------- EXPLORATION: OPTIMIZATION ------- - import time - start_time = time.time() - - # Divide the domain to subdomains - args = [] - subdomains = self.subdomain(Bounds, n_new_samples) - for i in range(n_new_samples): - args.append((exploit_method, subdomains[i], sigma2, var, i)) - - # Multiprocessing - pool = multiprocessing.Pool(multiprocessing.cpu_count()) - - # With Pool.starmap_async() - results = pool.starmap_async(self.dual_annealing, args).get() - - # Close the pool - pool.close() - - Xnew = np.array([results[i][1] for i in range(n_new_samples)]) - - print("\nXnew:\n", Xnew) - - elapsed_time = time.time() - start_time - print("\n") - print(f"elapsed_time: {round(elapsed_time,2)} sec.") - print('-'*20) - - elif explore_method == 'LOOCV': - # ----------------------------------------------------------------- - # TODO: LOOCV model construnction based on Feng et al. (2020) - # 'LOOCV': - # Initilize the ExploitScore array - - # Generate random samples - allCandidates = MetaModel.ExpDesign.generate_samples(n_candidates, - 'random') - - # Construct error model based on LCerror - errorModel = MetaModel.create_ModelError(old_EDX, self.LCerror) - self.errorModel.append(copy(errorModel)) - - # Evaluate the error models for allCandidates - eLCAllCands, _ = errorModel.eval_errormodel(allCandidates) - # Select the maximum as the representative error - eLCAllCands = np.dstack(eLCAllCands.values()) - eLCAllCandidates = np.max(eLCAllCands, axis=1)[:, 0] - - # Normalize the error w.r.t the maximum error - scoreExploration = eLCAllCandidates / np.sum(eLCAllCandidates) - - else: - # ------- EXPLORATION: SPACE-FILLING DESIGN ------- - # Generate candidate samples from Exploration class - explore = Exploration(MetaModel, n_candidates) - explore.w = 100 # * ndim #500 - # Select criterion (mc-intersite-proj-th, mc-intersite-proj) - explore.mc_criterion = 'mc-intersite-proj' - allCandidates, scoreExploration = explore.get_exploration_samples() - - # Temp: ---- Plot all candidates ----- - if ndim == 2: - def plotter(points, allCandidates, Method, - scoreExploration=None): - if Method == 'Voronoi': - from scipy.spatial import Voronoi, voronoi_plot_2d - vor = Voronoi(points) - fig = voronoi_plot_2d(vor) - ax1 = fig.axes[0] - else: - fig = plt.figure() - ax1 = fig.add_subplot(111) - ax1.scatter(points[:, 0], points[:, 1], s=10, c='r', - marker="s", label='Old Design Points') - ax1.scatter(allCandidates[:, 0], allCandidates[:, 1], s=10, - c='b', marker="o", label='Design candidates') - for i in range(points.shape[0]): - txt = 'p'+str(i+1) - ax1.annotate(txt, (points[i, 0], points[i, 1])) - if scoreExploration is not None: - for i in range(allCandidates.shape[0]): - txt = str(round(scoreExploration[i], 5)) - ax1.annotate(txt, (allCandidates[i, 0], - allCandidates[i, 1])) - - plt.xlim(self.bound_tuples[0]) - plt.ylim(self.bound_tuples[1]) - # plt.show() - plt.legend(loc='upper left') - - # ----------------------------------------- - # --------- EXPLOITATION METHODS ---------- - # ----------------------------------------- - if exploit_method == 'BayesOptDesign' or\ - exploit_method == 'BayesActDesign': - - # ------- Calculate Exoploration weight ------- - # Compute exploration weight based on trade off scheme - explore_w, exploit_w = self.tradoff_weights(tradeoff_scheme, - old_EDX, - old_EDY) - print(f"\n Exploration weight={explore_w:0.3f} " - f"Exploitation weight={exploit_w:0.3f}\n") - - # ------- EXPLOITATION: BayesOptDesign & ActiveLearning ------- - if explore_w != 1.0: - - # Create a sample pool for rejection sampling - MCsize = 15000 - X_MC = MetaModel.ExpDesign.generate_samples(MCsize, 'random') - candidates = MetaModel.ExpDesign.generate_samples( - MetaModel.ExpDesign.max_func_itr, 'latin_hypercube') - - # Split the candidates in groups for multiprocessing - split_cand = np.array_split( - candidates, n_cand_groups, axis=0 - ) - - results = Parallel(n_jobs=-1, backend='threading')( - delayed(self.run_util_func)( - exploit_method, split_cand[i], i, sigma2, var, X_MC) - for i in range(n_cand_groups)) - # out = map(self.run_util_func, - # [exploit_method]*n_cand_groups, - # split_cand, - # range(n_cand_groups), - # [sigma2] * n_cand_groups, - # [var] * n_cand_groups, - # [X_MC] * n_cand_groups - # ) - # results = list(out) - - # Retrieve the results and append them - U_J_d = np.concatenate([results[NofE][1] for NofE in - range(n_cand_groups)]) - - # Check if all scores are inf - if np.isinf(U_J_d).all() or np.isnan(U_J_d).all(): - U_J_d = np.ones(len(U_J_d)) - - # Get the expected value (mean) of the Utility score - # for each cell - if explore_method == 'Voronoi': - U_J_d = np.mean(U_J_d.reshape(-1, n_candidates), axis=1) - - # create surrogate model for U_J_d - from sklearn.preprocessing import MinMaxScaler - # Take care of inf entries - good_indices = [i for i, arr in enumerate(U_J_d) - if np.isfinite(arr).all()] - scaler = MinMaxScaler() - X_S = scaler.fit_transform(candidates[good_indices]) - gp = MetaModel.gaussian_process_emulator( - X_S, U_J_d[good_indices], autoSelect=True - ) - U_J_d = gp.predict(scaler.transform(allCandidates)) - - # Normalize U_J_d - norm_U_J_d = U_J_d / np.sum(U_J_d) - print("norm_U_J_d:\n", norm_U_J_d) - else: - norm_U_J_d = np.zeros((len(scoreExploration))) - - # ------- Calculate Total score ------- - # ------- Trade off between EXPLORATION & EXPLOITATION ------- - # Total score - totalScore = exploit_w * norm_U_J_d - totalScore += explore_w * scoreExploration - - # temp: Plot - # dim = self.ExpDesign.X.shape[1] - # if dim == 2: - # plotter(self.ExpDesign.X, allCandidates, explore_method) - - # ------- Select the best candidate ------- - # find an optimal point subset to add to the initial design by - # maximization of the utility score and taking care of NaN values - temp = totalScore.copy() - temp[np.isnan(totalScore)] = -np.inf - sorted_idxtotalScore = np.argsort(temp)[::-1] - bestIdx = sorted_idxtotalScore[:n_new_samples] - - # select the requested number of samples - if explore_method == 'Voronoi': - Xnew = np.zeros((n_new_samples, ndim)) - for i, idx in enumerate(bestIdx): - X_can = explore.closestPoints[idx] - - # Calculate the maxmin score for the region of interest - newSamples, maxminScore = explore.get_mc_samples(X_can) - - # select the requested number of samples - Xnew[i] = newSamples[np.argmax(maxminScore)] - else: - Xnew = allCandidates[sorted_idxtotalScore[:n_new_samples]] - - elif exploit_method == 'VarOptDesign': - # ------- EXPLOITATION: VarOptDesign ------- - UtilMethod = var - - # ------- Calculate Exoploration weight ------- - # Compute exploration weight based on trade off scheme - explore_w, exploit_w = self.tradoff_weights(tradeoff_scheme, - old_EDX, - old_EDY) - print(f"\nweightExploration={explore_w:0.3f} " - f"weightExploitation={exploit_w:0.3f}") - - # Generate candidate samples from Exploration class - nMeasurement = old_EDY[OutputNames[0]].shape[1] - - # Find sensitive region - if UtilMethod == 'LOOCV': - LCerror = MetaModel.LCerror - allModifiedLOO = np.zeros((len(old_EDX), len(OutputNames), - nMeasurement)) - for y_idx, y_key in enumerate(OutputNames): - for idx, key in enumerate(LCerror[y_key].keys()): - allModifiedLOO[:, y_idx, idx] = abs( - LCerror[y_key][key]) - - ExploitScore = np.max(np.max(allModifiedLOO, axis=1), axis=1) - - elif UtilMethod in ['EIGF', 'ALM']: - # ----- All other in ['EIGF', 'ALM'] ----- - # Initilize the ExploitScore array - ExploitScore = np.zeros((len(old_EDX), len(OutputNames))) - - # Split the candidates in groups for multiprocessing - if explore_method != 'Voronoi': - split_cand = np.array_split(allCandidates, - n_cand_groups, - axis=0) - goodSampleIdx = range(n_cand_groups) - else: - # Find indices of the Vornoi cells with samples - goodSampleIdx = [] - for idx in range(len(explore.closest_points)): - if len(explore.closest_points[idx]) != 0: - goodSampleIdx.append(idx) - split_cand = explore.closest_points - - # Split the candidates in groups for multiprocessing - args = [] - for index in goodSampleIdx: - args.append((exploit_method, split_cand[index], index, - sigma2, var)) - - # Multiprocessing - pool = multiprocessing.Pool(multiprocessing.cpu_count()) - # With Pool.starmap_async() - results = pool.starmap_async(self.run_util_func, args).get() - - # Close the pool - pool.close() - # out = map(self.run_util_func, - # [exploit_method]*len(goodSampleIdx), - # split_cand, - # range(len(goodSampleIdx)), - # [sigma2] * len(goodSampleIdx), - # [var] * len(goodSampleIdx) - # ) - # results = list(out) - - # Retrieve the results and append them - if explore_method == 'Voronoi': - ExploitScore = [np.mean(results[k][1]) for k in - range(len(goodSampleIdx))] - else: - ExploitScore = np.concatenate( - [results[k][1] for k in range(len(goodSampleIdx))]) - - else: - raise NameError('The requested utility function is not ' - 'available.') - - # print("ExploitScore:\n", ExploitScore) - - # find an optimal point subset to add to the initial design by - # maximization of the utility score and taking care of NaN values - # Total score - # Normalize U_J_d - ExploitScore = ExploitScore / np.sum(ExploitScore) - totalScore = exploit_w * ExploitScore - totalScore += explore_w * scoreExploration - - temp = totalScore.copy() - sorted_idxtotalScore = np.argsort(temp, axis=0)[::-1] - bestIdx = sorted_idxtotalScore[:n_new_samples] - - Xnew = np.zeros((n_new_samples, ndim)) - if explore_method != 'Voronoi': - Xnew = allCandidates[bestIdx] - else: - for i, idx in enumerate(bestIdx.flatten()): - X_can = explore.closest_points[idx] - # plotter(self.ExpDesign.X, X_can, explore_method, - # scoreExploration=None) - - # Calculate the maxmin score for the region of interest - newSamples, maxminScore = explore.get_mc_samples(X_can) - - # select the requested number of samples - Xnew[i] = newSamples[np.argmax(maxminScore)] - - elif exploit_method == 'alphabetic': - # ------- EXPLOITATION: ALPHABETIC ------- - Xnew = self.util_AlphOptDesign(allCandidates, var) - - elif exploit_method == 'Space-filling': - # ------- EXPLOITATION: SPACE-FILLING ------- - totalScore = scoreExploration - - # ------- Select the best candidate ------- - # find an optimal point subset to add to the initial design by - # maximization of the utility score and taking care of NaN values - temp = totalScore.copy() - temp[np.isnan(totalScore)] = -np.inf - sorted_idxtotalScore = np.argsort(temp)[::-1] - - # select the requested number of samples - Xnew = allCandidates[sorted_idxtotalScore[:n_new_samples]] - - else: - raise NameError('The requested design method is not available.') - - print("\n") - print("\nRun No. {}:".format(old_EDX.shape[0]+1)) - print("Xnew:\n", Xnew) - gc.collect() - - return Xnew, None - - # ------------------------------------------------------------------------- - def util_AlphOptDesign(self, candidates, var='D-Opt'): - """ - Enriches the Experimental design with the requested alphabetic - criterion based on exploring the space with number of sampling points. - - Ref: Hadigol, M., & Doostan, A. (2018). Least squares polynomial chaos - expansion: A review of sampling strategies., Computer Methods in - Applied Mechanics and Engineering, 332, 382-407. - - Arguments - --------- - NCandidate : int - Number of candidate points to be searched - - var : string - Alphabetic optimality criterion - - Returns - ------- - X_new : array of shape (1, n_params) - The new sampling location in the input space. - """ - MetaModelOrig = self - Model = self.Model - n_new_samples = MetaModelOrig.ExpDesign.n_new_samples - NCandidate = candidates.shape[0] - - # TODO: Loop over outputs - OutputName = Model.Output.names[0] - - # To avoid changes ub original aPCE object - MetaModel = deepcopy(MetaModelOrig) - - # Old Experimental design - oldExpDesignX = MetaModel.ExpDesign.X - - # TODO: Only one psi can be selected. - # Suggestion: Go for the one with the highest LOO error - Scores = list(MetaModel.score_dict[OutputName].values()) - ModifiedLOO = [1-score for score in Scores] - outIdx = np.argmax(ModifiedLOO) - - # Initialize Phi to save the criterion's values - Phi = np.zeros((NCandidate)) - - BasisIndices = MetaModelOrig.basis_dict[OutputName]["y_"+str(outIdx+1)] - P = len(BasisIndices) - - # ------ Old Psi ------------ - univ_p_val = MetaModelOrig.univ_basis_vals(oldExpDesignX) - Psi = MetaModelOrig.create_psi(BasisIndices, univ_p_val) - - # ------ New candidates (Psi_c) ------------ - # Assemble Psi_c - univ_p_val_c = self.univ_basis_vals(candidates) - Psi_c = self.create_psi(BasisIndices, univ_p_val_c) - - for idx in range(NCandidate): - - # Include the new row to the original Psi - Psi_cand = np.vstack((Psi, Psi_c[idx])) - - # Information matrix - PsiTPsi = np.dot(Psi_cand.T, Psi_cand) - M = PsiTPsi / (len(oldExpDesignX)+1) - - if np.linalg.cond(PsiTPsi) > 1e-12 \ - and np.linalg.cond(PsiTPsi) < 1 / sys.float_info.epsilon: - # faster - invM = linalg.solve(M, sparse.eye(PsiTPsi.shape[0]).toarray()) - else: - # stabler - invM = np.linalg.pinv(M) - - # ---------- Calculate optimality criterion ---------- - # Optimality criteria according to Section 4.5.1 in Ref. - - # D-Opt - if var == 'D-Opt': - Phi[idx] = (np.linalg.det(invM)) ** (1/P) - - # A-Opt - elif var == 'A-Opt': - Phi[idx] = np.trace(invM) - - # K-Opt - elif var == 'K-Opt': - Phi[idx] = np.linalg.cond(M) - - else: - raise Exception('The optimality criterion you requested has ' - 'not been implemented yet!') - - # find an optimal point subset to add to the initial design - # by minimization of the Phi - sorted_idxtotalScore = np.argsort(Phi) - - # select the requested number of samples - Xnew = candidates[sorted_idxtotalScore[:n_new_samples]] - - return Xnew - - # ------------------------------------------------------------------------- - def __normpdf(self, y_hat_pce, std_pce, obs_data, total_sigma2s, - rmse=None): - - Model = self.Model - likelihoods = 1.0 - - # Loop over the outputs - for idx, out in enumerate(Model.Output.names): - - # (Meta)Model Output - nsamples, nout = y_hat_pce[out].shape - - # Prepare data and remove NaN - try: - data = obs_data[out].values[~np.isnan(obs_data[out])] - except AttributeError: - data = obs_data[out][~np.isnan(obs_data[out])] - - # Prepare sigma2s - non_nan_indices = ~np.isnan(total_sigma2s[out]) - tot_sigma2s = total_sigma2s[out][non_nan_indices][:nout].values - - # Surrogate error if valid dataset is given. - if rmse is not None: - tot_sigma2s += rmse[out]**2 - - likelihoods *= stats.multivariate_normal.pdf( - y_hat_pce[out], data, np.diag(tot_sigma2s), - allow_singular=True) - self.Likelihoods = likelihoods - - return likelihoods - - # ------------------------------------------------------------------------- - def __corr_factor_BME(self, obs_data, total_sigma2s, logBME): - """ - Calculates the correction factor for BMEs. - """ - MetaModel = self.MetaModel - samples = MetaModel.ExpDesign.X # valid_samples - model_outputs = MetaModel.ExpDesign.Y # valid_model_runs - Model = MetaModel.ModelObj - n_samples = samples.shape[0] - - # Extract the requested model outputs for likelihood calulation - output_names = Model.Output.names - - # TODO: Evaluate MetaModel on the experimental design and ValidSet - OutputRS, stdOutputRS = MetaModel.eval_metamodel(samples=samples) - - logLik_data = np.zeros((n_samples)) - logLik_model = np.zeros((n_samples)) - # Loop over the outputs - for idx, out in enumerate(output_names): - - # (Meta)Model Output - nsamples, nout = model_outputs[out].shape - - # Prepare data and remove NaN - try: - data = obs_data[out].values[~np.isnan(obs_data[out])] - except AttributeError: - data = obs_data[out][~np.isnan(obs_data[out])] - - # Prepare sigma2s - non_nan_indices = ~np.isnan(total_sigma2s[out]) - tot_sigma2s = total_sigma2s[out][non_nan_indices][:nout] - - # Covariance Matrix - covMatrix_data = np.diag(tot_sigma2s) - - for i, sample in enumerate(samples): - - # Simulation run - y_m = model_outputs[out][i] - - # Surrogate prediction - y_m_hat = OutputRS[out][i] - - # CovMatrix with the surrogate error - # covMatrix = np.diag(stdOutputRS[out][i]**2) - covMatrix = np.diag((y_m-y_m_hat)**2) - covMatrix = np.diag( - np.mean((model_outputs[out]-OutputRS[out]), axis=0)**2 - ) - - # Compute likelilhood output vs data - logLik_data[i] += self.__logpdf( - y_m_hat, data, covMatrix_data - ) - - # Compute likelilhood output vs surrogate - logLik_model[i] += self.__logpdf(y_m_hat, y_m, covMatrix) - - # Weight - logLik_data -= logBME - weights = np.exp(logLik_model+logLik_data) - - return np.log(np.mean(weights)) - - # ------------------------------------------------------------------------- - def __logpdf(self, x, mean, cov): - """ - computes the likelihood based on a multivariate normal distribution. - - Parameters - ---------- - x : TYPE - DESCRIPTION. - mean : array_like - Observation data. - cov : 2d array - Covariance matrix of the distribution. - - Returns - ------- - log_lik : float - Log likelihood. - - """ - n = len(mean) - L = linalg.cholesky(cov, lower=True) - beta = np.sum(np.log(np.diag(L))) - dev = x - mean - alpha = dev.dot(linalg.cho_solve((L, True), dev)) - log_lik = -0.5 * alpha - beta - n / 2. * np.log(2 * np.pi) - - return log_lik - - # ------------------------------------------------------------------------- - def __posteriorPlot(self, posterior, par_names, key): - - # Initialization - newpath = (r'Outputs_SeqPosteriorComparison/posterior') - os.makedirs(newpath, exist_ok=True) - - bound_tuples = self.MetaModel.bound_tuples - n_params = len(par_names) - font_size = 40 - if n_params == 2: - - figPosterior, ax = plt.subplots(figsize=(15, 15)) - - sns.kdeplot(x=posterior[:, 0], y=posterior[:, 1], - fill=True, ax=ax, cmap=plt.cm.jet, - clip=bound_tuples) - # Axis labels - plt.xlabel(par_names[0], fontsize=font_size) - plt.ylabel(par_names[1], fontsize=font_size) - - # Set axis limit - plt.xlim(bound_tuples[0]) - plt.ylim(bound_tuples[1]) - - # Increase font size - plt.xticks(fontsize=font_size) - plt.yticks(fontsize=font_size) - - # Switch off the grids - plt.grid(False) - - else: - import corner - figPosterior = corner.corner(posterior, labels=par_names, - title_fmt='.2e', show_titles=True, - title_kwargs={"fontsize": 12}) - - figPosterior.savefig(f'./{newpath}/{key}.pdf', bbox_inches='tight') - plt.close() - - # Save the posterior as .npy - np.save(f'./{newpath}/{key}.npy', posterior) - - return figPosterior - - # ------------------------------------------------------------------------- - def __hellinger_distance(self, P, Q): - """ - Hellinger distance between two continuous distributions. - - The maximum distance 1 is achieved when P assigns probability zero to - every set to which Q assigns a positive probability, and vice versa. - 0 (identical) and 1 (maximally different) - - Parameters - ---------- - P : array - Reference likelihood. - Q : array - Estimated likelihood. - - Returns - ------- - float - Hellinger distance of two distributions. - - """ - mu1 = P.mean() - Sigma1 = np.std(P) - - mu2 = Q.mean() - Sigma2 = np.std(Q) - - term1 = np.sqrt(2*Sigma1*Sigma2 / (Sigma1**2 + Sigma2**2)) - - term2 = np.exp(-.25 * (mu1 - mu2)**2 / (Sigma1**2 + Sigma2**2)) - - H_squared = 1 - term1 * term2 - - return np.sqrt(H_squared) - - # ------------------------------------------------------------------------- - def __BME_Calculator(self, MetaModel, obs_data, sigma2Dict, rmse=None): - """ - This function computes the Bayesian model evidence (BME) via Monte - Carlo integration. - - """ - # Initializations - valid_likelihoods = MetaModel.valid_likelihoods - - post_snapshot = MetaModel.ExpDesign.post_snapshot - if post_snapshot or len(valid_likelihoods) != 0: - newpath = (r'Outputs_SeqPosteriorComparison/likelihood_vs_ref') - os.makedirs(newpath, exist_ok=True) - - SamplingMethod = 'random' - MCsize = 10000 - ESS = 0 - - # Estimation of the integral via Monte Varlo integration - while (ESS > MCsize) or (ESS < 1): - - # Generate samples for Monte Carlo simulation - X_MC = MetaModel.ExpDesign.generate_samples( - MCsize, SamplingMethod - ) - - # Monte Carlo simulation for the candidate design - m_1 = resource.getrusage(resource.RUSAGE_SELF).ru_maxrss/1024 - Y_MC, std_MC = MetaModel.eval_metamodel(samples=X_MC) - m_2 = resource.getrusage(resource.RUSAGE_SELF).ru_maxrss/1024 - print(f"\nMemory eval_metamodel in BME: {m_2-m_1:.2f} MB") - - # Likelihood computation (Comparison of data and - # simulation results via PCE with candidate design) - Likelihoods = self.__normpdf( - Y_MC, std_MC, obs_data, sigma2Dict, rmse - ) - - # Check the Effective Sample Size (1000<ESS<MCsize) - ESS = 1 / np.sum(np.square(Likelihoods/np.sum(Likelihoods))) - - # Enlarge sample size if it doesn't fulfill the criteria - if (ESS > MCsize) or (ESS < 1): - print(f'ESS={ESS} MC size should be larger.') - MCsize *= 10 - ESS = 0 - - # Rejection Step - # Random numbers between 0 and 1 - unif = np.random.rand(1, MCsize)[0] - - # Reject the poorly performed prior - accepted = (Likelihoods/np.max(Likelihoods)) >= unif - X_Posterior = X_MC[accepted] - - # ------------------------------------------------------------ - # --- Kullback-Leibler Divergence & Information Entropy ------ - # ------------------------------------------------------------ - # Prior-based estimation of BME - logBME = np.log(np.nanmean(Likelihoods)) - - # TODO: Correction factor - # log_weight = self.__corr_factor_BME(obs_data, sigma2Dict, logBME) - - # Posterior-based expectation of likelihoods - postExpLikelihoods = np.mean(np.log(Likelihoods[accepted])) - - # Posterior-based expectation of prior densities - postExpPrior = np.mean( - np.log(MetaModel.ExpDesign.JDist.pdf(X_Posterior.T)) - ) - - # Calculate Kullback-Leibler Divergence - # KLD = np.mean(np.log(Likelihoods[Likelihoods!=0])- logBME) - KLD = postExpLikelihoods - logBME - - # Information Entropy based on Entropy paper Eq. 38 - infEntropy = logBME - postExpPrior - postExpLikelihoods - - # If post_snapshot is True, plot likelihood vs refrence - if post_snapshot or len(valid_likelihoods) != 0: - # Hellinger distance - ref_like = np.log(valid_likelihoods[valid_likelihoods > 0]) - est_like = np.log(Likelihoods[Likelihoods > 0]) - distHellinger = self.__hellinger_distance(ref_like, est_like) - - idx = len([name for name in os.listdir(newpath) if 'Likelihoods_' - in name and os.path.isfile(os.path.join(newpath, name))]) - fig, ax = plt.subplots() - try: - sns.kdeplot(np.log(valid_likelihoods[valid_likelihoods > 0]), - shade=True, color="g", label='Ref. Likelihood') - sns.kdeplot(np.log(Likelihoods[Likelihoods > 0]), shade=True, - color="b", label='Likelihood with PCE') - except: - pass - - text = f"Hellinger Dist.={distHellinger:.3f}\n logBME={logBME:.3f}" - "\n DKL={KLD:.3f}" - - plt.text(0.05, 0.75, text, bbox=dict(facecolor='wheat', - edgecolor='black', - boxstyle='round,pad=1'), - transform=ax.transAxes) - - fig.savefig(f'./{newpath}/Likelihoods_{idx}.pdf', - bbox_inches='tight') - plt.close() - - else: - distHellinger = 0.0 - - # Bayesian inference with Emulator only for 2D problem - if post_snapshot and MetaModel.n_params == 2 and not idx % 5: - from bayes_inference.bayes_inference import BayesInference - from bayes_inference.discrepancy import Discrepancy - import pandas as pd - BayesOpts = BayesInference(MetaModel) - BayesOpts.emulator = True - BayesOpts.plot_post_pred = False - - # Select the inference method - import emcee - BayesOpts.inference_method = "MCMC" - # Set the MCMC parameters passed to self.mcmc_params - BayesOpts.mcmc_params = { - 'n_steps': 1e5, - 'n_walkers': 30, - 'moves': emcee.moves.KDEMove(), - 'verbose': False - } - - # ----- Define the discrepancy model ------- - obs_data = pd.DataFrame(obs_data, columns=self.Model.Output.names) - BayesOpts.measurement_error = obs_data - - # # -- (Option B) -- - DiscrepancyOpts = Discrepancy('') - DiscrepancyOpts.type = 'Gaussian' - DiscrepancyOpts.parameters = obs_data**2 - BayesOpts.Discrepancy = DiscrepancyOpts - # Start the calibration/inference - Bayes_PCE = BayesOpts.create_inference() - X_Posterior = Bayes_PCE.posterior_df.values - - # Clean up - del Y_MC, std_MC - gc.collect() - - return (logBME, KLD, X_Posterior, Likelihoods, distHellinger) - - # ------------------------------------------------------------------------- - def __validError(self, MetaModel): - - # MetaModel = self.MetaModel - Model = MetaModel.ModelObj - OutputName = Model.Output.names - - # Extract the original model with the generated samples - valid_samples = MetaModel.valid_samples - valid_model_runs = MetaModel.valid_model_runs - - # Run the PCE model with the generated samples - m_1 = resource.getrusage(resource.RUSAGE_SELF).ru_maxrss/1024 - valid_PCE_runs, valid_PCE_std = MetaModel.eval_metamodel(samples=valid_samples) - m_2 = resource.getrusage(resource.RUSAGE_SELF).ru_maxrss/1024 - print(f"\nMemory eval_metamodel: {m_2-m_1:.2f} MB") - - rms_error = {} - valid_error = {} - # Loop over the keys and compute RMSE error. - for key in OutputName: - rms_error[key] = mean_squared_error( - valid_model_runs[key], valid_PCE_runs[key], - multioutput='raw_values', - sample_weight=None, - squared=False) - - # Validation error - valid_error[key] = (rms_error[key]**2) - valid_error[key] /= np.var(valid_model_runs[key], ddof=1, axis=0) - - # Print a report table - print("\n>>>>> Updated Errors of {} <<<<<".format(key)) - print("\nIndex | RMSE | Validation Error") - print('-'*35) - print('\n'.join(f'{i+1} | {k:.3e} | {j:.3e}' for i, (k, j) - in enumerate(zip(rms_error[key], - valid_error[key])))) - - return rms_error, valid_error - - # ------------------------------------------------------------------------- - def __error_Mean_Std(self): - - MetaModel = self.MetaModel - # Extract the mean and std provided by user - df_MCReference = MetaModel.ModelObj.mc_reference - - # Compute the mean and std based on the MetaModel - pce_means, pce_stds = self._compute_pce_moments(MetaModel) - - # Compute the root mean squared error - for output in MetaModel.ModelObj.Output.names: - - # Compute the error between mean and std of MetaModel and OrigModel - RMSE_Mean = mean_squared_error( - df_MCReference['mean'], pce_means[output], squared=False - ) - RMSE_std = mean_squared_error( - df_MCReference['std'], pce_means[output], squared=False - ) - - return RMSE_Mean, RMSE_std - - # ------------------------------------------------------------------------- - def _compute_pce_moments(self, MetaModel): - """ - Computes the first two moments using the PCE-based meta-model. - - Returns - ------- - pce_means: dict - The first moment (mean) of the surrogate. - pce_stds: dict - The second moment (standard deviation) of the surrogate. - - """ - outputs = MetaModel.ModelObj.Output.names - pce_means_b = {} - pce_stds_b = {} - - # Loop over bootstrap iterations - for b_i in range(MetaModel.n_bootstrap_itrs): - # Loop over the metamodels - coeffs_dicts = MetaModel.coeffs_dict[f'b_{b_i+1}'].items() - means = {} - stds = {} - for output, coef_dict in coeffs_dicts: - - pce_mean = np.zeros((len(coef_dict))) - pce_var = np.zeros((len(coef_dict))) - - for index, values in coef_dict.items(): - idx = int(index.split('_')[1]) - 1 - coeffs = MetaModel.coeffs_dict[f'b_{b_i+1}'][output][index] - - # Mean = c_0 - if coeffs[0] != 0: - pce_mean[idx] = coeffs[0] - else: - clf_poly = MetaModel.clf_poly[f'b_{b_i+1}'][output] - pce_mean[idx] = clf_poly[index].intercept_ - # Var = sum(coeffs[1:]**2) - pce_var[idx] = np.sum(np.square(coeffs[1:])) - - # Save predictions for each output - if MetaModel.dim_red_method.lower() == 'pca': - PCA = MetaModel.pca[f'b_{b_i+1}'][output] - means[output] = PCA.mean_ + np.dot( - pce_mean, PCA.components_) - stds[output] = np.sqrt(np.dot(pce_var, - PCA.components_**2)) - else: - means[output] = pce_mean - stds[output] = np.sqrt(pce_var) - - # Save predictions for each bootstrap iteration - pce_means_b[b_i] = means - pce_stds_b[b_i] = stds - - # Change the order of nesting - mean_all = {} - for i in sorted(pce_means_b): - for k, v in pce_means_b[i].items(): - if k not in mean_all: - mean_all[k] = [None] * len(pce_means_b) - mean_all[k][i] = v - std_all = {} - for i in sorted(pce_stds_b): - for k, v in pce_stds_b[i].items(): - if k not in std_all: - std_all[k] = [None] * len(pce_stds_b) - std_all[k][i] = v - - # Back transformation if PCA is selected. - pce_means, pce_stds = {}, {} - for output in outputs: - pce_means[output] = np.mean(mean_all[output], axis=0) - pce_stds[output] = np.mean(std_all[output], axis=0) - - return pce_means, pce_stds diff --git a/src/bayesvalidrox/surrogate_models/surrogate_models.py b/src/bayesvalidrox/surrogate_models/surrogate_models.py index c51ea8c6679aaeec685da069154e8f460c7c4450..eb22b9085aaebc6701f50696dd5a093cfc218d90 100644 --- a/src/bayesvalidrox/surrogate_models/surrogate_models.py +++ b/src/bayesvalidrox/surrogate_models/surrogate_models.py @@ -1,36 +1,287 @@ #!/usr/bin/env python3 # -*- coding: utf-8 -*- +""" +Implementation of metamodel as either PC, aPC or GPE +""" +import copy +import os import warnings -import numpy as np -import math -import h5py + import matplotlib.pyplot as plt -from sklearn.preprocessing import MinMaxScaler +import numpy as np import scipy as sp -from tqdm import tqdm -from sklearn.decomposition import PCA as sklearnPCA -import sklearn.linear_model as lm -from sklearn.gaussian_process import GaussianProcessRegressor import sklearn.gaussian_process.kernels as kernels -import os +import sklearn.linear_model as lm from joblib import Parallel, delayed -import copy +from scipy.optimize import minimize, NonlinearConstraint +from sklearn.decomposition import PCA as sklearnPCA +from sklearn.gaussian_process import GaussianProcessRegressor +from sklearn.preprocessing import MinMaxScaler +from tqdm import tqdm -from .exp_designs import ExpDesigns -from .glexindex import glexindex +from .apoly_construction import apoly_construction +from .bayes_linear import VBLinearRegression, EBLinearRegression from .eval_rec_rule import eval_univ_basis +from .glexindex import glexindex +from .input_space import InputSpace +from .orthogonal_matching_pursuit import OrthogonalMatchingPursuit from .reg_fast_ard import RegressionFastARD from .reg_fast_laplace import RegressionFastLaplace -from .orthogonal_matching_pursuit import OrthogonalMatchingPursuit -from .bayes_linear import VBLinearRegression, EBLinearRegression + warnings.filterwarnings("ignore") # Load the mplstyle +# noinspection SpellCheckingInspection plt.style.use(os.path.join(os.path.split(__file__)[0], '../', 'bayesvalidrox.mplstyle')) -class MetaModel(): +# noinspection SpellCheckingInspection +def corr_loocv_error(clf, psi, coeffs, y): + """ + Calculates the corrected LOO error for regression on regressor + matrix `psi` that generated the coefficients based on [1] and [2]. + + [1] Blatman, G., 2009. Adaptive sparse polynomial chaos expansions for + uncertainty propagation and sensitivity analysis (Doctoral + dissertation, Clermont-Ferrand 2). + + [2] Blatman, G. and Sudret, B., 2011. Adaptive sparse polynomial chaos + expansion based on least angle regression. Journal of computational + Physics, 230(6), pp.2345-2367. + + Parameters + ---------- + clf : object + Fitted estimator. + psi : array of shape (n_samples, n_features) + The multivariate orthogonal polynomials (regressor). + coeffs : array-like of shape (n_features,) + Estimated cofficients. + y : array of shape (n_samples,) + Target values. + + Returns + ------- + R_2 : float + LOOCV Validation score (1-LOOCV erro). + residual : array of shape (n_samples,) + Residual values (y - predicted targets). + + """ + psi = np.array(psi, dtype=float) + + # Create PSI_Sparse by removing redundent terms + nnz_idx = np.nonzero(coeffs)[0] + if len(nnz_idx) == 0: + nnz_idx = [0] + psi_sparse = psi[:, nnz_idx] + + # NrCoeffs of aPCEs + P = len(nnz_idx) + # NrEvaluation (Size of experimental design) + N = psi.shape[0] + + # Build the projection matrix + PsiTPsi = np.dot(psi_sparse.T, psi_sparse) + + if np.linalg.cond(PsiTPsi) > 1e-12: # and \ + # np.linalg.cond(PsiTPsi) < 1/sys.float_info.epsilon: + # faster + try: + M = sp.linalg.solve(PsiTPsi, + sp.sparse.eye(PsiTPsi.shape[0]).toarray()) + except: + raise AttributeError( + 'There are too few samples for the corrected loo-cv error. Fit surrogate on at least as many ' + 'samples as parameters to use this') + else: + # stabler + M = np.linalg.pinv(PsiTPsi) + + # h factor (the full matrix is not calculated explicitly, + # only the trace is, to save memory) + PsiM = np.dot(psi_sparse, M) + + h = np.sum(np.multiply(PsiM, psi_sparse), axis=1, dtype=np.longdouble) # float128) + + # ------ Calculate Error Loocv for each measurement point ---- + # Residuals + try: + residual = clf.predict(psi) - y + except: + residual = np.dot(psi, coeffs) - y + + # Variance + var_y = np.var(y) + + if var_y == 0: + # norm_emp_error = 0 + loo_error = 0 + LCerror = np.zeros(y.shape) + return 1 - loo_error, LCerror + else: + # norm_emp_error = np.mean(residual ** 2) / var_y + + # LCerror = np.divide(residual, (1-h)) + LCerror = residual / (1 - h) + loo_error = np.mean(np.square(LCerror)) / var_y + # if there are NaNs, just return an infinite LOO error (this + # happens, e.g., when a strongly underdetermined problem is solved) + if np.isnan(loo_error): + loo_error = np.inf + + # Corrected Error for over-determined system + tr_M = np.trace(M) + if tr_M < 0 or abs(tr_M) > 1e6: + tr_M = np.trace(np.linalg.pinv(np.dot(psi.T, psi))) + + # Over-determined system of Equation + if N > P: + T_factor = N / (N - P) * (1 + tr_M) + + # Under-determined system of Equation + else: + T_factor = np.inf + + corrected_loo_error = loo_error * T_factor + + R_2 = 1 - corrected_loo_error + + return R_2, LCerror + + +def create_psi(basis_indices, univ_p_val): + """ + This function assemble the design matrix Psi from the given basis index + set INDICES and the univariate polynomial evaluations univ_p_val. + + Parameters + ---------- + basis_indices : array of shape (n_terms, n_params) + Multi-indices of multivariate polynomials. + univ_p_val : array of (n_samples, n_params, n_max+1) + All univariate regressors up to `n_max`. + + Raises + ------ + ValueError + n_terms in arguments do not match. + + Returns + ------- + psi : array of shape (n_samples, n_terms) + Multivariate regressors. + + """ + # Check if BasisIndices is a sparse matrix + sparsity = sp.sparse.issparse(basis_indices) + if sparsity: + basis_indices = basis_indices.toarray() + + # Initialization and consistency checks + # number of input variables + n_params = univ_p_val.shape[1] + + # Size of the experimental design + n_samples = univ_p_val.shape[0] + + # number of basis terms + n_terms = basis_indices.shape[0] + + # check that the variables have consistent sizes + if n_params != basis_indices.shape[1]: + raise ValueError( + f"The shapes of basis_indices ({basis_indices.shape[1]}) and " + f"univ_p_val ({n_params}) don't match!!" + ) + + # Preallocate the Psi matrix for performance + psi = np.ones((n_samples, n_terms)) + # Assemble the Psi matrix + for m in range(basis_indices.shape[1]): + aa = np.where(basis_indices[:, m] > 0)[0] + try: + basisIdx = basis_indices[aa, m] + bb = univ_p_val[:, m, basisIdx].reshape(psi[:, aa].shape) + psi[:, aa] = np.multiply(psi[:, aa], bb) + except ValueError as err: + raise err + return psi + + +def gaussian_process_emulator(X, y, nug_term=None, autoSelect=False, + varIdx=None): + """ + Fits a Gaussian Process Emulator to the target given the training + points. + + Parameters + ---------- + X : array of shape (n_samples, n_params) + Training points. + y : array of shape (n_samples,) + Target values. + nug_term : float, optional + Nugget term. The default is None, i.e. variance of y. + autoSelect : bool, optional + Loop over some kernels and select the best. The default is False. + varIdx : int, optional + The index number. The default is None. + + Returns + ------- + gp : object + Fitted estimator. + + """ + + nug_term = nug_term if nug_term else np.var(y) + + Kernels = [nug_term * kernels.RBF(length_scale=1.0, + length_scale_bounds=(1e-25, 1e15)), + nug_term * kernels.RationalQuadratic(length_scale=0.2, + alpha=1.0), + nug_term * kernels.Matern(length_scale=1.0, + length_scale_bounds=(1e-15, 1e5), + nu=1.5)] + + # Automatic selection of the kernel + if autoSelect: + gp = {} + BME = [] + for i, kernel in enumerate(Kernels): + gp[i] = GaussianProcessRegressor(kernel=kernel, + n_restarts_optimizer=3, + normalize_y=False) + + # Fit to data using Maximum Likelihood Estimation + gp[i].fit(X, y) + + # Store the MLE as BME score + BME.append(gp[i].log_marginal_likelihood()) + + gp = gp[np.argmax(BME)] + + else: + gp = GaussianProcessRegressor(kernel=Kernels[0], + n_restarts_optimizer=3, + normalize_y=False) + gp.fit(X, y) + + # Compute score + if varIdx is not None: + Score = gp.score(X, y) + print('-' * 50) + print(f'Output variable {varIdx}:') + print('The estimation of GPE coefficients converged,') + print(f'with the R^2 score: {Score:.3f}') + print('-' * 50) + + return gp + + +class MetaModel: """ Meta (surrogate) model @@ -77,10 +328,14 @@ class MetaModel(): `'no'`. There are two ways to select number of components: use percentage of the explainable variance threshold (between 0 and 100) (Option A) or direct prescription of components' number (Option B): - + >>> MetaModelOpts = MetaModel() >>> MetaModelOpts.dim_red_method = 'PCA' >>> MetaModelOpts.var_pca_threshold = 99.999 # Option A >>> MetaModelOpts.n_pca_components = 12 # Option B + apply_constraints : bool + If set to true constraints will be applied during training. + In this case the training uses OLS. In this version the constraints + need to be set explicitly in this class. verbose : bool Prints summary of the regression results. Default is `False`. @@ -90,21 +345,21 @@ class MetaModel(): To define the sampling methods and the training set, an experimental design instance shall be defined. This can be done by: - >>> MetaModelOpts.add_ExpDesign() + >>> MetaModelOpts.add_InputSpace() Two experimental design schemes are supported: one-shot (`normal`) and adaptive sequential (`sequential`) designs. - For experimental design refer to `ExpDesigns`. + For experimental design refer to `InputSpace`. """ - def __init__(self, input_obj, model_obj, meta_model_type='PCE', + def __init__(self, input_obj, meta_model_type='PCE', pce_reg_method='OLS', bootstrap_method='fast', n_bootstrap_itrs=1, pce_deg=1, pce_q_norm=1.0, - dim_red_method='no', verbose=False): + dim_red_method='no', apply_constraints=False, + verbose=False): self.input_obj = input_obj - self.ModelObj = model_obj self.meta_model_type = meta_model_type self.pce_reg_method = pce_reg_method self.bootstrap_method = bootstrap_method @@ -112,70 +367,79 @@ class MetaModel(): self.pce_deg = pce_deg self.pce_q_norm = pce_q_norm self.dim_red_method = dim_red_method - self.verbose = False - - # ------------------------------------------------------------------------- - def create_metamodel(self): + self.apply_constraints = apply_constraints + self.verbose = verbose + + # Other params + self.InputSpace = None + self.var_pca_threshold = None + self.polycoeffs = None + self.errorScale = None + self.errorclf_poly = None + self.errorRegMethod = None + self.nlc = None + self.univ_p_val = None + self.n_pca_components = None + self.out_names = None + self.allBasisIndices = None + self.deg_array = None + self.n_samples = None + self.CollocationPoints = None + self.pca = None + self.LCerror = None + self.clf_poly = None + self.score_dict = None + self.basis_dict = None + self.coeffs_dict = None + self.q_norm_dict = None + self.deg_dict = None + self.x_scaler = None + self.gp_poly = None + self.n_params = None + self.ndim = None + self.init_type = None + self.rmse = None + + def build_metamodel(self, n_init_samples=None) -> None: """ - Starts the training of the meta-model for the model objects containg - the given computational model. + Builds the parts for the metamodel (polynomes,...) that are neede before fitting. Returns ------- - metamodel : obj - The meta model object. + None + DESCRIPTION. """ - Model = self.ModelObj - self.n_params = len(self.input_obj.Marginals) - self.ExpDesignFlag = 'normal' - # --- Prepare pce degree --- - if self.meta_model_type.lower() == 'pce': - if type(self.pce_deg) is not np.ndarray: - self.pce_deg = np.array(self.pce_deg) - - if self.ExpDesign.method == 'sequential': - raise Exception( - "Please use MetaModelEngine class for the sequential design!" - ) - elif self.ExpDesign.method == 'normal': - self.ExpDesignFlag = 'normal' - self.train_norm_design(Model, verbose=True) + # Generate general warnings + if self.apply_constraints or self.pce_reg_method.lower() == 'ols': + print('There are no estimations of surrogate uncertainty available' + ' for the chosen regression options. This might lead to issues' + ' in later steps.') - else: - raise Exception("The method for experimental design you requested" - " has not been implemented yet.") - - # Zip the model run directories - if self.ModelObj.link_type.lower() == 'pylink' and\ - self.ExpDesign.sampling_method.lower() != 'user': - Model.zip_subdirs(Model.name, f'{Model.name}_') + if self.CollocationPoints is None: + raise AttributeError('Please provide samples to the metamodel before building it.') + self.CollocationPoints = np.array(self.CollocationPoints) - return self + # Add InputSpace to MetaModel if it does not have any + if self.InputSpace is None: + if n_init_samples is None: + n_init_samples = self.CollocationPoints.shape[0] + self.InputSpace = InputSpace(self.input_obj) + self.InputSpace.n_init_samples = n_init_samples + self.InputSpace.init_param_space(np.max(self.pce_deg)) - # ------------------------------------------------------------------------- - def train_norm_design(self, parallel=True, verbose=False): - """ - This function loops over the outputs and each time step/point and fits - the meta model. + self.ndim = self.InputSpace.ndim - Parameters - ---------- - parallel : bool - The parallel computation of coefficents. The default is True. - verbose : bool, optional - Flag for a sequential design in silent mode. The default is False. + # Transform input samples + # TODO: this is probably not yet correct! Make 'method' variable + self.CollocationPoints = self.InputSpace.transform(self.CollocationPoints, method='user') - Returns - ------- - self: obj - Meta-model object. + self.n_params = len(self.input_obj.Marginals) - """ - Model = self.ModelObj - # Get the collocation points to run the forward model - CollocationPoints, OutputDict = self.generate_ExpDesign(Model) + # Generate polynomials + if self.meta_model_type.lower() != 'gpe': + self.generate_polynomials(np.max(self.pce_deg)) # Initialize the nested dictionaries if self.meta_model_type.lower() == 'gpe': @@ -194,8 +458,14 @@ class MetaModel(): self.pca = self.auto_vivification() # Define an array containing the degrees - n_samples, ndim = CollocationPoints.shape - self.deg_array = self.__select_degree(ndim, n_samples) + self.CollocationPoints = np.array(self.CollocationPoints) + self.n_samples, ndim = self.CollocationPoints.shape + if self.ndim != ndim: + raise AttributeError( + 'The given samples do not match the given number of priors. The samples should be a 2D array of size' + '(#samples, #priors)') + + self.deg_array = self.__select_degree(ndim, self.n_samples) # Generate all basis indices self.allBasisIndices = self.auto_vivification() @@ -204,17 +474,60 @@ class MetaModel(): if deg not in np.fromiter(keys, dtype=float): # Generate the polynomial basis indices for qidx, q in enumerate(self.pce_q_norm): - basis_indices = self.create_basis_indices(degree=deg, - q_norm=q) + basis_indices = glexindex(start=0, stop=deg + 1, + dimensions=self.n_params, + cross_truncation=q, + reverse=False, graded=True) self.allBasisIndices[str(deg)][str(q)] = basis_indices - # Evaluate the univariate polynomials on ExpDesign - if self.meta_model_type.lower() != 'gpe': - univ_p_val = self.univ_basis_vals(CollocationPoints) + def fit(self, X: np.array, y: dict, parallel=False, verbose=False): + """ + Fits the surrogate to the given data (samples X, outputs y). + Note here that the samples X should be the transformed samples provided + by the experimental design if the transformation is used there. + + Parameters + ---------- + X : 2D list or np.array of shape (#samples, #dim) + The parameter value combinations that the model was evaluated at. + y : dict of 2D lists or arrays of shape (#samples, #timesteps) + The respective model evaluations. + parallel : bool + Set to True to run the training in parallel for various keys. + The default is False. + verbose : bool + Set to True to obtain more information during runtime. + The default is False. + + Returns + ------- + None. - if 'x_values' in OutputDict: - self.ExpDesign.x_values = OutputDict['x_values'] - del OutputDict['x_values'] + """ + # print(X) + # print(X.shape) + # print(y) + # print(y['Z'].shape) + X = np.array(X) + for key in y.keys(): + y_val = np.array(y[key]) + if y_val.ndim != 2: + raise ValueError('The given outputs y should be 2D') + y[key] = np.array(y[key]) + + # Output names are the same as the keys in y + self.out_names = list(y.keys()) + + # Build the MetaModel on the static samples + self.CollocationPoints = X + + # TODO: other option: rebuild every time + if self.deg_array is None: + self.build_metamodel(n_init_samples=X.shape[1]) + + # Evaluate the univariate polynomials on InputSpace + if self.meta_model_type.lower() != 'gpe': + self.univ_p_val = self.univ_basis_vals(self.CollocationPoints) # --- Loop through data points and fit the surrogate --- if verbose: @@ -227,10 +540,10 @@ class MetaModel(): self.n_bootstrap_itrs = 100 # Check if fast version (update coeffs with OLS) is selected. + n_comp_dict = {} + first_out = {} if self.bootstrap_method.lower() == 'fast': fast_bootstrap = True - first_out = {} - n_comp_dict = {} else: fast_bootstrap = False @@ -238,7 +551,7 @@ class MetaModel(): if verbose and self.n_bootstrap_itrs > 1: enum_obj = tqdm(range(self.n_bootstrap_itrs), total=self.n_bootstrap_itrs, - desc="Boostraping the metamodel", + desc="Bootstrapping the metamodel", ascii=True) else: enum_obj = range(self.n_bootstrap_itrs) @@ -246,16 +559,16 @@ class MetaModel(): # Loop over the bootstrap iterations for b_i in enum_obj: if b_i > 0: - b_indices = np.random.randint(n_samples, size=n_samples) + b_indices = np.random.randint(self.n_samples, size=self.n_samples) else: - b_indices = np.arange(len(CollocationPoints)) + b_indices = np.arange(len(X)) - X_train_b = CollocationPoints[b_indices] + X_train_b = X[b_indices] if verbose and self.n_bootstrap_itrs == 1: - items = tqdm(OutputDict.items(), desc="Fitting regression") + items = tqdm(y.items(), desc="Fitting regression") else: - items = OutputDict.items() + items = y.items() # For loop over the components/outputs for key, Output in items: @@ -270,8 +583,8 @@ class MetaModel(): # Start transformation pca, target, n_comp = self.pca_transformation( Output[b_indices], verbose=False - ) - self.pca[f'b_{b_i+1}'][key] = pca + ) + self.pca[f'b_{b_i + 1}'][key] = pca # Store the number of components for fast bootsrtrapping if fast_bootstrap and b_i == 0: n_comp_dict[key] = n_comp @@ -279,39 +592,40 @@ class MetaModel(): target = Output[b_indices] # Parallel fit regression + out = None if self.meta_model_type.lower() == 'gpe': # Prepare the input matrix scaler = MinMaxScaler() X_S = scaler.fit_transform(X_train_b) - self.x_scaler[f'b_{b_i+1}'][key] = scaler + self.x_scaler[f'b_{b_i + 1}'][key] = scaler if parallel: out = Parallel(n_jobs=-1, backend='multiprocessing')( - delayed(self.gaussian_process_emulator)( + delayed(gaussian_process_emulator)( X_S, target[:, idx]) for idx in range(target.shape[1])) else: - results = map(self.gaussian_process_emulator, - [X_train_b]*target.shape[1], + results = map(gaussian_process_emulator, + [X_train_b] * target.shape[1], [target[:, idx] for idx in range(target.shape[1])] ) out = list(results) for idx in range(target.shape[1]): - self.gp_poly[f'b_{b_i+1}'][key][f"y_{idx+1}"] = out[idx] + self.gp_poly[f'b_{b_i + 1}'][key][f"y_{idx + 1}"] = out[idx] else: - self.univ_p_val = univ_p_val[b_indices] + self.univ_p_val = self.univ_p_val[b_indices] if parallel and (not fast_bootstrap or b_i == 0): out = Parallel(n_jobs=-1, backend='multiprocessing')( - delayed(self.adaptive_regression)(X_train_b, - target[:, idx], - idx) + delayed(self.adaptive_regression)( # X_train_b, + target[:, idx], + idx) for idx in range(target.shape[1])) elif not parallel and (not fast_bootstrap or b_i == 0): results = map(self.adaptive_regression, - [X_train_b]*target.shape[1], + # [X_train_b] * target.shape[1], [target[:, idx] for idx in range(target.shape[1])], range(target.shape[1])) @@ -322,30 +636,29 @@ class MetaModel(): first_out[key] = copy.deepcopy(out) if b_i > 0 and fast_bootstrap: - # fast bootstrap out = self.update_pce_coeffs( X_train_b, target, first_out[key]) for i in range(target.shape[1]): # Create a dict to pass the variables - self.deg_dict[f'b_{b_i+1}'][key][f"y_{i+1}"] = out[i]['degree'] - self.q_norm_dict[f'b_{b_i+1}'][key][f"y_{i+1}"] = out[i]['qnorm'] - self.coeffs_dict[f'b_{b_i+1}'][key][f"y_{i+1}"] = out[i]['coeffs'] - self.basis_dict[f'b_{b_i+1}'][key][f"y_{i+1}"] = out[i]['multi_indices'] - self.score_dict[f'b_{b_i+1}'][key][f"y_{i+1}"] = out[i]['LOOCVScore'] - self.clf_poly[f'b_{b_i+1}'][key][f"y_{i+1}"] = out[i]['clf_poly'] - #self.LCerror[f'b_{b_i+1}'][key][f"y_{i+1}"] = out[i]['LCerror'] + self.deg_dict[f'b_{b_i + 1}'][key][f"y_{i + 1}"] = out[i]['degree'] + self.q_norm_dict[f'b_{b_i + 1}'][key][f"y_{i + 1}"] = out[i]['qnorm'] + self.coeffs_dict[f'b_{b_i + 1}'][key][f"y_{i + 1}"] = out[i]['coeffs'] + self.basis_dict[f'b_{b_i + 1}'][key][f"y_{i + 1}"] = out[i]['multi_indices'] + self.score_dict[f'b_{b_i + 1}'][key][f"y_{i + 1}"] = out[i]['LOOCVScore'] + self.clf_poly[f'b_{b_i + 1}'][key][f"y_{i + 1}"] = out[i]['clf_poly'] + # self.LCerror[f'b_{b_i+1}'][key][f"y_{i+1}"] = out[i]['LCerror'] if verbose: print(f"\n>>>> Training the {self.meta_model_type} metamodel" " sucessfully completed. <<<<<<\n") # ------------------------------------------------------------------------- - def update_pce_coeffs(self, X, y, out_dict): + def update_pce_coeffs(self, X, y, out_dict=None): """ Updates the PCE coefficents using only the ordinary least square method - for the fast version of the bootsrtrapping. + for the fast version of the bootstrapping. Parameters ---------- @@ -363,6 +676,7 @@ class MetaModel(): The updated training output dictionary. """ + # TODO: why is X not used here? # Make a copy final_out_dict = copy.deepcopy(out_dict) @@ -375,13 +689,13 @@ class MetaModel(): basis_indices = out_dict[i]['multi_indices'] # Evaluate the multivariate polynomials on CollocationPoints - psi = self.create_psi(basis_indices, self.univ_p_val) + psi = create_psi(basis_indices, self.univ_p_val) # Calulate the cofficients of surrogate model - updated_out = self.fit( + updated_out = self.regression( psi, y[:, i], basis_indices, reg_method='OLS', sparsity=False - ) + ) # Update coeffs in out_dict final_out_dict[i]['coeffs'][nnz_idx] = updated_out['coeffs'] @@ -389,33 +703,7 @@ class MetaModel(): return final_out_dict # ------------------------------------------------------------------------- - def create_basis_indices(self, degree, q_norm): - """ - Creates set of selected multi-indices of multivariate polynomials for - certain parameter numbers, polynomial degree, hyperbolic (or q-norm) - truncation scheme. - - Parameters - ---------- - degree : int - Polynomial degree. - q_norm : float - hyperbolic (or q-norm) truncation. - - Returns - ------- - basis_indices : array of shape (n_terms, n_params) - Multi-indices of multivariate polynomials. - - """ - basis_indices = glexindex(start=0, stop=degree+1, - dimensions=self.n_params, - cross_truncation=q_norm, - reverse=False, graded=True) - return basis_indices - - # ------------------------------------------------------------------------- - def add_ExpDesign(self): + def add_InputSpace(self): """ Instanciates experimental design object. @@ -424,101 +712,8 @@ class MetaModel(): None. """ - self.ExpDesign = ExpDesigns(self.input_obj, - meta_Model=self.meta_model_type) - - # ------------------------------------------------------------------------- - def generate_ExpDesign(self, Model): - """ - Prepares the experimental design either by reading from the prescribed - data or running simulations. - - Parameters - ---------- - Model : obj - Model object. - - Raises - ------ - Exception - If model sumulations are not provided properly. - - Returns - ------- - ED_X_tr: array of shape (n_samples, n_params) - Training samples transformed by an isoprobabilistic transformation. - ED_Y: dict - Model simulations (target) for all outputs. - """ - ExpDesign = self.ExpDesign - if self.ExpDesignFlag != 'sequential': - # Read ExpDesign (training and targets) from the provided hdf5 - if ExpDesign.hdf5_file is not None: - - # Read hdf5 file - f = h5py.File(ExpDesign.hdf5_file, 'r+') - - # Read EDX and pass it to ExpDesign object - try: - ExpDesign.X = np.array(f["EDX/New_init_"]) - except KeyError: - ExpDesign.X = np.array(f["EDX/init_"]) - - # Update number of initial samples - ExpDesign.n_init_samples = ExpDesign.X.shape[0] - - # Read EDX and pass it to ExpDesign object - out_names = self.ModelObj.Output.names - ExpDesign.Y = {} - - # Extract x values - try: - ExpDesign.Y["x_values"] = dict() - for varIdx, var in enumerate(out_names): - x = np.array(f[f"x_values/{var}"]) - ExpDesign.Y["x_values"][var] = x - except KeyError: - ExpDesign.Y["x_values"] = np.array(f["x_values"]) - - # Store the output - for varIdx, var in enumerate(out_names): - try: - y = np.array(f[f"EDY/{var}/New_init_"]) - except KeyError: - y = np.array(f[f"EDY/{var}/init_"]) - ExpDesign.Y[var] = y - f.close() - else: - # Check if an old hdf5 file exists: if yes, rename it - hdf5file = f'ExpDesign_{self.ModelObj.name}.hdf5' - if os.path.exists(hdf5file): - os.rename(hdf5file, 'old_'+hdf5file) - - # ---- Prepare X samples ---- - ED_X, ED_X_tr = ExpDesign.generate_ED(ExpDesign.n_init_samples, - ExpDesign.sampling_method, - transform=True, - max_pce_deg=np.max(self.pce_deg)) - ExpDesign.X = ED_X - ExpDesign.collocationPoints = ED_X_tr - self.bound_tuples = ExpDesign.bound_tuples - - # ---- Run simulations at X ---- - if not hasattr(ExpDesign, 'Y') or ExpDesign.Y is None: - print('\n Now the forward model needs to be run!\n') - ED_Y, up_ED_X = Model.run_model_parallel(ED_X) - ExpDesign.X = up_ED_X - self.ModelOutputDict = ED_Y - ExpDesign.Y = ED_Y - else: - # Check if a dict has been passed. - if type(ExpDesign.Y) is dict: - self.ModelOutputDict = ExpDesign.Y - else: - raise Exception('Please provide either a dictionary or a hdf5' - 'file to ExpDesign.hdf5_file argument.') - - return ED_X_tr, self.ModelOutputDict + self.InputSpace = InputSpace(self.input_obj, + meta_Model_type=self.meta_model_type) # ------------------------------------------------------------------------- def univ_basis_vals(self, samples, n_max=None): @@ -538,14 +733,14 @@ class MetaModel(): All univariate regressors up to n_max. """ # Extract information - poly_types = self.ExpDesign.poly_types + poly_types = self.InputSpace.poly_types if samples.ndim != 2: samples = samples.reshape(1, len(samples)) n_max = np.max(self.pce_deg) if n_max is None else n_max # Extract poly coeffs - if self.ExpDesign.input_data_given or self.ExpDesign.apce: - apolycoeffs = self.ExpDesign.polycoeffs + if self.InputSpace.input_data_given or self.InputSpace.apce: + apolycoeffs = self.polycoeffs else: apolycoeffs = None @@ -555,66 +750,9 @@ class MetaModel(): return univ_basis # ------------------------------------------------------------------------- - def create_psi(self, basis_indices, univ_p_val): - """ - This function assemble the design matrix Psi from the given basis index - set INDICES and the univariate polynomial evaluations univ_p_val. - - Parameters - ---------- - basis_indices : array of shape (n_terms, n_params) - Multi-indices of multivariate polynomials. - univ_p_val : array of (n_samples, n_params, n_max+1) - All univariate regressors up to `n_max`. - - Raises - ------ - ValueError - n_terms in arguments do not match. - - Returns - ------- - psi : array of shape (n_samples, n_terms) - Multivariate regressors. - - """ - # Check if BasisIndices is a sparse matrix - sparsity = sp.sparse.issparse(basis_indices) - if sparsity: - basis_indices = basis_indices.toarray() - - # Initialization and consistency checks - # number of input variables - n_params = univ_p_val.shape[1] - - # Size of the experimental design - n_samples = univ_p_val.shape[0] - - # number of basis terms - n_terms = basis_indices.shape[0] - - # check that the variables have consistent sizes - if n_params != basis_indices.shape[1]: - raise ValueError( - f"The shapes of basis_indices ({basis_indices.shape[1]}) and " - f"univ_p_val ({n_params}) don't match!!" - ) - - # Preallocate the Psi matrix for performance - psi = np.ones((n_samples, n_terms)) - # Assemble the Psi matrix - for m in range(basis_indices.shape[1]): - aa = np.where(basis_indices[:, m] > 0)[0] - try: - basisIdx = basis_indices[aa, m] - bb = univ_p_val[:, m, basisIdx].reshape(psi[:, aa].shape) - psi[:, aa] = np.multiply(psi[:, aa], bb) - except ValueError as err: - raise err - return psi # ------------------------------------------------------------------------- - def fit(self, X, y, basis_indices, reg_method=None, sparsity=True): + def regression(self, X, y, basis_indices, reg_method=None, sparsity=True): """ Fit regression using the regression method provided. @@ -629,6 +767,8 @@ class MetaModel(): Multi-indices of multivariate polynomials. reg_method : str, optional DESCRIPTION. The default is None. + sparsity : bool + Use with sparsity-inducing training methods. The default is True Returns ------- @@ -650,20 +790,23 @@ class MetaModel(): Lambda = 1e-6 # Bayes sparse adaptive aPCE + clf_poly = None if reg_method.lower() == 'ols': clf_poly = lm.LinearRegression(fit_intercept=False) elif reg_method.lower() == 'brr': clf_poly = lm.BayesianRidge(n_iter=1000, tol=1e-7, fit_intercept=False, - normalize=True, + # normalize=True, compute_score=compute_score, alpha_1=1e-04, alpha_2=1e-04, lambda_1=Lambda, lambda_2=Lambda) clf_poly.converged = True elif reg_method.lower() == 'ard': + if X.shape[0] < 2: + raise ValueError('Regression with ARD can only be performed for more than 2 samples') clf_poly = lm.ARDRegression(fit_intercept=False, - normalize=True, + # normalize=True, compute_score=compute_score, n_iter=1000, tol=0.0001, alpha_1=1e-3, alpha_2=1e-3, @@ -676,11 +819,15 @@ class MetaModel(): n_iter=300, tol=1e-10) elif reg_method.lower() == 'bcs': + if X.shape[0] < 10: + raise ValueError('Regression with BCS can only be performed for more than 10 samples') clf_poly = RegressionFastLaplace(fit_intercept=False, bias_term=bias_term, n_iter=1000, tol=1e-7) elif reg_method.lower() == 'lars': + if X.shape[0] < 10: + raise ValueError('Regression with LARS can only be performed for more than 5 samples') clf_poly = lm.LassoLarsCV(fit_intercept=False) elif reg_method.lower() == 'sgdr': @@ -696,8 +843,31 @@ class MetaModel(): elif reg_method.lower() == 'ebl': clf_poly = EBLinearRegression(optimizer='em') - # Fit - clf_poly.fit(X, y) + # Training with constraints automatically uses L2 + if self.apply_constraints: + # TODO: set the constraints here + # Define the nonlin. constraint + nlc = NonlinearConstraint(lambda x: np.matmul(X, x), -1, 1.1) + self.nlc = nlc + + fun = lambda x: (np.linalg.norm(np.matmul(X, x) - y, ord=2)) ** 2 + res = None + if self.init_type == 'zeros': + res = minimize(fun, np.zeros(X.shape[1]), method='trust-constr', constraints=self.nlc) + if self.init_type == 'nonpi': + clf_poly.fit(X, y) + coeff = clf_poly.coef_ + res = minimize(fun, coeff, method='trust-constr', constraints=self.nlc) + + coeff = np.array(res.x) + clf_poly.coef_ = coeff + clf_poly.X = X + clf_poly.y = y + clf_poly.intercept_ = 0 + + # Training without constraints uses chosen regression method + else: + clf_poly.fit(X, y) # Select the nonzero entries of coefficients if sparsity: @@ -724,15 +894,13 @@ class MetaModel(): return return_out_dict # -------------------------------------------------------------------------------------------------------- - def adaptive_regression(self, ED_X, ED_Y, varIdx, verbose=False): + def adaptive_regression(self, ED_Y, varIdx, verbose=False): """ Adaptively fits the PCE model by comparing the scores of different degrees and q-norm. Parameters ---------- - ED_X : array of shape (n_samples, n_params) - Experimental design. ED_Y : array of shape (n_samples,) Target values, i.e. simulation results for the Experimental design. varIdx : int @@ -748,7 +916,7 @@ class MetaModel(): """ - n_samples, n_params = ED_X.shape + # n_samples, n_params = ED_X.shape # Initialization qAllCoeffs, AllCoeffs = {}, {} qAllIndices_Sparse, AllIndices_Sparse = {}, {} @@ -756,7 +924,7 @@ class MetaModel(): qAllnTerms, AllnTerms = {}, {} qAllLCerror, AllLCerror = {}, {} - # Extract degree array and qnorm array + # Extract degree array and q-norm array deg_array = np.array([*self.allBasisIndices], dtype=int) qnorm = [*self.allBasisIndices[str(int(deg_array[0]))]] @@ -768,7 +936,7 @@ class MetaModel(): n_checks_qNorm = 2 nqnorms = len(qnorm) qNormEarlyStop = True - if nqnorms < n_checks_qNorm+1: + if nqnorms < n_checks_qNorm + 1: qNormEarlyStop = False # ===================================================================== @@ -776,6 +944,7 @@ class MetaModel(): # polynomial degree until the highest accuracy is reached # ===================================================================== # For each degree check all q-norms and choose the best one + best_q = None scores = -np.inf * np.ones(deg_array.shape[0]) qNormScores = -np.inf * np.ones(nqnorms) @@ -788,38 +957,38 @@ class MetaModel(): BasisIndices = self.allBasisIndices[str(deg)][str(q)] # Assemble the Psi matrix - Psi = self.create_psi(BasisIndices, self.univ_p_val) + Psi = create_psi(BasisIndices, self.univ_p_val) - # Calulate the cofficients of the meta model - outs = self.fit(Psi, ED_Y, BasisIndices) + # Calulate the cofficients of the metamodel + outs = self.regression(Psi, ED_Y, BasisIndices) # Calculate and save the score of LOOCV - score, LCerror = self.corr_loocv_error(outs['clf_poly'], - outs['sparePsi'], - outs['coeffs'], - ED_Y) + score, LCerror = corr_loocv_error(outs['clf_poly'], + outs['sparePsi'], + outs['coeffs'], + ED_Y) # Check the convergence of noise for FastARD if self.pce_reg_method == 'FastARD' and \ - outs['clf_poly'].alpha_ < np.finfo(np.float32).eps: + outs['clf_poly'].alpha_ < np.finfo(np.float32).eps: score = -np.inf qNormScores[qidx] = score - qAllCoeffs[str(qidx+1)] = outs['coeffs'] - qAllIndices_Sparse[str(qidx+1)] = outs['spareMulti-Index'] - qAllclf_poly[str(qidx+1)] = outs['clf_poly'] - qAllnTerms[str(qidx+1)] = BasisIndices.shape[0] - qAllLCerror[str(qidx+1)] = LCerror + qAllCoeffs[str(qidx + 1)] = outs['coeffs'] + qAllIndices_Sparse[str(qidx + 1)] = outs['spareMulti-Index'] + qAllclf_poly[str(qidx + 1)] = outs['clf_poly'] + qAllnTerms[str(qidx + 1)] = BasisIndices.shape[0] + qAllLCerror[str(qidx + 1)] = LCerror # EarlyStop check # if there are at least n_checks_qNorm entries after the # best one, we stop if qNormEarlyStop and \ - sum(np.isfinite(qNormScores)) > n_checks_qNorm: + sum(np.isfinite(qNormScores)) > n_checks_qNorm: # If the error has increased the last two iterations, stop! qNormScores_nonInf = qNormScores[np.isfinite(qNormScores)] deltas = np.sign(np.diff(qNormScores_nonInf)) - if sum(deltas[-n_checks_qNorm+1:]) == 2: + if sum(deltas[-n_checks_qNorm + 1:]) == 2: # stop the q-norm loop here break if np.var(ED_Y) == 0: @@ -829,11 +998,11 @@ class MetaModel(): best_q = np.nanargmax(qNormScores) scores[degIdx] = qNormScores[best_q] - AllCoeffs[str(degIdx+1)] = qAllCoeffs[str(best_q+1)] - AllIndices_Sparse[str(degIdx+1)] = qAllIndices_Sparse[str(best_q+1)] - Allclf_poly[str(degIdx+1)] = qAllclf_poly[str(best_q+1)] - AllnTerms[str(degIdx+1)] = qAllnTerms[str(best_q+1)] - AllLCerror[str(degIdx+1)] = qAllLCerror[str(best_q+1)] + AllCoeffs[str(degIdx + 1)] = qAllCoeffs[str(best_q + 1)] + AllIndices_Sparse[str(degIdx + 1)] = qAllIndices_Sparse[str(best_q + 1)] + Allclf_poly[str(degIdx + 1)] = qAllclf_poly[str(best_q + 1)] + AllnTerms[str(degIdx + 1)] = qAllnTerms[str(best_q + 1)] + AllLCerror[str(degIdx + 1)] = qAllLCerror[str(best_q + 1)] # Check the direction of the error (on average): # if it increases consistently stop the iterations @@ -841,7 +1010,7 @@ class MetaModel(): scores_nonInf = scores[scores != -np.inf] ss = np.sign(scores_nonInf - np.max(scores_nonInf)) # ss<0 error decreasing - errorIncreases = np.sum(np.sum(ss[-2:])) <= -1*n_checks_degree + errorIncreases = np.sum(np.sum(ss[-2:])) <= -1 * n_checks_degree if errorIncreases: break @@ -852,7 +1021,7 @@ class MetaModel(): # ------------------ Summary of results ------------------ # Select the one with the best score and save the necessary outputs - best_deg = np.nanargmax(scores)+1 + best_deg = np.nanargmax(scores) + 1 coeffs = AllCoeffs[str(best_deg)] basis_indices = AllIndices_Sparse[str(best_deg)] clf_poly = Allclf_poly[str(best_deg)] @@ -868,24 +1037,24 @@ class MetaModel(): nnz_idx = np.nonzero(coeffs)[0] BasisIndices_Sparse = basis_indices[nnz_idx] - print(f'Output variable {varIdx+1}:') + print(f'Output variable {varIdx + 1}:') print('The estimation of PCE coefficients converged at polynomial ' - f'degree {deg_array[best_deg-1]} with ' + f'degree {deg_array[best_deg - 1]} with ' f'{len(BasisIndices_Sparse)} terms (Sparsity index = ' - f'{round(len(BasisIndices_Sparse)/P, 3)}).') + f'{round(len(BasisIndices_Sparse) / P, 3)}).') - print(f'Final ModLOO error estimate: {1-max(scores):.3e}') - print('\n'+'-'*50) + print(f'Final ModLOO error estimate: {1 - max(scores):.3e}') + print('\n' + '-' * 50) if verbose: - print('='*50) - print(' '*10 + ' Summary of results ') - print('='*50) - - print("scores:\n", scores) - print("Best score's degree:", self.deg_array[best_deg-1]) - print("NO. of terms:", len(basis_indices)) - print("Sparsity index:", round(len(basis_indices)/P, 3)) + print('=' * 50) + print(' ' * 10 + ' Summary of results ') + print('=' * 50) + + print("Scores:\n", scores) + print("Degree of best score:", self.deg_array[best_deg - 1]) + print("No. of terms:", len(basis_indices)) + print("Sparsity index:", round(len(basis_indices) / P, 3)) print("Best Indices:\n", basis_indices) if self.pce_reg_method in ['BRR', 'ARD']: @@ -904,7 +1073,7 @@ class MetaModel(): plt.text(0.75, 0.5, text, fontsize=18, transform=ax.transAxes) plt.show() - print('='*80) + print('=' * 80) # Create a dict to pass the outputs returnVars = dict() @@ -918,115 +1087,6 @@ class MetaModel(): return returnVars - # ------------------------------------------------------------------------- - def corr_loocv_error(self, clf, psi, coeffs, y): - """ - Calculates the corrected LOO error for regression on regressor - matrix `psi` that generated the coefficients based on [1] and [2]. - - [1] Blatman, G., 2009. Adaptive sparse polynomial chaos expansions for - uncertainty propagation and sensitivity analysis (Doctoral - dissertation, Clermont-Ferrand 2). - - [2] Blatman, G. and Sudret, B., 2011. Adaptive sparse polynomial chaos - expansion based on least angle regression. Journal of computational - Physics, 230(6), pp.2345-2367. - - Parameters - ---------- - clf : object - Fitted estimator. - psi : array of shape (n_samples, n_features) - The multivariate orthogonal polynomials (regressor). - coeffs : array-like of shape (n_features,) - Estimated cofficients. - y : array of shape (n_samples,) - Target values. - - Returns - ------- - R_2 : float - LOOCV Validation score (1-LOOCV erro). - residual : array of shape (n_samples,) - Residual values (y - predicted targets). - - """ - psi = np.array(psi, dtype=float) - - # Create PSI_Sparse by removing redundent terms - nnz_idx = np.nonzero(coeffs)[0] - if len(nnz_idx) == 0: - nnz_idx = [0] - psi_sparse = psi[:, nnz_idx] - - # NrCoeffs of aPCEs - P = len(nnz_idx) - # NrEvaluation (Size of experimental design) - N = psi.shape[0] - - # Build the projection matrix - PsiTPsi = np.dot(psi_sparse.T, psi_sparse) - - if np.linalg.cond(PsiTPsi) > 1e-12: #and \ - # np.linalg.cond(PsiTPsi) < 1/sys.float_info.epsilon: - # faster - M = sp.linalg.solve(PsiTPsi, - sp.sparse.eye(PsiTPsi.shape[0]).toarray()) - else: - # stabler - M = np.linalg.pinv(PsiTPsi) - - # h factor (the full matrix is not calculated explicitly, - # only the trace is, to save memory) - PsiM = np.dot(psi_sparse, M) - - h = np.sum(np.multiply(PsiM, psi_sparse), axis=1, dtype=np.float128) - - # ------ Calculate Error Loocv for each measurement point ---- - # Residuals - try: - residual = clf.predict(psi) - y - except: - residual = np.dot(psi, coeffs) - y - - # Variance - var_y = np.var(y) - - if var_y == 0: - norm_emp_error = 0 - loo_error = 0 - LCerror = np.zeros((y.shape)) - return 1-loo_error, LCerror - else: - norm_emp_error = np.mean(residual**2)/var_y - - # LCerror = np.divide(residual, (1-h)) - LCerror = residual / (1-h) - loo_error = np.mean(np.square(LCerror)) / var_y - # if there are NaNs, just return an infinite LOO error (this - # happens, e.g., when a strongly underdetermined problem is solved) - if np.isnan(loo_error): - loo_error = np.inf - - # Corrected Error for over-determined system - tr_M = np.trace(M) - if tr_M < 0 or abs(tr_M) > 1e6: - tr_M = np.trace(np.linalg.pinv(np.dot(psi.T, psi))) - - # Over-determined system of Equation - if N > P: - T_factor = N/(N-P) * (1 + tr_M) - - # Under-determined system of Equation - else: - T_factor = np.inf - - corrected_loo_error = loo_error * T_factor - - R_2 = 1 - corrected_loo_error - - return R_2, LCerror - # ------------------------------------------------------------------------- def pca_transformation(self, target, verbose=False): """ @@ -1036,6 +1096,9 @@ class MetaModel(): ---------- target : array of shape (n_samples,) Target values. + verbose : bool + Set to True to get more information during functtion call. + The default is False. Returns ------- @@ -1048,20 +1111,20 @@ class MetaModel(): """ # Transform via Principal Component Analysis - if hasattr(self, 'var_pca_threshold'): + if self.var_pca_threshold is None: var_pca_threshold = self.var_pca_threshold else: var_pca_threshold = 100.0 n_samples, n_features = target.shape - if hasattr(self, 'n_pca_components'): + if self.n_pca_components is None: n_pca_components = self.n_pca_components else: # Instantiate and fit sklearnPCA object covar_matrix = sklearnPCA(n_components=None) covar_matrix.fit(target) var = np.cumsum(np.round(covar_matrix.explained_variance_ratio_, - decimals=5)*100) + decimals=5) * 100) # Find the number of components to explain self.varPCAThreshold of # variance try: @@ -1087,95 +1150,15 @@ class MetaModel(): return pca, scaled_target, n_pca_components # ------------------------------------------------------------------------- - def gaussian_process_emulator(self, X, y, nug_term=None, autoSelect=False, - varIdx=None): + def eval_metamodel(self, samples): """ - Fits a Gaussian Process Emulator to the target given the training - points. - - Parameters - ---------- - X : array of shape (n_samples, n_params) - Training points. - y : array of shape (n_samples,) - Target values. - nug_term : float, optional - Nugget term. The default is None, i.e. variance of y. - autoSelect : bool, optional - Loop over some kernels and select the best. The default is False. - varIdx : int, optional - The index number. The default is None. - - Returns - ------- - gp : object - Fitted estimator. - - """ - - nug_term = nug_term if nug_term else np.var(y) - - Kernels = [nug_term * kernels.RBF(length_scale=1.0, - length_scale_bounds=(1e-25, 1e15)), - nug_term * kernels.RationalQuadratic(length_scale=0.2, - alpha=1.0), - nug_term * kernels.Matern(length_scale=1.0, - length_scale_bounds=(1e-15, 1e5), - nu=1.5)] - - # Automatic selection of the kernel - if autoSelect: - gp = {} - BME = [] - for i, kernel in enumerate(Kernels): - gp[i] = GaussianProcessRegressor(kernel=kernel, - n_restarts_optimizer=3, - normalize_y=False) - - # Fit to data using Maximum Likelihood Estimation - gp[i].fit(X, y) - - # Store the MLE as BME score - BME.append(gp[i].log_marginal_likelihood()) - - gp = gp[np.argmax(BME)] - - else: - gp = GaussianProcessRegressor(kernel=Kernels[0], - n_restarts_optimizer=3, - normalize_y=False) - gp.fit(X, y) - - # Compute score - if varIdx is not None: - Score = gp.score(X, y) - print('-'*50) - print(f'Output variable {varIdx}:') - print('The estimation of GPE coefficients converged,') - print(f'with the R^2 score: {Score:.3f}') - print('-'*50) - - return gp - - # ------------------------------------------------------------------------- - def eval_metamodel(self, samples=None, nsamples=None, - sampling_method='random', return_samples=False): - """ - Evaluates meta-model at the requested samples. One can also generate + Evaluates metamodel at the requested samples. One can also generate nsamples. Parameters ---------- samples : array of shape (n_samples, n_params), optional - Samples to evaluate meta-model at. The default is None. - nsamples : int, optional - Number of samples to generate, if no `samples` is provided. The - default is None. - sampling_method : str, optional - Type of sampling, if no `samples` is provided. The default is - 'random'. - return_samples : bool, optional - Retun samples, if no `samples` is provided. The default is False. + Samples to evaluate metamodel at. The default is None. Returns ------- @@ -1184,77 +1167,77 @@ class MetaModel(): std_pred : dict Standard deviatioon of the predictions. """ - outputs = self.ModelObj.Output.names - - # Generate or transform (if need be) samples - if samples is None: - # Generate - samples = self.ExpDesign.generate_samples( - nsamples, - sampling_method - ) + # Transform into np array - can also be given as list + samples = np.array(samples) # Transform samples to the independent space - samples = self.ExpDesign.transform( + samples = self.InputSpace.transform( samples, method='user' - ) - # print(samples) - + ) # Compute univariate bases for the given samples + #print('Creating the univariate basis.') + univ_p_val = None if self.meta_model_type.lower() != 'gpe': univ_p_val = self.univ_basis_vals( samples, n_max=np.max(self.pce_deg) - ) + ) + mean_pred = None + std_pred = None mean_pred_b = {} std_pred_b = {} + b_i = 0 # Loop over bootstrap iterations + #print('Looping over bootstrap iterations.') for b_i in range(self.n_bootstrap_itrs): # Extract model dictionary if self.meta_model_type.lower() == 'gpe': - model_dict = self.gp_poly[f'b_{b_i+1}'] + model_dict = self.gp_poly[f'b_{b_i + 1}'] else: - model_dict = self.coeffs_dict[f'b_{b_i+1}'] + model_dict = self.coeffs_dict[f'b_{b_i + 1}'] # Loop over outputs mean_pred = {} std_pred = {} + #print(model_dict.items()) + #print('Looping over the output timesteps') for output, values in model_dict.items(): mean = np.empty((len(samples), len(values))) std = np.empty((len(samples), len(values))) idx = 0 + #print('Looping over ??') for in_key, InIdxValues in values.items(): - # Perdiction with GPE + # Prediction with GPE if self.meta_model_type.lower() == 'gpe': - X_T = self.x_scaler[f'b_{b_i+1}'][output].transform(samples) - gp = self.gp_poly[f'b_{b_i+1}'][output][in_key] + X_T = self.x_scaler[f'b_{b_i + 1}'][output].transform(samples) + gp = self.gp_poly[f'b_{b_i + 1}'][output][in_key] y_mean, y_std = gp.predict(X_T, return_std=True) else: - # Perdiction with PCE + # Prediction with PCE # Assemble Psi matrix - basis = self.basis_dict[f'b_{b_i+1}'][output][in_key] - psi = self.create_psi(basis, univ_p_val) + basis = self.basis_dict[f'b_{b_i + 1}'][output][in_key] + psi = create_psi(basis, univ_p_val) - # Perdiction + # Prediction if self.bootstrap_method != 'fast' or b_i == 0: # with error bar, i.e. use clf_poly - clf_poly = self.clf_poly[f'b_{b_i+1}'][output][in_key] + clf_poly = self.clf_poly[f'b_{b_i + 1}'][output][in_key] try: y_mean, y_std = clf_poly.predict( psi, return_std=True - ) + ) except TypeError: y_mean = clf_poly.predict(psi) y_std = np.zeros_like(y_mean) else: # without error bar - coeffs = self.coeffs_dict[f'b_{b_i+1}'][output][in_key] + coeffs = self.coeffs_dict[f'b_{b_i + 1}'][output][in_key] y_mean = np.dot(psi, coeffs) y_std = np.zeros_like(y_mean) @@ -1264,7 +1247,7 @@ class MetaModel(): # Save predictions for each output if self.dim_red_method.lower() == 'pca': - PCA = self.pca[f'b_{b_i+1}'][output] + PCA = self.pca[f'b_{b_i + 1}'][output] mean_pred[output] = PCA.inverse_transform(mean) std_pred[output] = np.zeros(mean.shape) else: @@ -1284,7 +1267,7 @@ class MetaModel(): mean_pred_all[k][i] = v # Compute the moments of predictions over the predictions - for output in outputs: + for output in self.out_names: # Only use bootstraps with finite values finite_rows = np.isfinite( mean_pred_all[output]).all(axis=2).all(axis=1) @@ -1295,15 +1278,13 @@ class MetaModel(): if self.n_bootstrap_itrs > 1: std_pred[output] = np.std(outs, axis=0) else: + # TODO: this b_i seems off here std_pred[output] = std_pred_b[b_i][output] - if return_samples: - return mean_pred, std_pred, samples - else: - return mean_pred, std_pred + return mean_pred, std_pred # ------------------------------------------------------------------------- - def create_model_error(self, X, y, name='Calib'): + def create_model_error(self, X, y, MeasuredData): """ Fits a GPE-based model error. @@ -1314,8 +1295,7 @@ class MetaModel(): extracted data. y : array of shape (n_outputs,) The model response for the MAP parameter set. - name : str, optional - Calibration or validation. The default is `'Calib'`. + MeasuredData : Returns ------- @@ -1323,14 +1303,14 @@ class MetaModel(): Self object. """ - Model = self.ModelObj - outputNames = Model.Output.names + outputNames = self.out_names self.errorRegMethod = 'GPE' self.errorclf_poly = self.auto_vivification() self.errorScale = self.auto_vivification() # Read data - MeasuredData = Model.read_observation(case=name) + # TODO: do this call outside the metamodel + # MeasuredData = Model.read_observation(case=name) # Fitting GPR based bias model for out in outputNames: @@ -1346,7 +1326,7 @@ class MetaModel(): delta = data # - y[out][0] BiasInputs = np.hstack((X[out], y[out].reshape(-1, 1))) X_S = scaler.fit_transform(BiasInputs) - gp = self.gaussian_process_emulator(X_S, delta) + gp = gaussian_process_emulator(X_S, delta) self.errorScale[out]["y_1"] = scaler self.errorclf_poly[out]["y_1"] = gp @@ -1416,31 +1396,25 @@ class MetaModel(): return value # ------------------------------------------------------------------------- - def copy_meta_model_opts(self, InputObj, ModelObj): + def copy_meta_model_opts(self): """ This method is a convinient function to copy the metamodel options. - Parameters - ---------- - InputObj : object - The input object. - ModelObj : object - The Model object. - Returns ------- new_MetaModelOpts : object The copied object. """ + # TODO: what properties should be moved to the new object? new_MetaModelOpts = copy.deepcopy(self) - new_MetaModelOpts.ModelObj = ModelObj - new_MetaModelOpts.input_obj = InputObj - new_MetaModelOpts.ExpDesign.meta_Model = 'aPCE' - new_MetaModelOpts.ExpDesign.InputObj = InputObj - new_MetaModelOpts.ExpDesign.ndim = len(InputObj.Marginals) - new_MetaModelOpts.n_params = len(InputObj.Marginals) - new_MetaModelOpts.ExpDesign.hdf5_file = None + new_MetaModelOpts.input_obj = self.input_obj # InputObj + new_MetaModelOpts.InputSpace = self.InputSpace + # new_MetaModelOpts.InputSpace.meta_Model = 'aPCE' + # new_MetaModelOpts.InputSpace.InputObj = self.input_obj + # new_MetaModelOpts.InputSpace.ndim = len(self.input_obj.Marginals) + new_MetaModelOpts.n_params = len(self.input_obj.Marginals) + # new_MetaModelOpts.InputSpace.hdf5_file = None return new_MetaModelOpts @@ -1460,13 +1434,15 @@ class MetaModel(): Returns ------- deg_array: array - Array containing the arrays. + The selected degrees. """ # Define the deg_array max_deg = np.max(self.pce_deg) min_Deg = np.min(self.pce_deg) - nitr = n_samples - self.ExpDesign.n_init_samples + + # TODO: remove the options for sequential? + nitr = n_samples - self.InputSpace.n_init_samples # Check q-norm if not np.isscalar(self.pce_q_norm): @@ -1474,24 +1450,134 @@ class MetaModel(): else: self.pce_q_norm = np.array([self.pce_q_norm]) - def M_uptoMax(maxDeg): - n_combo = np.zeros(maxDeg) - for i, d in enumerate(range(1, maxDeg+1)): - n_combo[i] = math.factorial(ndim+d) - n_combo[i] /= math.factorial(ndim) * math.factorial(d) - return n_combo + # def M_uptoMax(maxDeg): + # n_combo = np.zeros(maxDeg) + # for i, d in enumerate(range(1, maxDeg + 1)): + # n_combo[i] = math.factorial(ndim + d) + # n_combo[i] /= math.factorial(ndim) * math.factorial(d) + # return n_combo - if self.ExpDesignFlag != 'sequential': - deg_new = max_deg - else: - d = nitr if nitr != 0 and self.n_params > 5 else 1 - min_index = np.argmin(abs(M_uptoMax(max_deg)-ndim*n_samples*d)) - deg_new = max_deg - # deg_new = range(1, max_deg+1)[min_index] + deg_new = max_deg + # d = nitr if nitr != 0 and self.n_params > 5 else 1 + # d = 1 + # min_index = np.argmin(abs(M_uptoMax(max_deg)-ndim*n_samples*d)) + # deg_new = range(1, max_deg+1)[min_index] if deg_new > min_Deg and self.pce_reg_method.lower() != 'fastard': - deg_array = np.arange(min_Deg, deg_new+1) + deg_array = np.arange(min_Deg, deg_new + 1) else: deg_array = np.array([deg_new]) return deg_array + + def generate_polynomials(self, max_deg=None): + """ + Generates (univariate) polynomials. + + Parameters + ---------- + max_deg : int + Maximum polynomial degree. + + Returns + ------- + None + """ + # Check for InputSpace + if self.InputSpace is None: + raise AttributeError('Generate or add InputSpace before generating polynomials') + + ndim = self.InputSpace.ndim + # Create orthogonal polynomial coefficients if necessary + if (self.meta_model_type.lower() != 'gpe') and max_deg is not None: # and self.input_obj.poly_coeffs_flag: + self.polycoeffs = {} + for parIdx in tqdm(range(ndim), ascii=True, + desc="Computing orth. polynomial coeffs"): + poly_coeffs = apoly_construction( + self.InputSpace.raw_data[parIdx], + max_deg + ) + self.polycoeffs[f'p_{parIdx + 1}'] = poly_coeffs + else: + raise AttributeError('MetaModel cannot generate polynomials in the given scenario!') + + # ------------------------------------------------------------------------- + def _compute_pce_moments(self): + """ + Computes the first two moments using the PCE-based metamodel. + + Returns + ------- + pce_means: dict + The first moment (mean) of the surrogate. + pce_stds: dict + The second moment (standard deviation) of the surrogate. + + """ + + # Check if it's truly a pce-surrogate + if self.meta_model_type.lower() == 'gpe': + raise AttributeError('Moments can only be computed for pce-type surrogates') + + outputs = self.out_names + pce_means_b = {} + pce_stds_b = {} + + # Loop over bootstrap iterations + for b_i in range(self.n_bootstrap_itrs): + # Loop over the metamodels + coeffs_dicts = self.coeffs_dict[f'b_{b_i + 1}'].items() + means = {} + stds = {} + for output, coef_dict in coeffs_dicts: + + pce_mean = np.zeros((len(coef_dict))) + pce_var = np.zeros((len(coef_dict))) + + for index, values in coef_dict.items(): + idx = int(index.split('_')[1]) - 1 + coeffs = self.coeffs_dict[f'b_{b_i + 1}'][output][index] + + # Mean = c_0 + if coeffs[0] != 0: + pce_mean[idx] = coeffs[0] + else: + clf_poly = self.clf_poly[f'b_{b_i + 1}'][output] + pce_mean[idx] = clf_poly[index].intercept_ + # Var = sum(coeffs[1:]**2) + pce_var[idx] = np.sum(np.square(coeffs[1:])) + + # Save predictions for each output + if self.dim_red_method.lower() == 'pca': + PCA = self.pca[f'b_{b_i + 1}'][output] + means[output] = PCA.inverse_transform(pce_mean) + stds[output] = PCA.inverse_transform(np.sqrt(pce_var)) + else: + means[output] = pce_mean + stds[output] = np.sqrt(pce_var) + + # Save predictions for each bootstrap iteration + pce_means_b[b_i] = means + pce_stds_b[b_i] = stds + + # Change the order of nesting + mean_all = {} + for i in sorted(pce_means_b): + for k, v in pce_means_b[i].items(): + if k not in mean_all: + mean_all[k] = [None] * len(pce_means_b) + mean_all[k][i] = v + std_all = {} + for i in sorted(pce_stds_b): + for k, v in pce_stds_b[i].items(): + if k not in std_all: + std_all[k] = [None] * len(pce_stds_b) + std_all[k][i] = v + + # Back transformation if PCA is selected. + pce_means, pce_stds = {}, {} + for output in outputs: + pce_means[output] = np.mean(mean_all[output], axis=0) + pce_stds[output] = np.mean(std_all[output], axis=0) + + return pce_means, pce_stds diff --git a/tests/MCrefs_MeanStd.csv b/tests/MCrefs_MeanStd.csv new file mode 100644 index 0000000000000000000000000000000000000000..e9592bf45db032790f95259b8cedd7f961e70a81 --- /dev/null +++ b/tests/MCrefs_MeanStd.csv @@ -0,0 +1,12 @@ +x [m],mean,std +0,0,0 +0.1,-0.002623091088022,8.06E-04 +0.2,-0.004962749295994,0.001525818175278 +0.3,-0.006794367435948,0.002088956887598 +0.4,-0.007957511802197,0.002446570522429 +0.5,-0.008355922171325,0.002569063468612 +0.6,-0.007957511802197,0.002446570522429 +0.7,-0.006794367435948,0.002088956887598 +0.8,-0.004962749295994,0.001525818175278 +0.9,-0.002623091088022,8.06E-04 +1,0,0 diff --git a/tests/MeasuredData.csv b/tests/MeasuredData.csv new file mode 100644 index 0000000000000000000000000000000000000000..5774f51566a8dfc04976e30e56fbca293ac296e4 --- /dev/null +++ b/tests/MeasuredData.csv @@ -0,0 +1,12 @@ +x [m],Deflection [m] +0,0 +0.555555555555556,-0.002507972252554 +1.11111111111111,-0.004744950561407 +1.66666666666667,-0.006496185008909 +2.22222222222222,-0.007608282796739 +2.77777777777778,-0.007989208245903 +3.33333333333333,-0.007608282796739 +3.88888888888889,-0.006496185008909 +4.44444444444444,-0.004744950561407 +5,-0.002507972252554 +5.55555555555556,0 diff --git a/tests/MeasuredData_Valid.csv b/tests/MeasuredData_Valid.csv new file mode 100644 index 0000000000000000000000000000000000000000..426ba7ed46ff82621baadb3435f79c2a0f47810b --- /dev/null +++ b/tests/MeasuredData_Valid.csv @@ -0,0 +1,12 @@ +x [m],Deflection [m] +0,0 +0.555555555555556,-0.002623491033022 +1.11111111111111,-0.004962750295994 +1.66666666666667,-0.006794369935948 +2.22222222222222,-0.007956511802197 +2.77777777777778,-0.008355582171325 +3.33333333333333,-0.007957591802197 +3.88888888888889,-0.006794363675948 +4.44444444444444,-0.004962749995994 +5,-0.00262091088022 +5.55555555555556,0 diff --git a/tests/SBeam_Deflection.tpl.inp b/tests/SBeam_Deflection.tpl.inp new file mode 100644 index 0000000000000000000000000000000000000000..6bfc3fe96c62923b0a89bde26b5dd83375a418db --- /dev/null +++ b/tests/SBeam_Deflection.tpl.inp @@ -0,0 +1,6 @@ +% Input file for the simply supported beam model +<X1> % b in m +<X2> % h in m +5 % L in m +<X3> % E in Pa +<X4> % p in N/m diff --git a/tests/test_BayesInference.py b/tests/test_BayesInference.py new file mode 100644 index 0000000000000000000000000000000000000000..2f22f9158190c930fe6827fe892e3a87027e33c5 --- /dev/null +++ b/tests/test_BayesInference.py @@ -0,0 +1,1105 @@ +# -*- coding: utf-8 -*- +""" +Test the BayesInference class for bayesvalidrox + +Tests are available for the following functions + _logpdf - x + _kernel_rbf - x +class BayesInference: + setup_inference - x + create_inference - x + perform_bootstrap Need working model for tests without emulator + _perturb_data - x + create_error_model Error in the MetaModel + _eval_model Need working model to test this + normpdf - x + _corr_factor_BME_old - removed + _corr_factor_BME - x + _rejection_sampling - x + _posterior_predictive - x + plot_post_params - x + plot_log_BME - x + _plot_max_a_posteriori Need working model to test this + _plot_post_predictive - x +""" +import sys +import pytest +import numpy as np +import pandas as pd + +from bayesvalidrox.surrogate_models.inputs import Input +from bayesvalidrox.surrogate_models.exp_designs import ExpDesigns +from bayesvalidrox.surrogate_models.surrogate_models import MetaModel +from bayesvalidrox.pylink.pylink import PyLinkForwardModel as PL +from bayesvalidrox.surrogate_models.engine import Engine +from bayesvalidrox.bayes_inference.discrepancy import Discrepancy +from bayesvalidrox.bayes_inference.mcmc import MCMC +from bayesvalidrox.bayes_inference.bayes_inference import BayesInference +from bayesvalidrox.bayes_inference.bayes_inference import _logpdf, _kernel_rbf + +sys.path.append("src/") +sys.path.append("../src/") + + +#%% Test _logpdf + +def test_logpdf() -> None: + """ + Calculate loglikelihood + + """ + _logpdf([0], [0], [1]) + + +#%% Test _kernel_rbf + +def test_kernel_rbf() -> None: + """ + Create RBF kernel + """ + X = [[0, 0], [1, 1.5]] + pars = [1, 0.5, 1] + _kernel_rbf(X, pars) + + +def test_kernel_rbf_lesspar() -> None: + """ + Create RBF kernel with too few parameters + """ + X = [[0, 0], [1, 1.5]] + pars = [1, 2] + with pytest.raises(AttributeError) as excinfo: + _kernel_rbf(X, pars) + assert str(excinfo.value) == 'Provide 3 parameters for the RBF kernel!' + + +#%% Test MCMC init + +def test_BayesInference() -> None: + """ + Construct a BayesInference object + """ + inp = Input() + inp.add_marginals() + inp.Marginals[0].dist_type = 'normal' + inp.Marginals[0].parameters = [0, 1] + mod = PL() + mm = MetaModel(inp) + expdes = ExpDesigns(inp) + engine = Engine(mm, mod, expdes) + BayesInference(engine) + + +#%% Test create_inference +# TODO: disabled this test! +def test_create_inference() -> None: + """ + Run inference + """ + inp = Input() + inp.add_marginals() + inp.Marginals[0].dist_type = 'normal' + inp.Marginals[0].parameters = [0, 1] + + expdes = ExpDesigns(inp) + expdes.n_init_samples = 2 + expdes.n_max_samples = 4 + expdes.X = np.array([[0], [1], [0.5]]) + expdes.Y = {'Z': [[0.4], [0.5], [0.45]]} + expdes.x_values = np.array([0]) # Error in plots if this is not available + + mm = MetaModel(inp) + mm.fit(expdes.X, expdes.Y) + expdes.generate_ED(expdes.n_init_samples, max_pce_deg=np.max(mm.pce_deg)) + + mod = PL() + mod.observations = {'Z': np.array([0.45])} + mod.observations = {'Z': np.array([0.45]), 'x_values': np.array([0])} # Error if x_values not given + mod.Output.names = ['Z'] + + engine = Engine(mm, mod, expdes) + + obsData = pd.DataFrame(mod.observations, columns=mod.Output.names) + DiscrepancyOpts = Discrepancy('') + DiscrepancyOpts.type = 'Gaussian' + DiscrepancyOpts.parameters = (obsData * 0.15) ** 2 + + bi = BayesInference(engine) + bi.Discrepancy = DiscrepancyOpts # Error if this not class 'DiscrepancyOpts' or dict(?) + bi.bootstrap = True # Error if this and bayes_loocv and just_analysis are all False? + bi.plot_post_pred = False # Remaining issue in the violinplot + bi.create_inference() + # Remaining issue in the violinplot in plot_post_predictive + + +#%% Test rejection_sampling +def test_rejection_sampling_nologlik() -> None: + """ + Perform rejection sampling without given log likelihood + """ + inp = Input() + inp.add_marginals() + inp.Marginals[0].dist_type = 'normal' + inp.Marginals[0].parameters = [0, 1] + mod = PL() + mm = MetaModel(inp) + expdes = ExpDesigns(inp) + expdes.init_param_space(max_deg=1) + engine = Engine(mm, mod, expdes) + bi = BayesInference(engine) + bi.prior_samples = expdes.generate_samples(100, 'random') + with pytest.raises(AttributeError) as excinfo: + bi._rejection_sampling() + assert str(excinfo.value) == 'No log-likelihoods available!' + + +def test_rejection_sampling_noprior() -> None: + """ + Perform rejection sampling without prior samples + """ + inp = Input() + inp.add_marginals() + inp.Marginals[0].dist_type = 'normal' + inp.Marginals[0].parameters = [0, 1] + mod = PL() + mm = MetaModel(inp) + expdes = ExpDesigns(inp) + engine = Engine(mm, mod, expdes) + bi = BayesInference(engine) + with pytest.raises(AttributeError) as excinfo: + bi._rejection_sampling() + assert str(excinfo.value) == 'No prior samples available!' + + +def test_rejection_sampling() -> None: + """ + Perform rejection sampling + """ + inp = Input() + inp.add_marginals() + inp.Marginals[0].dist_type = 'normal' + inp.Marginals[0].parameters = [0, 1] + mod = PL() + mm = MetaModel(inp) + expdes = ExpDesigns(inp) + expdes.init_param_space(max_deg=1) + engine = Engine(mm, mod, expdes) + bi = BayesInference(engine) + bi.prior_samples = expdes.generate_samples(100, 'random') + bi.log_likes = np.swapaxes(np.atleast_2d(np.log(np.random.random(100) * 3)), 0, 1) + bi._rejection_sampling() + + +#%% Test _perturb_data + +def test_perturb_data() -> None: + """ + Perturb data + """ + inp = Input() + inp.add_marginals() + inp.Marginals[0].dist_type = 'normal' + inp.Marginals[0].parameters = [0, 1] + mod = PL() + mm = MetaModel(inp) + expdes = ExpDesigns(inp) + engine = Engine(mm, mod, expdes) + + bi = BayesInference(engine) + data = pd.DataFrame() + data['Z'] = [0.45] + bi._perturb_data(data, ['Z']) + + +def test_perturb_data_loocv() -> None: + """ + Perturb data with bayes_loocv + """ + inp = Input() + inp.add_marginals() + inp.Marginals[0].dist_type = 'normal' + inp.Marginals[0].parameters = [0, 1] + mod = PL() + mm = MetaModel(inp) + expdes = ExpDesigns(inp) + engine = Engine(mm, mod, expdes) + + bi = BayesInference(engine) + data = pd.DataFrame() + data['Z'] = [0.45] + bi.bayes_loocv = True + bi._perturb_data(data, ['Z']) + + +#%% Test _eval_model + +def test_eval_model() -> None: + """ + Run model with descriptive key + """ + # TODO: need functioning example model to test this + None + + +#%% Test corr_factor_BME + +def test_corr_factor_BME() -> None: + """ + Calculate correction factor + """ + inp = Input() + inp.add_marginals() + inp.Marginals[0].dist_type = 'normal' + inp.Marginals[0].parameters = [0, 1] + expdes = ExpDesigns(inp) + expdes.init_param_space(max_deg=1) + expdes.X = np.array([[0], [1], [0.5]]) + expdes.Y = {'Z': [[0.4], [0.5], [0.45]]} + + mm = MetaModel(inp) + mm.fit(expdes.X, expdes.Y) + mod = PL() + engine = Engine(mm, mod, expdes) + + obs_data = {'Z': np.array([0.45])} + total_sigma2s = {'Z': np.array([0.15])} + logBME = [0, 0, 0] + + bi = BayesInference(engine) + bi.selected_indices = {'Z': 0} + bi._corr_factor_BME(obs_data, total_sigma2s, logBME) + + +def test_corr_factor_BME_selectedindices() -> None: + """ + Calculate correction factor + """ + inp = Input() + inp.add_marginals() + inp.Marginals[0].dist_type = 'normal' + inp.Marginals[0].parameters = [0, 1] + expdes = ExpDesigns(inp) + expdes.init_param_space(max_deg=1) + expdes.X = np.array([[0], [1], [0.5]]) + expdes.Y = {'Z': [[0.4], [0.5], [0.45]]} + + mm = MetaModel(inp) + mm.fit(expdes.X, expdes.Y) + mod = PL() + engine = Engine(mm, mod, expdes) + + obs_data = {'Z': np.array([0.45])} + total_sigma2s = {'Z': np.array([0.15])} + logBME = [0, 0, 0] + + bi = BayesInference(engine) + bi.selected_indices = {'Z': 0} + bi._corr_factor_BME(obs_data, total_sigma2s, logBME) + + +#%% Test normpdf + +def test_normpdf_nosigmas() -> None: + """ + Run normpdf without any additional sigmas + """ + inp = Input() + inp.add_marginals() + inp.Marginals[0].dist_type = 'normal' + inp.Marginals[0].parameters = [0, 1] + expdes = ExpDesigns(inp) + expdes.init_param_space(max_deg=1) + expdes.X = np.array([[0], [1], [0.5]]) + expdes.Y = {'Z': np.array([[0.4], [0.5], [0.45]])} + + mm = MetaModel(inp) + mod = PL() + mod.Output.names = ['Z'] + engine = Engine(mm, mod, expdes) + + obs_data = {'Z': np.array([0.45])} + total_sigma2s = {'Z': np.array([0.15])} + + bi = BayesInference(engine) + bi.normpdf(expdes.Y, obs_data, total_sigma2s, sigma2=None, std=None) + + +def test_normpdf_sigma2() -> None: + """ + Run normpdf with sigma2 + """ + inp = Input() + inp.add_marginals() + inp.Marginals[0].dist_type = 'normal' + inp.Marginals[0].parameters = [0, 1] + expdes = ExpDesigns(inp) + expdes.init_param_space(max_deg=1) + expdes.X = np.array([[0], [1], [0.5]]) + expdes.Y = {'Z': np.array([[0.4], [0.5], [0.45]])} + + mm = MetaModel(inp) + mod = PL() + mod.Output.names = ['Z'] + engine = Engine(mm, mod, expdes) + + obs_data = {'Z': np.array([0.45])} + total_sigma2s = {'Z': np.array([0.15])} + sigma2 = [[0]] + + bi = BayesInference(engine) + bi.normpdf(expdes.Y, obs_data, total_sigma2s, sigma2=sigma2, std=None) + + +def test_normpdf_allsigmas() -> None: + """ + Run normpdf with all additional sigmas + """ + inp = Input() + inp.add_marginals() + inp.Marginals[0].dist_type = 'normal' + inp.Marginals[0].parameters = [0, 1] + expdes = ExpDesigns(inp) + expdes.init_param_space(max_deg=1) + expdes.X = np.array([[0], [1], [0.5]]) + expdes.Y = {'Z': np.array([[0.4], [0.5], [0.45]])} + + mm = MetaModel(inp) + mod = PL() + mod.Output.names = ['Z'] + engine = Engine(mm, mod, expdes) + + obs_data = {'Z': np.array([0.45])} + total_sigma2s = {'Z': np.array([0.15])} + sigma2 = [[0]] + + bi = BayesInference(engine) + bi.normpdf(expdes.Y, obs_data, total_sigma2s, sigma2=sigma2, std=total_sigma2s) + + +#%% Test setup_inference + +def test_setup_inference_noobservation() -> None: + """ + Test the object setup without given observations + """ + inp = Input() + inp.add_marginals() + inp.Marginals[0].dist_type = 'normal' + inp.Marginals[0].parameters = [0, 1] + + expdes = ExpDesigns(inp) + expdes.n_init_samples = 2 + + mm = MetaModel(inp) + mm.n_params = 1 + expdes.generate_ED(expdes.n_init_samples, max_pce_deg=np.max(1)) + + mod = PL() + mod.Output.names = ['Z'] + + engine = Engine(mm, mod, expdes) + + obsData = pd.DataFrame(mod.observations, columns=mod.Output.names) + DiscrepancyOpts = Discrepancy('') + DiscrepancyOpts.type = 'Gaussian' + DiscrepancyOpts.parameters = (obsData * 0.15) ** 2 + + bi = BayesInference(engine) + bi.Discrepancy = DiscrepancyOpts + with pytest.raises(Exception) as excinfo: + bi.setup_inference() + assert str( + excinfo.value) == ('Please provide the observation data as a dictionary via observations attribute or pass the ' + 'csv-file path to MeasurementFile attribute') + + +def test_setup_inference() -> None: + """ + Test the object setup with observations + """ + inp = Input() + inp.add_marginals() + inp.Marginals[0].dist_type = 'normal' + inp.Marginals[0].parameters = [0, 1] + + expdes = ExpDesigns(inp) + expdes.n_init_samples = 2 + + mm = MetaModel(inp) + mm.n_params = 1 + expdes.generate_ED(expdes.n_init_samples, max_pce_deg=np.max(1)) + + mod = PL() + mod.observations = {'Z': np.array([0.45])} + mod.observations = {'Z': np.array([0.45]), 'x_values': np.array([0])} + mod.Output.names = ['Z'] + + engine = Engine(mm, mod, expdes) + + obsData = pd.DataFrame(mod.observations, columns=mod.Output.names) + DiscrepancyOpts = Discrepancy('') + DiscrepancyOpts.type = 'Gaussian' + DiscrepancyOpts.parameters = (obsData * 0.15) ** 2 + + bi = BayesInference(engine) + bi.Discrepancy = DiscrepancyOpts + bi.setup_inference() + + +def test_setup_inference_priorsamples() -> None: + """ + Test the object setup with prior samples set by hand + """ + inp = Input() + inp.add_marginals() + inp.Marginals[0].dist_type = 'normal' + inp.Marginals[0].parameters = [0, 1] + + expdes = ExpDesigns(inp) + expdes.n_init_samples = 2 + + mm = MetaModel(inp) + mm.n_params = 1 + expdes.generate_ED(expdes.n_init_samples, max_pce_deg=np.max(1)) + + mod = PL() + mod.observations = {'Z': np.array([0.45])} + mod.observations = {'Z': np.array([0.45]), 'x_values': np.array([0])} + mod.Output.names = ['Z'] + + engine = Engine(mm, mod, expdes) + + obsData = pd.DataFrame(mod.observations, columns=mod.Output.names) + DiscrepancyOpts = Discrepancy('') + DiscrepancyOpts.type = 'Gaussian' + DiscrepancyOpts.parameters = (obsData * 0.15) ** 2 + + bi = BayesInference(engine) + bi.prior_samples = np.swapaxes(np.array([np.random.normal(0, 1, 100)]), 0, 1) + bi.Discrepancy = DiscrepancyOpts + bi.setup_inference() + + +def test_setup_inference_valid() -> None: + """ + Test the object setup for valid + """ + inp = Input() + inp.add_marginals() + inp.Marginals[0].dist_type = 'normal' + inp.Marginals[0].parameters = [0, 1] + + expdes = ExpDesigns(inp) + expdes.n_init_samples = 2 + + mm = MetaModel(inp) + mm.n_params = 1 + expdes.generate_ED(expdes.n_init_samples, max_pce_deg=np.max(1)) + + mod = PL() + mod.observations_valid = {'Z': np.array([0.45])} + mod.observations_valid = {'Z': np.array([0.45]), 'x_values': np.array([0])} + mod.Output.names = ['Z'] + + engine = Engine(mm, mod, expdes) + + obsData = pd.DataFrame(mod.observations, columns=mod.Output.names) + DiscrepancyOpts = Discrepancy('') + DiscrepancyOpts.type = 'Gaussian' + DiscrepancyOpts.parameters = (obsData * 0.15) ** 2 + + bi = BayesInference(engine) + bi.Discrepancy = DiscrepancyOpts + bi.name = 'valid' + bi.setup_inference() + + +def test_setup_inference_noname() -> None: + """ + Test the object setup for an invalid inference name + """ + inp = Input() + inp.add_marginals() + inp.Marginals[0].dist_type = 'normal' + inp.Marginals[0].parameters = [0, 1] + + expdes = ExpDesigns(inp) + expdes.n_init_samples = 2 + + mm = MetaModel(inp) + mm.n_params = 1 + expdes.generate_ED(expdes.n_init_samples, max_pce_deg=np.max(1)) + + mod = PL() + mod.observations = {'Z': np.array([0.45])} + mod.observations = {'Z': np.array([0.45]), 'x_values': np.array([0])} + mod.Output.names = ['Z'] + + engine = Engine(mm, mod, expdes) + + obsData = pd.DataFrame(mod.observations, columns=mod.Output.names) + DiscrepancyOpts = Discrepancy('') + DiscrepancyOpts.type = 'Gaussian' + DiscrepancyOpts.parameters = (obsData * 0.15) ** 2 + + bi = BayesInference(engine) + bi.Discrepancy = DiscrepancyOpts + bi.name = '' + with pytest.raises(Exception) as excinfo: + bi.setup_inference() + assert str(excinfo.value) == 'The set inference type is not known! Use either `calib` or `valid`' + + +#%% Test perform_bootstrap + +def test_perform_bootstrap() -> None: + """ + Do bootstrap + """ + inp = Input() + inp.add_marginals() + inp.Marginals[0].dist_type = 'normal' + inp.Marginals[0].parameters = [0, 1] + + expdes = ExpDesigns(inp) + expdes.n_init_samples = 2 + expdes.n_max_samples = 4 + expdes.X = np.array([[0], [1], [0.5]]) + expdes.Y = {'Z': [[0.4], [0.5], [0.45]]} + expdes.x_values = np.array([0]) # Error in plots if this is not available + + mm = MetaModel(inp) + mm.n_params = 1 + mm.fit(expdes.X, expdes.Y) + expdes.generate_ED(expdes.n_init_samples, max_pce_deg=np.max(1)) + + mod = PL() + mod.observations = {'Z': np.array([0.45])} + mod.observations = {'Z': np.array([0.45]), 'x_values': np.array([0])} # Error if x_values not given + mod.Output.names = ['Z'] + mod.n_obs = 1 + + engine = Engine(mm, mod, expdes) + + obsData = pd.DataFrame(mod.observations, columns=mod.Output.names) + DiscrepancyOpts = Discrepancy('') + DiscrepancyOpts.type = 'Gaussian' + DiscrepancyOpts.parameters = (obsData * 0.15) ** 2 + + bi = BayesInference(engine) + bi.Discrepancy = DiscrepancyOpts + bi.bootstrap = True + bi.plot_post_pred = False + total_sigma2s = {'Z': np.array([0.15])} + bi.setup_inference() + bi.perform_bootstrap(total_sigma2s) + + +def test_perform_bootstrap_bayesloocv() -> None: + """ + Do bootstrap + """ + inp = Input() + inp.add_marginals() + inp.Marginals[0].dist_type = 'normal' + inp.Marginals[0].parameters = [0, 1] + + expdes = ExpDesigns(inp) + expdes.n_init_samples = 2 + expdes.n_max_samples = 4 + expdes.X = np.array([[0], [1], [0.5]]) + expdes.Y = {'Z': [[0.4], [0.5], [0.45]]} + expdes.x_values = np.array([0]) # Error in plots if this is not available + + mm = MetaModel(inp) + mm.n_params = 1 + mm.fit(expdes.X, expdes.Y) + expdes.generate_ED(expdes.n_init_samples, max_pce_deg=np.max(1)) + + mod = PL() + mod.observations = {'Z': np.array([0.45])} + mod.observations = {'Z': np.array([0.45]), 'x_values': np.array([0])} # Error if x_values not given + mod.Output.names = ['Z'] + mod.n_obs = 1 + + engine = Engine(mm, mod, expdes) + + obsData = pd.DataFrame(mod.observations, columns=mod.Output.names) + DiscrepancyOpts = Discrepancy('') + DiscrepancyOpts.type = 'Gaussian' + DiscrepancyOpts.parameters = (obsData * 0.15) ** 2 + + bi = BayesInference(engine) + bi.Discrepancy = DiscrepancyOpts + bi.bootstrap = True + bi.plot_post_pred = False + total_sigma2s = {'Z': np.array([0.15])} + bi.setup_inference() + bi.bayes_loocv = True + bi.perform_bootstrap(total_sigma2s) + + +#%% Test create_error_model + +def create_error_model_prior() -> None: + """ + Test creating MetaModel error-model for 'prior' + """ + # TODO: there are issues with the expected formats from the MetaModel + inp = Input() + inp.add_marginals() + inp.Marginals[0].dist_type = 'normal' + inp.Marginals[0].parameters = [0, 1] + + expdes = ExpDesigns(inp) + expdes.n_init_samples = 2 + expdes.n_max_samples = 4 + expdes.X = np.array([[0], [1], [0.5]]) + expdes.Y = {'Z': [[0.4], [0.5], [0.45]]} + + mm = MetaModel(inp) + mm.n_params = 1 + mm.fit(expdes.X, expdes.Y) + expdes.generate_ED(expdes.n_init_samples, max_pce_deg=np.max(1)) + + mod = PL() + mod.observations = {'Z': np.array([0.45])} + mod.observations = {'Z': np.array([0.45]), 'x_values': np.array([0])} + mod.Output.names = ['Z'] + mod.n_obs = 1 + + engine = Engine(mm, mod, expdes) + + obsData = pd.DataFrame(mod.observations, columns=mod.Output.names) + DiscrepancyOpts = Discrepancy('') + DiscrepancyOpts.type = 'Gaussian' + DiscrepancyOpts.parameters = (obsData * 0.15) ** 2 + + bi = BayesInference(engine) + bi.Discrepancy = DiscrepancyOpts + bi.bootstrap = True + bi.setup_inference() + bi.bias_inputs = expdes.X + bi.create_error_model(type_='prior', opt_sigma='B', sampler=None) + + +def create_error_model_posterior() -> None: + """ + Test creating MetaModel error-model for 'posterior' + """ + # TODO: there are issues with the expected formats from the MetaModel + inp = Input() + inp.add_marginals() + inp.Marginals[0].dist_type = 'normal' + inp.Marginals[0].parameters = [0, 1] + + expdes = ExpDesigns(inp) + expdes.n_init_samples = 2 + expdes.n_max_samples = 4 + expdes.X = np.array([[0], [1], [0.5]]) + expdes.Y = {'Z': [[0.4], [0.5], [0.45]]} + + mm = MetaModel(inp) + mm.n_params = 1 + mm.fit(expdes.X, expdes.Y) + expdes.generate_ED(expdes.n_init_samples, max_pce_deg=np.max(1)) + + mod = PL() + mod.observations = {'Z': np.array([0.45])} + mod.observations = {'Z': np.array([0.45]), 'x_values': np.array([0])} + mod.Output.names = ['Z'] + mod.n_obs = 1 + + engine = Engine(mm, mod, expdes) + + obsData = pd.DataFrame(mod.observations, columns=mod.Output.names) + DiscrepancyOpts = Discrepancy('') + DiscrepancyOpts.type = 'Gaussian' + DiscrepancyOpts.parameters = (obsData * 0.15) ** 2 + + posterior = pd.DataFrame() + posterior[None] = [0, 1, 0.5] + + bi = BayesInference(engine) + bi.Discrepancy = DiscrepancyOpts + bi.bootstrap = True + bi.setup_inference() + bi.bias_inputs = expdes.X + bi.posterior_df = posterior + bi.create_error_model(type_='posterior', opt_sigma='B', sampler=None) + + +#%% Test _posterior_predictive + +def test_posterior_predictive() -> None: + """ + Test posterior predictions + """ + inp = Input() + inp.add_marginals() + inp.Marginals[0].dist_type = 'normal' + inp.Marginals[0].parameters = [0, 1] + prior_samples = np.swapaxes(np.array([np.random.normal(0, 1, 10)]), 0, 1) + + expdes = ExpDesigns(inp) + expdes.n_init_samples = 2 + expdes.n_max_samples = 4 + expdes.X = np.array([[0], [1], [0.5]]) + expdes.Y = {'Z': [[0.4], [0.5], [0.45]]} + expdes.x_values = np.array([0]) # Error in plots if this is not available + + mm = MetaModel(inp) + mm.n_params = 1 + mm.fit(expdes.X, expdes.Y) + expdes.generate_ED(expdes.n_init_samples, max_pce_deg=np.max(1)) + y_hat, y_std = mm.eval_metamodel(prior_samples) + + mod = PL() + mod.observations = {'Z': np.array([0.45])} + mod.observations = {'Z': np.array([0.45]), 'x_values': np.array([0])} # Error if x_values not given + mod.Output.names = ['Z'] + mod.n_obs = 1 + + engine = Engine(mm, mod, expdes) + + total_sigma2s = {'Z': np.array([0.15])} + posterior = pd.DataFrame() + posterior[None] = [0, 1, 0.5] + obsData = pd.DataFrame(mod.observations, columns=mod.Output.names) + DiscrepancyOpts = Discrepancy('') + DiscrepancyOpts.type = 'Gaussian' + DiscrepancyOpts.parameters = (obsData * 0.15) ** 2 + + bi = BayesInference(engine) + bi.Discrepancy = DiscrepancyOpts + bi.bootstrap = True + bi.plot_post_pred = False + bi.posterior_df = posterior + bi.bias_inputs = expdes.X + bi._mean_pce_prior_pred = y_hat + bi._std_pce_prior_pred = y_std + bi.Discrepancy.total_sigma2 = total_sigma2s + bi.setup_inference() + bi._posterior_predictive() + + +def test_posterior_predictive_rejection() -> None: + """ + Test posterior predictions with rejection inference + """ + inp = Input() + inp.add_marginals() + inp.Marginals[0].dist_type = 'normal' + inp.Marginals[0].parameters = [0, 1] + prior_samples = np.swapaxes(np.array([np.random.normal(0, 1, 10)]), 0, 1) + + expdes = ExpDesigns(inp) + expdes.n_init_samples = 2 + expdes.n_max_samples = 4 + expdes.X = np.array([[0], [1], [0.5]]) + expdes.Y = {'Z': [[0.4], [0.5], [0.45]]} + expdes.x_values = np.array([0]) # Error in plots if this is not available + + mm = MetaModel(inp) + mm.n_params = 1 + mm.fit(expdes.X, expdes.Y) + expdes.generate_ED(expdes.n_init_samples, max_pce_deg=np.max(1)) + y_hat, y_std = mm.eval_metamodel(prior_samples) + + mod = PL() + mod.observations = {'Z': np.array([0.45])} + mod.observations = {'Z': np.array([0.45]), 'x_values': np.array([0])} # Error if x_values not given + mod.Output.names = ['Z'] + mod.n_obs = 1 + + engine = Engine(mm, mod, expdes) + + total_sigma2s = {'Z': np.array([0.15])} + posterior = pd.DataFrame() + posterior[None] = [0, 1, 0.5] + obsData = pd.DataFrame(mod.observations, columns=mod.Output.names) + DiscrepancyOpts = Discrepancy('') + DiscrepancyOpts.type = 'Gaussian' + DiscrepancyOpts.parameters = (obsData * 0.15) ** 2 + + bi = BayesInference(engine) + bi.Discrepancy = DiscrepancyOpts + bi.bootstrap = True + bi.plot_post_pred = False + bi.posterior_df = posterior + bi.bias_inputs = expdes.X + bi._mean_pce_prior_pred = y_hat + bi._std_pce_prior_pred = y_std + bi.Discrepancy.total_sigma2 = total_sigma2s + bi.inference_method = 'rejection' + bi.setup_inference() + bi._posterior_predictive() + + +#%% Test plot_post_params + +def test_plot_post_params() -> None: + """ + Plot posterior dist + """ + inp = Input() + inp.add_marginals() + inp.Marginals[0].dist_type = 'normal' + inp.Marginals[0].parameters = [0, 1] + + expdes = ExpDesigns(inp) + expdes.init_param_space(max_deg=1) + expdes.n_init_samples = 2 + + mm = MetaModel(inp) + mm.n_params = 1 + mod = PL() + engine = Engine(mm, mod, expdes) + + bi = BayesInference(engine) + posterior = pd.DataFrame() + posterior[None] = [0, 1, 0.5] + bi.posterior_df = posterior + bi.plot_post_params('B') + + +def test_plot_post_params_noemulator() -> None: + """ + Plot posterior dist with emulator = False + """ + inp = Input() + inp.add_marginals() + inp.Marginals[0].dist_type = 'normal' + inp.Marginals[0].parameters = [0, 1] + + expdes = ExpDesigns(inp) + expdes.init_param_space(max_deg=1) + expdes.n_init_samples = 2 + + mm = MetaModel(inp) + mm.n_params = 1 + mod = PL() + engine = Engine(mm, mod, expdes) + + bi = BayesInference(engine) + posterior = pd.DataFrame() + posterior[None] = [0, 1, 0.5] + bi.posterior_df = posterior + bi.emulator = False + bi.plot_post_params('B') + + +#%% Test plot_log_BME + +def test_plot_log_BME() -> None: + """ + Show the log_BME from bootstrapping + """ + inp = Input() + inp.add_marginals() + inp.Marginals[0].dist_type = 'normal' + inp.Marginals[0].parameters = [0, 1] + + expdes = ExpDesigns(inp) + expdes.init_param_space(max_deg=1) + expdes.n_init_samples = 2 + + mm = MetaModel(inp) + mm.n_params = 1 + mod = PL() + engine = Engine(mm, mod, expdes) + + bi = BayesInference(engine) + bi.log_BME = np.array([[0, 0.2], [0, 0.2]]) + bi.n_tot_measurement = 1 + bi.plot_log_BME() + + +def test_plot_log_BME_noemulator() -> None: + """ + Show the log_BME from bootstrapping with emulator = False + """ + inp = Input() + inp.add_marginals() + inp.Marginals[0].dist_type = 'normal' + inp.Marginals[0].parameters = [0, 1] + + expdes = ExpDesigns(inp) + expdes.init_param_space(max_deg=1) + expdes.n_init_samples = 2 + + mm = MetaModel(inp) + mm.n_params = 1 + mod = PL() + engine = Engine(mm, mod, expdes) + + bi = BayesInference(engine) + bi.log_BME = np.array([[0, 0.2], [0, 0.2]]) + bi.n_tot_measurement = 1 + bi.emulator = False + bi.plot_log_BME() + + +#%% Test _plot_max_a_posteriori + +def test_plot_max_a_posteriori_rejection() -> None: + """ + Plot MAP estimate for rejection + """ + inp = Input() + inp.add_marginals() + inp.Marginals[0].dist_type = 'normal' + inp.Marginals[0].parameters = [0, 1] + + expdes = ExpDesigns(inp) + expdes.init_param_space(max_deg=1) + expdes.n_init_samples = 2 + + mm = MetaModel(inp) + mm.n_params = 1 + mod = PL() + engine = Engine(mm, mod, expdes) + + bi = BayesInference(engine) + bi.inference_method = 'rejection' + bi._plot_post_predictive() + + +def test_plot_max_a_posteriori() -> None: + """ + Plot MAP estimate + """ + inp = Input() + inp.add_marginals() + inp.Marginals[0].dist_type = 'normal' + inp.Marginals[0].parameters = [0, 1] + + expdes = ExpDesigns(inp) + expdes.init_param_space(max_deg=1) + expdes.n_init_samples = 2 + + mm = MetaModel(inp) + mm.n_params = 1 + mod = PL() + engine = Engine(mm, mod, expdes) + + bi = BayesInference(engine) + bi._plot_post_predictive() + + +#%% Test _plot_post_predictive + + +def test_plot_post_predictive_rejection() -> None: + """ + Plot posterior predictions for rejection + """ + inp = Input() + inp.add_marginals() + inp.Marginals[0].dist_type = 'normal' + inp.Marginals[0].parameters = [0, 1] + + expdes = ExpDesigns(inp) + expdes.init_param_space(max_deg=1) + expdes.n_init_samples = 2 + + mm = MetaModel(inp) + mm.n_params = 1 + mod = PL() + engine = Engine(mm, mod, expdes) + + bi = BayesInference(engine) + bi.inference_method = 'rejection' + bi._plot_post_predictive() + + +def test_plot_post_predictive() -> None: + """ + Plot posterior predictions + """ + inp = Input() + inp.add_marginals() + inp.Marginals[0].dist_type = 'normal' + inp.Marginals[0].parameters = [0, 1] + + expdes = ExpDesigns(inp) + expdes.init_param_space(max_deg=1) + expdes.n_init_samples = 2 + + mm = MetaModel(inp) + mm.n_params = 1 + mod = PL() + engine = Engine(mm, mod, expdes) + + bi = BayesInference(engine) + bi._plot_post_predictive() + + +#%% Main runs +if __name__ == '__main__': + inp = Input() + inp.add_marginals() + inp.Marginals[0].dist_type = 'normal' + inp.Marginals[0].parameters = [0, 1] + # prior_samples = np.swapaxes(np.array([np.random.normal(0,1,10)]),0,1) + + expdes = ExpDesigns(inp) + expdes.init_param_space(max_deg=1) + expdes.n_init_samples = 2 + expdes.n_max_samples = 4 + expdes.X = np.array([[0], [1], [0.5]]) + expdes.Y = {'Z': [[0.4], [0.5], [0.45]]} + expdes.x_values = np.array([0]) # Error in plots if this is not + + mm = MetaModel(inp) + mm.n_params = 1 + mm.fit(expdes.X, expdes.Y) + expdes.generate_ED(expdes.n_init_samples, max_pce_deg=np.max(1)) + # y_hat, y_std = mm.eval_metamodel(prior_samples) + + mod = PL() + mod.observations = {'Z': np.array([0.45])} + mod.observations = {'Z': np.array([0.45]), 'x_values': np.array([0])} # Error if x_values not given + mod.Output.names = ['Z'] + mod.n_obs = 1 + + engine = Engine(mm, mod, expdes) + + sigma2Dict = {'Z': np.array([0.05])} + sigma2Dict = pd.DataFrame(sigma2Dict, columns=['Z']) + obsData = pd.DataFrame({'Z': np.array([0.45]), 'x_values': np.array([0])}, columns=mod.Output.names) + DiscrepancyOpts = Discrepancy('') + DiscrepancyOpts.type = 'Gaussian' + DiscrepancyOpts.parameters = (obsData * 0.15) ** 2 + DiscrepancyOpts.opt_sigma = 'B' + + bi = BayesInference(engine) + bi.Discrepancy = DiscrepancyOpts # Error if this not class 'DiscrepancyOpts' or dict(?) + bi.bootstrap = True # Error if this and bayes_loocv and just_analysis are all False? + bi.plot_post_pred = False # Remaining issue in the violinplot + bi.error_model = False + bi.bayes_loocv = True + if 1: + bi.create_inference() + # opt_sigma = 'B' + # total_sigma2s = {'Z':np.array([0.15])} + # data = pd.DataFrame() + # data['Z'] = [0.45] + # data['x_values'] = [0.3] + # bi.setup_inference() + # bi.perform_bootstrap(total_sigma2s) + posterior = pd.DataFrame() + posterior[None] = [0, 1, 0.5] + bi.posterior_df = posterior + # bi.bias_inputs = expdes.X + # bi._mean_pce_prior_pred = y_hat + # bi._std_pce_prior_pred = y_std + # bi.Discrepancy.total_sigma2 = total_sigma2s + # bi.create_error_model(type_ = 'posterior', opt_sigma = 'B', sampler = None) + # bi._posterior_predictive() + # bi.plot_post_params('B') + # bi.log_BME = np.array([[0,0.2],[0,0.2]]) + # bi.n_tot_measurement = 1 + # bi.plot_log_BME() + bi.inference_method = 'rejection' + bi._plot_max_a_posteriori() diff --git a/tests/test_BayesModelComparison.py b/tests/test_BayesModelComparison.py new file mode 100644 index 0000000000000000000000000000000000000000..91f328ec7ae39cf7cded6b228edc1442053a2dfb --- /dev/null +++ b/tests/test_BayesModelComparison.py @@ -0,0 +1,28 @@ +# -*- coding: utf-8 -*- +""" +Test the BayesModelComparison class in bayesvalidrox. +Tests are available for the following functions +Class BayesModelComparison: + create_model_comparison + compare_models + generate_dataset + __perturb_data + cal_model_weight + plot_just_analysis + plot_model_weights + plot_bayes_factor + +""" +import sys +sys.path.append("src/") +import pytest +import numpy as np + +from bayesvalidrox.bayes_inference.bayes_model_comparison import BayesModelComparison +#from bayesvalidrox.surrogate_models.input_space import InputSpace + +def test_BMC() -> None: + """ + Build BMC without inputs + """ + BayesModelComparison() \ No newline at end of file diff --git a/tests/test_Discrepancy.py b/tests/test_Discrepancy.py new file mode 100644 index 0000000000000000000000000000000000000000..7fb948d905031e7d7e6235857c27792fb29ece57 --- /dev/null +++ b/tests/test_Discrepancy.py @@ -0,0 +1,43 @@ +# -*- coding: utf-8 -*- +""" +Test the Discrepancy class in bayesvalidrox. +Tests are available for the following functions +Class Discrepancy: + get_sample + +""" +import sys +sys.path.append("src/") +import pytest + +from bayesvalidrox.bayes_inference.discrepancy import Discrepancy +from bayesvalidrox.surrogate_models.inputs import Input + +#%% Test Discrepancy init + +def test_discrepancy() -> None: + """ + Construct a Discrepancy object + """ + disc = Discrepancy() + +#%% Test Discrepancy.get_sample + +def test_get_sample_noinput() -> None: + """ + Get discrepancy sample without input dist + """ + disc = Discrepancy() + with pytest.raises(AttributeError) as excinfo: + disc.get_sample(2) + assert str(excinfo.value) == 'Cannot create new samples, please provide input distributions' + +def test_get_sample() -> None: + """ + Get discrepancy sample + """ + disc = Discrepancy() + with pytest.raises(AttributeError) as excinfo: + disc.get_sample(2) + assert str(excinfo.value) == 'Cannot create new samples, please provide input distributions' + \ No newline at end of file diff --git a/tests/test_Engine.py b/tests/test_Engine.py new file mode 100644 index 0000000000000000000000000000000000000000..6b03a26237d1b1ff741bcfd69e8ffff188cc8d7d --- /dev/null +++ b/tests/test_Engine.py @@ -0,0 +1,1066 @@ +# -*- coding: utf-8 -*- +""" +Tests the class Engine in bayesvalidrox +Tests are available for the following functions: + hellinger_distance - x + logpdf - x + subdomain - x +Engine: + start_engine - x + train_normal + train_sequential + eval_metamodel + train_seq_design + util_VarBasedDesign + util_BayesianActiveDesign + util_BayesianDesign + run_util_func + dual_annealing + tradoff_weights - x + choose_next_sample + plotter + util_AlphOptDesign + _normpdf - x Also move outside the class? + _corr_factor_BME Not used again in this class + _posteriorPlot - x + _BME_Calculator - x + _validError - x + _error_Mean_Std - x + +""" +import math +import numpy as np +import pandas as pd +import sys + +from bayesvalidrox.surrogate_models.inputs import Input +from bayesvalidrox.surrogate_models.exp_designs import ExpDesigns +from bayesvalidrox.surrogate_models.surrogate_models import MetaModel +from bayesvalidrox.pylink.pylink import PyLinkForwardModel as PL +from bayesvalidrox.surrogate_models.engine import Engine +from bayesvalidrox.surrogate_models.engine import hellinger_distance, logpdf, subdomain + +sys.path.append("src/") + + +#%% Test Engine constructor + + +def test_engine() -> None: + """ + Build Engine without inputs + """ + inp = Input() + inp.add_marginals() + inp.Marginals[0].dist_type = 'normal' + inp.Marginals[0].parameters = [0, 1] + mod = PL() + mm = MetaModel(inp) + expdes = ExpDesigns(inp) + Engine(mm, mod, expdes) + + +#%% Test Engine.start_engine + +def test_start_engine() -> None: + """ + Build Engine without inputs + """ + inp = Input() + inp.add_marginals() + inp.Marginals[0].dist_type = 'normal' + inp.Marginals[0].parameters = [0, 1] + mod = PL() + mm = MetaModel(inp) + expdes = ExpDesigns(inp) + engine = Engine(mm, mod, expdes) + engine.start_engine() + + +#%% Test Engine.train_normal +# TODO: build mock model to do this? - test again in full-length examples + +#%% Test Engine._error_Mean_Std + +def test__error_Mean_Std() -> None: + """ + Compare moments of surrogate and reference + """ + inp = Input() + inp.add_marginals() + inp.Marginals[0].dist_type = 'normal' + inp.Marginals[0].parameters = [0, 1] + mm = MetaModel(inp) + mm.fit([[0.0], [1.0]], {'Z': [[0.5], [0.5]]}) + expdes = ExpDesigns(inp) + mod = PL() + mod.mc_reference['mean'] = [0.5] + mod.mc_reference['std'] = [0.0] + mod.Output.names = ['Z'] + engine = Engine(mm, mod, expdes) + engine.start_engine() + mean, std = engine._error_Mean_Std() + assert mean < 0.01 and std < 0.01 + + +#%% Test Engine._validError + +def test__validError() -> None: + """ + Calculate validation error + """ + inp = Input() + inp.add_marginals() + inp.Marginals[0].dist_type = 'normal' + inp.Marginals[0].parameters = [0, 1] + mm = MetaModel(inp) + mm.fit([[0.0], [1.0]], {'Z': [[0.5], [0.5]]}) + expdes = ExpDesigns(inp) + mod = PL() + expdes.valid_samples = [[0.5]] + expdes.valid_model_runs = {'Z': [[0.5]]} + mod.Output.names = ['Z'] + engine = Engine(mm, mod, expdes) + engine.start_engine() + mean, std = engine._validError() + assert mean['Z'][0] < 0.01 # and std['Z'][0] <0.01 + + +#%% Test Engine._BME_Calculator + +def test__BME_Calculator() -> None: + """ + Calculate BME + """ + inp = Input() + inp.add_marginals() + inp.Marginals[0].dist_type = 'normal' + inp.Marginals[0].parameters = [0, 1] + mm = MetaModel(inp) + mm.fit([[0.0], [0.5], [1.0]], {'Z': [[0.5], [0.4], [0.5]]}) + expdes = ExpDesigns(inp) + expdes.generate_ED(2, max_pce_deg=1) + mod = PL() + mod.Output.names = ['Z'] + engine = Engine(mm, mod, expdes) + engine.start_engine() + obs_data = {'Z': np.array([0.45])} + sigma2Dict = {'Z': np.array([0.05])} + sigma2Dict = pd.DataFrame(sigma2Dict, columns=['Z']) + engine._BME_Calculator(obs_data, sigma2Dict) + # Note: if error appears here it might also be due to inoptimal choice of training samples + + +def test__BME_Calculator_rmse() -> None: + """ + Calculate BME with given RMSE + """ + inp = Input() + inp.add_marginals() + inp.Marginals[0].dist_type = 'normal' + inp.Marginals[0].parameters = [0, 1] + mm = MetaModel(inp) + mm.fit([[0.0], [0.5], [1.0]], {'Z': [[0.5], [0.4], [0.5]]}) + expdes = ExpDesigns(inp) + expdes.generate_ED(2, max_pce_deg=1) + mod = PL() + mod.Output.names = ['Z'] + engine = Engine(mm, mod, expdes) + engine.start_engine() + obs_data = {'Z': np.array([0.45])} + sigma2Dict = {'Z': np.array([0.05])} + sigma2Dict = pd.DataFrame(sigma2Dict, columns=['Z']) + engine._BME_Calculator(obs_data, sigma2Dict, rmse={'Z': 0.1}) + # Note: if error appears here it might also be due to inoptimal choice of training samples + + +def test__BME_Calculator_lik() -> None: + """ + Calculate BME with given validation likelihood and post-snapshot + """ + inp = Input() + inp.add_marginals() + inp.Marginals[0].dist_type = 'normal' + inp.Marginals[0].parameters = [0, 1] + mm = MetaModel(inp) + mm.fit([[0.0], [0.5], [1.0]], {'Z': [[0.5], [0.4], [0.5]]}) + expdes = ExpDesigns(inp) + expdes.generate_ED(2, max_pce_deg=1) + mod = PL() + mod.Output.names = ['Z'] + engine = Engine(mm, mod, expdes) + engine.start_engine() + obs_data = {'Z': np.array([0.45])} + sigma2Dict = {'Z': np.array([0.05])} + sigma2Dict = pd.DataFrame(sigma2Dict, columns=['Z']) + expdes.post_snapshot = True + + engine.valid_likelihoods = [0.1] + engine._BME_Calculator(obs_data, sigma2Dict) + + +def test__BME_Calculator_2d() -> None: + """ + Calculate BME with given validation likelihood and post-snapshot, 2d input + """ + inp = Input() + inp.add_marginals() + inp.Marginals[0].dist_type = 'normal' + inp.Marginals[0].parameters = [0, 1] + inp.add_marginals() + inp.Marginals[1].dist_type = 'normal' + inp.Marginals[1].parameters = [0, 1] + mm = MetaModel(inp) + mm.fit([[0.0, 0.0], [0.5, 0.1], [1.0, 0.9]], {'Z': [[0.5], [0.4], [0.5]]}) + expdes = ExpDesigns(inp) + expdes.generate_ED(2, max_pce_deg=1) + mod = PL() + mod.n_obs = 1 + mod.Output.names = ['Z'] + engine = Engine(mm, mod, expdes) + engine.start_engine() + obs_data = {'Z': np.array([0.45])} + sigma2Dict = {'Z': np.array([0.05])} + sigma2Dict = pd.DataFrame(sigma2Dict, columns=['Z']) + expdes.post_snapshot = True + + engine.valid_likelihoods = [0.1] + engine._BME_Calculator(obs_data, sigma2Dict) + + +#%% Test hellinger_distance + +def test_hellinger_distance_isnan() -> None: + """ + Calculate Hellinger distance-nan + """ + P = [0] + Q = [1] + math.isnan(hellinger_distance(P, Q)) + + +def test_hellinger_distance_0() -> None: + """ + Calculate Hellinger distance-0 + """ + P = [0, 1, 2] + Q = [1, 0, 2] + assert hellinger_distance(P, Q) == 0.0 + + +def test_hellinger_distance_1() -> None: + """ + Calculate Hellinger distance-1 + """ + P = [0, 1, 2] + Q = [0, 0, 0] + assert hellinger_distance(P, Q) == 1.0 + + +#%% Test Engine._normpdf + +def test__normpdf() -> None: + """ + Likelihoods based on gaussian dist + """ + + inp = Input() + inp.add_marginals() + inp.Marginals[0].dist_type = 'normal' + inp.Marginals[0].parameters = [0, 1] + mm = MetaModel(inp) + expdes = ExpDesigns(inp) + mod = PL() + mod.Output.names = ['Z'] + + y_hat_pce = {'Z': np.array([[0.12]])} + std_pce = {'Z': np.array([[0.05]])} + obs_data = {'Z': np.array([0.1])} + sigma2Dict = {'Z': np.array([0.05])} + total_sigma2s = pd.DataFrame(sigma2Dict, columns=['Z']) + + engine = Engine(mm, mod, expdes) + engine.start_engine() + engine._normpdf(y_hat_pce, std_pce, obs_data, total_sigma2s) + + +def test__normpdf_rmse() -> None: + """ + Likelihoods based on gaussian dist with rmse + """ + + inp = Input() + inp.add_marginals() + inp.Marginals[0].dist_type = 'normal' + inp.Marginals[0].parameters = [0, 1] + mm = MetaModel(inp) + expdes = ExpDesigns(inp) + mod = PL() + mod.Output.names = ['Z'] + + y_hat_pce = {'Z': np.array([[0.12]])} + std_pce = {'Z': np.array([[0.05]])} + obs_data = {'Z': np.array([0.1])} + sigma2Dict = {'Z': np.array([0.05])} + total_sigma2s = pd.DataFrame(sigma2Dict, columns=['Z']) + + engine = Engine(mm, mod, expdes) + engine.start_engine() + engine._normpdf(y_hat_pce, std_pce, obs_data, total_sigma2s, rmse={'Z': 0.1}) + + +#%% Test Engine._posteriorPlot + +def test__posteriorPlot() -> None: + """ + Plot posterior + """ + inp = Input() + inp.add_marginals() + inp.Marginals[0].dist_type = 'normal' + inp.Marginals[0].parameters = [0, 1] + mm = MetaModel(inp) + expdes = ExpDesigns(inp) + expdes.generate_ED(2, max_pce_deg=1) + mod = PL() + posterior = np.array([[0], [0.1], [0.2]]) + engine = Engine(mm, mod, expdes) + engine._posteriorPlot(posterior, ['i'], 'Z') + + +def test__posteriorPlot_2d() -> None: + """ + Plot posterior for 2 params + """ + inp = Input() + inp.add_marginals() + inp.Marginals[0].dist_type = 'normal' + inp.Marginals[0].parameters = [0, 1] + inp.add_marginals() + inp.Marginals[1].dist_type = 'normal' + inp.Marginals[1].parameters = [0, 1] + mm = MetaModel(inp) + expdes = ExpDesigns(inp) + expdes.generate_ED(2, max_pce_deg=1) + mod = PL() + posterior = np.array([[0, 0], [0.1, 1.0], [0.2, 0.5]]) + engine = Engine(mm, mod, expdes) + engine._posteriorPlot(posterior, ['i', 'j'], 'Z') + + +#%% Test logpdf + +def test_logpdf() -> None: + """ + Calculate log-pdf + """ + logpdf(np.array([0.1]), np.array([0.2]), np.array([0.1])) + + +#%% Test Engine._corr_factor_BME +# TODO: not used again here? + +#%% Test subdomain + +def test_subdomain() -> None: + """ + Create subdomains from bounds + """ + subdomain([(0, 1), (0, 1)], 2) + + +#%% Test Engine.tradeoff_weights + +def test_tradeoff_weights_None() -> None: + """ + Tradeoff weights with no scheme + """ + inp = Input() + inp.add_marginals() + inp.Marginals[0].dist_type = 'normal' + inp.Marginals[0].parameters = [0, 1] + mm = MetaModel(inp) + expdes = ExpDesigns(inp) + mod = PL() + engine = Engine(mm, mod, expdes) + weights = engine.tradeoff_weights(None, [[0], [1]], {'Z': [[0.4], [0.5]]}) + assert weights[0] == 0 and weights[1] == 1 + + +def test_tradeoff_weights_equal() -> None: + """ + Tradeoff weights with 'equal' scheme + """ + inp = Input() + inp.add_marginals() + inp.Marginals[0].dist_type = 'normal' + inp.Marginals[0].parameters = [0, 1] + mm = MetaModel(inp) + expdes = ExpDesigns(inp) + mod = PL() + engine = Engine(mm, mod, expdes) + weights = engine.tradeoff_weights('equal', [[0], [1]], {'Z': [[0.4], [0.5]]}) + assert weights[0] == 0.5 and weights[1] == 0.5 + + +def test_tradeoff_weights_epsdecr() -> None: + """ + Tradeoff weights with 'epsilon-decreasing' scheme + """ + inp = Input() + inp.add_marginals() + inp.Marginals[0].dist_type = 'normal' + inp.Marginals[0].parameters = [0, 1] + mm = MetaModel(inp) + expdes = ExpDesigns(inp) + expdes.n_init_samples = 2 + expdes.n_max_samples = 3 + expdes.X = np.array([[0], [1]]) + mod = PL() + engine = Engine(mm, mod, expdes) + weights = engine.tradeoff_weights('epsilon-decreasing', expdes.X, {'Z': [[0.4], [0.5]]}) + assert weights[0] == 1.0 and weights[1] == 0.0 + + +def test_tradeoff_weights_adaptive() -> None: + """ + Tradeoff weights with 'adaptive' scheme + """ + inp = Input() + inp.add_marginals() + inp.Marginals[0].dist_type = 'normal' + inp.Marginals[0].parameters = [0, 1] + mm = MetaModel(inp) + expdes = ExpDesigns(inp) + expdes.n_init_samples = 2 + expdes.n_max_samples = 3 + expdes.X = np.array([[0], [1]]) + mod = PL() + engine = Engine(mm, mod, expdes) + weights = engine.tradeoff_weights('adaptive', expdes.X, {'Z': [[0.4], [0.5]]}) + assert weights[0] == 0.5 and weights[1] == 0.5 + + +def test_tradeoff_weights_adaptiveit1() -> None: + """ + Tradeoff weights with 'adaptive' scheme for later iteration (not the first) + """ + inp = Input() + inp.add_marginals() + inp.Marginals[0].dist_type = 'normal' + inp.Marginals[0].parameters = [0, 1] + expdes = ExpDesigns(inp) + expdes.n_init_samples = 2 + expdes.n_max_samples = 4 + expdes.X = np.array([[0], [1], [0.5]]) + expdes.Y = {'Z': [[0.4], [0.5], [0.45]]} + mm = MetaModel(inp) + mm.fit(expdes.X, expdes.Y) + mod = PL() + engine = Engine(mm, mod, expdes) + engine._y_hat_prev, _ = mm.eval_metamodel(samples=np.array([[0.1], [0.2], [0.6]])) + engine.tradeoff_weights('adaptive', expdes.X, expdes.Y) + + +#%% Test Engine.choose_next_sample + +def test_choose_next_sample() -> None: + """ + Chooses new sample using all standard settings (exploration, random, space-filling,...) + """ + inp = Input() + inp.add_marginals() + inp.Marginals[0].dist_type = 'normal' + inp.Marginals[0].parameters = [0, 1] + expdes = ExpDesigns(inp) + expdes.n_init_samples = 2 + expdes.n_max_samples = 4 + expdes.X = np.array([[0], [1], [0.5]]) + expdes.Y = {'Z': [[0.4], [0.5], [0.45]]} + expdes.explore_method = 'random' + expdes.exploit_method = 'Space-filling' + expdes.util_func = 'Space-filling' + + mm = MetaModel(inp) + mm.fit(expdes.X, expdes.Y) + expdes.generate_ED(expdes.n_init_samples, max_pce_deg=np.max(mm.pce_deg)) + mod = PL() + engine = Engine(mm, mod, expdes) + engine.out_names = ['Z'] + x, nan = engine.choose_next_sample() + assert x.shape[0] == 1 and x.shape[1] == 1 + + +def test_choose_next_sample_da_spaceparallel() -> None: + """ + Chooses new sample using dual-annealing and space-filling, parallel=True + """ + inp = Input() + inp.add_marginals() + inp.Marginals[0].dist_type = 'normal' + inp.Marginals[0].parameters = [0, 1] + expdes = ExpDesigns(inp) + expdes.n_init_samples = 2 + expdes.n_max_samples = 4 + expdes.X = np.array([[0], [1], [0.5]]) + expdes.Y = {'Z': [[0.4], [0.5], [0.45]]} + expdes.explore_method = 'dual-annealing' + expdes.exploit_method = 'Space-filling' + expdes.util_func = 'Space-filling' + + mm = MetaModel(inp) + mm.fit(expdes.X, expdes.Y) + expdes.generate_ED(expdes.n_init_samples, max_pce_deg=np.max(mm.pce_deg)) + mod = PL() + engine = Engine(mm, mod, expdes) + engine.out_names = ['Z'] + engine.parallel = True + x, nan = engine.choose_next_sample() + assert x.shape[0] == 1 and x.shape[1] == 1 + + +def test_choose_next_sample_da_spacenoparallel() -> None: + """ + Chooses new sample using dual-annealing and space-filling, parallel = False + """ + inp = Input() + inp.add_marginals() + inp.Marginals[0].dist_type = 'normal' + inp.Marginals[0].parameters = [0, 1] + expdes = ExpDesigns(inp) + expdes.n_init_samples = 2 + expdes.n_max_samples = 4 + expdes.X = np.array([[0], [1], [0.5]]) + expdes.Y = {'Z': [[0.4], [0.5], [0.45]]} + expdes.explore_method = 'dual-annealing' + expdes.exploit_method = 'Space-filling' + expdes.util_func = 'Space-filling' + + mm = MetaModel(inp) + mm.fit(expdes.X, expdes.Y) + expdes.generate_ED(expdes.n_init_samples, max_pce_deg=np.max(mm.pce_deg)) + mod = PL() + engine = Engine(mm, mod, expdes) + engine.out_names = ['Z'] + engine.parallel = False + x, nan = engine.choose_next_sample() + assert x.shape[0] == 1 and x.shape[1] == 1 + + +def test_choose_next_sample_loo_space() -> None: + """ + Chooses new sample using all LOO-CV and space-filling + """ + inp = Input() + inp.add_marginals() + inp.Marginals[0].dist_type = 'normal' + inp.Marginals[0].parameters = [0, 1] + expdes = ExpDesigns(inp) + expdes.n_init_samples = 2 + expdes.n_max_samples = 4 + expdes.X = np.array([[0], [1], [0.5]]) + expdes.Y = {'Z': [[0.4], [0.5], [0.45]]} + expdes.explore_method = 'LOO-CV' + expdes.exploit_method = 'Space-filling' + expdes.util_func = 'Space-filling' + + mm = MetaModel(inp) + mm.fit(expdes.X, expdes.Y) + expdes.generate_ED(expdes.n_init_samples, max_pce_deg=np.max(mm.pce_deg)) + mod = PL() + engine = Engine(mm, mod, expdes) + engine.out_names = ['Z'] + x, nan = engine.choose_next_sample() + assert x.shape[0] == 1 and x.shape[1] == 1 + + +def test_choose_next_sample_vor_space() -> None: + """ + Chooses new sample using voronoi, space-filling + """ + inp = Input() + inp.add_marginals() + inp.Marginals[0].dist_type = 'normal' + inp.Marginals[0].parameters = [0, 1] + expdes = ExpDesigns(inp) + expdes.n_init_samples = 2 + expdes.n_max_samples = 4 + expdes.X = np.array([[0], [1], [0.5]]) + expdes.Y = {'Z': [[0.4], [0.5], [0.45]]} + expdes.explore_method = 'voronoi' + expdes.exploit_method = 'Space-filling' + expdes.util_func = 'Space-filling' + + mm = MetaModel(inp) + mm.fit(expdes.X, expdes.Y) + expdes.generate_ED(expdes.n_init_samples, max_pce_deg=np.max(mm.pce_deg)) + mod = PL() + engine = Engine(mm, mod, expdes) + engine.out_names = ['Z'] + x, nan = engine.choose_next_sample() + assert x.shape[0] == 1 and x.shape[1] == 1 + + +def test_choose_next_sample_latin_space() -> None: + """ + Chooses new sample using all latin-hypercube, space-filling + """ + inp = Input() + inp.add_marginals() + inp.Marginals[0].dist_type = 'normal' + inp.Marginals[0].parameters = [0, 1] + expdes = ExpDesigns(inp) + expdes.n_init_samples = 2 + expdes.n_max_samples = 4 + expdes.X = np.array([[0], [1], [0.5]]) + expdes.Y = {'Z': [[0.4], [0.5], [0.45]]} + expdes.explore_method = 'latin-hypercube' + expdes.exploit_method = 'Space-filling' + expdes.util_func = 'Space-filling' + + mm = MetaModel(inp) + mm.fit(expdes.X, expdes.Y) + expdes.generate_ED(expdes.n_init_samples, max_pce_deg=np.max(mm.pce_deg)) + mod = PL() + engine = Engine(mm, mod, expdes) + engine.out_names = ['Z'] + x, nan = engine.choose_next_sample() + assert x.shape[0] == 1 and x.shape[1] == 1 + + +def test_choose_next_sample_latin_alphD() -> None: + """ + Chooses new sample using all latin-hypercube, alphabetic (D) + """ + inp = Input() + inp.add_marginals() + inp.Marginals[0].dist_type = 'normal' + inp.Marginals[0].parameters = [0, 1] + expdes = ExpDesigns(inp) + expdes.n_init_samples = 2 + expdes.n_max_samples = 4 + expdes.X = np.array([[0], [1], [0.5]]) + expdes.Y = {'Z': [[0.4], [0.5], [0.45]]} + expdes.explore_method = 'latin-hypercube' + expdes.exploit_method = 'alphabetic' + expdes.util_func = 'D-Opt' + + mm = MetaModel(inp) + mm.fit(expdes.X, expdes.Y) + expdes.generate_ED(expdes.n_init_samples, max_pce_deg=np.max(mm.pce_deg)) + mod = PL() + engine = Engine(mm, mod, expdes) + engine.out_names = ['Z'] + x, nan = engine.choose_next_sample(var=expdes.util_func) + assert x.shape[0] == 1 and x.shape[1] == 1 + + +def test_choose_next_sample_latin_alphK() -> None: + """ + Chooses new sample using all latin-hypercube, alphabetic (K) + """ + inp = Input() + inp.add_marginals() + inp.Marginals[0].dist_type = 'normal' + inp.Marginals[0].parameters = [0, 1] + expdes = ExpDesigns(inp) + expdes.n_init_samples = 2 + expdes.n_max_samples = 4 + expdes.X = np.array([[0], [1], [0.5]]) + expdes.Y = {'Z': [[0.4], [0.5], [0.45]]} + expdes.explore_method = 'latin-hypercube' + expdes.exploit_method = 'alphabetic' + expdes.util_func = 'K-Opt' + + mm = MetaModel(inp) + mm.fit(expdes.X, expdes.Y) + expdes.generate_ED(expdes.n_init_samples, max_pce_deg=np.max(mm.pce_deg)) + mod = PL() + engine = Engine(mm, mod, expdes) + engine.out_names = ['Z'] + x, nan = engine.choose_next_sample(var=expdes.util_func) + assert x.shape[0] == 1 and x.shape[1] == 1 + + +def test_choose_next_sample_latin_alphA() -> None: + """ + Chooses new sample using all latin-hypercube, alphabetic (A) + """ + inp = Input() + inp.add_marginals() + inp.Marginals[0].dist_type = 'normal' + inp.Marginals[0].parameters = [0, 1] + expdes = ExpDesigns(inp) + expdes.n_init_samples = 2 + expdes.n_max_samples = 4 + expdes.X = np.array([[0], [1], [0.5]]) + expdes.Y = {'Z': [[0.4], [0.5], [0.45]]} + expdes.explore_method = 'latin-hypercube' + expdes.exploit_method = 'alphabetic' + expdes.util_func = 'A-Opt' + + mm = MetaModel(inp) + mm.fit(expdes.X, expdes.Y) + expdes.generate_ED(expdes.n_init_samples, max_pce_deg=np.max(mm.pce_deg)) + mod = PL() + engine = Engine(mm, mod, expdes) + engine.out_names = ['Z'] + x, nan = engine.choose_next_sample(var=expdes.util_func) + assert x.shape[0] == 1 and x.shape[1] == 1 + + +def test_choose_next_sample_latin_VarALM() -> None: + """ + Chooses new sample using all latin-hypercube, VarDesign (ALM) + """ + inp = Input() + inp.add_marginals() + inp.Marginals[0].dist_type = 'normal' + inp.Marginals[0].parameters = [0, 1] + expdes = ExpDesigns(inp) + expdes.n_init_samples = 2 + expdes.n_max_samples = 4 + expdes.X = np.array([[0], [1], [0.5]]) + expdes.Y = {'Z': [[0.4], [0.5], [0.45]]} + expdes.tradeoff_scheme = 'equal' + expdes.explore_method = 'latin-hypercube' + expdes.exploit_method = 'VarOptDesign' + expdes.util_func = 'ALM' + + mm = MetaModel(inp) + mm.fit(expdes.X, expdes.Y) + expdes.generate_ED(expdes.n_init_samples, max_pce_deg=np.max(mm.pce_deg)) + mod = PL() + engine = Engine(mm, mod, expdes) + engine.out_names = ['Z'] + x, nan = engine.choose_next_sample(var=expdes.util_func) + assert x.shape[0] == 1 and x.shape[1] == 1 + + +def test_choose_next_sample_latin_VarEIGF() -> None: + """ + Chooses new sample using all latin-hypercube, VarDesign (EIGF) + """ + inp = Input() + inp.add_marginals() + inp.Marginals[0].dist_type = 'normal' + inp.Marginals[0].parameters = [0, 1] + expdes = ExpDesigns(inp) + expdes.n_init_samples = 2 + expdes.n_max_samples = 4 + expdes.X = np.array([[0], [1], [0.5]]) + expdes.Y = {'Z': [[0.4], [0.5], [0.45]]} + expdes.tradeoff_scheme = 'equal' + expdes.explore_method = 'latin-hypercube' + expdes.exploit_method = 'VarOptDesign' + expdes.util_func = 'EIGF' + + mm = MetaModel(inp) + mm.fit(expdes.X, expdes.Y) + expdes.generate_ED(expdes.n_init_samples, max_pce_deg=np.max(mm.pce_deg)) + mod = PL() + engine = Engine(mm, mod, expdes) + engine.out_names = ['Z'] + x, nan = engine.choose_next_sample(var=expdes.util_func) + assert x.shape[0] == 1 and x.shape[1] == 1 + + +def test_choose_next_sample_latin_VarLOO() -> None: + """ + Chooses new sample using all latin-hypercube, VarDesign (LOOCV) + """ + inp = Input() + inp.add_marginals() + inp.Marginals[0].dist_type = 'normal' + inp.Marginals[0].parameters = [0, 1] + expdes = ExpDesigns(inp) + expdes.n_init_samples = 2 + expdes.n_max_samples = 4 + expdes.X = np.array([[0], [1], [0.5]]) + expdes.Y = {'Z': [[0.4], [0.5], [0.45]]} + expdes.tradeoff_scheme = 'equal' + expdes.explore_method = 'latin-hypercube' + expdes.exploit_method = 'VarOptDesign' + expdes.util_func = 'LOOCV' + + mm = MetaModel(inp) + mm.fit(expdes.X, expdes.Y) + expdes.generate_ED(expdes.n_init_samples, max_pce_deg=np.max(mm.pce_deg)) + mod = PL() + engine = Engine(mm, mod, expdes) + engine.out_names = ['Z'] + x, nan = engine.choose_next_sample(var=expdes.util_func) + assert x.shape[0] == 1 and x.shape[1] == 1 + + +def test_choose_next_sample_latin_BODMI() -> None: + """ + Chooses new sample using all latin-hypercube, BayesOptDesign (MI) + """ + inp = Input() + inp.add_marginals() + inp.Marginals[0].dist_type = 'normal' + inp.Marginals[0].parameters = [0, 1] + expdes = ExpDesigns(inp) + expdes.n_init_samples = 2 + expdes.n_max_samples = 4 + expdes.X = np.array([[0], [1], [0.5]]) + expdes.Y = {'Z': [[0.4], [0.5], [0.45]]} + expdes.tradeoff_scheme = 'equal' + expdes.explore_method = 'latin-hypercube' + expdes.exploit_method = 'BayesOptDesign' + expdes.util_func = 'MI' + mm = MetaModel(inp) + mm.fit(expdes.X, expdes.Y) + expdes.generate_ED(expdes.n_init_samples, max_pce_deg=np.max(mm.pce_deg)) + mod = PL() + engine = Engine(mm, mod, expdes) + engine.out_names = ['Z'] + engine.observations = {'Z': np.array([0.45])} + # engine.choose_next_sample(sigma2=None, n_candidates=5, var='DKL') + sigma2Dict = {'Z': np.array([0.05])} + sigma2Dict = pd.DataFrame(sigma2Dict, columns=['Z']) + engine.choose_next_sample(sigma2=sigma2Dict, var=expdes.util_func) + + +def test_choose_next_sample_latin_BODALC() -> None: + """ + Chooses new sample using all latin-hypercube, BayesOptDesign (ALC) + """ + inp = Input() + inp.add_marginals() + inp.Marginals[0].dist_type = 'normal' + inp.Marginals[0].parameters = [0, 1] + expdes = ExpDesigns(inp) + expdes.n_init_samples = 2 + expdes.n_max_samples = 4 + expdes.X = np.array([[0], [1], [0.5]]) + expdes.Y = {'Z': [[0.4], [0.5], [0.45]]} + expdes.tradeoff_scheme = 'equal' + expdes.explore_method = 'latin-hypercube' + expdes.exploit_method = 'BayesOptDesign' + expdes.util_func = 'ALC' + mm = MetaModel(inp) + mm.fit(expdes.X, expdes.Y) + expdes.generate_ED(expdes.n_init_samples, max_pce_deg=np.max(mm.pce_deg)) + mod = PL() + engine = Engine(mm, mod, expdes) + engine.out_names = ['Z'] + engine.observations = {'Z': np.array([0.45])} + # engine.choose_next_sample(sigma2=None, n_candidates=5, var='DKL') + sigma2Dict = {'Z': np.array([0.05])} + sigma2Dict = pd.DataFrame(sigma2Dict, columns=['Z']) + engine.choose_next_sample(sigma2=sigma2Dict, var=expdes.util_func) + + +def test_choose_next_sample_latin_BODDKL() -> None: + """ + Chooses new sample using all latin-hypercube, BayesOptDesign (DKL) + """ + inp = Input() + inp.add_marginals() + inp.Marginals[0].dist_type = 'normal' + inp.Marginals[0].parameters = [0, 1] + expdes = ExpDesigns(inp) + expdes.n_init_samples = 2 + expdes.n_max_samples = 4 + expdes.X = np.array([[0], [1], [0.5]]) + expdes.Y = {'Z': [[0.4], [0.5], [0.45]]} + expdes.tradeoff_scheme = 'equal' + expdes.explore_method = 'latin-hypercube' + expdes.exploit_method = 'BayesOptDesign' + expdes.util_func = 'DKL' + mm = MetaModel(inp) + mm.fit(expdes.X, expdes.Y) + expdes.generate_ED(expdes.n_init_samples, max_pce_deg=np.max(mm.pce_deg)) + mod = PL() + engine = Engine(mm, mod, expdes) + engine.out_names = ['Z'] + engine.observations = {'Z': np.array([0.45])} + # engine.choose_next_sample(sigma2=None, n_candidates=5, var='DKL') + sigma2Dict = {'Z': np.array([0.05])} + sigma2Dict = pd.DataFrame(sigma2Dict, columns=['Z']) + engine.choose_next_sample(sigma2=sigma2Dict, var=expdes.util_func) + + +def test_choose_next_sample_latin_BODDPP() -> None: + """ + Chooses new sample using all latin-hypercube, BayesOptDesign (DPP) + """ + inp = Input() + inp.add_marginals() + inp.Marginals[0].dist_type = 'normal' + inp.Marginals[0].parameters = [0, 1] + expdes = ExpDesigns(inp) + expdes.n_init_samples = 2 + expdes.n_max_samples = 4 + expdes.X = np.array([[0], [1], [0.5]]) + expdes.Y = {'Z': [[0.4], [0.5], [0.45]]} + expdes.tradeoff_scheme = 'equal' + expdes.explore_method = 'latin-hypercube' + expdes.exploit_method = 'BayesOptDesign' + expdes.util_func = 'DPP' + mm = MetaModel(inp) + mm.fit(expdes.X, expdes.Y) + expdes.generate_ED(expdes.n_init_samples, max_pce_deg=np.max(mm.pce_deg)) + mod = PL() + engine = Engine(mm, mod, expdes) + engine.out_names = ['Z'] + engine.observations = {'Z': np.array([0.45])} + # engine.choose_next_sample(sigma2=None, n_candidates=5, var='DKL') + sigma2Dict = {'Z': np.array([0.05])} + sigma2Dict = pd.DataFrame(sigma2Dict, columns=['Z']) + engine.choose_next_sample(sigma2=sigma2Dict, var=expdes.util_func) + + +def test_choose_next_sample_latin_BODAPP() -> None: + """ + Chooses new sample using all latin-hypercube, BayesOptDesign (APP) + """ + inp = Input() + inp.add_marginals() + inp.Marginals[0].dist_type = 'normal' + inp.Marginals[0].parameters = [0, 1] + expdes = ExpDesigns(inp) + expdes.n_init_samples = 2 + expdes.n_max_samples = 4 + expdes.X = np.array([[0], [1], [0.5]]) + expdes.Y = {'Z': [[0.4], [0.5], [0.45]]} + expdes.tradeoff_scheme = 'equal' + expdes.explore_method = 'latin-hypercube' + expdes.exploit_method = 'BayesOptDesign' + expdes.util_func = 'APP' + mm = MetaModel(inp) + mm.fit(expdes.X, expdes.Y) + expdes.generate_ED(expdes.n_init_samples, max_pce_deg=np.max(mm.pce_deg)) + mod = PL() + engine = Engine(mm, mod, expdes) + engine.out_names = ['Z'] + engine.observations = {'Z': np.array([0.45])} + # engine.choose_next_sample(sigma2=None, n_candidates=5, var='DKL') + sigma2Dict = {'Z': np.array([0.05])} + sigma2Dict = pd.DataFrame(sigma2Dict, columns=['Z']) + engine.choose_next_sample(sigma2=sigma2Dict, var=expdes.util_func) + + +def test_choose_next_sample_latin_BODMI_() -> None: + """ + Chooses new sample using all latin-hypercube, BayesOptDesign (MI) + """ + inp = Input() + inp.add_marginals() + inp.Marginals[0].dist_type = 'normal' + inp.Marginals[0].parameters = [0, 1] + expdes = ExpDesigns(inp) + expdes.n_init_samples = 2 + expdes.n_max_samples = 4 + expdes.X = np.array([[0], [1], [0.5]]) + expdes.Y = {'Z': [[0.4], [0.5], [0.45]]} + expdes.tradeoff_scheme = 'equal' + expdes.explore_method = 'latin-hypercube' + expdes.exploit_method = 'BayesOptDesign' + expdes.util_func = 'MI' + mm = MetaModel(inp) + mm.fit(expdes.X, expdes.Y) + expdes.generate_ED(expdes.n_init_samples, max_pce_deg=np.max(mm.pce_deg)) + mod = PL() + engine = Engine(mm, mod, expdes) + engine.out_names = ['Z'] + engine.observations = {'Z': np.array([0.45])} + # engine.choose_next_sample(sigma2=None, n_candidates=5, var='DKL') + sigma2Dict = {'Z': np.array([0.05])} + sigma2Dict = pd.DataFrame(sigma2Dict, columns=['Z']) + engine.choose_next_sample(sigma2=sigma2Dict, var=expdes.util_func) + + +def test_choose_next_sample_latin_BADBME() -> None: + """ + Chooses new sample using all latin-hypercube, BayesActDesign (BME) + """ + inp = Input() + inp.add_marginals() + inp.Marginals[0].dist_type = 'normal' + inp.Marginals[0].parameters = [0, 1] + expdes = ExpDesigns(inp) + expdes.n_init_samples = 2 + expdes.n_max_samples = 4 + expdes.X = np.array([[0], [1], [0.5]]) + expdes.Y = {'Z': [[0.4], [0.5], [0.45]]} + expdes.tradeoff_scheme = 'equal' + expdes.explore_method = 'latin-hypercube' + expdes.exploit_method = 'BayesActDesign' + expdes.util_func = 'BME' + mm = MetaModel(inp) + mm.fit(expdes.X, expdes.Y) + expdes.generate_ED(expdes.n_init_samples, max_pce_deg=np.max(mm.pce_deg)) + mod = PL() + engine = Engine(mm, mod, expdes) + engine.out_names = ['Z'] + engine.observations = {'Z': np.array([0.45])} + # engine.choose_next_sample(sigma2=None, n_candidates=5, var='DKL') + sigma2Dict = {'Z': np.array([0.05])} + sigma2Dict = pd.DataFrame(sigma2Dict, columns=['Z']) + engine.n_obs = 1 + engine.choose_next_sample(sigma2=sigma2Dict, var=expdes.util_func) + + +def test_choose_next_sample_latin_BADDKL() -> None: + """ + Chooses new sample using all latin-hypercube, BayesActDesign (DKL) + """ + inp = Input() + inp.add_marginals() + inp.Marginals[0].dist_type = 'normal' + inp.Marginals[0].parameters = [0, 1] + expdes = ExpDesigns(inp) + expdes.n_init_samples = 2 + expdes.n_max_samples = 4 + expdes.X = np.array([[0], [1], [0.5]]) + expdes.Y = {'Z': [[0.4], [0.5], [0.45]]} + expdes.tradeoff_scheme = 'equal' + expdes.explore_method = 'latin-hypercube' + expdes.exploit_method = 'BayesActDesign' + expdes.util_func = 'DKL' + mm = MetaModel(inp) + mm.fit(expdes.X, expdes.Y) + expdes.generate_ED(expdes.n_init_samples, max_pce_deg=np.max(mm.pce_deg)) + mod = PL() + engine = Engine(mm, mod, expdes) + engine.out_names = ['Z'] + engine.observations = {'Z': np.array([0.45])} + # engine.choose_next_sample(sigma2=None, n_candidates=5, var='DKL') + sigma2Dict = {'Z': np.array([0.05])} + sigma2Dict = pd.DataFrame(sigma2Dict, columns=['Z']) + engine.n_obs = 1 + engine.choose_next_sample(sigma2=sigma2Dict, var=expdes.util_func) + + +def test_choose_next_sample_latin_BADinfEntropy() -> None: + """ + Chooses new sample using all latin-hypercube, BayesActDesign (infEntropy) + """ + inp = Input() + inp.add_marginals() + inp.Marginals[0].dist_type = 'normal' + inp.Marginals[0].parameters = [0, 1] + expdes = ExpDesigns(inp) + expdes.n_init_samples = 2 + expdes.n_max_samples = 4 + expdes.X = np.array([[0], [1], [0.5]]) + expdes.Y = {'Z': [[0.4], [0.5], [0.45]]} + expdes.tradeoff_scheme = 'equal' + expdes.explore_method = 'latin-hypercube' + expdes.exploit_method = 'BayesActDesign' + expdes.util_func = 'infEntropy' + mm = MetaModel(inp) + mm.fit(expdes.X, expdes.Y) + expdes.generate_ED(expdes.n_init_samples, max_pce_deg=np.max(mm.pce_deg)) + mod = PL() + engine = Engine(mm, mod, expdes) + engine.out_names = ['Z'] + engine.observations = {'Z': np.array([0.45])} + # engine.choose_next_sample(sigma2=None, n_candidates=5, var='DKL') + sigma2Dict = {'Z': np.array([0.05])} + sigma2Dict = pd.DataFrame(sigma2Dict, columns=['Z']) + engine.n_obs = 1 + engine.choose_next_sample(sigma2=sigma2Dict, var=expdes.util_func) diff --git a/tests/test_ExpDesign.py b/tests/test_ExpDesign.py new file mode 100644 index 0000000000000000000000000000000000000000..68255b3380881a8182ecd5a3de7411842fcedebd --- /dev/null +++ b/tests/test_ExpDesign.py @@ -0,0 +1,397 @@ +# -*- coding: utf-8 -*- +""" +Test the ExpDesigns class in bayesvalidrox. +Tests are available for the following functions: + _check_ranges - x + fit_dist - x + +Class ExpDesigns: + generate_samples + generate_ED + read_from_file + random_sampler + pcm_sampler +Other function tests to be found in parent class 'InputSpace' + +""" +import sys +sys.path.append("src/") +import pytest +import numpy as np + +from bayesvalidrox.surrogate_models.inputs import Input +import bayesvalidrox.surrogate_models.exp_designs as exp +from bayesvalidrox.surrogate_models.exp_designs import ExpDesigns + +#%% Test check_ranges + +def test_check_ranges() -> None: + """ + Check to see if theta lies in expected ranges + """ + theta = [0.5,1.2] + ranges = [[0,1],[1,2]] + assert exp.check_ranges(theta, ranges) == True + +def test_check_ranges_inv() -> None: + """ + Check to see if theta lies not in expected ranges + """ + theta = [1.5,1.2] + ranges = [[0,1],[1,2]] + assert exp.check_ranges(theta, ranges) == False + +#%% Test ExpDesign.pcm_sampler + +def test_pcm_sampler_noinit() -> None: + """ + Sample via pcm without init_param_space + """ + x = np.random.uniform(0,1,1000) + inp = Input() + inp.add_marginals() + inp.Marginals[0].input_data = x + exp = ExpDesigns(inp) + exp.pcm_sampler(4,2) + +def test_pcm_sampler_lowdeg() -> None: + """ + Sample via pcm with init_param_space and small max_deg + """ + x = np.random.uniform(0,1,1000) + inp = Input() + inp.add_marginals() + inp.Marginals[0].input_data = x + exp = ExpDesigns(inp) + exp.init_param_space() + exp.pcm_sampler(4,2) + +def test_pcm_sampler_highdeg() -> None: + """ + Sample via pcm with init_param_space and high max_deg + """ + x = np.random.uniform(0,1,1000) + inp = Input() + inp.add_marginals() + inp.Marginals[0].input_data = x + exp = ExpDesigns(inp) + exp.init_param_space() + exp.pcm_sampler(4,4) + +def test_pcm_sampler_lscm() -> None: + """ + Sample via pcm with init_param_space and samplin gmethod 'lscm' + """ + x = np.random.uniform(0,1,1000) + inp = Input() + inp.add_marginals() + inp.Marginals[0].input_data = x + exp = ExpDesigns(inp) + exp.init_param_space() + exp.sampling_method = 'lscm' + exp.pcm_sampler(4,4) + +def test_pcm_sampler_rawdata() -> None: + """ + Sample via pcm, init_param_space implicitly, has raw data + """ + x = np.random.uniform(0,1,1000) + inp = Input() + inp.add_marginals() + inp.Marginals[0].input_data = x + exp = ExpDesigns(inp) + exp.raw_data = np.random.uniform(0,1,1000) + with pytest.raises(AttributeError) as excinfo: + exp.pcm_sampler(4,4) + assert str(excinfo.value) == 'Data should be a 1D array' + +def test_pcm_sampler_rawdata_1d() -> None: + """ + Sample via pcm, init_param_space implicitly, has raw data + """ + x = np.random.uniform(0,1,(1,1000)) + inp = Input() + inp.add_marginals() + inp.Marginals[0].input_data = x + exp = ExpDesigns(inp) + exp.raw_data = np.random.uniform(0,1,1000) + exp.pcm_sampler(4,4) + + +#%% Test ExpDesign.random_sampler + +def test_random_sampler() -> None: + """ + Sample randomly, init_param_space implicitly + """ + x = np.random.uniform(0,1,1000) + inp = Input() + inp.add_marginals() + inp.Marginals[0].input_data = x + exp = ExpDesigns(inp) + exp.random_sampler(4) + +def test_random_sampler_largedatanoJDist() -> None: + """ + Sample randomly, init_param_space implicitly, more samples wanted than given, no JDist available + """ + x = np.random.uniform(0,1,1000) + inp = Input() + inp.add_marginals() + inp.Marginals[0].input_data = x + exp = ExpDesigns(inp) + with pytest.raises(AttributeError) as excinfo: + exp.random_sampler(100000) + assert str(excinfo.value) == 'Sampling cannot proceed, build ExpDesign with max_deg != 0 to create JDist!' + +def test_random_sampler_largedataJDist0() -> None: + """ + Sample randomly, init_param_space implicitly, more samples wanted than given, + JDist available, priors given via samples + """ + x = np.random.uniform(0,1,1000) + inp = Input() + inp.add_marginals() + inp.Marginals[0].input_data = x + exp = ExpDesigns(inp) + exp.init_param_space(max_deg = 1) + exp.random_sampler(100000) + +def test_random_sampler_largedataJDist1() -> None: + """ + Sample randomly, init_param_space implicitly, more samples wanted than given, + JDist available, prior distributions given + """ + inp = Input() + inp.add_marginals() + inp.Marginals[0].dist_type = 'normal' + inp.Marginals[0].parameters = [0,1] + exp = ExpDesigns(inp) + exp.init_param_space(max_deg = 1) + exp.random_sampler(100000) + + + +def test_random_sampler_rawdata() -> None: + """ + Sample randomly, init_param_space implicitly, has 2d raw data + """ + x = np.random.uniform(0,1,1000) + inp = Input() + inp.add_marginals() + inp.Marginals[0].input_data = x + exp = ExpDesigns(inp) + exp.raw_data = np.random.uniform(0,1,(1,1000)) + exp.random_sampler(4) + +def test_random_sampler_rawdata1d() -> None: + """ + Sample randomly, init_param_space implicitly, has raw data, but only 1d + """ + x = np.random.uniform(0,1,1000) + inp = Input() + inp.add_marginals() + inp.Marginals[0].input_data = x + exp = ExpDesigns(inp) + exp.raw_data = np.random.uniform(0,1,1000) + with pytest.raises(AttributeError) as excinfo: + exp.random_sampler(4) + assert str(excinfo.value) == 'The given raw data for sampling should have two dimensions' + + +def test_random_sampler_fewdata() -> None: + """ + Sample randomly, init_param_space implicitly, has few 2d raw datapoints + """ + x = np.random.uniform(0,1,5) + inp = Input() + inp.add_marginals() + inp.Marginals[0].input_data = x + exp = ExpDesigns(inp) + exp.raw_data = np.random.uniform(0,1,(1,1000)) + exp.random_sampler(7) + + +#%% Test ExpDesign.generate_samples + +def test_generate_samples() -> None: + """ + Generate samples according to chosen scheme + """ + x = np.random.uniform(0,1,1000) + inp = Input() + inp.add_marginals() + inp.Marginals[0].input_data = x + exp = ExpDesigns(inp) + exp.generate_samples(4) + + +#%% Test ExpDesign.generate_ED + +def test_generate_ED() -> None: + """ + Generate ED as is + """ + x = np.random.uniform(0,1,1000) + inp = Input() + inp.add_marginals() + inp.Marginals[0].input_data = x + exp = ExpDesigns(inp) + exp.generate_ED(4) + +def test_generate_ED_negsamplenum(): + """ + Generate ED for neg number of samples + """ + x = np.random.uniform(0,1,1000) + inp = Input() + inp.add_marginals() + inp.Marginals[0].input_data = x + exp = ExpDesigns(inp, sampling_method = 'user') + with pytest.raises(ValueError) as excinfo: + exp.generate_ED(-1) + assert str(excinfo.value) == 'A negative number of samples cannot be created. Please provide positive n_samples' + + + +def test_generate_ED_usernoX() -> None: + """ + User-defined ED without samples + """ + x = np.random.uniform(0,1,1000) + inp = Input() + inp.add_marginals() + inp.Marginals[0].input_data = x + exp = ExpDesigns(inp, sampling_method = 'user') + with pytest.raises(AttributeError) as excinfo: + exp.generate_ED(4) + assert str(excinfo.value) == 'User-defined sampling cannot proceed as no samples provided. Please add them to this class as attribute X' + +def test_generate_ED_userXdimerr() -> None: + """ + User-defined ED with wrong shape of samples + """ + x = np.random.uniform(0,1,1000) + X = np.random.uniform(0,1,(2,1,1000)) + inp = Input() + inp.add_marginals() + inp.Marginals[0].input_data = x + exp = ExpDesigns(inp, sampling_method = 'user') + exp.X = X + with pytest.raises(AttributeError) as excinfo: + exp.generate_ED(4) + assert str(excinfo.value) == 'The provided samples shuld have 2 dimensions' + +# TODO: this does not give any issues??? +def test_generate_ED_userX() -> None: + """ + User-defined ED with wrong shape of samples + """ + x = np.random.uniform(0,1,1000) + X = np.random.uniform(0,1,(3,1000)) + inp = Input() + inp.add_marginals() + inp.Marginals[0].input_data = x + exp = ExpDesigns(inp, sampling_method = 'user') + exp.X = X + exp.generate_ED(4) + +# TODO: this looks like a pcm-sampler issue +def test_generate_ED_PCM() -> None: + """ + PCM-defined ED + """ + x = np.random.uniform(0,1,1000) + inp = Input() + inp.add_marginals() + inp.Marginals[0].input_data = x + exp = ExpDesigns(inp, sampling_method = 'PCM') + exp.generate_ED(4) + +def test_generate_ED_random() -> None: + """ + Random-defined ED + """ + x = np.random.uniform(0,1,1000) + inp = Input() + inp.add_marginals() + inp.Marginals[0].input_data = x + exp = ExpDesigns(inp, sampling_method = 'random') + exp.generate_ED(4) + +def test_generate_ED_usertrafo() -> None: + """ + User-defined ED + """ + x = np.random.uniform(0,1,1000) + X = np.random.uniform(0,1,(1,1000)) + inp = Input() + inp.add_marginals() + inp.Marginals[0].input_data = x + exp = ExpDesigns(inp, sampling_method = 'user') + exp.meta_Model_type = 'gpe' + exp.X = X + exp.generate_ED(4) + +def test_generate_ED_randomtrafo() -> None: + """ + User-defined ED + """ + x = np.random.uniform(0,1,1000) + inp = Input() + inp.add_marginals() + inp.Marginals[0].input_data = x + exp = ExpDesigns(inp, sampling_method = 'random') + exp.generate_ED(4) + +def test_generate_ED_latin() -> None: + """ + latin-hypercube-defined ED + """ + x = np.random.uniform(0,1,1000) + inp = Input() + inp.add_marginals() + inp.Marginals[0].input_data = x + exp = ExpDesigns(inp, sampling_method = 'latin-hypercube') + exp.generate_ED(4) + +#%% Test ExpDesign.read_from_file + +def test_read_from_file_nofile(): + """ + No file given to read in + """ + x = np.random.uniform(0,1,1000) + inp = Input() + inp.add_marginals() + inp.Marginals[0].input_data = x + exp = ExpDesigns(inp, sampling_method = 'user') + with pytest.raises(AttributeError) as excinfo: + exp.read_from_file(['Out']) + assert str(excinfo.value) == 'ExpDesign cannot be read in, please provide hdf5 file first' + +def test_read_from_file_wrongcomp(): + """ + Correct file, incorrect output name + """ + x = np.random.uniform(0,1,1000) + inp = Input() + inp.add_marginals() + inp.Marginals[0].input_data = x + exp = ExpDesigns(inp, sampling_method = 'user') + exp.hdf5_file = 'ExpDesign_testfile.hdf5' + with pytest.raises(KeyError) as excinfo: + exp.read_from_file(['Out']) + assert str(excinfo.value) == "'Unable to open object (component not found)'" + +def test_read_from_file(): + """ + Read from testfile + """ + x = np.random.uniform(0,1,1000) + inp = Input() + inp.add_marginals() + inp.Marginals[0].input_data = x + exp = ExpDesigns(inp, sampling_method = 'user') + exp.hdf5_file = 'ExpDesign_testfile.hdf5' + exp.read_from_file(['Z']) diff --git a/tests/test_Input.py b/tests/test_Input.py new file mode 100644 index 0000000000000000000000000000000000000000..41c0e5ab84a5178b1934504bc63b5d5c03d19078 --- /dev/null +++ b/tests/test_Input.py @@ -0,0 +1,25 @@ +# -*- coding: utf-8 -*- +""" +Test the Input and associated Marginal classes in bayesvalidrox. +Tests are available for the following functions +Class Marginal contains no functions - no tests to write. +Class Input: + add_marginals + +@author: Rebecca Kohlhaas +""" +import sys + +from bayesvalidrox.surrogate_models.inputs import Input + +sys.path.append("src/") + + +def test_addmarginals() -> None: + """ + Tests function 'Input.add_marginals()' + Ensure that marginals get appended + """ + inp = Input() + inp.add_marginals() + assert len(inp.Marginals) == 1 diff --git a/tests/test_InputSpace.py b/tests/test_InputSpace.py new file mode 100644 index 0000000000000000000000000000000000000000..ae31f8e90d051e39dd67c2e55f900a3eb0e11958 --- /dev/null +++ b/tests/test_InputSpace.py @@ -0,0 +1,610 @@ +# -*- coding: utf-8 -*- +""" +Test the InputSpace class in bayesvalidrox. +Tests are available for the following functions +Class InputSpace: + check_valid_inputs - x + init_param_space - x + build_polytypes - x + transform - x + +""" +import sys +import pytest +import numpy as np + +from bayesvalidrox.surrogate_models.inputs import Input +from bayesvalidrox.surrogate_models.input_space import InputSpace + +sys.path.append("src/") +sys.path.append("../src/") + + +#%% Test ExpDesign.check_valid_input + +def test_check_valid_input_hasmarg() -> None: + """ + Distribution not built if no marginals set + """ + inp = Input() + with pytest.raises(AssertionError) as excinfo: + InputSpace(inp) + assert str(excinfo.value) == 'Cannot build distributions if no marginals are given' + + +def test_check_valid_input_haspriors() -> None: + """ + Distribution not built if no distribution set for the marginals + """ + inp = Input() + inp.add_marginals() + with pytest.raises(AssertionError) as excinfo: + InputSpace(inp) + assert str(excinfo.value) == 'Not all marginals were provided priors' + + +def test_check_valid_input_priorsmatch() -> None: + """ + Distribution not built if dist types do not align + """ + x = np.random.uniform(0, 1, 1000) + inp = Input() + inp.add_marginals() + inp.Marginals[0].input_data = x + inp.add_marginals() + inp.Marginals[1].dist_type = 'normal' + inp.Marginals[1].parameters = [0, 1] + with pytest.raises(AssertionError) as excinfo: + InputSpace(inp) + assert str(excinfo.value) == 'Distributions cannot be built as the priors have different types' + + +def test_check_valid_input_samples() -> None: + """ + Design built correctly - samples + """ + x = np.random.uniform(0, 1, 1000) + inp = Input() + inp.add_marginals() + inp.Marginals[0].input_data = x + inp.add_marginals() + inp.Marginals[1].input_data = x + 2 + InputSpace(inp) + + +def test_check_valid_input_both() -> None: + """ + Design no built - samples and dist type given + """ + x = np.random.uniform(0, 1, 1000) + inp = Input() + inp.add_marginals() + inp.Marginals[0].input_data = x + inp.Marginals[0].dist_type = 'normal' + with pytest.raises(AssertionError) as excinfo: + InputSpace(inp) + assert str(excinfo.value) == 'Both samples and distribution type are given. Please choose only one.' + + +# def test_check_valid_input_distnotok() -> None: +# """ +# Design built incorrectly - dist types without parameters +# """ +# inp = Input() +# inp.add_marginals() +# inp.Marginals[0].dist_type = 'normal' +# inp.add_marginals() +# inp.Marginals[1].dist_type = 'normal' +# with pytest.raises(AssertionError) as excinfo: +# exp = ExpDesigns(inp) +# assert str(excinfo.value) == 'Some distributions do not have characteristic values' + +def test_check_valid_input_distok() -> None: + """ + Design built correctly - dist types + """ + inp = Input() + inp.add_marginals() + inp.Marginals[0].dist_type = 'normal' + inp.Marginals[0].parameters = [0, 1] + inp.add_marginals() + inp.Marginals[1].dist_type = 'normal' + inp.Marginals[1].parameters = [0, 1] + InputSpace(inp) + + +def test_check_valid_input_noapc() -> None: + """ + Design built correctly - no apc + """ + inp = Input() + inp.add_marginals() + inp.Marginals[0].dist_type = 'normal' + inp.Marginals[0].parameters = [0, 1] + inp.add_marginals() + inp.Marginals[1].dist_type = 'normal' + inp.Marginals[1].parameters = [0, 1] + InputSpace(inp, meta_Model_type='gpe') + + +#%% Test ExpDesign.build_polytypes +def test_build_polytypes_normalerr() -> None: + """ + Build dist 'normal' - too few params + """ + inp = Input() + inp.add_marginals() + inp.Marginals[0].dist_type = 'normal' + inp.Marginals[0].parameters = [] + exp = InputSpace(inp) + with pytest.raises(AssertionError) as excinfo: + exp.build_polytypes(False) + assert str(excinfo.value) == 'Distribution has too few parameters!' + + +def test_build_polytypes_normal() -> None: + """ + Build dist 'normal' + """ + inp = Input() + inp.add_marginals() + inp.Marginals[0].dist_type = 'normal' + inp.Marginals[0].parameters = [0, 1] + exp = InputSpace(inp) + exp.build_polytypes(False) + + +def test_build_polytypes_uniferr() -> None: + """ + Build dist 'unif' - too few params + """ + inp = Input() + inp.add_marginals() + inp.Marginals[0].dist_type = 'unif' + inp.Marginals[0].parameters = [] + exp = InputSpace(inp) + with pytest.raises(AssertionError) as excinfo: + exp.build_polytypes(False) + assert str(excinfo.value) == 'Distribution has too few parameters!' + + +def test_build_polytypes_unif() -> None: + """ + Build dist 'unif' + """ + inp = Input() + inp.add_marginals() + inp.Marginals[0].dist_type = 'unif' + inp.Marginals[0].parameters = [0, 1] + exp = InputSpace(inp) + exp.build_polytypes(False) + + +def test_build_polytypes_gammaerr() -> None: + """ + Build dist 'gamma' - too few params + """ + inp = Input() + inp.add_marginals() + inp.Marginals[0].dist_type = 'gamma' + inp.Marginals[0].parameters = [] + exp = InputSpace(inp) + with pytest.raises(AssertionError) as excinfo: + exp.build_polytypes(False) + assert str(excinfo.value) == 'Distribution has too few parameters!' + + +# noinspection SpellCheckingInspection +def test_build_polytypes_gamma() -> None: + """ + Build dist 'gamma' + """ + inp = Input() + inp.add_marginals() + inp.Marginals[0].dist_type = 'gamma' + inp.Marginals[0].parameters = [0, 1, 0] + exp = InputSpace(inp) + with pytest.raises(ValueError) as excinfo: + exp.build_polytypes(False) + assert str(excinfo.value) == 'Parameter values are not valid, please set differently' + + +# noinspection SpellCheckingInspection +def test_build_polytypes_betaerr() -> None: + """ + Build dist 'beta' - too few params + """ + inp = Input() + inp.add_marginals() + inp.Marginals[0].dist_type = 'beta' + inp.Marginals[0].parameters = [] + exp = InputSpace(inp) + with pytest.raises(AssertionError) as excinfo: + exp.build_polytypes(False) + assert str(excinfo.value) == 'Distribution has too few parameters!' + + +def test_build_polytypes_beta() -> None: + """ + Build dist 'beta' + """ + inp = Input() + inp.add_marginals() + inp.Marginals[0].dist_type = 'beta' + inp.Marginals[0].parameters = [0.5, 1, 2, 3] + exp = InputSpace(inp) + exp.build_polytypes(False) + + +# noinspection SpellCheckingInspection +def test_build_polytypes_lognormerr() -> None: + """ + Build dist 'lognorm' - too few params + """ + inp = Input() + inp.add_marginals() + inp.Marginals[0].dist_type = 'lognorm' + inp.Marginals[0].parameters = [] + exp = InputSpace(inp) + with pytest.raises(AssertionError) as excinfo: + exp.build_polytypes(False) + assert str(excinfo.value) == 'Distribution has too few parameters!' + + +def test_build_polytypes_lognorm() -> None: + """ + Build dist 'lognorm' + """ + inp = Input() + inp.add_marginals() + inp.Marginals[0].dist_type = 'lognorm' + inp.Marginals[0].parameters = [0.5, 1, 2, 3] + exp = InputSpace(inp) + exp.build_polytypes(False) + + +def test_build_polytypes_exponerr() -> None: + """ + Build dist 'expon' - too few params + """ + inp = Input() + inp.add_marginals() + inp.Marginals[0].dist_type = 'beta' + inp.Marginals[0].parameters = [] + exp = InputSpace(inp) + with pytest.raises(AssertionError) as excinfo: + exp.build_polytypes(False) + assert str(excinfo.value) == 'Distribution has too few parameters!' + + +def test_build_polytypes_expon() -> None: + """ + Build dist 'expon' + """ + inp = Input() + inp.add_marginals() + inp.Marginals[0].dist_type = 'expon' + inp.Marginals[0].parameters = [0.5, 1, 2, 3] + exp = InputSpace(inp) + exp.build_polytypes(False) + + +def test_build_polytypes_weibullerr() -> None: + """ + Build dist 'weibull' - too few params + """ + inp = Input() + inp.add_marginals() + inp.Marginals[0].dist_type = 'weibull' + inp.Marginals[0].parameters = [] + exp = InputSpace(inp) + with pytest.raises(AssertionError) as excinfo: + exp.build_polytypes(False) + assert str(excinfo.value) == 'Distribution has too few parameters!' + + +def test_build_polytypes_weibull() -> None: + """ + Build dist 'weibull' + """ + inp = Input() + inp.add_marginals() + inp.Marginals[0].dist_type = 'weibull' + inp.Marginals[0].parameters = [0.5, 1, 2, 3] + exp = InputSpace(inp) + exp.build_polytypes(False) + + +def test_build_polytypes_arbitrary() -> None: + """ + Build poly 'arbitrary' + """ + x = np.random.uniform(0, 1, 1000) + inp = Input() + inp.add_marginals() + inp.Marginals[0].input_data = x + exp = InputSpace(inp) + exp.build_polytypes(False) + + +def test_build_polytypes_rosenblatt() -> None: + """ + Build dist with rosenblatt + """ + x = np.random.uniform(0, 1, 1000) + inp = Input() + inp.add_marginals() + inp.Marginals[0].input_data = x + exp = InputSpace(inp) + exp.build_polytypes(True) + + +def test_build_polytypes_samples() -> None: + """ + Build dist from samples + """ + x = np.random.uniform(0, 1, 1000) + inp = Input() + inp.add_marginals() + inp.Marginals[0].input_data = x + exp = InputSpace(inp) + exp.build_polytypes(False) + + +def test_build_polytypes_samples2d() -> None: + """ + Build dist from samples - samples too high dim + """ + x = np.random.uniform(0, 1, (2, 1000)) + inp = Input() + inp.add_marginals() + inp.Marginals[0].input_data = x + exp = InputSpace(inp) + with pytest.raises(ValueError) as excinfo: + exp.build_polytypes(False) + assert str(excinfo.value) == 'The samples provided to the Marginals should be 1D only' + + +#%% Test ExpDesign.init_param_space + +def test_init_param_space_nomaxdegsample() -> None: + """ + Init param space without max_deg for given samples + """ + x = np.random.uniform(0, 1, 1000) + inp = Input() + inp.add_marginals() + inp.Marginals[0].input_data = x + exp = InputSpace(inp) + exp.init_param_space() + + +def test_init_param_space_nomaxdegdist() -> None: + """ + Init param space without max_deg for given dist + """ + inp = Input() + inp.add_marginals() + inp.Marginals[0].dist_type = 'expon' + inp.Marginals[0].parameters = [0.5, 1, 2, 3] + exp = InputSpace(inp) + exp.init_param_space() + + +def test_init_param_space_maxdeg() -> None: + """ + Init param space with max_deg for given samples + """ + x = np.random.uniform(0, 1, 1000) + inp = Input() + inp.add_marginals() + inp.Marginals[0].input_data = x + exp = InputSpace(inp) + exp.init_param_space(max_deg=2) + + +def test_init_param_space_maxdegdist() -> None: + """ + Init param space with max_deg for given dist (not uniform) + """ + inp = Input() + inp.add_marginals() + inp.Marginals[0].dist_type = 'expon' + inp.Marginals[0].parameters = [0.5, 1, 2, 3] + exp = InputSpace(inp) + exp.init_param_space(max_deg=2) + + +def test_init_param_space_maxdegdistunif() -> None: + """ + Init param space with max_deg for given dist (uniform) + """ + inp = Input() + inp.add_marginals() + inp.Marginals[0].dist_type = 'unif' + inp.Marginals[0].parameters = [0.5, 1, 2, 3] + exp = InputSpace(inp) + exp.init_param_space(max_deg=2) + + +#%% Test ExpDesign.transform + +def test_transform_noparamspace() -> None: + """ + Call transform without a built JDist + """ + x = np.random.uniform(0, 1, 1000) + y = np.random.uniform(0, 1, (2, 1000)) + inp = Input() + inp.add_marginals() + inp.Marginals[0].input_data = x + exp = InputSpace(inp) + with pytest.raises(AttributeError) as excinfo: + exp.transform(y) + assert str(excinfo.value) == 'Call function init_param_space first to create JDist' + + +def test_transform_dimerrlow() -> None: + """ + Call transform with too few dimensions + """ + x = np.random.uniform(0, 1, 1000) + inp = Input() + inp.add_marginals() + inp.Marginals[0].input_data = x + exp = InputSpace(inp) + exp.init_param_space(max_deg=2) + with pytest.raises(AttributeError) as excinfo: + exp.transform(x) + assert str(excinfo.value) == 'X should have two dimensions' + + +def test_transform_dimerrhigh() -> None: + """ + Call transform with too many dimensions + """ + x = np.random.uniform(0, 1, 1000) + y = np.random.uniform(0, 1, (1, 1, 1000)) + inp = Input() + inp.add_marginals() + inp.Marginals[0].input_data = x + exp = InputSpace(inp) + exp.init_param_space(max_deg=2) + with pytest.raises(AttributeError) as excinfo: + exp.transform(y) + assert str(excinfo.value) == 'X should have two dimensions' + + +def test_transform_dimerr0() -> None: + """ + Call transform with wrong X.shape[0] + """ + x = np.random.uniform(0, 1, 1000) + y = np.random.uniform(0, 1, (2, 1000)) + inp = Input() + inp.add_marginals() + inp.Marginals[0].input_data = x + exp = InputSpace(inp) + exp.init_param_space(max_deg=2) + with pytest.raises(AttributeError) as excinfo: + exp.transform(y) + assert str( + excinfo.value) == 'The second dimension of X should be the same size as the number of marginals in the InputObj' + + +def test_transform_paramspace() -> None: + """ + Transform successfully + """ + x = np.random.uniform(0, 1, 1000) + y = np.random.uniform(0, 1, (1000, 1)) + inp = Input() + inp.add_marginals() + inp.Marginals[0].input_data = x + exp = InputSpace(inp) + exp.init_param_space(max_deg=2) + exp.transform(y) + + +def test_transform_rosenblatt() -> None: + """ + Transform with rosenblatt + """ + x = np.random.uniform(0, 1, 1000) + y = np.random.uniform(0, 1, (1000, 1)) + inp = Input() + inp.Rosenblatt = True + inp.add_marginals() + inp.Marginals[0].input_data = x + exp = InputSpace(inp) + exp.init_param_space(max_deg=2) + exp.transform(y) + + +def test_transform_user() -> None: + """ + Transform with method 'user' + """ + x = np.random.uniform(0, 1, 1000) + y = np.random.uniform(0, 1, (1000, 1)) + inp = Input() + inp.add_marginals() + inp.Marginals[0].input_data = x + exp = InputSpace(inp) + exp.init_param_space(max_deg=2) + exp.transform(y, method='user') + + +# noinspection SpellCheckingInspection +def test_transform_rosenblattuser() -> None: + """ + Transform with rosenblatt and method 'user' + """ + x = np.random.uniform(0, 1, 1000) + y = np.random.uniform(0, 1, (1000, 1)) + inp = Input() + inp.Rosenblatt = True + inp.add_marginals() + inp.Marginals[0].input_data = x + exp = InputSpace(inp) + exp.init_param_space(max_deg=2) + exp.transform(y, method='user') + + +def test_transform_uniform() -> None: + """ + Transform uniform dist + """ + y = np.random.uniform(0, 1, (1000, 1)) + inp = Input() + inp.add_marginals() + inp.Marginals[0].dist_type = 'unif' + inp.Marginals[0].parameters = [0, 1] + exp = InputSpace(inp) + exp.init_param_space(max_deg=2) + exp.transform(y) + + +def test_transform_norm() -> None: + """ + Transform normal dist + """ + y = np.random.uniform(0, 1, (1000, 1)) + inp = Input() + inp.add_marginals() + inp.Marginals[0].dist_type = 'norm' + inp.Marginals[0].parameters = [0, 1] + exp = InputSpace(inp) + exp.init_param_space(max_deg=2) + exp.transform(y) + + +# TODO: what are these other params here??? +def test_transform_gammanoparam() -> None: + """ + Transform gamma dist - no parameters + """ + y = np.random.uniform(0, 1, (1000, 1)) + inp = Input() + inp.add_marginals() + inp.Marginals[0].dist_type = 'gamma' + inp.Marginals[0].parameters = [1, 1, 0] + exp = InputSpace(inp) + exp.init_param_space(max_deg=2) + with pytest.raises(AttributeError) as excinfo: + exp.transform(y) + assert str(excinfo.value) == 'Additional parameters have to be set for the gamma distribution!' + + +def test_transform_gammaparam() -> None: + """ + Transform gamma dist - with parameters + """ + y = np.random.uniform(0, 1, (1000, 1)) + inp = Input() + inp.add_marginals() + inp.Marginals[0].dist_type = 'gamma' + inp.Marginals[0].parameters = [1, 1, 0] + exp = InputSpace(inp) + exp.init_param_space(max_deg=2) + exp.transform(y, params=[1, 1]) diff --git a/tests/test_MCMC.py b/tests/test_MCMC.py new file mode 100644 index 0000000000000000000000000000000000000000..3485a615b34150f63f8c8f428167453393531c09 --- /dev/null +++ b/tests/test_MCMC.py @@ -0,0 +1,223 @@ +# -*- coding: utf-8 -*- +""" +Test the MCM class of bayesvalidrox +Tests are available for the following functions +_check_ranges - x +gelmain_rubin +_iterative_scheme +_my_ESS - x +Class MCMC: + run_sampler + log_prior + log_likelihood + log_posterior + eval_model + train_error_model + marginal_llk_emcee +""" +import sys +import pandas as pd +import numpy as np + +from bayesvalidrox.surrogate_models.inputs import Input +from bayesvalidrox.surrogate_models.exp_designs import ExpDesigns +from bayesvalidrox.surrogate_models.surrogate_models import MetaModel +from bayesvalidrox.pylink.pylink import PyLinkForwardModel as PL +from bayesvalidrox.surrogate_models.engine import Engine +from bayesvalidrox.bayes_inference.discrepancy import Discrepancy +from bayesvalidrox.bayes_inference.mcmc import MCMC +from bayesvalidrox.bayes_inference.bayes_inference import BayesInference +from bayesvalidrox.bayes_inference.mcmc import _check_ranges, gelman_rubin + +sys.path.append("src/") +sys.path.append("../src/") + + +#%% Test MCMC init + +def test_MCMC() -> None: + """ + Construct an MCMC object + """ + inp = Input() + inp.add_marginals() + inp.Marginals[0].dist_type = 'normal' + inp.Marginals[0].parameters = [0, 1] + + expdes = ExpDesigns(inp) + expdes.n_init_samples = 2 + expdes.n_max_samples = 4 + expdes.X = np.array([[0], [1], [0.5]]) + expdes.Y = {'Z': [[0.4], [0.5], [0.45]]} + expdes.x_values = np.array([0]) + + mm = MetaModel(inp) + mm.fit(expdes.X, expdes.Y) + expdes.generate_ED(expdes.n_init_samples, max_pce_deg=np.max(mm.pce_deg)) + + mod = PL() + mod.observations = {'Z': np.array([0.45]), 'x_values': np.array([0])} + mod.Output.names = ['Z'] + engine = Engine(mm, mod, expdes) + + obsData = pd.DataFrame(mod.observations, columns=mod.Output.names) + disc = Discrepancy('') + disc.type = 'Gaussian' + disc.parameters = (obsData * 0.15) ** 2 + disc.opt_sigma = 'B' + + bi = BayesInference(engine) + bi.Discrepancy = disc + bi.inference_method = 'mcmc' + bi.setup_inference() + MCMC(bi) + + +#%% Test run_sampler + +def test_run_sampler() -> None: + """ + Run short MCMC + + Returns + ------- + None + DESCRIPTION. + + """ + inp = Input() + inp.add_marginals() + inp.Marginals[0].dist_type = 'normal' + inp.Marginals[0].parameters = [0, 1] + + expdes = ExpDesigns(inp) + expdes.n_init_samples = 2 + expdes.n_max_samples = 4 + expdes.X = np.array([[0], [1], [0.5]]) + expdes.Y = {'Z': [[0.4], [0.5], [0.45]]} + expdes.x_values = np.array([0]) + + mm = MetaModel(inp) + mm.fit(expdes.X, expdes.Y) + expdes.generate_ED(expdes.n_init_samples, max_pce_deg=np.max(mm.pce_deg)) + + mod = PL() + mod.observations = {'Z': np.array([0.45]), 'x_values': np.array([0])} + mod.Output.names = ['Z'] + engine = Engine(mm, mod, expdes) + + obsData = pd.DataFrame(mod.observations, columns=mod.Output.names) + disc = Discrepancy('') + disc.type = 'Gaussian' + disc.parameters = (obsData * 0.15) ** 2 + disc.opt_sigma = 'B' + + bi = BayesInference(engine) + bi.Discrepancy = disc + bi.inference_method = 'mcmc' + bi.setup_inference() + total_sigma2s = {'Z': np.array([0.15])} + mcmc = MCMC(bi) + mcmc.nburn = 10 + mcmc.nsteps = 50 + mcmc.run_sampler(mod.observations, total_sigma2s) + + +#%% Test log_prior + +#%% Test log_likelihood + +#%% Test log_posterior + +#%% Test eval_model + +#%% Test train_error_model + +#%% Test gelmain_rubin + +def test_gelman_rubin() -> None: + """ + Calculate gelman-rubin + """ + chain = [[[1], [2]]] + gelman_rubin(chain) + + +def test_gelman_rubin_returnvar() -> None: + """ + Calculate gelman-rubin returning var + """ + chain = [[[1], [2]]] + gelman_rubin(chain, return_var=True) + + +#%% Test marginal_llk_emcee + +#%% Test _check_ranges + +def test_check_ranges() -> None: + """ + Check to see if theta lies in expected ranges + """ + theta = [0.5, 1.2] + ranges = [[0, 1], [1, 2]] + assert _check_ranges(theta, ranges) is True + + +def test_check_ranges_inv() -> None: + """ + Check to see if theta lies not in expected ranges + """ + theta = [1.5, 1.2] + ranges = [[0, 1], [1, 2]] + assert _check_ranges(theta, ranges) is False + + +#%% Main + +if __name__ == '__main__': + inp = Input() + inp.add_marginals() + inp.Marginals[0].dist_type = 'normal' + inp.Marginals[0].parameters = [0, 1] + + expdes = ExpDesigns(inp) + expdes.n_init_samples = 2 + expdes.n_max_samples = 4 + expdes.X = np.array([[0], [1], [0.5]]) + expdes.Y = {'Z': [[0.4], [0.5], [0.45]]} + # expdes.x_values = np.array([0]) # Error in plots if this is not available + + mm = MetaModel(inp) + mm.fit(expdes.X, expdes.Y) + expdes.generate_ED(expdes.n_init_samples, max_pce_deg=np.max(mm.pce_deg)) + + mod = PL() + mod.observations = {'Z': np.array([0.45]), 'x_values': np.array([0])} + mod.Output.names = ['Z'] + + engine = Engine(mm, mod, expdes) + + sigma2Dict = {'Z': np.array([0.05])} + sigma2Dict = pd.DataFrame(sigma2Dict, columns=['Z']) + obsData = pd.DataFrame(mod.observations, columns=mod.Output.names) + disc = Discrepancy('') + disc.type = 'Gaussian' + disc.parameters = (obsData * 0.15) ** 2 + disc.opt_sigma = 'B' + + bi = BayesInference(engine) + bi.Discrepancy = disc + bi.inference_method = 'mcmc' + bi.setup_inference() + + # chain = [[[1],[2]]] + total_sigma2s = {'Z': np.array([0.15])} + mcmc = MCMC(bi) + mcmc.nsteps = 50 + mcmc.nburn = 10 + mcmc.run_sampler(mod.observations, total_sigma2s) + # mcmc.gelmain_rubin(chain) + + chain = [[[1], [2]]] + gelman_rubin(chain, return_var=True) diff --git a/tests/test_MetaModel.py b/tests/test_MetaModel.py new file mode 100644 index 0000000000000000000000000000000000000000..a3f9b19d3fb42c3e6ec3f34b3efb19298c8de545 --- /dev/null +++ b/tests/test_MetaModel.py @@ -0,0 +1,1172 @@ +# -*- coding: utf-8 -*- +""" +Test the MetaModel class in bayesvalidrox. +Tests are available for the following functions +Class MetaModel: + build_metamodel - x + update_metamodel + update_pce_coeffs + create_basis_indices --removed, just redirects + add_InputSpace -x + univ_basis_vals + create_psi + fit + adaptive_regression + corr_loocv_error + pca_transformation + gaussian_process_emulator + eval_metamodel + create_model_error + eval_model_error + auto_vivification + copy_meta_model_opts + __select_degree + generate_polynomials + _compute_pce_moments + +""" +import numpy as np +import pytest +import sys + +from bayesvalidrox.surrogate_models.inputs import Input +from bayesvalidrox.surrogate_models.input_space import InputSpace +from bayesvalidrox.surrogate_models.surrogate_models import MetaModel, corr_loocv_error, create_psi +from bayesvalidrox.surrogate_models.surrogate_models import gaussian_process_emulator + +sys.path.append("src/") + + +#%% Test MetaMod constructor on its own + +def test_metamod() -> None: + """ + Construct MetaModel without inputs + """ + inp = Input() + inp.add_marginals() + inp.Marginals[0].dist_type = 'normal' + inp.Marginals[0].parameters = [0, 1] + MetaModel(inp) + + +#%% Test MetaModel.build_metamodel + +def test_build_metamodel_nosamples() -> None: + """ + Build MetaModel without collocation samples + """ + inp = Input() + inp.add_marginals() + inp.Marginals[0].dist_type = 'normal' + inp.Marginals[0].parameters = [0, 1] + mm = MetaModel(inp) + with pytest.raises(AttributeError) as excinfo: + mm.build_metamodel() + assert str(excinfo.value) == 'Please provide samples to the metamodel before building it.' + + +def test_build_metamodel() -> None: + """ + Build MetaModel + """ + inp = Input() + inp.add_marginals() + inp.Marginals[0].dist_type = 'normal' + inp.Marginals[0].parameters = [0, 1] + mm = MetaModel(inp) + mm.CollocationPoints = np.array([[0.2], [0.8]]) + mm.build_metamodel() + + +def test_build_metamodel_ninitsamples() -> None: + """ + Build MetaModel with n_init_samples + """ + inp = Input() + inp.add_marginals() + inp.Marginals[0].dist_type = 'normal' + inp.Marginals[0].parameters = [0, 1] + mm = MetaModel(inp) + mm.CollocationPoints = np.array([[0.2], [0.8]]) + mm.build_metamodel(n_init_samples=2) + + +def test_build_metamodel_gpe() -> None: + """ + Build MetaModel gpe + """ + inp = Input() + inp.add_marginals() + inp.Marginals[0].dist_type = 'normal' + inp.Marginals[0].parameters = [0, 1] + mm = MetaModel(inp) + mm.meta_model_type = 'gpe' + mm.CollocationPoints = np.array([[0.2], [0.8]]) + mm.build_metamodel() + + +def test_build_metamodel_coldimerr() -> None: + """ + Build MetaModel with wrong shape collocation samples + """ + inp = Input() + inp.add_marginals() + inp.Marginals[0].dist_type = 'normal' + inp.Marginals[0].parameters = [0, 1] + mm = MetaModel(inp) + mm.CollocationPoints = [[0.2, 0.8]] + with pytest.raises(AttributeError) as excinfo: + mm.build_metamodel() + assert str( + excinfo.value) == 'The second dimension of X should be the same size as the number of marginals in the InputObj' + + +#%% Test MetaMod.generate_polynomials + +def test_generate_polynomials_noexp() -> None: + """ + Generate polynomials without ExpDeg + """ + inp = Input() + inp.add_marginals() + inp.Marginals[0].dist_type = 'normal' + inp.Marginals[0].parameters = [0, 1] + mm = MetaModel(inp) + with pytest.raises(AttributeError) as excinfo: + mm.generate_polynomials() + assert str(excinfo.value) == 'Generate or add InputSpace before generating polynomials' + + +def test_generate_polynomials_nodeg() -> None: + """ + Generate polynomials without max_deg + """ + inp = Input() + inp.add_marginals() + inp.Marginals[0].dist_type = 'normal' + inp.Marginals[0].parameters = [0, 1] + mm = MetaModel(inp) + + # Setup + mm.InputSpace = InputSpace(inp) + mm.InputSpace.n_init_samples = 2 + mm.InputSpace.init_param_space(np.max(mm.pce_deg)) + mm.ndim = mm.InputSpace.ndim + mm.n_params = len(mm.input_obj.Marginals) + + # Generate + with pytest.raises(AttributeError) as excinfo: + mm.generate_polynomials() + assert str(excinfo.value) == 'MetaModel cannot generate polynomials in the given scenario!' + + +def test_generate_polynomials_deg() -> None: + """ + Generate polynomials with max_deg + """ + inp = Input() + inp.add_marginals() + inp.Marginals[0].dist_type = 'normal' + inp.Marginals[0].parameters = [0, 1] + mm = MetaModel(inp) + + # Setup + mm.InputSpace = InputSpace(inp) + mm.InputSpace.n_init_samples = 2 + mm.InputSpace.init_param_space(np.max(mm.pce_deg)) + mm.ndim = mm.InputSpace.ndim + mm.n_params = len(mm.input_obj.Marginals) + + # Generate + mm.generate_polynomials(4) + + +#%% Test MetaMod.add_InputSpace + +def test_add_inputspace() -> None: + """ + Add InputSpace in MetaModel + """ + inp = Input() + inp.add_marginals() + inp.Marginals[0].dist_type = 'normal' + inp.Marginals[0].parameters = [0, 1] + mm = MetaModel(inp) + mm.add_InputSpace() + + +#%% Test MetaModel.fit +# Faster without these +def test_fit() -> None: + """ + Fit MetaModel + """ + inp = Input() + inp.add_marginals() + inp.Marginals[0].dist_type = 'normal' + inp.Marginals[0].parameters = [0, 1] + mm = MetaModel(inp) + mm.fit([[0.2], [0.8]], {'Z': [[0.4], [0.5]]}) + + +def test_fit_parallel() -> None: + """ + Fit MetaModel in parallel + """ + inp = Input() + inp.add_marginals() + inp.Marginals[0].dist_type = 'normal' + inp.Marginals[0].parameters = [0, 1] + mm = MetaModel(inp) + mm.fit([[0.2], [0.8]], {'Z': [[0.4], [0.5]]}, parallel=True) + + +def test_fit_verbose() -> None: + """ + Fit MetaModel verbose + """ + inp = Input() + inp.add_marginals() + inp.Marginals[0].dist_type = 'normal' + inp.Marginals[0].parameters = [0, 1] + mm = MetaModel(inp) + mm.fit([[0.2], [0.8]], {'Z': [[0.4], [0.5]]}, verbose=True) + + +def test_fit_pca() -> None: + """ + Fit MetaModel verbose and with pca + """ + inp = Input() + inp.add_marginals() + inp.Marginals[0].dist_type = 'normal' + inp.Marginals[0].parameters = [0, 1] + mm = MetaModel(inp) + mm.dim_red_method = 'pca' + mm.fit([[0.2], [0.8]], {'Z': [[0.4, 0.4], [0.5, 0.6]]}, verbose=True) + + +def test_fit_gpe() -> None: + """ + Fit MetaModel + """ + inp = Input() + inp.add_marginals() + inp.Marginals[0].dist_type = 'normal' + inp.Marginals[0].parameters = [0, 1] + mm = MetaModel(inp) + mm.meta_model_type = 'gpe' + mm.fit([[0.2], [0.8]], {'Z': [[0.4], [0.5]]}) + + +#%% Test MetaModel.create_psi + +def test_create_psi() -> None: + """ + Create psi-matrix + """ + inp = Input() + inp.add_marginals() + inp.Marginals[0].dist_type = 'normal' + inp.Marginals[0].parameters = [0, 1] + mm = MetaModel(inp) + samples = np.array([[0.2], [0.8]]) + mm.CollocationPoints = samples + mm.build_metamodel(n_init_samples=2) + BasisIndices = mm.allBasisIndices[str(1)][str(1.0)] + univ_bas = mm.univ_basis_vals(samples) + create_psi(BasisIndices, univ_bas) + + +#%% Test MetaModel.regression + +def test_regression() -> None: + """ + Regression without a method + """ + inp = Input() + inp.add_marginals() + inp.Marginals[0].dist_type = 'normal' + inp.Marginals[0].parameters = [0, 1] + mm = MetaModel(inp) + samples = np.array([[0.2]]) + outputs = np.array([0.5]) + + mm.CollocationPoints = samples + mm.build_metamodel(n_init_samples=2) + BasisIndices = mm.allBasisIndices[str(1)][str(1.0)] + univ_bas = mm.univ_basis_vals(samples) + psi = create_psi(BasisIndices, univ_bas) + + mm.regression(samples, outputs, psi) + + +def test_regression_ols() -> None: + """ + Regression: ols + """ + inp = Input() + inp.add_marginals() + inp.Marginals[0].dist_type = 'normal' + inp.Marginals[0].parameters = [0, 1] + mm = MetaModel(inp) + samples = np.array([[0.2]]) + outputs = np.array([0.5]) + + mm.CollocationPoints = samples + mm.build_metamodel(n_init_samples=2) + BasisIndices = mm.allBasisIndices[str(1)][str(1.0)] + univ_bas = mm.univ_basis_vals(samples) + psi = create_psi(BasisIndices, univ_bas) + + mm.regression(samples, outputs, psi, reg_method='ols') + + +def test_regression_olssparse() -> None: + """ + Regression: ols and sparse + """ + inp = Input() + inp.add_marginals() + inp.Marginals[0].dist_type = 'normal' + inp.Marginals[0].parameters = [0, 1] + mm = MetaModel(inp) + samples = np.array([[0.2]]) + outputs = np.array([0.5]) + + mm.CollocationPoints = samples + mm.build_metamodel(n_init_samples=2) + BasisIndices = mm.allBasisIndices[str(1)][str(1.0)] + univ_bas = mm.univ_basis_vals(samples) + psi = create_psi(BasisIndices, univ_bas) + + mm.regression(samples, outputs, psi, reg_method='ols', sparsity=True) + + +def test_regression_ard() -> None: + """ + Regression: ard + """ + inp = Input() + inp.add_marginals() + inp.Marginals[0].dist_type = 'normal' + inp.Marginals[0].parameters = [0, 1] + mm = MetaModel(inp) + samples = np.array([[0.2], [0.8]]) + outputs = np.array([0.4, 0.5]) + + mm.CollocationPoints = samples + mm.build_metamodel(n_init_samples=2) + BasisIndices = mm.allBasisIndices[str(1)][str(1.0)] + univ_bas = mm.univ_basis_vals(samples) + psi = create_psi(BasisIndices, univ_bas) + + mm.regression(samples, outputs, psi, reg_method='ard') + + +def test_regression_ardssparse() -> None: + """ + Regression: ard and sparse + """ + inp = Input() + inp.add_marginals() + inp.Marginals[0].dist_type = 'normal' + inp.Marginals[0].parameters = [0, 1] + mm = MetaModel(inp) + samples = np.array([[0.2], [0.8]]) + outputs = np.array([0.4, 0.5]) + + mm.CollocationPoints = samples + mm.build_metamodel(n_init_samples=2) + BasisIndices = mm.allBasisIndices[str(1)][str(1.0)] + univ_bas = mm.univ_basis_vals(samples) + psi = create_psi(BasisIndices, univ_bas) + + mm.regression(samples, outputs, psi, reg_method='ard', sparsity=True) + + +def test_regression_fastard() -> None: + """ + Regression: fastard + """ + inp = Input() + inp.add_marginals() + inp.Marginals[0].dist_type = 'normal' + inp.Marginals[0].parameters = [0, 1] + mm = MetaModel(inp) + samples = np.array([[0.2]]) + outputs = np.array([0.5]) + + mm.CollocationPoints = samples + mm.build_metamodel(n_init_samples=2) + BasisIndices = mm.allBasisIndices[str(1)][str(1.0)] + univ_bas = mm.univ_basis_vals(samples) + psi = create_psi(BasisIndices, univ_bas) + + mm.regression(samples, outputs, psi, reg_method='fastard') + + +def test_regression_fastardssparse() -> None: + """ + Regression: fastard and sparse + """ + inp = Input() + inp.add_marginals() + inp.Marginals[0].dist_type = 'normal' + inp.Marginals[0].parameters = [0, 1] + mm = MetaModel(inp) + samples = np.array([[0.2]]) + outputs = np.array([0.5]) + + mm.CollocationPoints = samples + mm.build_metamodel(n_init_samples=2) + BasisIndices = mm.allBasisIndices[str(1)][str(1.0)] + univ_bas = mm.univ_basis_vals(samples) + psi = create_psi(BasisIndices, univ_bas) + + mm.regression(samples, outputs, psi, reg_method='fastard', sparsity=True) + + +def test_regression_brr() -> None: + """ + Regression: brr + """ + inp = Input() + inp.add_marginals() + inp.Marginals[0].dist_type = 'normal' + inp.Marginals[0].parameters = [0, 1] + mm = MetaModel(inp) + samples = np.array([[0.2]]) + outputs = np.array([0.5]) + + mm.CollocationPoints = samples + mm.build_metamodel(n_init_samples=2) + BasisIndices = mm.allBasisIndices[str(1)][str(1.0)] + univ_bas = mm.univ_basis_vals(samples) + psi = create_psi(BasisIndices, univ_bas) + + mm.regression(samples, outputs, psi, reg_method='brr') + + +def test_regression_brrssparse() -> None: + """ + Regression: brr and sparse + """ + inp = Input() + inp.add_marginals() + inp.Marginals[0].dist_type = 'normal' + inp.Marginals[0].parameters = [0, 1] + mm = MetaModel(inp) + samples = np.array([[0.2]]) + outputs = np.array([0.5]) + + mm.CollocationPoints = samples + mm.build_metamodel(n_init_samples=2) + BasisIndices = mm.allBasisIndices[str(1)][str(1.0)] + univ_bas = mm.univ_basis_vals(samples) + psi = create_psi(BasisIndices, univ_bas) + + mm.regression(samples, outputs, psi, reg_method='brr', sparsity=True) + + +def test_regression_bcs() -> None: + """ + Regression: bcs + """ + inp = Input() + inp.add_marginals() + inp.Marginals[0].dist_type = 'normal' + inp.Marginals[0].parameters = [0, 1] + mm = MetaModel(inp) + samples = np.array([[0.0], [0.1], [0.2], [0.3], [0.4], [0.5], [0.6], [0.7], [0.8], [0.9]]) + outputs = np.array([0.0, 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9]) + mm.pce_deg = 3 + mm.CollocationPoints = samples + mm.build_metamodel(n_init_samples=2) + BasisIndices = mm.allBasisIndices[str(mm.pce_deg)][str(1.0)] + univ_bas = mm.univ_basis_vals(samples) + psi = create_psi(BasisIndices, univ_bas) + + mm.regression(samples, outputs, psi, reg_method='bcs') + + +def test_regression_bcsssparse() -> None: + """ + Regression: bcs and sparse + """ + inp = Input() + inp.add_marginals() + inp.Marginals[0].dist_type = 'normal' + inp.Marginals[0].parameters = [0, 1] + mm = MetaModel(inp) + samples = np.array([[0.0], [0.1], [0.2], [0.3], [0.4], [0.5], [0.6], [0.7], [0.8], [0.9], [1.0]]) + outputs = np.array([0.0, 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 1.1]) + + mm.CollocationPoints = samples + mm.build_metamodel(n_init_samples=2) + BasisIndices = mm.allBasisIndices[str(1)][str(1.0)] + univ_bas = mm.univ_basis_vals(samples) + psi = create_psi(BasisIndices, univ_bas) + + mm.regression(samples, outputs, psi, reg_method='bcs', sparsity=True) + + +def test_regression_lars() -> None: + """ + Regression: lars + """ + inp = Input() + inp.add_marginals() + inp.Marginals[0].dist_type = 'normal' + inp.Marginals[0].parameters = [0, 1] + mm = MetaModel(inp) + samples = np.array([[0.0], [0.1], [0.2], [0.3], [0.4], [0.5], [0.6], [0.7], [0.8], [0.9], [1.0]]) + outputs = np.array([0.0, 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 1.1]) + + mm.CollocationPoints = samples + mm.build_metamodel(n_init_samples=2) + BasisIndices = mm.allBasisIndices[str(1)][str(1.0)] + univ_bas = mm.univ_basis_vals(samples) + psi = create_psi(BasisIndices, univ_bas) + + mm.regression(samples, outputs, psi, reg_method='lars') + + +def test_regression_larsssparse() -> None: + """ + Regression: lars and sparse + """ + inp = Input() + inp.add_marginals() + inp.Marginals[0].dist_type = 'normal' + inp.Marginals[0].parameters = [0, 1] + mm = MetaModel(inp) + samples = np.array([[0.0], [0.1], [0.2], [0.3], [0.4], [0.5], [0.6], [0.7], [0.8], [0.9], [1.0]]) + outputs = np.array([0.0, 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 1.1]) + + mm.CollocationPoints = samples + mm.build_metamodel(n_init_samples=2) + BasisIndices = mm.allBasisIndices[str(1)][str(1.0)] + univ_bas = mm.univ_basis_vals(samples) + psi = create_psi(BasisIndices, univ_bas) + + mm.regression(samples, outputs, psi, reg_method='lars', sparsity=True) + + +def test_regression_sgdr() -> None: + """ + Regression: sgdr + """ + inp = Input() + inp.add_marginals() + inp.Marginals[0].dist_type = 'normal' + inp.Marginals[0].parameters = [0, 1] + mm = MetaModel(inp) + samples = np.array([[0.2]]) + outputs = np.array([0.5]) + + mm.CollocationPoints = samples + mm.build_metamodel(n_init_samples=2) + BasisIndices = mm.allBasisIndices[str(1)][str(1.0)] + univ_bas = mm.univ_basis_vals(samples) + psi = create_psi(BasisIndices, univ_bas) + + mm.regression(samples, outputs, psi, reg_method='sgdr') + + +def test_regression_sgdrssparse() -> None: + """ + Regression: sgdr and sparse + """ + inp = Input() + inp.add_marginals() + inp.Marginals[0].dist_type = 'normal' + inp.Marginals[0].parameters = [0, 1] + mm = MetaModel(inp) + samples = np.array([[0.2]]) + outputs = np.array([0.5]) + + mm.CollocationPoints = samples + mm.build_metamodel(n_init_samples=2) + BasisIndices = mm.allBasisIndices[str(1)][str(1.0)] + univ_bas = mm.univ_basis_vals(samples) + psi = create_psi(BasisIndices, univ_bas) + + mm.regression(samples, outputs, psi, reg_method='sgdr', sparsity=True) + + +def test_regression_omp() -> None: + """ + Regression: omp + """ + inp = Input() + inp.add_marginals() + inp.Marginals[0].dist_type = 'normal' + inp.Marginals[0].parameters = [0, 1] + mm = MetaModel(inp) + samples = np.array([[0.2]]) + outputs = np.array([0.5]) + + mm.CollocationPoints = samples + mm.build_metamodel(n_init_samples=2) + BasisIndices = mm.allBasisIndices[str(1)][str(1.0)] + univ_bas = mm.univ_basis_vals(samples) + psi = create_psi(BasisIndices, univ_bas) + + mm.regression(samples, outputs, psi, reg_method='omp') + + +def test_regression_ompssparse() -> None: + """ + Regression: omp and sparse + """ + inp = Input() + inp.add_marginals() + inp.Marginals[0].dist_type = 'normal' + inp.Marginals[0].parameters = [0, 1] + mm = MetaModel(inp) + samples = np.array([[0.2]]) + outputs = np.array([0.5]) + + mm.CollocationPoints = samples + mm.build_metamodel(n_init_samples=2) + BasisIndices = mm.allBasisIndices[str(1)][str(1.0)] + univ_bas = mm.univ_basis_vals(samples) + psi = create_psi(BasisIndices, univ_bas) + + mm.regression(samples, outputs, psi, reg_method='omp', sparsity=True) + + +def test_regression_vbl() -> None: + """ + Regression: vbl + """ + inp = Input() + inp.add_marginals() + inp.Marginals[0].dist_type = 'normal' + inp.Marginals[0].parameters = [0, 1] + mm = MetaModel(inp) + samples = np.array([[0.2]]) + outputs = np.array([0.5]) + + mm.CollocationPoints = samples + mm.build_metamodel(n_init_samples=2) + BasisIndices = mm.allBasisIndices[str(1)][str(1.0)] + univ_bas = mm.univ_basis_vals(samples) + psi = create_psi(BasisIndices, univ_bas) + + mm.regression(samples, outputs, psi, reg_method='vbl') + + +def test_regression_vblssparse() -> None: + """ + Regression: vbl and sparse + """ + inp = Input() + inp.add_marginals() + inp.Marginals[0].dist_type = 'normal' + inp.Marginals[0].parameters = [0, 1] + mm = MetaModel(inp) + samples = np.array([[0.2]]) + outputs = np.array([0.5]) + + mm.CollocationPoints = samples + mm.build_metamodel(n_init_samples=2) + BasisIndices = mm.allBasisIndices[str(1)][str(1.0)] + univ_bas = mm.univ_basis_vals(samples) + psi = create_psi(BasisIndices, univ_bas) + + mm.regression(samples, outputs, psi, reg_method='vbl', sparsity=True) + + +def test_regression_ebl() -> None: + """ + Regression: ebl + """ + inp = Input() + inp.add_marginals() + inp.Marginals[0].dist_type = 'normal' + inp.Marginals[0].parameters = [0, 1] + mm = MetaModel(inp) + samples = np.array([[0.2]]) + outputs = np.array([0.5]) + + mm.CollocationPoints = samples + mm.build_metamodel(n_init_samples=2) + BasisIndices = mm.allBasisIndices[str(1)][str(1.0)] + univ_bas = mm.univ_basis_vals(samples) + psi = create_psi(BasisIndices, univ_bas) + + mm.regression(samples, outputs, psi, reg_method='ebl') + + +def test_regression_eblssparse() -> None: + """ + Regression: ebl and sparse + """ + inp = Input() + inp.add_marginals() + inp.Marginals[0].dist_type = 'normal' + inp.Marginals[0].parameters = [0, 1] + mm = MetaModel(inp) + samples = np.array([[0.2]]) + outputs = np.array([0.5]) + + mm.CollocationPoints = samples + mm.build_metamodel(n_init_samples=2) + BasisIndices = mm.allBasisIndices[str(1)][str(1.0)] + univ_bas = mm.univ_basis_vals(samples) + psi = create_psi(BasisIndices, univ_bas) + + mm.regression(samples, outputs, psi, reg_method='ebl', sparsity=True) + + +#%% Test Model.update_pce_coeffs + +# TODO: very linked to the actual training... + +#%% Test MetaModel.univ_basis_vals + +def test_univ_basis_vals() -> None: + """ + Creates univariate polynomials + """ + inp = Input() + inp.add_marginals() + inp.Marginals[0].dist_type = 'normal' + inp.Marginals[0].parameters = [0, 1] + mm = MetaModel(inp) + samples = np.array([[0.2], [0.8]]) + mm.CollocationPoints = samples + mm.build_metamodel(n_init_samples=2) + mm.univ_basis_vals(samples) + + +#%% Test MetaModel.adaptive_regression + +def test_adaptive_regression_fewsamples() -> None: + """ + Adaptive regression, no specific method, too few samples given + """ + inp = Input() + inp.add_marginals() + inp.Marginals[0].dist_type = 'normal' + inp.Marginals[0].parameters = [0, 1] + mm = MetaModel(inp) + samples = np.array([[0.2]]) + outputs = np.array([0.8]) + + mm.CollocationPoints = samples + mm.build_metamodel(n_init_samples=2) + + # Evaluate the univariate polynomials on InputSpace + if mm.meta_model_type.lower() != 'gpe': + mm.univ_p_val = mm.univ_basis_vals(mm.CollocationPoints) + + with pytest.raises(AttributeError) as excinfo: + mm.adaptive_regression(outputs, 0) + assert str( + excinfo.value) == ('There are too few samples for the corrected loo-cv error. Fit surrogate on at least as ' + 'many samples as parameters to use this') + + +def test_adaptive_regression() -> None: + """ + Adaptive regression, no specific method + """ + inp = Input() + inp.add_marginals() + inp.Marginals[0].dist_type = 'normal' + inp.Marginals[0].parameters = [0, 1] + mm = MetaModel(inp) + samples = np.array([[0.0], [0.1]]) + outputs = np.array([0.0, 0.1]) + + mm.CollocationPoints = samples + mm.build_metamodel(n_init_samples=2) + + # Evaluate the univariate polynomials on InputSpace + if mm.meta_model_type.lower() != 'gpe': + mm.univ_p_val = mm.univ_basis_vals(mm.CollocationPoints) + mm.adaptive_regression(outputs, 0) + + +def test_adaptive_regression_verbose() -> None: + """ + Adaptive regression, no specific method, verbose output + """ + inp = Input() + inp.add_marginals() + inp.Marginals[0].dist_type = 'normal' + inp.Marginals[0].parameters = [0, 1] + mm = MetaModel(inp) + samples = np.array([[0.0], [0.1]]) + outputs = np.array([0.0, 0.1]) + + mm.CollocationPoints = samples + mm.build_metamodel(n_init_samples=2) + + # Evaluate the univariate polynomials on InputSpace + if mm.meta_model_type.lower() != 'gpe': + mm.univ_p_val = mm.univ_basis_vals(mm.CollocationPoints) + mm.adaptive_regression(outputs, 0, True) + + +def test_adaptive_regression_ols() -> None: + """ + Adaptive regression, ols + """ + inp = Input() + inp.add_marginals() + inp.Marginals[0].dist_type = 'normal' + inp.Marginals[0].parameters = [0, 1] + mm = MetaModel(inp) + samples = np.array([[0.0], [0.1], [0.2], [0.3], [0.4], [0.5], [0.6], [0.7], [0.8], + [0.9], [1.0]]) + outputs = np.array([0.0, 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 1.1]) + + mm.CollocationPoints = samples + mm.build_metamodel(n_init_samples=2) + + # Evaluate the univariate polynomials on InputSpace + if mm.meta_model_type.lower() != 'gpe': + mm.univ_p_val = mm.univ_basis_vals(mm.CollocationPoints) + mm.pce_reg_method = 'ols' + mm.adaptive_regression(outputs, 0) + + +#%% Test MetaModel.corr_loocv_error + +def test_corr_loocv_error_nosparse() -> None: + """ + Corrected loocv error + """ + inp = Input() + inp.add_marginals() + inp.Marginals[0].dist_type = 'normal' + inp.Marginals[0].parameters = [0, 1] + mm = MetaModel(inp) + samples = np.array([[0.0], [0.1], [0.2], [0.3], [0.4], [0.5], [0.6], [0.7], + [0.8], [0.9], [1.0]]) + outputs = np.array([0.0, 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 1.1]) + + mm.CollocationPoints = samples + mm.build_metamodel(n_init_samples=2) + BasisIndices = mm.allBasisIndices[str(1)][str(1.0)] + univ_bas = mm.univ_basis_vals(samples) + psi = create_psi(BasisIndices, univ_bas) + + outs = mm.regression(samples, outputs, psi, reg_method='ebl') + corr_loocv_error(outs['clf_poly'], outs['sparePsi'], outs['coeffs'], + outputs) + + +def test_corr_loocv_error_singley() -> None: + """ + Corrected loocv error + """ + inp = Input() + inp.add_marginals() + inp.Marginals[0].dist_type = 'normal' + inp.Marginals[0].parameters = [0, 1] + mm = MetaModel(inp) + samples = np.array([[0.2]]) + outputs = np.array([0.1]) + + mm.CollocationPoints = samples + mm.build_metamodel(n_init_samples=2) + BasisIndices = mm.allBasisIndices[str(1)][str(1.0)] + univ_bas = mm.univ_basis_vals(samples) + psi = create_psi(BasisIndices, univ_bas) + + outs = mm.regression(samples, outputs, psi, reg_method='ols') + corr_loocv_error(outs['clf_poly'], outs['sparePsi'], outs['coeffs'], + outputs) + + +def test_corr_loocv_error_sparse() -> None: + """ + Corrected loocv error from sparse results + """ + inp = Input() + inp.add_marginals() + inp.Marginals[0].dist_type = 'normal' + inp.Marginals[0].parameters = [0, 1] + mm = MetaModel(inp) + samples = np.array([[0.0], [0.1], [0.2], [0.3], [0.4], [0.5], [0.6], [0.7], + [0.8], [0.9], [1.0]]) + outputs = np.array([0.0, 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 1.1]) + + mm.CollocationPoints = samples + mm.build_metamodel(n_init_samples=2) + BasisIndices = mm.allBasisIndices[str(1)][str(1.0)] + univ_bas = mm.univ_basis_vals(samples) + psi = create_psi(BasisIndices, univ_bas) + + outs = mm.regression(samples, outputs, psi, reg_method='ebl', + sparsity=True) + corr_loocv_error(outs['clf_poly'], outs['sparePsi'], outs['coeffs'], + outputs) + + +#%% Test MetaModel.pca_transformation + +def test_pca_transformation() -> None: + """ + Apply PCA + """ + inp = Input() + inp.add_marginals() + inp.Marginals[0].dist_type = 'normal' + inp.Marginals[0].parameters = [0, 1] + mm = MetaModel(inp) + outputs = np.array([[0.4, 0.4], [0.5, 0.6]]) + mm.pca_transformation(outputs) + + +def test_pca_transformation_verbose() -> None: + """ + Apply PCA verbose + """ + inp = Input() + inp.add_marginals() + inp.Marginals[0].dist_type = 'normal' + inp.Marginals[0].parameters = [0, 1] + mm = MetaModel(inp) + outputs = np.array([[0.4, 0.4], [0.5, 0.6]]) + mm.pca_transformation(outputs, True) + + +def test_pca_transformation_varcomp() -> None: + """ + Apply PCA with set var_pca_threshold + """ + inp = Input() + inp.add_marginals() + inp.Marginals[0].dist_type = 'normal' + inp.Marginals[0].parameters = [0, 1] + mm = MetaModel(inp) + outputs = np.array([[0.4, 0.4], [0.5, 0.6]]) + mm.var_pca_threshold = 1 + mm.pca_transformation(outputs) + + +def test_pca_transformation_ncomp() -> None: + """ + Apply PCA with set n_pca_components + """ + inp = Input() + inp.add_marginals() + inp.Marginals[0].dist_type = 'normal' + inp.Marginals[0].parameters = [0, 1] + mm = MetaModel(inp) + outputs = np.array([[0.4, 0.4], [0.5, 0.6]]) + mm.n_pca_components = 1 + mm.pca_transformation(outputs) + + +#%% Test MetaModel.gaussian_process_emulator + +def test_gaussian_process_emulator() -> None: + """ + Create GPE + """ + inp = Input() + inp.add_marginals() + inp.Marginals[0].dist_type = 'normal' + inp.Marginals[0].parameters = [0, 1] + gaussian_process_emulator([[0.2], [0.8]], [0.4, 0.5]) + + +def test_gaussian_process_emulator_nug() -> None: + """ + Create GPEwith nugget + """ + inp = Input() + inp.add_marginals() + inp.Marginals[0].dist_type = 'normal' + inp.Marginals[0].parameters = [0, 1] + gaussian_process_emulator([[0.2], [0.8]], [0.4, 0.5], nug_term=1.0) + + +def test_gaussian_process_emulator_autosel() -> None: + """ + Fit MetaModel with autoselect + """ + inp = Input() + inp.add_marginals() + inp.Marginals[0].dist_type = 'normal' + inp.Marginals[0].parameters = [0, 1] + gaussian_process_emulator([[0.2], [0.8]], [0.4, 0.5], autoSelect=True) + + +def test_gaussian_process_emulator_varidx() -> None: + """ + Create GPE with var_idx + """ + inp = Input() + inp.add_marginals() + inp.Marginals[0].dist_type = 'normal' + inp.Marginals[0].parameters = [0, 1] + gaussian_process_emulator([[0.2], [0.8]], [0.4, 0.5], varIdx=1) + + +#%% Test MetaModel.eval_metamodel + +def test_eval_metamodel() -> None: + """ + Eval trained MetaModel + """ + inp = Input() + inp.add_marginals() + inp.Marginals[0].dist_type = 'normal' + inp.Marginals[0].parameters = [0, 1] + mm = MetaModel(inp) + mm.out_names = ['Z'] + mm.fit([[0.2], [0.8]], {'Z': [[0.4], [0.5]]}) + mm.eval_metamodel([[0.4]]) + + +def test_eval_metamodel_normalboots() -> None: + """ + Eval trained MetaModel with normal bootstrap + """ + inp = Input() + inp.add_marginals() + inp.Marginals[0].dist_type = 'normal' + inp.Marginals[0].parameters = [0, 1] + mm = MetaModel(inp) + mm.bootstrap_method = 'normal' + mm.out_names = ['Z'] + mm.fit([[0.2], [0.8]], {'Z': [[0.4], [0.5]]}) + mm.eval_metamodel([[0.4]]) + + +def test_eval_metamodel_highnormalboots() -> None: + """ + Eval trained MetaModel with higher bootstrap-itrs + """ + inp = Input() + inp.add_marginals() + inp.Marginals[0].dist_type = 'normal' + inp.Marginals[0].parameters = [0, 1] + mm = MetaModel(inp) + mm.n_bootstrap_itrs = 2 + mm.out_names = ['Z'] + mm.fit([[0.2], [0.8]], {'Z': [[0.4], [0.5]]}) + mm.eval_metamodel([[0.4]]) + + +def test_eval_metamodel_gpe() -> None: + """ + Eval trained MetaModel - gpe + """ + inp = Input() + inp.add_marginals() + inp.Marginals[0].dist_type = 'normal' + inp.Marginals[0].parameters = [0, 1] + mm = MetaModel(inp) + mm.meta_model_type = 'gpe' + mm.out_names = ['Z'] + mm.fit([[0.2], [0.8]], {'Z': np.array([[0.4], [0.5]])}) + mm.eval_metamodel([[0.4]]) + + +def test_eval_metamodel_pca() -> None: + """ + Eval trained MetaModel with pca + """ + inp = Input() + inp.add_marginals() + inp.Marginals[0].dist_type = 'normal' + inp.Marginals[0].parameters = [0, 1] + mm = MetaModel(inp) + mm.dim_red_method = 'pca' + mm.out_names = ['Z'] + mm.fit([[0.2], [0.8]], {'Z': [[0.4, 0.4], [0.5, 0.6]]}) + mm.eval_metamodel([[0.4]]) + + +#%% Test MetaModel.create_model_error +# TODO: move model out of this function + +#%% Test MetaModel.eval_model_error +# TODO: test create_model_error first + +#%% Test MetaModel.auto_vivification +def test_auto_vivification() -> None: + """ + Creation of auto-vivification objects + """ + inp = Input() + inp.add_marginals() + inp.Marginals[0].dist_type = 'normal' + inp.Marginals[0].parameters = [0, 1] + mm = MetaModel(inp) + mm.auto_vivification() + + +#%% Test MetaModel.copy_meta_model_opts + +def test_copy_meta_model_opts() -> None: + """ + Copy the metamodel with just some stats + """ + inp = Input() + inp.add_marginals() + inp.Marginals[0].dist_type = 'normal' + inp.Marginals[0].parameters = [0, 1] + mm = MetaModel(inp) + mm.add_InputSpace() + mm.copy_meta_model_opts() + + +#%% Test MetaModel.__select_degree + +#%% Test Engine._compute_pce_moments + +def test__compute_pce_moments() -> None: + """ + Compute moments of a pce-surrogate + """ + inp = Input() + inp.add_marginals() + inp.Marginals[0].dist_type = 'normal' + inp.Marginals[0].parameters = [0, 1] + mm = MetaModel(inp) + mm.fit([[0.2], [0.8]], {'Z': [[0.4], [0.5]]}) + mm._compute_pce_moments() + + +def test__compute_pce_moments_pca() -> None: + """ + Compute moments of a pce-surrogate with pca + """ + inp = Input() + inp.add_marginals() + inp.Marginals[0].dist_type = 'normal' + inp.Marginals[0].parameters = [0, 1] + mm = MetaModel(inp) + mm.dim_red_method = 'pca' + mm.fit([[0.2], [0.8]], {'Z': [[0.4, 0.4], [0.5, 0.6]]}) + mm._compute_pce_moments() + + +def test__compute_pce_moments_gpe() -> None: + """ + Compute moments of a gpe-surrogate + """ + inp = Input() + inp.add_marginals() + inp.Marginals[0].dist_type = 'normal' + inp.Marginals[0].parameters = [0, 1] + mm = MetaModel(inp) + mm.meta_model_type = 'gpe' + with pytest.raises(AttributeError) as excinfo: + mm._compute_pce_moments() + assert str(excinfo.value) == 'Moments can only be computed for pce-type surrogates' + + +#%% Test MetaModel.update_metamodel +# TODO: taken from engine diff --git a/tests/test_model/PosteriorGeneration/Posterior.csv b/tests/test_model/PosteriorGeneration/Posterior.csv new file mode 100644 index 0000000000000000000000000000000000000000..c5ac7661b1293e88b1d8f257c7bf183962be336f --- /dev/null +++ b/tests/test_model/PosteriorGeneration/Posterior.csv @@ -0,0 +1,6458 @@ +Beam width,Beam height,Youngs modulus,Uniform load +0.15055984558676253,0.29525432449198297,30.76127334738532,9.723836401962199 +0.15172323185227535,0.3018864526755948,30.900386050140906,10.572937395098421 +0.14973682706047656,0.2978203129324041,36.32602379774441,11.755511440017944 +0.1517705925936338,0.305488518618717,34.50777554904536,12.185971698925812 +0.15122339466850782,0.2926128752190275,35.56672182303718,11.0301930879105 +0.14845810152750857,0.30211679811976233,29.835349622421052,10.024544145665512 +0.1489486486032762,0.2976793170334428,29.594984582798585,9.521736085316368 +0.15058053518912617,0.30333441137936284,27.27802142418919,9.342001468585726 +0.1507691624131821,0.2939876743771734,31.27163912090209,9.792688628012431 +0.1500870646038146,0.2985441999148553,39.81677531480247,12.987496647396311 +0.14898608605561217,0.30375423088389003,29.52705674493042,10.062549985258489 +0.14970824383703807,0.30315407503168046,35.2631265265265,11.99629791617248 +0.1498912371993728,0.3013950044398239,33.54132459098164,11.248721986783334 +0.14918575621696326,0.29880381550532065,34.150652209795595,11.118554528090979 +0.1489969356057506,0.300082398957258,31.002479481593078,10.219384641989384 +0.14963859664258394,0.2969265555129175,28.313546776132057,9.088993931185307 +0.14924423341105603,0.2961598248152436,34.8669105697025,11.066044927367999 +0.1488627318567911,0.30339555022808407,28.7659733754671,9.719728325570129 +0.14904620979099514,0.30205065043454093,27.36896794141427,9.15878555321657 +0.14886154272190172,0.297571249578671,33.98280136527889,10.993246687313722 +0.15046175526021985,0.3014252784837413,30.320866515147358,10.245770506771493 +0.14895131444063903,0.3006988921964416,37.02907995194387,12.254220550055356 +0.14822839215760572,0.2967015482530759,29.13063987848894,9.243997918545368 +0.15061583048688917,0.3023050340792065,26.381591123053003,9.039144523940172 +0.14933137568234386,0.2976303918077185,28.185860267431718,9.099539621429873 +0.15097333701125473,0.29884114856849325,32.448149132581875,10.725091737113342 +0.14861246193204933,0.2956301496342977,31.53137989477175,9.887819803283998 +0.15075147769579367,0.29426575882827677,32.81116563700903,10.356665887389468 +0.1488838808015214,0.30969592007109076,23.314425369188026,8.41259635215697 +0.15089032060024854,0.29975849822448203,28.330198030194403,9.395440278016995 +0.15171896932446038,0.29697069253763303,31.719864538400206,10.265446132573281 +0.1511638954444731,0.3064294498625754,30.16270383629635,10.712742355905162 +0.14970391336634295,0.2933263997782806,31.105997921156632,9.588629000761 +0.15173385801101136,0.3026504423355007,27.856008806744917,9.647971253145494 +0.14963903690066988,0.2992892791266329,25.62644199051723,8.41447349619034 +0.14786899863171046,0.29465218763471346,32.73828816801097,10.110488762340273 +0.14830043739463228,0.30179590466397616,33.33391843314495,11.074223059030498 +0.14972066572015155,0.29329923960466125,29.91942642817336,9.29929818095726 +0.14968180670910078,0.30368487275388706,30.888973401246478,10.545427119589773 +0.1518739419436568,0.3021836590473556,34.00577846722855,11.670888200124832 +0.1513373569201578,0.2992960113169822,29.659969447444713,9.860813347162992 +0.15160436704895,0.3010981673626241,36.64411401601438,12.449286997760847 +0.14870809657944523,0.29324066965704415,33.40093193356068,10.250535977092024 +0.150329666654505,0.3015776803893649,29.295545898925752,9.904251047292721 +0.15110408601686112,0.30238317785012736,33.19806246609083,11.353712675878493 +0.14911287190577996,0.2992352248448469,30.347226764990197,9.90312082340579 +0.1513478466633895,0.2962980407271981,35.68541092831026,11.460068110037875 +0.1503563256692775,0.30714086924433825,28.569871495685874,10.186432339695088 +0.14891257103394928,0.296688726025247,30.734192595943526,9.743439511560911 +0.151105303175229,0.29894996065185564,31.884589303779972,10.46387013660202 +0.14683980110850903,0.29302131628940636,37.91487937324246,11.521781589410088 +0.15005118664246028,0.29614219476553616,31.612243932956268,10.103649749107161 +0.1502371893551997,0.2944204279777004,28.55807190100987,8.953242542734515 +0.1516111490053176,0.3044040258957299,30.347403454026416,10.566693853101615 +0.14821312224234226,0.305553714812958,27.762839297622556,9.580249090441534 +0.15058036389882157,0.30120964748854995,23.304137265628846,7.880051394316492 +0.14751159516124104,0.3045117430978514,25.625863623354057,8.777248324422054 +0.14968171786301937,0.2979298363954319,30.265733028953793,9.809306867181538 +0.14902637994484685,0.29436900881321476,32.94978451310034,10.246990173014247 +0.14821532118475994,0.3061690727243609,31.682038781139664,11.007031013157192 +0.14926641068125943,0.30674418982891644,28.45440326279706,10.08300255254922 +0.14941809741096518,0.292584520491891,34.24498923168918,10.538070061953654 +0.1494371702021553,0.2986140517197328,33.90742531182021,11.050570051393581 +0.15061256206078197,0.30127244886893073,31.55060000864165,10.692445609275516 +0.15180893258345682,0.30914066357851544,29.549067783101776,10.790145838160383 +0.15068728655039282,0.30148840873794036,26.882296892997054,9.074449939020091 +0.14942716567458997,0.2923218917496673,34.26192248389427,10.496615929923584 +0.14980292323154265,0.30137721959111047,24.945347103870077,8.361949478660202 +0.1486372195220464,0.30348665546178627,30.825887911149117,10.463615818344296 +0.14937896477437884,0.2976727021751642,25.491255100968537,8.185568530092164 +0.1488265616723196,0.30297766723896785,30.641895492682583,10.385503058131476 +0.148838855994559,0.30068669479470905,30.19295051607365,10.034973817737873 +0.1506531831503386,0.2976345133477932,33.73310641425946,10.92219062603582 +0.14977990320362342,0.2982886259205805,32.732305316522464,10.625062422281657 +0.15000084994829443,0.3000301295153972,27.658024991021872,9.106955193691304 +0.15225710501013492,0.2978346445274063,29.91895901482293,9.818553925371916 +0.14817305361997635,0.30528908407897076,32.9734146523813,11.363147869847735 +0.1490344402055049,0.2943411804090603,33.9012644331582,10.513566096077135 +0.15025966169314448,0.3109671410224573,28.169493920086914,10.417199062512964 +0.148583316685014,0.3007806398250571,29.69795195646071,9.837671584721877 +0.1510825560762331,0.30232957350044304,28.50738709183433,9.748590869656413 +0.1495004260725029,0.30016803986102364,28.273580690642955,9.285662388512815 +0.14981439928459667,0.29881513808789495,34.50392392360294,11.289112459374614 +0.15091068054381374,0.302467459505437,28.311260389325504,9.613980971017389 +0.14909997719166432,0.30479042137133283,35.65438926788075,12.276695718506792 +0.15130616156420285,0.3038436201604296,28.970942637849586,10.04549883005259 +0.15186843568301658,0.29225167822589815,29.877997715611002,9.265560868188839 +0.14977494259410137,0.30192895562495725,27.66737404766756,9.346035286973285 +0.15189383237894763,0.30119200504941274,30.92548692793698,10.429113557842532 +0.1493896872256712,0.3020106084226828,27.244612736455554,9.177666015264949 +0.15036568554485277,0.3006719966701882,36.73988935552735,12.302849181812002 +0.15050728093898388,0.2994238110413449,27.82675162060344,9.187549196960479 +0.1499824925468035,0.3104885096845966,29.408171042714557,10.834360112828678 +0.14927979151865797,0.2963020864286519,29.33177505167398,9.308447373692195 +0.14949314255982643,0.2992559712577732,33.515172505333155,10.956492945956864 +0.15223538030184647,0.30371694105146685,34.38740887209568,12.04509030468316 +0.1513333785359546,0.29673535517331967,33.63053320690034,10.901160508591673 +0.1486884767803919,0.29960827874237556,35.66544646652888,11.653871377930248 +0.15022785417528656,0.29892598811010074,34.255202806799495,11.155145100083288 +0.1500446847038556,0.2947741300092464,30.883318926874477,9.693701333386489 +0.149530729694222,0.29793313186228654,26.34257337687657,8.56280273496689 +0.14785240398769836,0.3038824613025239,34.384275000045875,11.638938769404774 +0.14978234736190676,0.30247484130040897,32.49578111835835,10.998645782608914 +0.15081562716849634,0.29502756823272464,37.39273141591937,11.807808752137325 +0.1516947658363905,0.30214832436982675,32.48047556943996,11.055921988750107 +0.15128828263897434,0.2979108800648392,28.943963217364768,9.480860622511818 +0.15068116283040608,0.29975875562671955,27.34583784453978,9.075480460016735 +0.1495663750815079,0.2954199845583222,26.52315469716406,8.362502810976341 +0.153404983193812,0.3005152233901543,28.312684516574297,9.61342418466401 +0.15197700649943188,0.2991297553322459,32.30142569149332,10.71322644139777 +0.14915503460944793,0.2906435524385892,28.217206656216238,8.435126234651827 +0.14992032971143876,0.3073871144233205,25.838767024280966,9.182180630220786 +0.1538480867673471,0.3010074574157471,29.633520381070642,10.222685034618264 +0.15088176598636063,0.2916312967389822,25.446640477176196,7.790483619271734 +0.14993612643293172,0.2945369963866243,31.322249860359193,9.825497546378267 +0.15064391203039237,0.30539121155865867,27.972462898445155,9.903605107768124 +0.15136632172546702,0.30629825593407006,33.205609563444206,11.787452889288033 +0.15002053542401364,0.3098112267373979,33.94061708235345,12.389304462581826 +0.1501655527227246,0.309075792573876,28.20474154794161,10.204701229195155 +0.14966392433192938,0.3033427640110384,28.37661073485141,9.732244863392218 +0.14895087593485662,0.3029541125038597,25.708971329380212,8.715270367914593 +0.14874171289070937,0.30384815081731836,27.403406001063047,9.395321061579356 +0.1498689145466191,0.30151414645490554,33.204065929342306,11.091474911329973 +0.1511065664332087,0.3054692362131533,34.88252203197452,12.206359291083874 +0.14876906418405475,0.29695451593481553,29.522162582340016,9.364710359504773 +0.14988303524504276,0.30688639886867203,29.42119617813994,10.40581014806049 +0.1480558555254069,0.30247020489426407,32.477701714570614,10.798638566645648 +0.15021712656855019,0.29881511348141326,30.641069040579335,10.009811818444462 +0.1482840007392455,0.3046378237755229,28.496742184427145,9.755129123427965 +0.15232874591163678,0.29680254757082936,39.16262584770895,12.753504758885263 +0.14949931774512287,0.3041063151441979,27.05540339215973,9.293668741165693 +0.1505928479246886,0.2964959715990655,28.223548558035123,9.02754806727615 +0.15012427175262796,0.3010637927773365,27.220561179809124,9.094992859787487 +0.14801980301660816,0.3036543801001375,31.34849857487015,10.629067506812659 +0.1500867385067023,0.30634465152224427,23.51097156734263,8.290304883724216 +0.14877077745974351,0.3015486014242194,30.90770151335038,10.291509070092474 +0.15024106836095674,0.29596599786352074,33.61079380343045,10.681497984693236 +0.1489978193892505,0.3014684736226687,31.58319671240412,10.563937986715448 +0.14926634027697147,0.3015404725512661,31.484248598815753,10.557864061225922 +0.1491314705637946,0.3069001461105756,26.807949439174564,9.431211274268472 +0.1520519079767036,0.30258511857102466,28.57537466305894,9.83818394033662 +0.15007774098039034,0.29643262551590216,30.899661724287945,9.87659072027582 +0.15068963222309179,0.29919820648602014,27.239551741754372,8.992518582194263 +0.15051526087122283,0.30287684769117834,32.626001750187605,11.17536875883694 +0.1494887500861804,0.298894867175155,27.586617439801273,8.985403322166203 +0.1503604979685574,0.30747438885938255,37.92815139196196,13.452723763873648 +0.14853069376702444,0.305234906947794,28.5007342542425,9.818475212315807 +0.15133925171115922,0.29795144165275245,34.9696604115056,11.427903172401512 +0.1512476979870864,0.3019411896931407,32.369960748916185,11.030947701774968 +0.1515489465579641,0.30263343046831487,31.43855479165138,10.911714911031918 +0.15160879200171345,0.29802657744652544,23.88976491776734,7.848603688134473 +0.149064300181178,0.3029967164715359,29.72992939615525,10.060173788200132 +0.14965437424001926,0.31225350973842314,25.051638508321034,9.297753868406645 +0.1514650269457611,0.2968004738364224,30.502684118498053,9.88155165779316 +0.14876051230969034,0.3004418943053964,27.693585003297645,9.125791293416185 +0.1484086853098675,0.30727801960447515,29.599580050110685,10.440832193932605 +0.15033697768411095,0.30628613330376037,27.52341505419809,9.737181128446311 +0.14919815372860634,0.30082176769673474,33.09660787485743,10.971005632337823 +0.14959564600833866,0.29916945393343425,34.84748979206722,11.429990101950287 +0.14718780610125706,0.299746528495256,31.503390935029834,10.21067366823202 +0.1498602266062501,0.30366289062787777,28.208889038388122,9.682978747576996 +0.1510453374964302,0.29910330631973603,32.03089859340307,10.557506445205682 +0.14900887560237508,0.29680965930551667,36.457299493717784,11.619969420759853 +0.15039549818449718,0.2994452707681189,28.287579715121574,9.335720051423205 +0.14939070683862868,0.2886794580577476,33.22018309609472,9.766110255396727 +0.148745055432814,0.29476802012579584,31.11828480696371,9.738225304456279 +0.1496362985449041,0.297811595134583,32.606545583712006,10.512848919471093 +0.14874344070048112,0.2921575314186452,36.02116458874868,10.863341878743029 +0.14958800944836867,0.2999392233979651,31.750309703064552,10.508558858775233 +0.15010271603800662,0.3045069303719998,34.89886877563877,12.09929985480022 +0.15020652805386578,0.2935117521867393,31.57812545069551,9.78426577606543 +0.14920701740869194,0.3001947499199989,29.678186056046982,9.800266460890446 +0.14899500681853833,0.2941874702544053,30.813099330757144,9.6032661765239 +0.15178785364962707,0.29247576997089647,30.51755213502337,9.477760519482972 +0.15304507858941244,0.2966447293812387,28.708114319920096,9.368012020511118 +0.14946869732953577,0.3071440256512768,28.11179637204363,9.949527533422806 +0.1530573452385186,0.30180656296999936,28.91485367004659,9.998635210408647 +0.1480007668899303,0.30186207882588795,24.757988252563564,8.276430018547003 +0.14946782803360084,0.2900758996746606,28.501833153308965,8.51406386951207 +0.14934116320600377,0.3045398715336866,31.59290918469803,10.930060035663235 +0.1499416032166091,0.2986041561880714,28.275555738606226,9.261641945464493 +0.15092343377430512,0.29742545996956865,32.03950272152434,10.419242730653812 +0.15011435224950923,0.297729464370605,24.206251889985758,7.784485957001749 +0.1510189582361033,0.30134913051182177,34.68690784951749,11.684729057230019 +0.15036452875263903,0.30929920914101355,30.730634237710785,11.221971379980342 +0.14671348716270663,0.2889661015626476,33.48283722005661,9.691192978316995 +0.14961660568352309,0.296050785135825,33.074152561554236,10.525844112121085 +0.1507554977678148,0.29992742103317116,25.54387833737656,8.510250852233998 +0.15128676226610152,0.3018045195674189,24.62547278601421,8.399027286145987 +0.15181300527395006,0.2979184440695008,29.662935740240332,9.775382699188885 +0.15119513917883112,0.2993542950592609,22.21256873434029,7.322151521038533 +0.15048454614953574,0.29562220266994793,34.07762493642974,10.857519763126543 +0.14838119669507693,0.3007689462543949,30.222945004218083,9.927756375813932 +0.14975207226870937,0.3026094606167818,26.208738117259756,8.872185977374953 +0.14980298071873221,0.2928263537860688,31.73733771187316,9.796836930870741 +0.14934388404680854,0.3063250921874342,30.288841287547353,10.613296273639772 +0.14976059027164404,0.3031422716446645,31.349065262371838,10.67021978030094 +0.1498408020680534,0.29938262590939285,27.693501980662774,9.101994062971542 +0.15111803648108216,0.30239546012294555,31.963111378008435,10.926273173384027 +0.14826792205709147,0.29570549045065386,31.574053309669193,9.934626331339368 +0.14981537320978033,0.2939572749649994,27.80629596627346,8.640943729490157 +0.1489882112504195,0.29729029691614267,30.116691944523907,9.628761736466783 +0.1500822648362782,0.2975041871410536,25.6710269666928,8.277387193085927 +0.14902162945262012,0.29774104031568455,34.26601713491265,10.991386403253186 +0.1491555766469372,0.30804030666564103,24.54502636768644,8.724187497092355 +0.15124352599211235,0.2991613674665899,30.40932275500175,10.12268590171712 +0.14798054712407785,0.3000148354952253,29.796658153465096,9.717482174257155 +0.15189067191738573,0.3071158127333312,23.101406636568107,8.2476121734044 +0.15007457761277063,0.3031497910318296,31.976451966360592,10.926146372894532 +0.15057017834231676,0.31152396925547704,28.460199226450925,10.640886574589103 +0.1522771346084892,0.2937341692041088,37.34304918444231,11.787290522101543 +0.14966661869806655,0.2958412345828857,30.063880656371857,9.497455277604528 +0.14861441625704627,0.29427590666408693,33.997918533450004,10.546788135325198 +0.1487343280709861,0.3017060403401639,27.148412018563384,9.048234341365424 +0.15098348299066197,0.30788668857656515,31.27945197684635,11.219983159844665 +0.14884479304777434,0.29907538810286705,27.824669078320497,9.083786797540489 +0.15012063325482902,0.2940519375442823,40.307544332204984,12.550150923263567 +0.15016120127610302,0.30485551492262464,34.04475709440887,11.822907898487575 +0.15241561156454103,0.29851553362206984,29.65544387404923,9.818649632343295 +0.14872019875655726,0.3001373881311435,26.70775812539404,8.795795418043781 +0.15080751353239563,0.3018408190451544,31.248543171355955,10.594128404991215 +0.15053090276943745,0.2973438798313409,34.85215403382923,11.232099118267381 +0.15099519532945224,0.3019916426618645,25.544022330622436,8.654280482632828 +0.15028120443040704,0.2964859666951222,27.057394018131877,8.622360099926349 +0.14915747375071,0.3005050680682623,30.35122825547351,10.061680601319015 +0.14877204033028296,0.302220433380282,27.420400355962098,9.212411840896046 +0.15125736642174265,0.30494762703113415,30.490686066132223,10.595563761749547 +0.14779924267005687,0.29529259089737864,27.687571639439938,8.609169339070927 +0.1499047754788092,0.2988239139274257,28.21315986844262,9.24990874476866 +0.1507002517005334,0.2954894725319827,27.078293163019588,8.65474727577832 +0.15035010113194794,0.3006207407169748,31.725648601472805,10.668851834764412 +0.15210012943902212,0.30513578301430266,22.414443652835157,7.905746571014915 +0.15006272035414744,0.30026826591762,32.57035201011891,10.769869474907654 +0.15041136876320343,0.30864212509992994,37.34079542493906,13.538068585495218 +0.14891732063086624,0.30704187573636904,34.20339318192538,12.062451326402229 +0.15111217168437657,0.2993555076833791,29.457546528185986,9.821653735808562 +0.14917712053834456,0.30038848720815337,25.93335017691198,8.56332638090726 +0.1519067084382722,0.3002300567356726,37.879395995683794,12.749477546207281 +0.14991865193986956,0.29759815855392724,32.04001327414488,10.306694295047105 +0.14930927885154074,0.293815522367974,35.33715845537655,10.971039696202741 +0.15181732211865637,0.3083551922732411,31.163211865239596,11.384245340728938 +0.15106522092731342,0.3033723746923159,29.981836299054144,10.382599743915275 +0.14905748447314163,0.30608950112816885,31.39794477527777,10.91489306651549 +0.15054844712532803,0.305463122112815,24.592175109918685,8.675892956928802 +0.15145316666266082,0.29946493814942404,27.283163094262555,9.07810812874611 +0.15116523474612856,0.300186610675573,33.362499449421364,11.177987781886637 +0.15014961909292454,0.2987830643019073,29.088164396446643,9.51967825978883 +0.14932682799309635,0.2985993780906179,30.589803283378075,9.96360303287355 +0.14852161179841675,0.3011011855220957,34.17713495644102,11.321126112070724 +0.15030319553731605,0.30187309700110304,25.69774310443523,8.693373906623659 +0.1488139570568861,0.3049209403992994,32.16769920134675,11.12080943485244 +0.14968163375635532,0.2995028699525601,28.951090875858345,9.533006700412372 +0.15148903319553794,0.2978283506038287,35.317495232372536,11.548913267808015 +0.14952445572832593,0.29543915530033765,29.372789464059636,9.222772248084631 +0.15173723335907577,0.30463868041947784,30.668067903425513,10.82127275943284 +0.14901534408032557,0.2982539028110938,28.52014536603087,9.193357643249687 +0.14934273246529872,0.29782943175822,32.46199888695863,10.445512314468221 +0.14826889688375675,0.29862210307294773,33.4147063173458,10.779068980989635 +0.1496143672327263,0.29423556424387903,25.447224040321657,7.893732604936797 +0.14913730896802493,0.30290985526267095,21.561731606026772,7.359102655064715 +0.15224699088217344,0.3060106786744574,28.876127385822628,10.357077816738874 +0.1493391670192003,0.29446357326361217,22.496972665757877,7.0119100705839355 +0.1506718108031533,0.29901133649391853,25.37104500644519,8.383767996304819 +0.14934194154934383,0.29789396058464024,30.57898148770403,9.849258252801745 +0.1494174425084412,0.29822077232257127,27.69708221741343,8.965681141777214 +0.15093135042266742,0.3035134095605013,24.449887000227463,8.431536657354064 +0.14964430847329654,0.3015546040920544,20.72212018377121,6.978487633759805 +0.14872643532651258,0.30053621656949303,34.45644867243379,11.432834464697807 +0.150123054463629,0.30519471981423374,30.84635117215684,10.769084721575103 +0.14919200289735668,0.29983949883065997,30.897753634012368,10.192561651850477 +0.1495162100841066,0.2961158372832322,28.467440884960737,9.050137006275445 +0.15078473020398495,0.2990270188857155,37.91378398897915,12.529395238569068 +0.14969058172767438,0.308008496751349,29.30860619379051,10.479201117055737 +0.1510504859294013,0.2984806751033729,29.3546867228218,9.640972871650584 +0.15153967472433752,0.2984665595130986,24.35546897620516,7.976415961785806 +0.1497479209101268,0.2992339095114881,36.31438862346043,11.890170797630965 +0.1491550025093411,0.29874944528384734,28.98366387427587,9.437334775330685 +0.14937846502552232,0.29303768919036993,30.834425333541148,9.426162570071122 +0.1499411772569658,0.30174826685135164,28.052118734501285,9.451001782195622 +0.14913885249490463,0.29267557265693445,35.29226962828841,10.720818264289933 +0.15206863236952384,0.2943459802650546,27.346282470696906,8.655096792824835 +0.14741902827912312,0.29466001096771066,27.252111333103972,8.430739015143114 +0.15062899511190472,0.3059288616103764,37.57116039034379,13.245955305137027 +0.14965071326135765,0.2958868066823978,40.740150610546564,12.914951637617886 +0.14878459712332862,0.2985736878467162,35.51078564383348,11.511270604378174 +0.14882212577625686,0.2984291628646143,32.073483325258806,10.305828728383872 +0.1502318848565183,0.2974292659438344,29.650317628151097,9.597903672856555 +0.14986867492965752,0.30135721882409255,26.582726667838383,8.910962172831352 +0.1491184456465211,0.2977737383469291,29.65025856307935,9.518980844607546 +0.1491680241277339,0.304134180238478,26.851651292513374,9.252248304156252 +0.1526142775522997,0.29818513346284836,30.308407683078457,10.026969845626711 +0.15059088867869366,0.29819217053634134,30.630290355358714,9.9794575644142 +0.15009187620219455,0.3008266229099315,30.4040240532869,10.18170319900686 +0.14935386202143278,0.307054697551981,31.751073388988626,11.20852657629564 +0.1514100197594207,0.304683573207516,35.80845144910144,12.567714463158097 +0.14792157102981773,0.29932326547740074,30.050731501029667,9.740789651873008 +0.14891498502411013,0.30337695011451493,35.48956479727424,12.063245659457644 +0.14953512067721256,0.2987205511252022,31.9799021300304,10.410718809710039 +0.15026732637128806,0.3024764519098979,20.02631857077032,6.797353958567772 +0.14948461911518465,0.3023996433128415,30.42976475416596,10.273605365122691 +0.14943160746722328,0.3024572955973802,28.33359613500148,9.632119282797328 +0.14846812089397998,0.29724758337215185,18.239624704413714,5.827787194746103 +0.15033033271472904,0.2917858511918958,28.099272690302982,8.607096992066781 +0.1485933156025488,0.3022578992282033,26.976147859636832,9.05863765717649 +0.1508963978324125,0.30159972845868205,29.067314494349894,9.853371604547197 +0.14902978936605013,0.3027927143470135,31.61811090252395,10.678425824240387 +0.15061374871072847,0.3060400195364271,30.10342581618345,10.633131710057091 +0.15168041856401326,0.3061970422030104,32.10759927220783,11.457897918920988 +0.1495398017624066,0.30725530944279966,34.06986848973423,12.039571358100124 +0.14944862272628653,0.2956877155847981,28.091980366671436,8.867766856657994 +0.15140503109450387,0.2986243008203451,32.94402825156279,10.872903661466523 +0.14910983325724517,0.29473158536277266,30.6132270130783,9.522054047375676 +0.15037861529507426,0.29881760697218346,23.378469585620216,7.693075736528165 +0.15055730754782531,0.3042420886748917,29.357877683535204,10.181571399849737 +0.1510837562296279,0.298489560346636,31.355134877912594,10.283737971914226 +0.1489896218530212,0.30262237707933665,23.97414770016584,8.117670478941406 +0.1498910881898534,0.3044507915902215,29.926712123749343,10.372938640964005 +0.1512493516153254,0.2979938173342998,35.24637438512325,11.556546704821441 +0.14929214659486115,0.29937239018888406,37.20692476580979,12.162148166705705 +0.14949771906518347,0.3055240602760612,29.280459015672626,10.209407420367528 +0.14770507450592274,0.29566272755314443,30.089720704363607,9.446256325236508 +0.1484629395829242,0.2937218437660126,26.030297062810067,8.042927966050712 +0.1499321795067112,0.30825102034506013,30.144815010237142,10.79751735508709 +0.14870552122501857,0.301193121801619,26.781605833201326,8.898743078468081 +0.14995894393256742,0.3006943619948541,29.09227584256573,9.689425174433975 +0.1499825205899331,0.3111641199060322,32.42375804921548,11.959910064016746 +0.15280073763367996,0.2918516728755794,33.292340440537615,10.363926505181457 +0.14846324772003752,0.3000832288898834,29.721405083090747,9.790143221951945 +0.15219466500952536,0.298215694556894,27.580702979511823,9.118715274192626 +0.1495760856861593,0.29844028610242396,34.33763617593761,11.217122882805375 +0.15077491601056386,0.2980002928006384,30.31006048596984,9.848811451199015 +0.15024930113536691,0.30659212456914403,24.473943273487233,8.612155169590151 +0.15091111452622977,0.29856326137619554,30.575979103093083,10.006834549549453 +0.14949413367772957,0.3037564049190828,31.055608707327167,10.679861131081061 +0.14961243357695084,0.29699156984127745,29.259473117195245,9.406889564784223 +0.14956123785977174,0.2990791260322669,29.953812657377032,9.809920006537999 +0.14984588805523216,0.2959574540621208,30.330033123128562,9.616295051859154 +0.14996460917313495,0.3037619039747305,25.87190815111976,8.887914909907565 +0.1480257226408688,0.29385236444999624,24.00491625871529,7.415584558314747 +0.14900984546133592,0.29800626550157033,35.69235646754341,11.521813088324128 +0.1494021709385801,0.3023794252143484,30.42660570646331,10.274389403325698 +0.15060645497097538,0.301877040623659,29.824376968668904,10.153621324925327 +0.1500333845176352,0.3021376433141179,32.25554093796441,10.938356263939855 +0.15167483488864333,0.2925411138020343,32.17187165264918,9.996099838332814 +0.1505035609895622,0.2986022095508008,21.401029673867733,6.998351391913655 +0.1504630614711269,0.3009463757737091,29.257174788807294,9.740726188762508 +0.1508469667290671,0.2986421453982684,26.00328767243224,8.534305013218301 +0.15050580807899866,0.29848158760409776,26.2332959744437,8.599843394054588 +0.14819342984621311,0.2959305276821364,31.372916161864048,9.897302049634238 +0.14923711764130698,0.29710309339786817,33.56729558896696,10.76325692915899 +0.1508952694753759,0.29712352356594807,35.055410206468096,11.328192535465035 +0.151522160751871,0.30334513951335157,25.141754541624874,8.696047862727795 +0.14925329228104184,0.2961764024729039,35.715031791752466,11.35200407045951 +0.14973974418744754,0.298978595700762,28.043057005833383,9.139958254405876 +0.15023758211142899,0.3022507770094781,30.975777031548677,10.496513410291604 +0.14880739425700093,0.30502143697116757,27.6534174759722,9.513739440459156 +0.15112056388830875,0.3036886941997729,33.85986311104277,11.763074187258438 +0.15095956839461552,0.28889461662062166,21.88276594484709,6.483880193817931 +0.1491411861949391,0.30179026653359614,28.858060377684417,9.667857777598877 +0.14894232459511672,0.2970496864357128,28.947319559444473,9.25484681608827 +0.15007139455496743,0.2965730288945393,30.569270166147284,9.806350879228807 +0.14863071320713872,0.30332823336037995,34.39406575198916,11.723983358112505 +0.15136454603303562,0.3001751794679093,29.29771986241849,9.774527864482451 +0.15063310632553145,0.29133171003791986,32.30145991918147,9.876231515337192 +0.15011578767695663,0.3035215597482106,34.29635454950055,11.706214023226632 +0.14902585656006004,0.30727658485627457,29.884417114082254,10.58010315277547 +0.1511807797862923,0.30221150457180285,30.578604042619222,10.507037268538841 +0.15103309222731956,0.29742666060974593,25.780143457298323,8.317782512238757 +0.1487766502627119,0.2974799815709442,31.68383776557351,10.139737290818656 +0.15020146113030744,0.2975177317045459,30.14319274708062,9.75511898560725 +0.152317168972062,0.2926761640111467,36.56952219702545,11.46868343395447 +0.15053964222814784,0.29411314626134966,30.606088336027955,9.564511965510913 +0.148657087766761,0.2953316094116469,23.427092556508025,7.325509934784851 +0.15147658134832234,0.3068649635521136,31.809090876376626,11.360821824150685 +0.14912085623290092,0.2987958193875473,26.981602799647035,8.760638358877987 +0.1501541028443787,0.30275459731998444,23.642033314238596,8.065961928589967 +0.14959500185109015,0.2955250428501214,29.180394836448098,9.205813058897137 +0.14706547668521716,0.3000506205074221,28.081517221189266,9.07193571899043 +0.1508736824734018,0.295908273214061,29.77115332366316,9.52108115479004 +0.1504328905640732,0.29593712526660354,29.521182732288754,9.39356213537008 +0.14889539951215452,0.3011636321707227,27.677772344076658,9.181755128766273 +0.14941291996802777,0.2969178488774501,27.573572563488018,8.78258749128284 +0.15091003632256547,0.29425518539651413,28.879406355779295,9.145857017026126 +0.15093014660374854,0.29436256542809197,36.59760388764741,11.508237335362212 +0.15314235412938362,0.3025767233615449,30.763775481842938,10.639112802096825 +0.1491860566358692,0.3014357579409271,31.85368511969487,10.627168772567037 +0.1479654673843062,0.3032025069485427,23.838078261946126,8.037821980226834 +0.15013646231780012,0.30627808176638033,28.94712852981048,10.271280946263486 +0.15057275733173497,0.2994687477111681,30.725182171807766,10.18749396083978 +0.1486631600440337,0.2990068915734763,33.912813237301705,11.05059292346624 +0.14831358041657317,0.29959784640181936,33.878947032437935,11.059998283026594 +0.14959711565627537,0.29166189984092095,34.92904124863464,10.658420025752694 +0.1504850305374941,0.3008023096533805,30.91907585083221,10.39955661726275 +0.15071673126441568,0.29969573484042045,38.48745411640155,12.823262320225282 +0.1490817370964279,0.3005769226406982,32.546549512462796,10.741141059481908 +0.15069765785810676,0.2962327925809819,29.622421026046688,9.537547945886256 +0.14940853170996088,0.3037750260222448,20.19769880029473,6.907064932654375 +0.1500889423589155,0.3040224035042571,27.111136145436575,9.353013453253306 +0.14985153750717023,0.29358988385770146,34.75857625868212,10.812163817031175 +0.15008319695786607,0.3048731311403147,29.16658887817879,10.08673917843446 +0.1473448269199635,0.2974835746764654,32.15790461243691,10.18023406788845 +0.15024995757551493,0.29465180530783974,35.13635609269776,11.020823513617792 +0.1514009158094101,0.31201066714675757,29.181765185523577,10.981333795770183 +0.15017511879388318,0.3088041533053905,33.28177073163513,12.023419738642426 +0.1506245980777018,0.30229730706826186,31.63300376582034,10.74856519577247 +0.15054588656794113,0.29958432268703267,33.46144915011455,11.061581833270576 +0.1494253575703012,0.29772286701727885,27.378969809749464,8.78585423749199 +0.1488826986037764,0.2951293045090014,31.460052188678024,9.8435007205761 +0.14832753433515963,0.29776911176525855,32.30373151561594,10.362796339271949 +0.15244139655013833,0.29101153767070737,31.705575337664804,9.749157121433942 +0.15113871611006288,0.3082620345483787,24.98903162659579,9.035058408148565 +0.14912871208304712,0.30338038861064126,20.673369466080196,7.0327655600006675 +0.15087605845629665,0.29528222667164605,25.712482831149664,8.169583444536414 +0.15079648579812518,0.2930724256876402,27.708584278050722,8.641395921689426 +0.1496842365272227,0.30031561163310366,29.80179945743069,9.885905400332975 +0.15012704237797095,0.29546164446314843,30.435123429679255,9.675608860448063 +0.1510471063891252,0.2977451824681645,34.07302272607536,11.044179985502755 +0.15042802422379306,0.29895953805998265,23.636043992404847,7.784709115758189 +0.14957730261412397,0.29921405271643947,36.20652593590794,11.900878961846212 +0.14958827594953497,0.29706355864168743,29.25448534609478,9.378265331268556 +0.15101170997086635,0.2954596939890875,32.908254887106615,10.512042294174059 +0.15004250919707388,0.2976803069341217,32.05099894376916,10.376912532811142 +0.14943332680260898,0.30445324948208435,30.889270733194333,10.682079329109298 +0.15011083666320588,0.30367878013126787,27.95835232728612,9.586266955600143 +0.15055857587259602,0.3037181268166476,35.829868260686105,12.389115077395378 +0.15002500348034503,0.2994472135167083,33.421807212453096,11.032914216680252 +0.151172183605408,0.29590377959527125,30.497127325020635,9.76814854112289 +0.14980215496747631,0.30394557981993836,32.37559356615698,11.158970656905538 +0.14938680091411766,0.3040392188557711,29.20489579870351,9.992998723509032 +0.15144908122872064,0.3004888416488506,30.173632072819874,10.172499584769295 +0.15015522013623153,0.2992264484814328,31.826596316776577,10.436126293638983 +0.1487235724979198,0.30594527866482285,30.901846846146338,10.766635971485945 +0.15114150267704476,0.2951937898172113,34.23035736931596,10.9062916771717 +0.15263008505194842,0.29879298483757144,27.49577246839852,9.182744212439308 +0.14956070555998957,0.2999028577469079,27.816587337166602,9.195553385147829 +0.14628987801419369,0.3008235800083747,25.760663681403585,8.440275159970756 +0.15131629576342273,0.3043090330461232,26.749649317237225,9.341605228160908 +0.15055694943616213,0.2993897808226218,28.059973432311708,9.231172254406035 +0.15030134331258493,0.29523974356408683,27.72863610132116,8.807791273520943 +0.1506482480350617,0.29745414956130284,32.4346750832933,10.573867924516044 +0.15015996592716005,0.30482774357149217,26.13844936707493,9.065677143856897 +0.15040790795574058,0.30235731385047004,30.786762424786104,10.44977551741484 +0.15018221526750766,0.2981139215649245,33.239790761861244,10.814262122132225 +0.15084612908226816,0.2957314662753635,41.18691454207346,13.19610062411596 +0.1508618433434742,0.29414888924432814,28.11608010492822,8.802138422941963 +0.1501638866594775,0.300956801882725,37.14699436076744,12.534696548081417 +0.15199659310103322,0.30214792532120055,27.457894785971572,9.430136104022711 +0.1489126868335239,0.3082248649666756,30.769056618968435,10.958500121854772 +0.14931884975740572,0.29829181594638016,31.635118977869656,10.265020575848503 +0.15061053250801895,0.30284575228017746,25.55624561666887,8.787108028269742 +0.15065574351334124,0.29132464170810674,24.637644450834582,7.539816644230832 +0.1521226488656385,0.2909646066180605,27.909269033376283,8.606127479874944 +0.15124498148719523,0.30038695249616404,35.13783090830752,11.735238059783017 +0.15057546667566343,0.3007133745793283,35.91930998412292,11.998821977580768 +0.1483483478332004,0.29812827315188495,27.09329317981287,8.76047841696497 +0.15080683139852316,0.3046533076584855,33.0546139097074,11.450228411959804 +0.14980104156385424,0.30428481109386835,28.2506036735804,9.731414844627569 +0.14989746328919257,0.2913562061620193,29.47370780996163,8.939785339540418 +0.14970939665498822,0.2970251233707702,34.41395623221377,11.101697136997947 +0.15076883127244167,0.2951979963362588,29.386287256492455,9.289375416166767 +0.14853842728837263,0.29947966249568336,30.45116052671035,9.903815695044626 +0.15057972337474673,0.2985250795860804,30.34771774602401,9.953481023588102 +0.15032038443840787,0.3066071266342161,32.36922741576723,11.370664028063732 +0.15180633579267314,0.2967117981028808,32.54220873329364,10.52069433660834 +0.15168470117675253,0.29524836742563065,24.9596907643182,8.023620699830184 +0.14939997679593267,0.3052174163621483,29.688804830706548,10.384364221528307 +0.14916467040675715,0.3007245281133914,29.47800866583047,9.739895008910658 +0.150566044336451,0.3026503772101429,29.37235646138533,10.022059446577844 +0.14980009582685144,0.3022529903969485,33.57016150213883,11.417437254249764 +0.14992039301308016,0.3050828090644713,28.468975414279384,9.86226938654436 +0.1476527317941712,0.30062561910482544,23.765492918450065,7.826075144728294 +0.14941857058131866,0.2977262266462387,30.238810484398766,9.726015111403239 +0.14855683389992813,0.29873507632913965,25.84039648437522,8.344340028976996 +0.14810264386090102,0.3042927299912458,30.2199464535226,10.358834271377336 +0.1511094939380544,0.3007998087013436,29.931399252602592,10.03701639131078 +0.14722525574169346,0.30367005258464774,30.860086907563538,10.413280479121998 +0.14955314209641557,0.29764310479379447,35.553772921988724,11.426727815972447 +0.15176751571932093,0.29929660610998754,28.9840118709319,9.676856194272592 +0.15087155552818132,0.29265134410996285,32.45800271439821,10.026473318465804 +0.1510855894482687,0.30293760312065166,20.901500511140448,7.169998420390856 +0.15005196298765647,0.290476789204969,35.9302329380256,10.801627495973657 +0.14870390374457443,0.2978288937717562,31.8684962591826,10.179359155734396 +0.14966252541239375,0.30302896233042365,29.15384327224427,9.876596288486652 +0.1472035620393613,0.29899824785596213,29.841621629273455,9.584896427595018 +0.14996599717516457,0.30311274881141964,26.980930763608367,9.180509095132143 +0.14957184558310052,0.30415697181340573,25.190650455187598,8.662578101237925 +0.15003665683749276,0.3029787159884705,29.685526312221597,10.148576379261256 +0.14976739759364474,0.3033526282613485,25.516565266335064,8.708699345824051 +0.14794725347352286,0.30032360304196953,28.986409570754283,9.551024511387988 +0.1499666602165532,0.3018195418980935,28.036874087064156,9.405690861402993 +0.1474775787305305,0.29672115583084,27.658479121619706,8.682374836645792 +0.14993737997204828,0.3039694056182393,37.13499755626592,12.828156849036896 +0.15109509444741573,0.3001093079148672,35.23163457331781,11.718012484841388 +0.14854756181138218,0.2969396111160809,25.091954319497205,7.99315413224884 +0.1500305599206379,0.30239451343982476,22.818754849077756,7.746134062288748 +0.14950385712362932,0.2963036307395636,26.128493994085,8.28044971173436 +0.14994341822860704,0.3045222682041515,31.944484830609962,11.089443155602213 +0.14846089652132405,0.30605454060258036,32.03756911486029,11.163707870354832 +0.15013582762606253,0.2979242693917266,32.6443773967764,10.557717486643783 +0.150073640426966,0.30045786602202773,30.08824633270982,10.014064099056451 +0.14924265913784782,0.30122265743213067,33.1833480245727,11.077366576478926 +0.15306071327887236,0.30137582316823136,26.53096916375681,9.12123078597179 +0.1502635258312966,0.2994928676272812,28.474058984861305,9.414666022234911 +0.15042865352859366,0.2980716876143727,25.060268722712173,8.13978952610261 +0.1496763557885887,0.29262643048568276,28.801651063351926,8.810061554268703 +0.14913100945226004,0.297286549384086,32.50185103304084,10.373430415689647 +0.14912467149398978,0.303293717596043,32.748982877309295,11.132291493363024 +0.15057184966083811,0.30098882026312995,21.267482900950327,7.1376220297120705 +0.15013968399150748,0.3061523075386729,27.99139872398668,9.859997568401987 +0.1509283303366912,0.2913948417195026,34.51116356802715,10.570560507046144 +0.14946427579851523,0.30227731823298837,26.465356796198755,8.90259797513959 +0.15000890839687844,0.3015260387834789,28.01769285295905,9.412289673692824 +0.1484751773742092,0.2965327007853438,32.58903987299041,10.305487811523875 +0.15069022419785016,0.3060168574399029,30.571684465460493,10.86635766505315 +0.14863070209114726,0.29796176325082624,29.614474143318354,9.51939709476121 +0.15134573068152657,0.30296748922748945,25.716564524016828,8.88041763763647 +0.15081879854970412,0.2980248027004772,21.45897078512217,7.008624273145392 +0.14745810274036042,0.30565473039503105,29.270526769420933,10.107834652199767 +0.1492534601774889,0.300340726535067,34.75757302907004,11.520208070806323 +0.15038512347484084,0.3071842592054775,34.78384004643853,12.418125751327405 +0.15009517618229423,0.30722125221172786,30.01603945854036,10.737540515611103 +0.1491584818993425,0.30259805875650236,25.46298862027588,8.626127273931255 +0.1501647686491723,0.2997257327982886,32.29144891703004,10.611319302503315 +0.1489336323780241,0.3155795829477371,34.66961660590635,13.236959074190834 +0.14996350967311728,0.3027033555027251,33.81836684474702,11.554677502353607 +0.15112955891742694,0.30309442726779917,34.01332968362189,11.714805275988551 +0.15219118695246783,0.3020163159513072,33.75205334989588,11.601421771496407 +0.1485457625904523,0.3031700017658926,31.78596923317772,10.734410405076558 +0.14897020617834567,0.29973533719833795,30.042880751329278,9.863484992982864 +0.14977308097777525,0.3019816948884039,32.2139907335767,10.807347469480353 +0.15045636885364788,0.2995860174721442,37.60566898747301,12.464992413490094 +0.150746055398752,0.30380127091404485,34.33567829258946,11.873973421370222 +0.15022077136517206,0.30031611946971976,30.991533498776487,10.334896662161105 +0.15077153213875627,0.2976190971054179,29.0122894122261,9.466032978370418 +0.15105249361168355,0.29808747598513285,34.2425267091802,11.197425555735082 +0.15161145439299778,0.3006577605054715,32.68765919586306,11.01197550196764 +0.15188246937005692,0.2935780471978487,30.524231681372164,9.621491408921452 +0.1496177063128402,0.3113549986867437,34.55945620840114,12.716709065290036 +0.15203825954803898,0.2990851367011101,28.689016072634466,9.589192928063232 +0.1501132920554986,0.29827261634767427,27.11624105022958,8.793264760150128 +0.15107333512271764,0.2999440188287876,30.43366465845303,10.135254733212292 +0.14883239381575752,0.29910592076133674,33.17814200449787,10.832138075818952 +0.15082079014483563,0.3025748579319745,32.04393329942213,10.926989694088672 +0.15158905459358193,0.30372207881662044,28.445977778595086,9.94356723101183 +0.14854983351440168,0.2943482485577552,39.38210694863326,12.232911113266107 +0.14959287090778747,0.29622455699568023,27.891238901710906,8.867273668436425 +0.15201855218065352,0.2965889175489323,28.133932991927345,9.089261874341682 +0.15118004268405702,0.2993794819326196,32.5428106843994,10.755657105615102 +0.14778426753028703,0.2951734136975467,25.139465738920386,7.818542503756957 +0.14913526925205906,0.30377772734870706,28.083810151578398,9.584111353408977 +0.15191090497118898,0.3056415303811612,28.230921483641982,10.000511803908706 +0.1484882381934001,0.29834349810727484,34.08079886068081,10.98020721217452 +0.15144392003909588,0.2958014986386183,34.801756157506695,11.183311899284156 +0.15179417815286658,0.3029046075723229,26.580097149946457,9.16004191931725 +0.1490163691509792,0.2942320733756115,32.927358053237946,10.184598869083835 +0.1504005356697204,0.3062613537677499,32.34103392753811,11.463703678336824 +0.1499454383361951,0.2967875959928261,29.884751441340264,9.547117387896137 +0.15008284321975793,0.2949731203385351,29.18292820426911,9.202326694424457 +0.14998152285076788,0.3021350981194945,26.812082213265782,9.068899784557134 +0.1514147962140816,0.3035962804042345,32.669549267810936,11.306267716770495 +0.14955044799956427,0.29967360184776265,36.25293251815223,11.857131258695443 +0.14904952153265036,0.29712006169290817,33.48440250184578,10.724476342124195 +0.14927468504520522,0.29891405095118756,29.953655661651503,9.78871451920998 +0.14970372939823806,0.299951622211213,31.544194862184526,10.416317092554406 +0.15003837275228746,0.3009753448903261,29.66932372261937,9.900288724121902 +0.15117930885910108,0.30253476139717533,27.198360489589458,9.306077999402962 +0.14943439884521453,0.3063443981116435,32.371644067217886,11.354976014563086 +0.15096206837455728,0.29694287002711467,30.911510598638195,9.987266038670288 +0.15057071096251276,0.2998736596096519,30.138501639638044,9.984851313745082 +0.1521511652746639,0.3136535350669949,24.473416208619845,9.372502552337172 +0.14918293569206503,0.3002909893396902,24.090056906405607,7.963650060648746 +0.14869176461237843,0.2985078551904009,30.85817181055191,10.017965362410457 +0.15064097768326065,0.2960873180013139,28.024547343869575,8.953083720396604 +0.14903830908548032,0.2922688421920057,33.80623318154196,10.37170590405411 +0.15067996868282763,0.30677890560119964,28.94008397817612,10.343294006273222 +0.1508622625233087,0.2977239714760468,29.60533856460739,9.589497519852197 +0.15054603386921428,0.29953199052155666,30.983311551589942,10.266697097923975 +0.15014118403924334,0.2970138150147447,22.40729883228875,7.252336139878895 +0.1491896187403479,0.30249838164138027,30.58234177404367,10.408895272836867 +0.14867165244158445,0.29747047324023795,27.94895152663642,8.947632861344427 +0.14992040937909334,0.2980122926736729,27.67940096341664,8.94934535229599 +0.1500352403911064,0.2988069520196299,29.615573069329805,9.719548934280118 +0.14943711959818654,0.2976103722904502,28.28099601050286,9.086498956540684 +0.15019435108910922,0.2909989076250412,30.934535532833934,9.321381679692436 +0.1503600421890092,0.3052445147305015,27.895349313964008,9.700407240719326 +0.14986509838638232,0.30558970013441106,24.68925334320747,8.603159069132515 +0.15023401709645937,0.2983807222859906,28.807330025501308,9.39707862273289 +0.14966799215222226,0.3050919291880867,30.6631701647629,10.682235645882818 +0.14916729070947932,0.30059023033293086,32.532988994480895,10.805782554929683 +0.1503419277358287,0.30361188752647805,30.882569568967984,10.631038380173122 +0.15000742068592474,0.30031159974690363,31.70209460265815,10.547643571755966 +0.14759163497996114,0.30158337157236526,29.053953769255784,9.60530097237676 +0.14943493461042975,0.3083449916056496,34.64658161591563,12.415832015529665 +0.148332035166729,0.31087880950915986,30.004433713542724,10.906900385391978 +0.15018174651514707,0.29918427303062306,29.215654425144557,9.578866820415161 +0.1505515598030791,0.2974783857487953,36.01371334198877,11.647381580787403 +0.1472243151921999,0.30187097186747247,29.877090332460966,9.90953557892298 +0.1509764430142271,0.2978500286507289,33.254593388240245,10.811902487036933 +0.15007104554383793,0.2988103832328719,33.33453682436079,10.92493632256222 +0.15171423933431796,0.28992539661433386,33.55896636733532,10.14617373438563 +0.15002041908932967,0.29438768248416936,35.18438762205645,10.992046353505572 +0.15102371253752425,0.29919103083491455,35.994316192947196,11.907642966938072 +0.150975979761627,0.30155564822659336,25.586057637103053,8.647764351732922 +0.15044713783439256,0.29492824314511434,31.93235560642705,10.115140054891818 +0.14910783115117807,0.30134013876079585,29.826330957698985,9.93928495407546 +0.14916418281448665,0.30661062383191606,32.77420870203761,11.535937359074534 +0.1492361638486164,0.29952901297656764,30.39260472061772,9.985416267853433 +0.14964311425997281,0.2887615572035871,31.557904422456364,9.293398839381808 +0.15080878499498981,0.3007564212367959,29.53404880159411,9.911769263345175 +0.15039532032426242,0.3002519526742686,31.206398982283474,10.44450326435303 +0.14951941156332618,0.3030135557230122,28.95321479383778,9.881260644838484 +0.15093892075135332,0.2949528871014366,30.787956178541613,9.727494528056024 +0.14959203237478452,0.2890559105886098,33.36971667580648,9.8471510372342 +0.1510865295268145,0.30231912122093174,26.181786440441766,8.910579687232959 +0.15042754923519816,0.3066997112838843,31.601079427386342,11.245122204068208 +0.15089986773229647,0.2967813363732004,26.990216111743102,8.675319517589742 +0.14994742251585894,0.2967319705361209,35.61679070607965,11.384987253210745 +0.15007661762487792,0.29810355709728553,36.774733992528915,11.962312104593959 +0.1489555438804885,0.3034596237617873,25.276383082204177,8.689817036477416 +0.15012156279922848,0.30382376737691325,29.251035523229497,10.118787964229277 +0.15020128428018065,0.3075236309433366,27.503831698642973,9.830632375974282 +0.1518968277101748,0.30099570347035004,33.09463123563412,11.255434572772375 +0.1505220179511371,0.30840618181896073,27.926440134872475,10.126554936598634 +0.14917079578803963,0.2976443055445046,36.4768941894277,11.686936068887887 +0.15010183354736495,0.29584527685641443,30.406764058166644,9.65535669266472 +0.15146083102084873,0.2990042547753686,26.507031900679625,8.755355532917452 +0.14844790570911642,0.30168563298975876,28.604238571209667,9.525699548852334 +0.15041959478235617,0.29876199201186104,26.275435229790627,8.654845615331617 +0.15102067722451376,0.29386276078371765,34.859238266791614,10.909591032071848 +0.1508903961321277,0.30592425037814924,31.32658794107276,11.073505400353701 +0.15089621643339085,0.3049656090954614,30.030124468392806,10.514052194537669 +0.1486759585632364,0.3033752797350535,30.23175728656776,10.28012622590159 +0.1512089507081679,0.2997224666186917,32.69447095110937,10.912320059791286 +0.1479012482028148,0.30083731884778026,30.198048605048555,9.932086590228412 +0.15004621669698878,0.29726992927520307,33.90252735538629,10.9432229209386 +0.15125363877539771,0.2991262169696003,33.684105830677304,11.200578680142696 +0.1493133505340897,0.306454890869998,31.94497841434481,11.275377395751395 +0.14959653853332922,0.29635415446660185,27.497138762894977,8.754877296179078 +0.1516761726849361,0.29232536184763913,26.29787266170922,8.145683779245939 +0.1500182161250967,0.3020051817684498,26.647311533739476,9.013308295170773 +0.1515555760263168,0.30115353927703054,24.792947623666453,8.362768030390988 +0.1503585859583759,0.3042008453784902,33.334910084153975,11.514050695322037 +0.15164100202458983,0.29821042838998046,31.541694335424253,10.371304373101331 +0.14961429177170424,0.29512496088587803,33.07581824478645,10.300522494336839 +0.14906569544125917,0.302117304060041,26.80638458041723,9.016949277208552 +0.15136274592076865,0.3103068406487046,33.45337196505887,12.341544368326504 +0.15022148150287437,0.2969756412245621,29.537155909670485,9.51504177296019 +0.15061734068504387,0.29486445324380706,36.33454015938793,11.432107590553436 +0.15209201989229942,0.2950568704582408,30.007091123542278,9.618003762062296 +0.14995391569450298,0.29751240623780995,33.72709163633462,10.868429173316313 +0.15001232846768753,0.3100498631462953,32.76120992816861,11.993922209924849 +0.14956417805435032,0.3082617209326906,24.390216145981533,8.761462569536612 +0.1515512340923047,0.29074130869517856,34.07196729044985,10.37124171841425 +0.14986512582542383,0.2981185557034098,30.503918557880855,9.887966250743041 +0.15031351540815138,0.2990718816375098,30.820754667874645,10.127442855299872 +0.14875686679557423,0.29876326933235875,29.14734723081554,9.47861035895895 +0.15144393522640356,0.30049910927381374,24.220341108407986,8.223661474053092 +0.1517884305917953,0.3029764292453884,29.835269567406794,10.28434564601362 +0.15065828000363055,0.3091059997854844,35.14365303798337,12.843567518912135 +0.15174705020107535,0.2996082725871279,34.90978609568744,11.688791673180365 +0.14752651872607567,0.30404144339678213,35.757803232794,12.086293182024043 +0.1500723962964581,0.30246138487295454,33.70362057925719,11.420213962297472 +0.15151089587674116,0.30391619725626223,31.869005180163583,11.036278589614488 +0.14927048902474813,0.2959658707852493,27.480487601135344,8.718227364847314 +0.14833527660374377,0.2975873287520703,24.98524387373731,7.991621062633815 +0.14786848226719276,0.3080072241923758,24.811535458773157,8.8160567499912 +0.150506646656927,0.29647442348783204,34.61349571149491,11.065289581348381 +0.15090685821297814,0.303860271280687,39.088282406870434,13.574863297628612 +0.1489806346706394,0.2937527850611376,32.72485575533845,10.102024794694211 +0.1492963502074725,0.30225881918690223,29.191203891211742,9.82925207424227 +0.14998752797332093,0.2909312738681106,31.390876833924434,9.472523071756394 +0.14919570697799767,0.30694103684562385,26.44413493935842,9.397383337588453 +0.15019979172213924,0.3064976494948885,32.41986960162854,11.498743462299078 +0.15070191722530388,0.2974119535448898,36.38499488385061,11.73474583611893 +0.1515253233022824,0.3000622615161986,24.45424623152199,8.189796243175874 +0.15167379332329306,0.2989281671568408,33.21827039904709,11.027822257167879 +0.15111264893935544,0.30507577322379714,30.823639530704362,10.719481302681633 +0.14804538264343914,0.29944720586318907,29.008339722399636,9.399540947510559 +0.15273192648133851,0.2968573641464815,33.18474580550856,10.878678828792545 +0.1505495687010902,0.2974536456002474,27.306612591906877,8.861518376437777 +0.14996117368913603,0.2943457514387063,35.686865237600195,11.16463545101459 +0.1475940328139064,0.29834883903691045,34.67596878841765,11.118971246325726 +0.15060888135729866,0.30406808368525134,28.030466239149604,9.774668534624748 +0.1508187350465357,0.307070638566268,36.61210071266109,13.092178565225643 +0.14902666604402295,0.29705163868634593,30.915902866734964,9.868227482453312 +0.15012334242456427,0.30752902235383534,25.920674821990442,9.25477493007857 +0.15116237374829572,0.29938869012121233,29.673880167060165,9.879190837205744 +0.14716669600687643,0.30807047053391473,32.88413452372613,11.535730748825241 +0.1502396993464982,0.300901219435161,28.330886732478387,9.409962887919335 +0.14935949561729153,0.29885931208494704,33.42914925659725,10.883604346647843 +0.1498440094405153,0.29723352366356764,36.22424768476266,11.62321517780871 +0.14895696689901308,0.30607183664782056,26.84162553919353,9.390602833106348 +0.1494042553484704,0.3078667061400821,27.342189765964218,9.718086242706823 +0.14933451168040124,0.3071986697527515,31.015401040501324,10.938539136248405 +0.1503265867426408,0.2961685114688979,32.92513330907774,10.465515549156134 +0.14983936494187003,0.3046654805738976,30.019670920133677,10.359175286166733 +0.15041909813120238,0.31018911572537117,28.487906738596376,10.432961017783782 +0.15159549480395862,0.3007637043939719,25.937445231074356,8.759648303542587 +0.14886355716351088,0.309483757566457,21.01328659927175,7.572320555264039 +0.150752179617311,0.29575768894664584,27.26880463879626,8.719753665640413 +0.1494785282785803,0.3059351253855607,33.18062324596161,11.598035483358354 +0.14925948206658404,0.30524688333395006,30.422475672900255,10.5516014012209 +0.1502916022854355,0.3030516106124504,31.319240722130882,10.705018347911835 +0.1490001330539206,0.31067510111771596,22.464126270461325,8.165204239959966 +0.14773925560537485,0.30703790883666626,21.25498823421914,7.457092926797787 +0.150101489344986,0.30164678044175813,29.487458590896818,9.92325900721363 +0.14911128131729248,0.29718588888321185,27.344918149030306,8.740985937257328 +0.14854489822900424,0.2973088042702456,31.98185317871807,10.19286851016151 +0.14941205889865936,0.2947727683570191,33.9851953740705,10.592158746628847 +0.14936122018958825,0.30578116057325305,29.038745522719278,10.158905289745494 +0.15114673880032367,0.30354247476455887,23.03103946302629,7.966053285317991 +0.1503411567799113,0.30697768183803,39.30724317566079,13.999021405533757 +0.15105472347613266,0.2996169735686692,38.28576639084284,12.704090116037023 +0.15139299745135593,0.2993389008629265,26.753676182640206,8.90336794582846 +0.15064191761943474,0.29852829960359395,32.12431742154824,10.476811111770122 +0.150197633049568,0.3083968720733971,30.787752325326714,11.13493650583415 +0.14774176279401943,0.3101977946859031,31.09475803372817,11.199526092857411 +0.14918767653233858,0.31177204956357163,34.22412317294143,12.58746662147834 +0.15112114512198097,0.29774515144350916,31.93965075660989,10.419866981343336 +0.14996536161638632,0.3019389060169935,28.7566761397452,9.66817398744774 +0.1493737277557658,0.30630772492771874,31.80368597242567,11.193124481926235 +0.14898905411074992,0.3045018692455646,28.61740562597859,9.821272999556651 +0.1523105432518779,0.3004644849817676,30.849351458857964,10.391404312528827 +0.14742204971815365,0.3072980603502881,28.97316470845142,10.118796059011451 +0.15012005019941654,0.3025333299930898,29.62378846967718,10.127140156347744 +0.15076360306880962,0.30055083378714126,30.083219704306433,10.002413449282237 +0.14774774114745037,0.29898294848869233,33.78830051934181,10.919477108804744 +0.1506255164089052,0.30362441569749465,26.158884809403993,8.997229656877021 +0.1500618669117975,0.30020400988387547,29.626278405169778,9.867866113356468 +0.14954372592491003,0.2966790313883309,32.132166684814074,10.203563611295376 +0.15279879538783248,0.28950762209123,33.304262851385694,10.084542940985497 +0.14915975701230422,0.3015906280625015,25.219548581385574,8.452826943368901 +0.14907740456840957,0.3058956773908288,31.662208626378415,11.069475555889884 +0.1489009670635744,0.3015476389547356,26.316141495337536,8.768691722112353 +0.15040775864109587,0.30259821344478927,27.558312881520706,9.327111796184514 +0.1472243227403273,0.30869198579910934,30.908374594522183,10.990654043197056 +0.15090870367118617,0.29401446781053797,32.86923582238348,10.342511408378508 +0.14814522457565546,0.305030735273677,27.68221484796239,9.453099057528014 +0.14963490644660526,0.303098955165886,29.368255265861013,10.059032648787689 +0.151198210097055,0.29885761828823654,28.099624767184594,9.234811336990399 +0.14921554706381188,0.3042906161593349,28.404083008365745,9.778174573962293 +0.15024641531527302,0.30240570232616365,30.44438440359634,10.359745547714281 +0.1498863076019546,0.2987851771117795,35.201171123178746,11.526576855118341 +0.14895581148511014,0.2967824435287926,25.893127168653038,8.225779906122595 +0.1537241241984455,0.30106378664925243,26.217628215120595,9.025076076037978 +0.14908445413709384,0.2913703993026949,34.307075712228496,10.335820924120384 +0.1509934550848374,0.2983794884386259,36.56295130699237,12.054583166590827 +0.14917704466826798,0.2952221615332231,32.308253192878134,10.190490974334367 +0.15063222912051033,0.2995406424695869,30.865623545864416,10.238329688328337 +0.14967489866518946,0.3023697373527036,25.516564069912352,8.652796368270076 +0.14876565383842355,0.3004506053537208,28.643684424144805,9.4815817817979 +0.14979491768061212,0.30097130396038835,27.60908258410998,9.267209030389456 +0.14876016120012941,0.2969464568816164,28.05311601667463,8.981781656933007 +0.14981367925523403,0.2948764050859755,33.50601731386008,10.5259107866057 +0.1506896178007023,0.30572012753160677,30.23584021949554,10.609316750593381 +0.15243986858610808,0.2986552197329972,35.34078198375197,11.736751766408467 +0.1498514574067397,0.3023145182321984,28.65989123655709,9.73219336617965 +0.14973794353484146,0.29862127547049544,33.27937301592313,10.875510798083441 +0.15126033317833118,0.28749122809418715,33.23996007039621,9.786585667731352 +0.1495446565313801,0.29780169482300906,35.53338534264499,11.45485176378322 +0.15082617573720739,0.3000783988592799,33.25006834924283,11.05097604400453 +0.15219647905155434,0.2912563529734065,34.34418015829418,10.583791025068024 +0.14940148959775865,0.29888806435424126,27.509264354132803,9.001649636106386 +0.15025757847894855,0.2968105824482904,30.362226267862052,9.755931540914572 +0.15124259655991376,0.29895477114759395,28.301614393414965,9.359063839191375 +0.15088626447582212,0.30181320392816074,33.94099900689517,11.541376335371519 +0.1512271258648696,0.29897430397573205,36.162024667086555,11.964604484514128 +0.14875836642235374,0.29953924198234677,34.206212951652226,11.200155751707443 +0.1505515177388149,0.30130761226627917,36.018209130536405,12.162356777824936 +0.14795098411128757,0.3028690982786083,32.80147135711972,10.990146056424466 +0.15066345212577262,0.3061379543985671,28.02494372437358,9.889004455209392 +0.1498688962588884,0.3042747364614315,33.224407253142374,11.495620249157781 +0.1511908009081899,0.2997119484121435,34.5040748991875,11.49854148226733 +0.14919401817083952,0.29727460265851247,23.739706063501185,7.601257163175144 +0.1509529340180886,0.30220949312090245,26.12639548000782,8.87752857154905 +0.14948772752465933,0.2999259547186016,33.20767191967741,11.026274545958309 +0.1486349591752679,0.3019949446284335,30.288848401727194,10.152838919818876 +0.1513446849177707,0.29572488890443854,31.659834523778716,10.11892961624331 +0.1473960161818882,0.2947598941578979,30.365672926920215,9.358843952207401 +0.14996077667413607,0.3066571493666906,25.826770918212866,9.056745791449355 +0.15265793617868526,0.2972681847910318,31.29720286764956,10.288777374335583 +0.1492417604472084,0.2929765238306304,26.568839275631195,8.174729966008721 +0.15040357946763352,0.30288980065095356,34.38165836565564,11.702575606891573 +0.14819780466011748,0.3004385530453564,25.32901571279708,8.308012546876899 +0.1507633882125035,0.30557604703980307,24.548169860747183,8.639131048626412 +0.15017079959565952,0.29973940164178825,29.264580213916858,9.680246198517418 +0.14906147535145028,0.2985336340308801,30.496984891246974,9.861557937375366 +0.15050813269843497,0.30031900599836253,32.48606318767466,10.855383436502802 +0.15103612967224717,0.2936868417789775,28.280217907050833,8.876878754452761 +0.15186241427217048,0.3031455275130496,33.8208469929001,11.735049997698075 +0.15185864139833055,0.2956259167608082,37.00160653606174,11.896547625643425 +0.14984246723274167,0.2942681503173357,27.889506808309005,8.70943786300349 +0.1499817950147458,0.30222777973895426,32.05413720934781,10.805688658976253 +0.14848862546753486,0.3055455989847807,29.510163520632677,10.23612894459919 +0.15129089105523078,0.2964009144118516,30.64690884422028,9.911214582317172 +0.15040455379407988,0.30251356444144684,34.949941309274216,11.93079236809867 +0.15014539021924947,0.29892605956173735,36.201172727639914,11.850676134200187 +0.14985837848624214,0.2989250734398376,33.97974748136045,11.04679203801169 +0.15123664103371148,0.2988085881169198,27.314991958444338,9.025691063999346 +0.1514385698313616,0.29616711055042066,27.000425462110858,8.700577618454252 +0.150267348453317,0.29491865363633535,33.372342767494494,10.53105418543387 +0.15008848097186303,0.29969842950694203,35.086746468448865,11.60756674581252 +0.14953789540591875,0.2930842029498012,26.649832577915348,8.18506729121734 +0.15106920111916455,0.2983571357871916,23.28175487057035,7.65758519752106 +0.1509359656941498,0.29990195574388184,29.538083864061438,9.878268321512692 +0.15115501788335736,0.2980387243640346,34.37355300136416,11.2454802129667 +0.1505231310168393,0.2979311562446744,32.4785844680121,10.60033422492411 +0.15137772342566688,0.30124057081884653,30.2694338013806,10.236358786609049 +0.14972691366984903,0.3070264418021966,36.61960663193208,13.010086407743469 +0.15091062143095388,0.2971720230219162,25.000255681661884,8.052370871774297 +0.1511386478466319,0.29634513047331695,26.883437323659237,8.62531195527594 +0.15008462387368607,0.29651094361759306,34.56075023876316,11.07303865179044 +0.14701966409788644,0.3004392741081591,33.85560273829859,11.065562242837624 +0.14867707252776366,0.29723642372954745,39.49476324505095,12.591713864017942 +0.15107986791962177,0.29721859649007704,30.489438377757608,9.89766687599394 +0.15011488875084042,0.30014570682499936,33.7499967787005,11.156958993709052 +0.15221870502758336,0.3084343484274188,27.447044466709684,9.985065883991153 +0.1512509814163417,0.29433003118657125,29.806366898757023,9.41122900682281 +0.15117878805416265,0.29598544432854423,29.061255736555676,9.301509760706526 +0.1500922285589333,0.29706068102798594,33.80006191736862,10.891773547770033 +0.1518879600629523,0.29898065163019705,33.422499113401045,11.091479233322527 +0.15095834497757024,0.30274686697180875,28.426696521684317,9.711058084079626 +0.15079567460919238,0.30515158180402874,30.699130204358138,10.729159162383857 +0.14934075784324496,0.3025310345383543,26.919502673802885,9.153838865481607 +0.1500543144124589,0.2995253449491973,31.62000707458597,10.449382640055624 +0.15155623435919083,0.29961136489622225,32.90123233672207,10.966204958456649 +0.14951995645406604,0.3082201687319642,19.95868440511743,7.097090864042583 +0.14760201438693782,0.3004724537206517,28.232841888116216,9.255904926006599 +0.14779092977810623,0.29071731929837574,32.76202912254371,9.730413085707433 +0.1491623740716588,0.2962389197420503,32.45636496243322,10.250880536508221 +0.14946164117152957,0.29653950548537084,30.464043580216412,9.667011995390464 +0.14949773523804236,0.2969774260578205,23.8620439741878,7.6490579390220415 +0.149960556907964,0.3064415435482632,24.82347834972292,8.77780495740306 +0.1514203322833583,0.29968259716087353,31.42029881437975,10.488567799689747 +0.15055737803637645,0.30630462073295767,33.51689271347229,11.846716321497944 +0.15120864997725922,0.3009440647172057,29.963168545855037,10.085357473220913 +0.14899279212480038,0.29330904312988176,25.62921549120118,7.8817479504385215 +0.15105935335217813,0.3012438082787404,32.960604658232484,11.164264342094928 +0.14784941879844132,0.3079957179141506,29.764299694931147,10.517175839285597 +0.15065036688154718,0.2927757309021103,27.45874628147905,8.46930595825136 +0.14914601331280725,0.2901538908663763,31.888982048951405,9.484488927811588 +0.14893743050870345,0.29711627768431,30.188025048763954,9.658608480162505 +0.15079155143260545,0.29825336392257296,30.654580469025245,9.960743385521946 +0.15121704845259587,0.3044421964303313,27.242633864535705,9.531203494700447 +0.15063654499200305,0.30185562906989977,34.695123633187706,11.817022857853162 +0.14968482659355914,0.3037162050386218,27.555679387581794,9.555450040306123 +0.1496819792395299,0.2989840204308278,27.64664756369102,9.03123425370152 +0.1496333077311794,0.2993908040706199,28.69326418137503,9.424091993197747 +0.14954703288332746,0.3006311534960641,25.34343053950323,8.412849625644617 +0.15003787976313512,0.29660482848075914,34.43554535598618,11.03963931295674 +0.15020503250049713,0.2993006758049192,30.751481624571802,10.123347817565215 +0.15054684233309967,0.3041475918761166,26.76849761760211,9.322336730576316 +0.151176409992443,0.3038507714782511,25.481840204403333,8.85817453451678 +0.15058133634980106,0.29839647203227515,31.410843424644213,10.281842888273818 +0.1501164003578849,0.30290971684315116,34.95081516104412,11.926671744473673 +0.14870870628412772,0.29911373277126313,26.146484303095402,8.534145026886769 +0.15075055057909711,0.30616848674486086,26.923112459475867,9.568316019808073 +0.15074525683937098,0.2918553579684512,31.658167661932637,9.708151450711034 +0.14954554711946627,0.30116243967153034,30.28292408927563,10.161641143407072 +0.14990041386936065,0.30228712199449453,34.272923709166434,11.65939842965061 +0.15045106612158363,0.2990953001137047,28.114167755882715,9.275493092853393 +0.1503863929155109,0.2976212255477522,30.246764388281537,9.751199157027244 +0.15019797827023715,0.3000106448129475,30.88799329891091,10.267543985226247 +0.14966411091296064,0.29763115557517794,36.927849229833825,11.942374095866713 +0.1492068479172189,0.30201974847622787,31.217571536174788,10.498276268257325 +0.1518907073550811,0.2956484448389705,30.43353251824483,9.777252585442957 +0.14955247225066448,0.29815156557390265,27.314507629261982,8.821677053473447 +0.1502436650151414,0.3037466620280247,29.7164154870646,10.231666570937726 +0.14976210244170166,0.2985474226428221,26.70977182661979,8.707835024759937 +0.1512168525523791,0.29655703704774067,33.53122401347239,10.862009990992181 +0.15124997148606492,0.30145148209894385,30.10706251711293,10.215341718284254 +0.15102039477316617,0.3011362668999081,34.2183596729988,11.555388393960992 +0.14927384960338666,0.3000266800372907,28.930875346601717,9.532615066721558 +0.14897381524113582,0.30170070233536067,33.882115245137264,11.331929609037445 +0.14995349467904134,0.30219865676720364,25.209011062506388,8.503995153045514 +0.1488645394878935,0.30362749117716326,31.095209893227157,10.592924690355332 +0.15063115312071765,0.30502852930017016,29.115290844646427,10.198355252383108 +0.14890165875497113,0.2942254254935604,28.82116200352384,8.915033812382127 +0.14893890083967098,0.3041066876767933,26.36411300198654,9.002289613964603 +0.1508052335942665,0.298925637532032,27.16186411164882,8.962375611443761 +0.14842648865049934,0.29962788401843704,30.21863875895262,9.844861017007982 +0.15051416687547736,0.29428404091626553,34.725772830851504,10.87594121439406 +0.1509575144045163,0.2955371444183768,33.07492726899305,10.469402776617589 +0.15176814512964398,0.3026930539329611,30.79893851660414,10.576263476743435 +0.15030164456712505,0.30284831815079044,34.765223990312094,11.826541996156827 +0.15027921642337938,0.30683599634790293,32.51005329560275,11.58230884120171 +0.14728138425921644,0.2926434958218858,31.64923584663656,9.54349678239735 +0.1507575284044046,0.29210042730555524,24.849058613723656,7.684507021154809 +0.1500049250616565,0.3031062058111396,27.194323553502247,9.332150431765799 +0.1487168849670676,0.2964163804595073,32.21573088731027,10.209686191547206 +0.15075699133854817,0.3034139750626313,29.01431882051022,9.989719410597978 +0.14834700891791752,0.29963856881203704,35.08200228687244,11.450391648799496 +0.15182451040441056,0.30392998085130135,35.91982115755415,12.42735166201002 +0.14889302864109205,0.2948418329228591,37.86348995957854,11.824041444916647 +0.1503711211854792,0.2975105405793958,26.840376992498186,8.694657683105342 +0.15125413677062022,0.2921259315315851,34.260986352712834,10.54735717166166 +0.1519646946306437,0.2996683439804958,21.42197425749427,7.17313939741468 +0.1484600934854459,0.2991377244063529,23.710963458079764,7.697749791715194 +0.14891410632892274,0.2988098380563203,31.743169415855345,10.256761434163158 +0.15066958563408175,0.2951500528344038,29.969531644365887,9.53878630645548 +0.15054966845771045,0.3022017488787465,30.747535506480485,10.527917237009378 +0.14806272196892042,0.29465372012727564,34.435503601961685,10.710265284843393 +0.14997172913770979,0.30651510213206745,32.47431075342442,11.417037889899817 +0.15117117131752694,0.2917292272518141,27.764525272700183,8.500357642467375 +0.15159874956945657,0.30115157175264834,29.51188427479089,10.062734759882941 +0.15043374973978196,0.29660831932668114,27.047671261162318,8.706239007600306 +0.1498057484815538,0.30121785119025507,33.89142789793691,11.367397727684121 +0.14789567691673852,0.30196473516278916,31.148834787039068,10.448674031225941 +0.1488294866750703,0.29256419767629227,33.91688094566335,10.34174434433083 +0.15085697837387252,0.2987449175042957,32.92262687052016,10.830422013537566 +0.14920199188867211,0.3008471194837781,29.77245789341505,9.925668151517995 +0.15052748038362745,0.30095241276052387,35.59227534524553,11.940957419512525 +0.15076325794371298,0.29357480346153286,29.340350689559806,9.130312442363135 +0.1501764690265589,0.2995196023313363,24.365027140691573,8.09936415044696 +0.14966904009886267,0.3052383842940481,24.206903430325134,8.445472845994399 +0.14868761060530106,0.2973455630128658,32.29125182245676,10.322375935045311 +0.15063362817850906,0.307037400258243,25.98411130267952,9.292888381135977 +0.14893327816488533,0.29528791586084013,33.565934687041846,10.550531955321762 +0.15017370993630055,0.29823479661294,37.957742666959916,12.436546845933393 +0.15070160401760851,0.30339393884344934,34.812467822573694,11.97663251933992 +0.150832258891719,0.299543367830413,28.108345672654828,9.318232357885304 +0.1495652178989082,0.30892162251966204,29.75510102125093,10.758924632664922 +0.1490765561033728,0.2936808755010839,33.50120921681035,10.357682603202344 +0.1507180329854221,0.30354436302789806,27.86521878224896,9.64179106792109 +0.1497967552535799,0.30216213544523557,35.958024479518684,12.107584721499737 +0.1503944591532032,0.29952990150772413,30.867847503731902,10.16323250350204 +0.14957929628929098,0.30146029662921797,22.82043823563545,7.640989320914041 +0.1502356353774901,0.3056037396018075,26.995701954372365,9.526998896734046 +0.1503338214091052,0.3055681512190886,30.38999455302239,10.708257468749096 +0.1504410029693449,0.2948036468702991,34.35347582213354,10.834846131345344 +0.14856311746568523,0.29654993115068257,28.31349539089163,8.97390091269914 +0.15146680372352042,0.301732767837017,32.497306124371924,11.026076815835575 +0.15042569312934767,0.3005818497522339,35.444084693209554,11.917507516956862 +0.1505274006263153,0.30369060984544877,36.81698494232931,12.64791808385251 +0.15011000129068966,0.3030368117390581,30.093816878650752,10.261939540528456 +0.1515239624134868,0.2980517982761791,31.441045046718862,10.300464234523826 +0.15124208627284313,0.2933373424284313,33.65331225024641,10.497051006788578 +0.14985998052949054,0.3005785195306973,34.28967923656887,11.39011396080651 +0.15021188931656335,0.30171125427496914,28.753124501034144,9.689699131610409 +0.14911313882918142,0.3012528369082108,32.52422251029407,10.890077489548956 +0.15032240581357864,0.3029229043309101,33.70839983360081,11.443637035451347 +0.15085208346857668,0.2989352158071677,36.85363275739923,12.118241764951293 +0.15031841203212024,0.29327163649696353,33.65359890694176,10.435361855360695 +0.14787356351293823,0.30277710444816797,29.265373825893057,9.789588980600792 +0.147614225701062,0.3004627640812067,26.171588071358748,8.602406014502876 +0.14898958289252526,0.3047821475108864,30.778340475410154,10.617208072680864 +0.15152818736152615,0.3018856573123969,34.02404261996352,11.591377767253263 +0.15003499208965257,0.3028292605271953,27.41406625965335,9.379812783330312 +0.15136377013832333,0.2968016101960674,38.35328806281334,12.431948082944324 +0.1498827157796835,0.30843931356550974,36.46909986933902,13.119947155532632 +0.14871337441654672,0.30384476999128057,32.173003035957244,10.945690197405327 +0.15014917077940734,0.2937468278021895,33.408281565499706,10.418815119066625 +0.15302948609505895,0.29789564451548634,27.347464774697546,9.033439218908681 +0.15031386357921248,0.3066368888142671,31.860685450800645,11.323987120272413 +0.15016886402867483,0.30465543523082483,27.771821775415372,9.678442198374116 +0.1502505033534802,0.30017686285155093,31.453346884174376,10.418743623976825 +0.1512462608600947,0.30362550742386146,30.832776602706044,10.64017509880815 +0.1503295284047975,0.2966764728275484,25.960002410448894,8.316749262922574 +0.14952117372988893,0.30165794611401653,25.193815819174393,8.448657346085543 +0.14944276187311584,0.30409938659928093,29.479639548649242,10.130651168787438 +0.1484519765435036,0.2986560450144415,39.04871935204383,12.624017391488406 +0.14871945578709161,0.29947358736515217,34.05779498935618,11.241285095454518 +0.15114992891463538,0.2920878614281889,24.62669395402656,7.5710802071877445 +0.1500224819224408,0.2959402374441665,30.488445405644175,9.648711918238675 +0.1502392934332353,0.3009577572317961,32.36014928630358,10.830675189699303 +0.14974285552240094,0.301591505528705,24.20785628222651,8.101815756774375 +0.15013061630773614,0.29808108589706656,25.150809845683703,8.196801270555618 +0.14967298990034558,0.2997450366378831,38.004137347578585,12.512629895642338 +0.14992919064645452,0.3052126130268347,31.982966766096474,11.244107736229351 +0.1502090834939124,0.304976188279243,30.155283630009816,10.548261420645598 +0.15026848432272913,0.2932701131096796,27.217240708839576,8.450028124342944 +0.14944652947931283,0.3032959770027709,23.6678188520576,8.046422121762305 +0.15040461896191407,0.30206528762025553,27.109039252678162,9.155663379839762 +0.1504922919693039,0.29054118025907455,24.61732150895415,7.447804977599117 +0.14910210523182174,0.2993956696583617,31.589401136626837,10.333482539075487 +0.1508220633365633,0.2988573645562054,31.44945168896795,10.356595799235773 +0.15058994247338892,0.2909510310489874,28.322267752414632,8.623093618504152 +0.14900871860030934,0.29951312054656976,32.533177602715355,10.644224312825305 +0.14929337686013366,0.3029452725227361,29.625730978659696,10.043413877830407 +0.15018649847838705,0.29359053573809824,26.944428272429917,8.355572922789456 +0.15007827273545463,0.30420799629240264,31.910309545382535,10.969322171268509 +0.14993901866203935,0.30066466820325627,36.3791801618848,12.07420164414293 +0.14885856858200075,0.29536921004670624,32.523786928977465,10.198408610603558 +0.14957152920716602,0.2995349861547087,32.33065240642796,10.562178372045615 +0.15051753082043925,0.29992540417637825,33.329345172107686,11.104997219388034 +0.15030228817895827,0.3029717325051204,31.040964576080814,10.615308494931815 +0.1484624525422483,0.2988307561975425,30.05498706841398,9.718551973038558 +0.14888276043656964,0.2969522089042105,28.08023262483907,8.955993133171685 +0.1496719995486927,0.2919109873933123,35.79845797122066,10.965005905284617 +0.15029311495094014,0.3094287001399119,23.45836653918558,8.50727727624241 +0.15091964884714623,0.299963218337733,36.160923779999635,11.957776418657852 +0.15109598329800666,0.3005024472545272,30.993687905045608,10.392037123506576 +0.14965631932309167,0.3019141239628933,30.225162432576266,10.18183570199313 +0.15131396676829342,0.30147361398136524,30.28433077441294,10.329994260638832 +0.15048637978133342,0.2993597464660071,31.84737518883069,10.510559456755301 +0.15016673737018899,0.28999659716589626,35.50364612751036,10.610693607550473 +0.14738591128104175,0.2947372581857313,29.01277831480424,8.935773213567476 +0.1488093878551757,0.30743356580620107,36.335616238205695,12.889863504494825 +0.1517813246349319,0.30324181713326953,32.99783754133938,11.38537009284713 +0.150758728380869,0.2970595202012445,29.24568675497889,9.45656563771629 +0.15131989912749075,0.304031710543142,28.5189431623976,9.908293098869532 +0.15175563571148867,0.2976515901505717,31.920847087078297,10.417592749936498 +0.14824076772755188,0.2968697300776827,34.35004275069388,10.925628780770584 +0.15089729837535842,0.30365925859072807,29.59194908431159,10.274826181125984 +0.15106308040215577,0.3075729492798916,32.37900260840095,11.672886249129787 +0.1517354087338235,0.29025654663565253,29.200397294606937,8.885552830450896 +0.14823542116693725,0.29815827778438286,28.938213478273955,9.264698314041423 +0.15154834876713924,0.29792698181185195,24.008755509333046,7.871932990162026 +0.14959729750167125,0.2994374379576436,32.06393736344493,10.570597731619692 +0.14792977909299737,0.3000417773393517,40.82540593972179,13.351537175515492 +0.15196658111533673,0.2946385411084125,26.09044580106551,8.338997530510644 +0.1510220850504848,0.299738917510093,33.62464381268533,11.196876026008894 +0.15056967118126055,0.2966678130030911,33.61173312173384,10.817619185272502 +0.1517707078250806,0.29349498596725687,31.882869494672228,10.025699943662003 +0.15147506942053213,0.29528351740341396,32.89982952511258,10.474005574162053 +0.1500181040440888,0.29196888047046937,31.410076436487728,9.559782205306137 +0.14868623831084904,0.30016010663540793,32.31530281600955,10.692330174987362 +0.14843661537867275,0.3048619819544252,29.57267827491789,10.147097648772029 +0.14935356041469383,0.3024077044842959,31.254387416036455,10.590472317259344 +0.14929278593165152,0.30429970700145087,32.23894762213105,11.070031787510883 +0.1505337093469242,0.2988069632001269,34.89624555335462,11.493628400831524 +0.15121260121649183,0.3027581628195519,35.08942019399526,12.07934788460749 +0.1489193568264593,0.3033530927076887,24.11312630231134,8.169468146429 +0.15076703786156756,0.29502217255024893,34.08919193457311,10.791119172536847 +0.15054218163325714,0.2967558147490412,31.987682855829018,10.294399367637991 +0.14953055967520004,0.30351860341069214,29.219941031778212,10.002680820875133 +0.14959700788475358,0.3018123199685266,26.10714103576688,8.783203738271029 +0.15117570090083168,0.3040979425724393,24.623430462113262,8.53983093089476 +0.1512568769373476,0.30390501004466275,30.111676917649863,10.43036557237571 +0.14949131369551366,0.29987303894252987,31.667631187325675,10.44095240733032 +0.14900671696079928,0.301513168462388,28.853242167467812,9.602355947064813 +0.14978756623540754,0.2988137179429864,28.60090207585285,9.317503573509804 +0.15036270974495508,0.29006643415678907,27.15392991993081,8.128656074280554 +0.1512837415211956,0.3015567688667979,23.532941899761802,7.975692610765678 +0.1495591644592673,0.3074223300869523,29.786339068072085,10.499009713761371 +0.14828298397720358,0.30549806350968883,26.478325886992987,9.153302662687553 +0.1492822729373184,0.2970438996280207,28.20429896393201,9.095263548669958 +0.14990051644596777,0.30548572048317885,33.42444394001757,11.628652355062053 +0.15005055835352255,0.3031442339835692,30.382556293090627,10.391817052730225 +0.1486067758124017,0.29891551444119185,28.821375362481557,9.343403549793875 +0.1506437316020271,0.30016200232361956,35.844887460099834,11.830060559519445 +0.1490859544222344,0.30457317076830714,31.80362578352571,10.945371769361744 +0.15006509001935886,0.306770807981222,29.232113196279876,10.395637032015946 +0.14932782227031074,0.30045598380072996,31.9918718057975,10.53974966636883 +0.15123907282744287,0.3015247222918784,25.922987946446916,8.796781837609016 +0.1496552659910478,0.29453060569342243,29.463981544514642,9.19744859453254 +0.14875250708547624,0.30144723058369227,25.832422763660407,8.622386789576131 +0.14996107573470427,0.30423699251532155,29.425285949656672,10.219843839859747 +0.15093899029653995,0.28960054393113316,34.13228569972372,10.221225991677711 +0.14955452097681618,0.3013937963023212,26.309347712901648,8.817941914816643 +0.14978146621559815,0.3061178492764605,34.98293931381591,12.24444682965456 +0.15024256964746727,0.3064390527095013,33.191150532791916,11.819635003489598 +0.14882859329938236,0.29936129573981846,32.156847864253315,10.471735546901114 +0.15013074415945168,0.29368661934606727,31.258682223608737,9.711805391483326 +0.1499962394192698,0.30618458846575763,30.75082349140601,10.860163841485003 +0.1483661712219665,0.29489089587624445,25.897643911205627,8.072150279870213 +0.15016909795222208,0.2940812748740644,27.210657771842737,8.53777380221041 +0.14770905240245816,0.2988029679742595,33.04682593592117,10.74821040028409 +0.1504706001374261,0.29360471835183233,29.783580443639046,9.269498121430289 +0.15106720100056262,0.29401558610509215,25.094609778352396,7.943548361001013 +0.15093940259993072,0.2922969940609524,28.880885318437358,8.986781444225661 +0.15175233897053178,0.3038750891284353,27.14456420767266,9.408639459663577 +0.14957513232572367,0.294119013402869,31.947348594894486,9.928199991299774 +0.15039435534057494,0.29539384762894944,32.02003746263402,10.125494170494 +0.15056360878977945,0.30332954606846935,25.313174972292884,8.743527321176554 +0.14939001505792693,0.3077775812330945,32.2496776316018,11.549140382334972 +0.14948332710852158,0.29939340366713824,23.50504751207855,7.674796198835257 +0.14892432182206336,0.2963109690562844,28.98611479585104,9.225921188053903 +0.15005619968168907,0.2971092224727821,31.42829248609925,10.054136377946058 +0.1482419158748991,0.3009716413880165,28.962002423342803,9.617265544013971 +0.15012840183811435,0.2919312229530458,32.36518937033421,9.861727026409891 +0.15020654460440572,0.3059886333848216,25.80801920413371,9.102426706867877 +0.15121393587244067,0.29785226204632986,30.917558037647137,10.122876297971871 +0.14996563010225417,0.30134540552396566,35.12137391320328,11.771037468377854 +0.15029830029940242,0.2949710079177352,31.23133364423206,9.88133328668207 +0.1511119111883414,0.3015865882728825,31.329649884742775,10.62367150512918 +0.14924692296059347,0.2987733718958023,30.27513086974693,9.8587082285617 +0.15127436537312827,0.30154839363563585,28.711165501277677,9.796495236037586 +0.14847706777775357,0.2966056616147545,33.93109741304513,10.726537641138675 +0.14946214455930718,0.28984494673266153,28.212494421228403,8.380500038175887 +0.1506825926411751,0.3064262925111831,31.009909882591167,10.945446748874495 +0.15099243380503366,0.30340702212937015,28.58124642359956,9.801112721573395 +0.1504494182286553,0.3047830913829803,38.47640322115666,13.36450576347629 +0.15106487824036255,0.3005892952081447,24.919222219033635,8.344135055723386 +0.15196836674126585,0.2923502393382312,29.63010102781788,9.19344493910101 +0.14926247152236263,0.2994402272515033,35.52990400329769,11.6920420335638 +0.14976467681821243,0.29670154156693357,38.051075396857776,12.178321145054468 +0.15029593867639982,0.30420229052743125,33.38294066262675,11.523936486991012 +0.14857528292565486,0.3021919233109612,32.19633576988187,10.763034301563895 +0.1510594679886518,0.29973720389448055,36.60107852580917,12.185170673321384 +0.15246804262893324,0.2998333618128473,34.20083288308479,11.500285352995697 +0.1535709971024537,0.30959122838707526,31.668862939015582,11.853204420432208 +0.15123094478754415,0.30549275800011766,30.99913726547713,10.918482367078374 +0.15014861880458383,0.2933854513532002,36.88113647741596,11.481509761423878 +0.15042934534432115,0.3038639078507019,31.91667634402292,10.996945049389945 +0.1495930405242381,0.30331042623897003,34.29334553983028,11.666747088793155 +0.14979711836621537,0.29802794755613404,26.994616966403477,8.769529047466268 +0.14984532953417853,0.29556387253697286,27.0498643164782,8.559434718148317 +0.14869799101823036,0.30434497072303573,26.21586079150661,8.993305473093198 +0.14836285038374317,0.30517211624538715,37.26622461243694,12.852664984418093 +0.14943159371727405,0.28969698619514245,30.66998910233591,9.066638096358144 +0.149940932235718,0.2975049294999836,27.1245990680857,8.762096258382288 +0.14922791883559514,0.2977634618880283,31.13517718691211,9.96238658775658 +0.14926952451310155,0.30083614805899594,31.851987221588303,10.586985105437451 +0.1495666051874417,0.3009023040516559,28.230462642555405,9.443281823166174 +0.15123404167979212,0.3036907729071329,33.631049019883726,11.65065908415119 +0.1506915748929467,0.31007286603300815,28.791522579345035,10.522978193073877 +0.149236094491469,0.2952837526413964,32.337132937049894,10.137734662811628 +0.15027005273435337,0.3033658700023189,26.480970893509884,9.114870928114595 +0.14844500558979445,0.3010653223761643,32.107848308819634,10.681984767554077 +0.14985653448034897,0.30064514440767826,30.196704481438143,10.050163651391866 +0.14953464697694818,0.29900325269412065,34.242284739469646,11.140426989003949 +0.15024043507619017,0.2985587045258194,30.206342209120415,9.83436491844351 +0.15245607917602663,0.30142395567712105,34.34573805931154,11.710476207827014 +0.15007613950607337,0.29951428809644365,25.93698385831209,8.547068560236008 +0.14948567046068434,0.29459933683133566,37.57067084720336,11.799902421384306 +0.14972077488181865,0.3002441567088723,31.9496906294171,10.533847068473596 +0.15032282142747763,0.29885684637501947,34.10185615697111,11.163145758980717 +0.15011087593107025,0.30151323260757185,30.58147659411447,10.299610896279773 +0.15164252198537173,0.29501365807090807,24.532006072465236,7.852103144213662 +0.1496703332648168,0.29424596699080013,32.848038158588324,10.228364741019794 +0.14999798393376856,0.29706567508528287,35.60582101979719,11.435674622125283 +0.15060374276638175,0.29856610266922673,31.134019552887885,10.269183100433752 +0.14995430489691716,0.3018683241406865,24.042705088855634,8.117618952649552 +0.14819069856063,0.30329389305647303,38.994361543850715,13.238693523485017 +0.1510184485200127,0.30247508614175417,32.048296414670524,11.017520555522488 +0.15119218971675003,0.30332837393149786,22.9323035971646,7.923357557494507 +0.15060577459757615,0.29566289570867216,30.654435948931607,9.700718817872058 +0.15033794215104931,0.3042312182154079,30.323577133895128,10.487081761688454 +0.14916663760403992,0.30164730140562657,31.236148612720857,10.511949237930395 +0.1493016947289959,0.3030567651314524,29.057893570185445,9.864812295436248 +0.15172826084290864,0.30051688073430777,26.586032564923496,8.981273370883144 +0.14966676113287605,0.30039227827431575,29.254795160924676,9.6943680767718 +0.1498135767028827,0.2997613639297315,31.03551690024411,10.226351567804484 +0.1503949636328519,0.30230270361168105,29.892999501677544,10.211885598278212 +0.151573802597699,0.2982939553198602,29.42107167630469,9.6998484769277 +0.14831131917804652,0.30058640293349087,31.51515950761884,10.342440708473132 +0.15034405785893276,0.29973775830680177,28.36103096251965,9.379845345378182 +0.14903190317417805,0.3079035700240502,28.3025330722287,10.063550524782102 +0.1478080524964651,0.30955457859831015,30.35901745271205,10.871103933055402 +0.15029019841852218,0.30130550729433697,33.32374829294493,11.203764573589691 +0.14962738778213355,0.2995570057864302,32.16595164112327,10.584775403022231 +0.15078993494856646,0.2984270466767336,31.97557096547065,10.52222327495193 +0.15034022260438115,0.29713208877591196,30.829875770429066,9.901457272457298 +0.1491323979084778,0.3043204588885452,29.74965779562403,10.223674046426117 +0.15040581658257285,0.3005155497833545,29.43965251756935,9.79157941400253 +0.1478512612441709,0.2990195686566001,29.232743188963198,9.470235808418142 +0.1500735641391952,0.29483498293008925,38.76464139601996,12.223634242143937 +0.1487289227115036,0.30412407481335674,29.853001069863858,10.301775850103581 +0.1495354880629886,0.3009103635681213,27.087591140382877,9.092106475576859 +0.14898115608072893,0.305723515109334,24.387767483343488,8.474497798906455 +0.14897699488692448,0.29472217413551693,31.166275609724604,9.766383056288335 +0.1507806833786336,0.2937987107105424,34.40202924008551,10.753586591427483 +0.14946882543439236,0.30557679927484255,31.613262427974693,10.990715626912099 +0.15007446744233974,0.2970966476571149,29.88335297755974,9.577581598329585 +0.14961627985765372,0.29809507390120726,34.31154924430163,11.147886141284527 +0.14889122692542872,0.30256451279338104,31.32402980905584,10.56346332959485 +0.15050269454145407,0.30578553339113806,32.76557981421831,11.567576331988679 +0.15229505271838192,0.2980766828179947,36.38319789957793,11.977440920532379 +0.14886430027943778,0.30531143580287384,34.52110714936033,11.968323603263034 +0.14963434211851567,0.295459189244937,30.302662211960662,9.590708169856164 +0.15016411639580113,0.29662514339495627,32.13514236479925,10.36706838300313 +0.14964471737828816,0.30623342441099,32.11797966513122,11.228588715183676 +0.15089495471534464,0.28669953358657735,32.47598717431585,9.367748841935402 +0.14901439932110488,0.3015817295623231,35.67924275387125,11.9129333301493 +0.15065699854073972,0.3036763041655656,28.312507967551436,9.776709790950727 +0.14922245746610346,0.29832700490896075,31.390042997097453,10.157804154899141 +0.15037367287703232,0.2925690515548204,30.453856114618482,9.403168602634725 +0.15030175150196196,0.30214945370991697,32.583894056423894,11.07201588224418 +0.14976302423069693,0.29803403215069535,34.664996394579084,11.23770611052974 +0.15066174317294365,0.2951221344713463,32.66855482390812,10.304461667937773 +0.15101810601617244,0.29293100172253594,27.392627361136483,8.536144622209695 +0.14872508626990102,0.3008814647672245,21.7817644231091,7.239791857943913 +0.15201803723889057,0.2990632269986326,35.19298258317643,11.613395717018953 +0.15105365960056866,0.29858451747018555,30.197380640425393,9.935498483852733 +0.14904539584416507,0.30301646208662014,24.323889331651962,8.21539122734183 +0.15163033690423086,0.2980432363822574,33.799329180240534,11.093831322356856 +0.14946963993916157,0.29529602543010225,36.78909615567422,11.629944984474523 +0.14918988852785864,0.2940231863042375,30.339571206401775,9.398481960191425 +0.1502965418038214,0.30007676671221867,28.269440520536108,9.414317439700133 +0.1515097059027011,0.304775227234421,28.736069170635616,10.092638780269711 +0.1495828253110589,0.2976348466213151,31.809280218843178,10.285626850498998 +0.14856869286061794,0.30442414789867916,32.283064691468155,11.082020360157571 +0.15073573708215263,0.3018972187753007,30.088391425553613,10.2233142496659 +0.15097968602277714,0.30211186095026205,32.3789178452419,11.019646265377682 +0.15017706037985587,0.30082009425988304,35.36351103601454,11.7893024482316 +0.14828818168020752,0.3042725082702825,30.51656866831515,10.478334292167034 +0.1508488591509756,0.29640717039690057,34.43829542286709,11.085449918410864 +0.14854289556534664,0.2949858792728813,30.643407873853164,9.534437088132208 +0.14944846974729745,0.3001512360637616,29.035524535697657,9.592619040110659 +0.1511193358234461,0.3038840255882353,31.829802691828533,11.065056206478213 +0.15061035143255283,0.30992663218675276,27.13739800766237,9.973450528576388 +0.1472259356960803,0.292873821948525,34.31355818885529,10.333688074200808 +0.1504820054957166,0.29293663947218546,34.12244446399096,10.564758347789594 +0.15002957211115853,0.29204054146181213,32.14621384199188,9.839772179501209 +0.15029129991205636,0.302926946931672,34.88576424559817,11.940177710442759 +0.1490519184371965,0.3092208137824031,30.62775414360587,11.059733703748124 +0.1506192360434431,0.29686306554164565,35.46433093979432,11.445665241656465 +0.1498211913893357,0.3059710905475735,33.17537498227907,11.589815088297865 +0.1499106202647163,0.3052391878799995,29.881247905119114,10.44192793551343 +0.15075946157762252,0.3006716139764046,30.21222067813192,10.14562553060421 +0.14941864819702555,0.3087688492290572,31.011346489877816,11.13137159103197 +0.1503504048849847,0.29452409465573315,32.984415981968674,10.30157179164134 +0.15231336686595584,0.2995847855557831,28.38042668717172,9.498120390580539 +0.14992876770553593,0.2955073007104968,33.84688927454856,10.73014356345847 +0.14778828328970486,0.29554175998218146,35.16309051594405,10.983385609846408 +0.14958180397078402,0.29657019518738886,30.10413394012286,9.639808547729109 +0.14941658735708052,0.3023224618429213,26.458471021112604,8.90399985788873 +0.15054670517225383,0.2938443238772191,28.94806312253282,9.01305642020253 +0.14809105406044193,0.2970556779062674,21.25541490431505,6.754265743507642 +0.14975263655850765,0.2986276239949644,31.757312797393606,10.362837008645783 +0.15108228767347873,0.3031198105675986,26.6938975269629,9.153639858044976 +0.15046852541727404,0.29856093598532274,30.113350600386852,9.874983761990242 +0.1499646622645416,0.2984918196481945,27.807100940766905,9.085050972306021 +0.14733646705132958,0.31225589919720237,26.590665574647876,9.74772233508828 +0.14963801794465154,0.2983725877691983,28.73595081512813,9.369558332461953 +0.15029511066647305,0.300656239004975,32.41485125903267,10.85475495497344 +0.14934110313127025,0.2987606527276248,32.71309643106109,10.631147733042798 +0.15131856242565542,0.29263084290026437,32.93764133478025,10.244594818604536 +0.1508542142177066,0.304585265305606,32.568582245568486,11.310028656859561 +0.1485668797319397,0.3003702945950658,29.60388428417201,9.74775419488824 +0.14808798214606864,0.2982771136447815,32.701877246416544,10.493636595635381 +0.1493555857522384,0.2975563751582676,33.25637625626635,10.729876307909315 +0.14859885165940132,0.29399196516054826,29.43950784204871,9.092754542383354 +0.150117852417438,0.2969059059879977,25.17812588547092,8.115761535597482 +0.1492549549927877,0.2968873683733181,30.45891359866831,9.709929147084168 +0.1509124025985545,0.3020541990916436,31.19217937353768,10.576428810011462 +0.15095647001605247,0.29678947856126414,30.644626116918328,9.849203465645411 +0.15033459171458652,0.3039113140573403,36.71239704942944,12.678631101730714 +0.15003159638163854,0.29579140394140996,26.322359247086776,8.3703114758238 +0.15176791840016493,0.2961909557875221,31.329578367121808,10.13759706794733 +0.14931951086371675,0.2934774643747336,31.792920803079483,9.811213739690254 +0.1494385903976748,0.29849983884466985,32.509333364174175,10.500417985956386 +0.15013535290322963,0.29690211973554687,30.682877330032014,9.83888579036708 +0.1494966940861589,0.3063392998965729,29.813754603674667,10.43408466613716 +0.14871431505560823,0.29883952549613074,30.46311029746167,9.886617007900796 +0.15010738890910708,0.29980573055499643,27.988413693902142,9.252874923285688 +0.15013729898998576,0.2949371164945765,31.267862807104134,9.89156921549504 +0.15050723855780088,0.30575978792356356,31.69148958442447,11.191980545240975 +0.14917028554866266,0.29356131933529805,30.92366236779113,9.548200664643998 +0.14959592960264056,0.3015747576588524,33.60207127262726,11.267490647299379 +0.14964456379453495,0.2959273484550434,29.58575794140641,9.399535250816895 +0.1486305125339834,0.29859172881813506,32.57814235468342,10.494987427389566 +0.15061575573809474,0.30502510243361153,29.741684106244534,10.375878115296894 +0.15078819242972993,0.3079330594219004,36.046347090419154,12.98750247978473 +0.15068822489676814,0.29452844976720544,28.65206436408655,9.040349125542393 +0.150100205720832,0.304509086627755,24.252033702721626,8.444714889250852 +0.15081262193741332,0.2961390177730878,30.68930936578938,9.806830528903488 +0.14951171083907255,0.2989018343235903,28.34341878063096,9.300037648670584 +0.15020592737654595,0.30209872699909185,20.987840718305012,7.104071652179904 +0.14928230993739955,0.305178815499527,36.0740460284905,12.558577348073449 +0.15243122250609972,0.29381058933884696,32.279542284411654,10.21490130593091 +0.14975608415790917,0.3063226007890185,29.929617974990546,10.522990641522846 +0.1519518583900202,0.29549269134844863,29.944448117881727,9.589269820652271 +0.14960138010307075,0.30532195911617377,36.714359798264226,12.783908540477002 +0.1513381247597114,0.3022938272203957,29.57256193317909,10.122499451084863 +0.14742016348772174,0.29804230392400116,23.63076029280212,7.569159768259938 +0.1508788811122436,0.3011513359756591,34.258198291073626,11.495345687046036 +0.14982899787560972,0.30426351790674216,26.863863967461793,9.271968754730683 +0.14895592765773213,0.3023338566832721,34.8640475078041,11.767710338921695 +0.149843441908338,0.29652904148122844,27.470034993196233,8.753383686623492 +0.14869118243343335,0.2914906569034201,32.01754049016726,9.662068460424026 +0.1509533326293663,0.29975110314446235,30.16075104800443,9.99968279622062 +0.15026872128239935,0.3023964658584561,36.1076775035646,12.261560079970298 +0.1495059089558059,0.30203468751484064,33.31421069649369,11.204005475947948 +0.1519729677135393,0.2942390858448879,32.50053461200382,10.316062366557073 +0.1515429988109793,0.29708373018058,31.7577227023881,10.280050704021493 +0.14984015623346994,0.2960191995189967,29.79093951261108,9.50120573611485 +0.15048278654682248,0.29971951315679507,43.15796985567222,14.345835824214141 +0.14911620835477837,0.3098668835671274,34.96104214258803,12.744220199982907 +0.15103311134872527,0.2951589355436554,33.40339822022466,10.670596447363733 +0.1492233648542176,0.2960727504881542,31.853147323984075,10.066029300027772 +0.1511541388364954,0.2966932929987935,36.5113600245607,11.72903458435206 +0.14964890800610836,0.299857433894381,36.17836540547994,11.911300105722779 +0.15084502003737044,0.29427183305578547,31.325843587924354,9.873487873494733 +0.14904632774553786,0.2959303895093903,31.684781236463667,10.03877126080379 +0.14999810677918615,0.308426089727294,28.559957044353816,10.271658734686921 +0.1507735720416544,0.309166400040474,30.04504269330427,10.930716991086125 +0.15213799002347245,0.29195566992334054,31.301913779388027,9.631064954003104 +0.14869342784536285,0.2996925800217488,27.81558077382281,9.059161184667918 +0.14915296529765265,0.30642472330906834,26.794105376723447,9.439291920703685 +0.14951281678534806,0.30602602954701524,33.31097509346966,11.629653940583477 +0.15075171030373752,0.3012043569631422,23.457598493428446,7.9058633835171195 +0.15187371865228705,0.30030071548429366,35.64200335918134,11.96167435980993 +0.1504544588142319,0.29791568586975425,25.955040278615925,8.457068800658156 +0.14904556158487178,0.2967581548584196,26.194804073676437,8.346954160042396 +0.14916263809925406,0.3036509324695845,31.733824884311062,10.846689848884797 +0.1504166952807725,0.30511141515137763,27.38645497690966,9.50517583552963 +0.1518237638743997,0.3084608656971661,34.28351424830444,12.469752280235998 +0.15064377755156577,0.2973977655590622,36.189217947818264,11.75646413668318 +0.14945107990281783,0.30627024178346196,30.895784673755525,10.82479657307176 +0.153075874546962,0.3092038452926638,31.535427149929074,11.64609017306598 +0.1513758310865408,0.29796745075172565,29.58250322883334,9.784147633569248 +0.15008791511188366,0.30016707729214637,30.799763157196203,10.206706850413692 +0.15001836294100462,0.3036653433983236,28.895397736623313,9.991917279607225 +0.1512481417535386,0.3023305880295679,27.784666763475805,9.51674969382431 +0.15045956972581254,0.30311193233225125,36.241726502506715,12.441263093586565 +0.15066670354739203,0.29610240557688217,25.246665377414995,8.045166945388212 +0.1485124729592786,0.3078366436068957,33.97296019928375,12.034676659955453 +0.14747711670244437,0.2957194073946381,24.86512940396093,7.742988269418023 +0.15066759578666813,0.29325299046274683,31.69386342963977,9.885622870390296 +0.1510563186427632,0.28659422675156304,29.297910875298918,8.555689870244734 +0.1494516644647774,0.29993644022008065,28.336291387886178,9.351267581619718 +0.15161683409139717,0.30476336327825854,27.00817101705429,9.470053255235632 +0.14905831750824247,0.3048375834712021,35.224072693551406,12.180733342182513 +0.14919702684568104,0.30071899462840973,24.06725966308412,8.002998014920365 +0.1501634716617056,0.2992221921292285,28.456756380824277,9.354801478498974 +0.14937402607434902,0.29370344802889503,27.1202761540699,8.385355117812852 +0.1484541200649279,0.3020458330149224,30.58205299409174,10.23179323543316 +0.15053540625857081,0.2993223556034504,32.6091123500656,10.776209868568673 +0.15170611011296084,0.29872150499570205,31.50899076345738,10.48362077972494 +0.15173985836955198,0.29525594043788284,28.242838107915517,9.015935753342319 +0.14960984837269484,0.30366258612904545,30.101142830587538,10.363299882677344 +0.15000457230940906,0.2965000521689666,22.590547101866964,7.1911995823474495 +0.15011315700527475,0.2972897651913754,30.217548607899534,9.736742552831384 +0.14997957768805562,0.3039057426701143,26.255442742622826,9.083875774807812 +0.1503612245478511,0.3044532475314712,27.35241093026144,9.54130601317228 +0.15093556892867563,0.2967437162497005,34.026827774689956,10.970173598053728 +0.14953949211170903,0.30029118423471424,27.154113270776367,9.0063410960184 +0.14927420523361445,0.3032515412473108,33.67407410311267,11.442398547796618 +0.14992434108261984,0.30581258866327254,30.8283280426243,10.780464464507357 +0.15132514898323324,0.2983025018542108,33.54658898355271,11.03021673331369 +0.1501750408730218,0.30777668269071,26.9338448798883,9.660872464121367 +0.14969279718448447,0.29905207194077776,28.206741271589348,9.229951078017539 +0.15081262465969886,0.2998605738071204,24.589425604804447,8.170059528272745 +0.14987440005148303,0.299851071765085,27.646879040866317,9.139547944725521 +0.15010238290509204,0.305270414561371,24.903950596280445,8.667927501076225 +0.14931621805311734,0.2990457426194622,23.33260895453758,7.67003201756318 +0.15089689823743374,0.29907932999156545,32.61234053618648,10.78379598447001 +0.15005971835135076,0.29859252528081814,31.314764550285684,10.26099273787217 +0.15012458172767382,0.3012886800514294,27.726753040706154,9.314631200784303 +0.1509276992209322,0.3052936403471904,28.7955295539655,10.133286095200772 +0.1484870517847549,0.2987182338552571,32.4736200066089,10.494782050802531 +0.14886355709859406,0.2962919278560709,33.35827426252522,10.584660725361864 +0.14946046123391016,0.2947879377998004,31.20831621654397,9.776026894226016 +0.14927941501121655,0.3028050797394077,33.28993175604032,11.234396245951933 +0.14820632419588226,0.30255987618440666,36.0969584009121,12.149612076356181 +0.15097068686847293,0.29906105548622136,24.852844349265617,8.23308181086641 +0.14959766787098228,0.30421692933899763,28.53145865689232,9.859100156940547 +0.14814246510283585,0.30519534797132236,35.34362741458607,12.145767913069598 +0.1503396379495941,0.2994137530228159,25.124745245024265,8.288531227142137 +0.14876849980845197,0.3055094092366561,31.094718860237087,10.765890533753064 +0.14832598475870568,0.29689044757437894,35.314182030403614,11.226308235410269 +0.1501055712244124,0.2991027685833126,29.152605158320704,9.562833106142326 +0.14939295098022665,0.2941057608541519,26.130524424285383,8.124635861840357 +0.14961163782095463,0.2940407620988173,24.449323660793834,7.6103776692125855 +0.14907099439580684,0.30097398847461937,27.92472632132697,9.312621993097085 +0.14870034247231154,0.3032182276196772,29.329823789177542,9.926527229636216 +0.1506444429753799,0.29929975077346505,32.57738390070241,10.745552788724952 +0.1521097792871288,0.3018077089978286,32.37398434717708,11.043942759220549 +0.15016203928122765,0.2994893049649995,32.89360255521494,10.888203086153178 +0.14986563126152788,0.3049948198437638,30.429884126822156,10.612359982137727 +0.14861899918167323,0.29863531377985236,29.43082574766197,9.562215464497807 +0.15050136142802928,0.3073271652131244,27.600999490777813,9.857508844443903 +0.14962246410879737,0.30988645253718156,31.053819770304347,11.25597572004028 +0.14947471344233074,0.3071442403773207,27.582968552717084,9.738973582542345 +0.1498440821016301,0.2987496216035186,32.22513447809433,10.586296225390313 +0.1499268635234685,0.30288194081805814,30.099850253408977,10.249635033092394 +0.15171316928084494,0.3067129653452541,31.210970462315636,11.145942602780746 +0.15164523369807315,0.2944032177562788,30.79193545673952,9.719013065466735 +0.14987583957460263,0.2994496095800449,30.214773178069866,9.984043388348637 +0.14663071182531714,0.2984929612524825,25.333830906177102,8.051425076146966 +0.15246909747413637,0.30445389349434687,30.48853162225655,10.682034129970992 +0.14861014412197052,0.298821268347214,37.32471701831951,12.12446954848558 +0.14920583149787542,0.29154072869720454,28.403793469693152,8.636116245319595 +0.14858696037630476,0.2975735846844447,35.58840056036075,11.326177857921678 +0.14969317537721558,0.29496814553357215,26.50084356031137,8.343467900712099 +0.15029768343807112,0.30294768458982974,36.18942176570336,12.341280376804363 +0.15030073026647925,0.29486465352662034,26.346669426871145,8.287884327175115 +0.14993004118851874,0.2887958882281781,33.36712735453716,9.78662803799943 +0.1508832985087737,0.30077881275111623,24.021174521113167,8.05784417088163 +0.1489815478225288,0.3086396075968591,30.00620398349348,10.744233634333584 +0.14887968845402888,0.30128429029644804,36.482724143331026,12.128763260266824 +0.1504453180429995,0.2926372286344371,32.73166493232795,10.06625290657978 +0.1518133898699506,0.2962539698681256,34.28672486172306,11.026579121387872 +0.15116726142309506,0.30787750324104585,30.005710557831847,10.787535414361736 +0.1515489432282429,0.30581690714454446,30.42873479880812,10.82902037533006 +0.15021260437217349,0.30548050607280813,28.524570740752594,9.990589160565722 +0.14880486558318182,0.30897610103228845,34.26344920079479,12.279001319530819 +0.1513317244359161,0.29863947018525894,30.06671109657763,9.892334366131431 +0.1492256156372346,0.2977022266722479,27.6853783280012,8.920452444034263 +0.14892242074846582,0.3035800312670985,27.515039377519376,9.342308600781793 +0.14897720134123674,0.30118078579724133,35.53576077988817,11.848238679077173 +0.15016396775645566,0.29766418827806496,29.097078294606412,9.461986458168386 +0.15080214692665955,0.2996186135273665,33.337915234459814,11.009269945826961 +0.14986425664011815,0.30344246635191197,26.85036834264724,9.203031609581263 +0.15008513686450298,0.30366807337595436,23.054077817014587,7.916443346233995 +0.15035247485473233,0.3097382698789907,30.230629640938687,10.990226332347433 +0.14993975495667525,0.30156100523344975,26.569436428937504,8.968196901362846 +0.1492824903873171,0.3071380903716087,22.918935473945368,8.161907928147203 +0.14912138608553782,0.2989795279623632,26.638574317332573,8.694810440058315 +0.15032983406418024,0.30007686106296866,28.880025656703946,9.591397865155713 +0.1489657558377843,0.29860845883228965,29.664630932760748,9.646077328107333 +0.15014198290068437,0.3109940684028399,36.008073617134954,13.322188716444744 +0.1504234994954692,0.29854896658979196,33.53797891001062,10.982736702673218 +0.15022426968564986,0.2941970353005605,30.29658148022922,9.491879156798033 +0.15025936114329622,0.2960629588989855,29.44034243796433,9.430371934171337 +0.15035027362381653,0.3088554203576547,26.344513675708445,9.57293705265558 +0.14795386377574954,0.2983851438683293,31.220914071465245,10.063321432517037 +0.14817054272801297,0.30040568319095906,29.12824471131692,9.55654719392729 +0.15028692774255398,0.3055680161258741,29.25069580726783,10.290009717191406 +0.1471917474249395,0.3056258982812352,31.789733280525155,10.933399391464249 +0.14998474733790376,0.29541941829728957,23.429808045859275,7.412261431506177 +0.14974700568094074,0.3038961083391735,22.532428738794955,7.761597124682928 +0.1516573156811515,0.29887358133507297,34.534840020700194,11.434363355105779 +0.1497848289528665,0.30348734524816984,30.50376779189494,10.491403983963078 +0.14935389643060595,0.29116085505877193,27.938264356223723,8.453324107028266 +0.1497962332265091,0.3057189392116326,30.591846831922407,10.771275806806422 +0.14883233391858025,0.3014440557517702,27.92725393565536,9.323389903410234 +0.1502987927776795,0.30640715763224224,31.289942878498323,11.162928523196191 +0.1493564927133489,0.29767917270895616,28.45320897970447,9.142101619843656 +0.1495636679391326,0.30136448008653977,29.927657466882856,10.000105701061807 +0.1507716830061682,0.29703543604668897,31.994644557010847,10.370505977415664 +0.14953318138440327,0.2924780049867702,26.696327598434713,8.163167954938936 +0.15273327877786508,0.3069680354185403,26.274204782234246,9.503922861080087 +0.149460073778059,0.2997991240644723,31.910763120238684,10.504848299144314 +0.15190166848841216,0.2944370791811293,37.23451743402805,11.791024987376224 +0.14832790420812103,0.3000894470622935,35.25054624641852,11.572621510330517 +0.15062572050925305,0.2919136307054266,34.81351675585643,10.640147641871081 +0.15083379227707017,0.3044651026508134,28.234280082169626,9.81013764142995 +0.14799698206587733,0.2968838136931571,32.36040447466012,10.264206261446903 +0.15100837724787755,0.30068229231360666,25.199342277051066,8.487124000782067 +0.15099941829846164,0.30127591223860933,34.72240083657862,11.736273969761225 +0.14984442356548883,0.297055313543995,26.909876393808936,8.672201600590805 +0.1507286387504953,0.30246688454220744,30.599288543618908,10.439740753720368 +0.15194001326536918,0.3025651311604872,31.398592478753564,10.877394408662397 +0.1511329684326075,0.3029225548996437,18.63028876719688,6.399280988399067 +0.15082043002824927,0.3024660880921182,30.83527604654443,10.501461233673636 +0.1498710815761281,0.2982346016671458,29.34285346411498,9.50718232216921 +0.14922090669392862,0.2949087215851879,36.28843644144635,11.399013356003572 +0.15222817225288973,0.3036616449152189,34.04223912184769,11.867120110256263 +0.15044844326905948,0.30269794413724727,29.99367347018559,10.25400213878802 +0.14998689612923893,0.30102680834412787,30.42049734096397,10.132641947899327 +0.1493168355279846,0.2961373095731936,36.75377337734255,11.653213166293177 +0.1494493699993605,0.3055435004942096,28.283111120113738,9.86763628494505 +0.14759824884842485,0.30210194149606096,34.31081503762213,11.408485978842984 +0.14925521411450493,0.2955263079249816,26.412378181549588,8.28110303655824 +0.15005669241599576,0.30293548377489604,22.218189603590776,7.592960602807637 +0.15000032143292505,0.302242111442588,27.98017051728654,9.41502567348656 +0.1505351514129424,0.3054099203111593,25.35960004082907,8.971413298557007 +0.15013734647169885,0.30096649722767127,29.990015823689372,10.040379990146308 +0.1502625862492857,0.2990800135028794,30.906641903475926,10.175520011964606 +0.14999719597716835,0.294830119417112,28.45165867543718,8.916207529404184 +0.14981252992282418,0.3012505852448972,29.686187644489006,9.938652206429651 +0.15154124327947815,0.2956352124036493,32.281381857499824,10.324268210721472 +0.1512085130908872,0.29333230773669305,27.701616213725597,8.643185845257056 +0.149424905863411,0.2997989824329277,36.890016628679355,12.139129439631578 +0.1504961555241621,0.31425977970598257,30.28817655112293,11.589553854706661 +0.1488124492744967,0.30099534013674123,32.93900797339819,10.851695251450124 +0.15097337922854182,0.2946251180516484,33.369284187735566,10.530517286859917 +0.15014830810333665,0.29584768089466706,32.418606698001426,10.350687633120097 +0.14886139771325121,0.3018387572180834,26.994048272197166,9.018615540157882 +0.15130061334759667,0.3000243308556417,28.345990679735248,9.4463388147431 +0.15122296095065246,0.29868384484432,27.002942884505075,8.950347972052402 +0.14795985550263768,0.3070089208659452,29.726754230977424,10.412686028188142 +0.1496892070155126,0.29898376284992434,34.06221941581788,11.167611286171132 +0.14929415093360437,0.29780398268037894,31.4827007546207,10.115640678617156 +0.1496916131781584,0.2988147352267663,29.324938515199484,9.580019558073756 +0.1513281016803208,0.295524342993566,33.187172316700085,10.617996166898994 +0.15027967601647976,0.29784412703166996,21.967615203140014,7.170575347190038 +0.15009363822277527,0.30253971187594975,30.20402360032784,10.27984762078738 +0.1505420394411433,0.29667937671914274,27.69172137882578,8.896400222375107 +0.1500331293955744,0.30017839620556186,21.684323036719274,7.204939801831008 +0.14963284219315826,0.29744687779705653,26.28113385616158,8.532972392180621 +0.15068194594943823,0.3061343847286944,26.111733562462867,9.225333583165794 +0.14967599722875413,0.3076800200326965,28.9198519969263,10.324829902129007 +0.14807046998939422,0.2985121199592824,30.76469508803264,9.840437239228107 +0.15100444612208455,0.29745180587405246,24.783041108232602,8.09269156516452 +0.15213935231981682,0.30383307547149085,31.313509736470884,10.952211686505029 +0.14867943043382373,0.3080792655005318,29.106116895941735,10.41933587148494 +0.14930830930698036,0.30585801217711517,28.453975037328487,9.962307414014262 +0.14950856937213125,0.2994301775387612,34.52390648652692,11.268239362409037 +0.15008270299801532,0.3025183373804114,30.753203667349844,10.443333620830515 +0.147888807249661,0.29868405559404365,34.14457109645893,11.039737717620632 +0.15094160846206317,0.29568782076552874,35.772687753485116,11.395273631646193 +0.1509645232189185,0.2985781385934332,29.18280361261936,9.558891816224238 +0.15018806864629933,0.3005184695111801,33.83596761879269,11.3496473461145 +0.14928223410393035,0.29296084046862153,28.250427690968497,8.67941696928371 +0.1501770650248331,0.30818201030567,28.754934083523843,10.35104587990094 +0.1502947979904603,0.2963559000694448,26.694058698378807,8.480370273657583 +0.151131744594772,0.3020070182057061,21.284744901397218,7.244068682612943 +0.14785968642775515,0.30675814450689126,33.27586567851387,11.586668086610228 +0.14900525516544852,0.29696597975616607,30.98592024075515,9.961114817318288 +0.1492805847571378,0.2945825676398438,33.1109052854763,10.352557344103186 +0.15078148296071447,0.29969182290860963,32.96864743573734,10.945011388789153 +0.14851282651401146,0.2916183132153612,30.317250254829336,9.127801371234128 +0.14921877423587698,0.2982639173881653,28.925381995278748,9.36956560043565 +0.15039187606448987,0.29965398441538194,36.01493475976781,11.919092862454317 +0.1481083719775558,0.30051659235748523,25.239066320562923,8.252680218698172 +0.1497863122897759,0.3066948593634432,28.976416587603467,10.230954490672747 +0.14904462241644817,0.30406452476782814,27.21010080318012,9.330363888567346 +0.1489743786483905,0.30382263904150364,27.211541019359412,9.334226473837157 +0.1522280929653971,0.3020264419724161,32.391436329804236,11.095853050158833 +0.15026191428785246,0.2965040354653548,29.056194879822808,9.327388612919918 +0.15087264750373813,0.29826400520776253,31.443131630884434,10.319966865109471 +0.15160047350774802,0.30098844631851057,27.444229343416996,9.245294147609494 +0.14768046274732916,0.2930667749682501,35.273117719153284,10.736042877916672 +0.14990618913307924,0.30127799689737733,24.946552609417438,8.372501808149291 +0.15221840948289866,0.30076299464612216,32.75908648507973,11.087331051491075 +0.15106311356405405,0.30121567658568266,34.0731439216661,11.523747567783262 +0.14911926318439517,0.302321607974659,28.724646739990263,9.69480946935736 +0.1507811028782618,0.2970439092898332,28.62793101162397,9.228297286821583 +0.1493955559484204,0.2988140009918291,27.530626642740025,9.008257231446489 +0.14938779341207323,0.30162462227115816,32.19235303336165,10.799353399620571 +0.15005270405843463,0.29515449394378435,28.036024115388763,8.847496727765508 +0.15043516559510217,0.3020608701856593,33.68921821015433,11.434755287912203 +0.15091623835329154,0.29770312678712785,33.87806857242446,11.050626318243125 +0.15031249012781303,0.2954579124760183,32.02057914739803,10.101605244845528 +0.14949497678899462,0.2984802116314504,30.038440953397195,9.757376696721813 +0.15004301795035344,0.30023018131299134,30.474288331639023,10.11582873526878 +0.15114008108028526,0.30469896553215164,31.136681833626135,10.887815229204415 +0.1488512653493385,0.29856863947108403,33.133648689564275,10.764402495199855 +0.14938064756831884,0.30152732293416945,24.95510809129861,8.356301134165864 +0.15048404276960559,0.29742101862246234,25.5027773133755,8.257472278037609 +0.14972249723558562,0.29513247602660114,36.11891538246461,11.337419716718461 +0.15161875167345293,0.30329994668146504,27.348447368520027,9.450244064427064 +0.15119720345593593,0.29665997579834286,28.187670507731482,9.095387431467882 +0.15012227160020167,0.30277843842606816,25.57051048761817,8.73876602595269 +0.1495970939757347,0.2991464600910206,29.057506719758102,9.545118326559917 +0.1520025955067428,0.30815761185766893,28.701960712750196,10.472143450195059 +0.15056832211425786,0.2995227606784546,36.15805828845385,11.933263142671715 +0.15012785108486718,0.3022570496423323,27.843114886914968,9.481378769334265 +0.14925558949778267,0.29231474294004556,28.36559429058258,8.69239097435106 +0.15137408498196286,0.2988283812154281,24.74927717954377,8.15272647390634 +0.1512526532967986,0.2985003348612405,33.87808964643939,11.152711361712377 +0.1516911560722677,0.30625805760190095,28.96122702649597,10.32784504809697 +0.1509256826604494,0.3067917740647256,30.113577081091744,10.731659594533635 +0.14980057526624577,0.29870593811637913,23.839521436984935,7.763621997331694 +0.15180591688754339,0.28650438799784295,35.006985227903414,10.233984052533854 +0.15011178788595128,0.2962880056798331,37.01079156174243,11.768988543018033 +0.1524013452739238,0.30307322269628706,25.170108472695148,8.752717470516735 +0.14920317241792408,0.30880921562963204,32.879510550644596,11.798266775696696 +0.14880573907496633,0.29927557047780134,29.182586766667278,9.50161739099512 +0.1492125130808436,0.2986644924006054,33.70357641612851,10.939000720689258 +0.14953509791460057,0.2987035017842563,29.440418381217004,9.547129393648273 +0.15207493129631042,0.2943047548166318,27.528801337634228,8.721904798137794 +0.15057456633203323,0.29756614036243345,34.33468153099778,11.164134848358058 +0.150325409543768,0.30036337795198736,28.975500175955442,9.665645465585635 +0.15083696863532708,0.3002733447080845,28.137366354213867,9.359473229034837 +0.14970942519355748,0.3012026555781548,31.809916554047398,10.665514164009986 +0.14896255693408708,0.2983520504582475,27.777092296611553,8.957628181167639 +0.15242307700908211,0.30149223418022153,24.84109159210363,8.479830672597435 +0.15060518830192698,0.29208996040478746,31.888033837975026,9.775207563578924 +0.14998477742896943,0.29964400550504244,34.43155665311746,11.360763680770313 +0.1496866401093059,0.29740447149343696,25.305492835857542,8.142198229250324 +0.1516470146851721,0.30817558160421493,35.117442644466,12.739881437847396 +0.15213351977665077,0.3038491374015874,33.050112553307706,11.50968921156396 +0.14992337437511977,0.29818859037373374,26.701707574280864,8.673109840488346 +0.14864475091623253,0.3025514146274038,36.675428690863704,12.378143495695717 +0.15244074361726803,0.30621651704180547,29.340080406005715,10.461885454655702 +0.1486079386836727,0.3018141498054468,36.112119313324776,12.04943586848042 +0.14819897543526173,0.30355615047733936,32.80081175627869,11.075969099798698 +0.14972386171915308,0.304893640427319,29.790610733601014,10.368572233589623 +0.15025086365921134,0.30228864508977543,26.186279588191688,8.874698120201586 +0.15026688525289283,0.3029337811258193,34.31371417781755,11.702102277862826 +0.1501108112692139,0.2964282232779521,27.317631534558206,8.812731229226713 +0.1498126910398424,0.30417965369645966,32.794245592531006,11.301153705163792 +0.1506974817299632,0.3057821290686507,33.095277678147774,11.552390146256661 +0.14874000475726776,0.2946865500101859,31.326796110624407,9.742173253876137 +0.15052951718889349,0.30082342701116127,25.108513612496743,8.420516371458469 +0.14927104685597978,0.30351183497162193,28.955424616351017,9.85774231850985 +0.14963589069838443,0.2983635373496512,32.93027612148988,10.705746866218806 +0.15053576460028387,0.2946008767435972,24.096850557348674,7.6024963558647904 +0.15062436205024293,0.3013811401181963,31.86341339759568,10.766264206785959 +0.14818169576140142,0.30487275484520227,23.55419782865253,8.091190056422553 +0.1499886751492536,0.30490495084035724,31.771846906437236,11.078823104413505 +0.1507872537419261,0.3035926943644544,34.34574833423175,11.884700678150502 +0.14898145274124017,0.28964097887176354,34.23528904794512,10.126891512483269 +0.14874895985633999,0.2976126211819138,34.77458299307136,11.145460762200292 +0.14948496670293507,0.2959176508114824,32.102081824024545,10.204114009955665 +0.14965217780678805,0.3015933975591987,31.18284449295596,10.468901572260194 +0.14956063368442515,0.3052319520572469,28.890135002136745,10.075331433173286 +0.14893964723123035,0.3022558761126296,32.48206937918695,10.94734995003074 +0.14688478414868428,0.3003855880588913,31.91741543695538,10.380437269012702 +0.15035508586388577,0.30179899749173505,31.140185816582335,10.502961420521187 +0.15091743655556328,0.2939973340503097,32.18386599420609,10.042790060729416 +0.14894560291367834,0.2964818044191132,26.86246237219971,8.542372348201889 +0.14854483313359437,0.30262354291192006,33.39081513788139,11.20643585341734 +0.14962821886708766,0.29731769383173867,26.874271350235034,8.640945394153619 +0.14875514702599849,0.29361653234527835,34.18374290472517,10.43289850608173 +0.14912718817295736,0.2961903636604162,34.12504782251649,10.794049999123548 +0.15181958553483785,0.29860408436378805,29.843128786054194,9.88729749399836 +0.15041845521703084,0.30273525883877533,32.9504853214347,11.186832885564238 +0.15205457474950093,0.3028559302322407,24.865536730262377,8.590437969420222 +0.15041557335435843,0.30268601856826227,30.72241255622563,10.506441093209613 +0.150808313478075,0.3005789226196844,31.38192298166672,10.512310663038805 +0.15034538871716369,0.2986673547739355,35.001483995257615,11.528725114587587 +0.1508814704322279,0.30168125574370275,28.766625677962907,9.74131985961107 +0.1490158166320131,0.2977036058931768,22.665424296448478,7.283357009979763 +0.14979666442266168,0.3023696677764737,31.509743491044965,10.71934821375528 +0.1505171255710441,0.29068190638234,32.15246556597357,9.761765191599748 +0.15013340358829838,0.30740038186083607,33.45087513184034,11.935442883759565 +0.1519787297717845,0.2981165882529669,27.15415962718962,8.924304940325015 +0.14988054934426712,0.30302773822581286,32.704010215853195,11.1248487306371 +0.1495360987924365,0.2969310868400165,31.293193531069303,10.021680319702707 +0.15057718884452106,0.2976580082784839,33.10996067963713,10.7330546610531 +0.1487228304330534,0.30319849788062236,29.1771699099803,9.87336269197575 +0.14905567420144228,0.29959229497339585,28.82540907897291,9.425245181089505 +0.14868281256354016,0.30162546059520795,32.428563478227595,10.808530063364158 +0.1494260884958777,0.2977460684182924,25.112935003887753,8.14363075663654 +0.15133947023668376,0.2998543835987088,37.592191489767956,12.50555865286203 +0.15092000583608917,0.3008955056406372,27.86092727105118,9.41830837021123 +0.1507389074779785,0.29423703350582253,21.67519187825925,6.798172407264784 +0.14843623419335586,0.3041632904485749,34.16295352845209,11.72661037951953 +0.15073957016584297,0.3031615459961292,29.61786423071759,10.144256083228525 +0.15140578191113055,0.3026983774368958,33.25910669226422,11.380231570478895 +0.15039040440742454,0.2958982323868579,29.23422002194563,9.301403258814073 +0.14981423766816268,0.2974147931652726,30.602260616829728,9.858173870411612 +0.1502370150962687,0.29366677041489425,28.670841779042348,8.95038654762077 +0.14854596223139882,0.2993546591986097,30.481005781059572,9.894597873478839 +0.15015093810573926,0.30827334671908574,39.541210183051874,14.204719299208374 +0.14919882203145157,0.300277848773034,32.26306811390193,10.643248672044342 +0.14907910581386952,0.2967624803224476,35.13967609716077,11.182041471950901 +0.1502606484475079,0.29900150747158055,32.06443728488079,10.493890824667554 +0.14933446222009128,0.2989022237158591,30.37209021895631,9.978807042600481 +0.15024074017308872,0.2925352908679993,29.97315922427273,9.244565507764525 +0.14999118987874524,0.2922532353038687,35.2496605571391,10.759938635280989 +0.1485914866981715,0.3087040890872049,32.83673645538393,11.825493709824274 +0.14895914538233693,0.3010829233816725,33.35022956933008,11.076158608665526 +0.14903948682847723,0.29416477437503247,33.98862651702106,10.54423115330366 +0.14830904145437324,0.30636900476862977,31.76259189173235,11.053745410921715 +0.14992175446621292,0.2935526204274009,31.89899967186903,9.90523893260138 +0.1505127021450571,0.30038629388056615,33.35902232235886,11.143127713554062 +0.1493911814223313,0.30527275630775885,29.123289663260532,10.108494518300258 +0.15077551245921803,0.2959661269467682,29.9478264662559,9.594593460372373 +0.15048334142967915,0.3035201547362843,30.1045813996062,10.342143804805152 +0.14954218885044496,0.3032719975516333,36.753363912518466,12.464360820670006 +0.14995557387272285,0.2949728621735323,35.77194822337479,11.17866561095538 +0.15010397167640352,0.3029141122170916,29.755680607867593,10.124794162555025 +0.1509633469090302,0.2997935772809878,36.92148788018323,12.284076654300842 +0.14962446385733896,0.3011647704929971,27.428855691695485,9.164989627809618 +0.14998663957924588,0.2911912177678153,32.25693807185051,9.687922214739755 +0.1518683747642769,0.298858945103879,29.872822611319773,9.888616762439133 +0.15225959401162578,0.2985468134695267,31.706712905546294,10.483080250571932 +0.15047245450993887,0.29492921594632276,33.368831093712416,10.489479199238955 +0.14984687532024996,0.30090596518292445,28.30715371793389,9.451482988248781 +0.15243581817553165,0.2968625600840603,22.536531549513676,7.371573715857619 +0.15187376601470845,0.2983711305207364,31.664041150606266,10.452818724802956 +0.15111741068534718,0.297440508865088,32.46207374753361,10.54723698754527 +0.14981772972620855,0.30108720466417777,34.78965040759686,11.677204407725677 +0.14826348778023474,0.30146727684783875,32.767285175178706,10.895482148978816 +0.1513766289367511,0.29572060346576773,30.76942989854546,9.822019739986208 +0.15135014506248118,0.3021741270526886,31.603354609243972,10.755675896199723 +0.1486383440875989,0.29722273858919357,29.96394681262076,9.529230924042128 +0.15189866667649038,0.29785271713249717,29.76801433636954,9.73625227497407 +0.15031687526101448,0.2936701632163496,28.060600102469888,8.704546157890038 +0.15035834677434534,0.30994681126795987,32.691262120545424,11.90153300453965 +0.15027019587758644,0.29894798838651543,33.62309096177642,11.038233067655451 +0.15020374256526747,0.2980894291003046,33.87042773952535,11.029121150207176 +0.1474740522254742,0.30332729960474014,30.364271246706828,10.229618148421276 +0.14959699146109007,0.2986334024857134,36.61030329007141,11.946214749544279 +0.15053011300252067,0.2918649678858111,26.80323112543837,8.217188107771332 +0.15035752891563312,0.2956455239999933,28.99612589991693,9.213784398692582 +0.14967691438823194,0.3000727884522262,30.774799934422443,10.164447244215495 +0.15082194173870858,0.29809176748277355,32.85084521786257,10.750671445915277 +0.1499383803488793,0.304107145927933,25.380411319154078,8.752910108488743 +0.15068555576073825,0.2966042008050907,30.601448672888083,9.874377579430755 +0.1514367571409839,0.2981518028145486,26.372580392289027,8.669837517039095 +0.14834098525580833,0.3027777751156708,36.58898656043898,12.287030495901982 +0.14977628097229392,0.2997052104469754,26.240760300001313,8.65925686594563 +0.150643100947925,0.302288271728923,28.281631931544872,9.61822124916888 +0.14898356485586034,0.3079496818587827,35.66933459332304,12.681634353035731 +0.14951053591730526,0.29978987583836425,31.447615920488047,10.347293799941689 +0.1505627024938917,0.29466891866021677,37.94228245290978,11.91199196066982 +0.14989560873063623,0.29969860316037855,37.078228812534384,12.308836723721328 +0.15190362265333873,0.3016199295312082,30.52011479320811,10.35382192080045 +0.15051690616188634,0.29498059433075907,30.464121540940344,9.676866880704647 +0.14994678244497345,0.2977087015284275,35.01784118531437,11.287145033043405 +0.15156698267641203,0.30262712754343374,35.136985756897616,12.08467957477632 +0.14945043435615676,0.2995632332255712,30.905255264879482,10.101374706824439 +0.15018947066619628,0.30234784507004114,36.71236511604527,12.405903138988842 +0.14822956302683712,0.30570911123023803,30.054760454375625,10.414024755433557 +0.1495296269998208,0.3058501636576577,34.8282115009899,12.170158773014872 +0.14924355491648109,0.30582183807197055,32.454611952421644,11.267361734579971 +0.15094024428219932,0.3004432513101937,30.01068157321523,10.077152461057176 +0.15112634086391144,0.3036609828958633,31.346497931586047,10.889596973853287 +0.14967421626033448,0.3000955256395234,33.22706719556286,10.978414733736054 +0.15139795459378583,0.3028322081918244,30.07799228373364,10.4089336987374 +0.15003066651132227,0.3014667759668776,28.33673153957974,9.469629921484088 +0.1510828814651715,0.2964010035291382,29.214172116439403,9.414397112763027 +0.15032601732625392,0.30354094372600665,30.965630419758675,10.58093791110108 +0.1515891672649942,0.29529387363277376,30.32259482349002,9.6656130529125 +0.15016903562676973,0.30377587143681445,26.973757329744313,9.214255594645321 +0.14832542185236428,0.2972143535554744,37.98391426195752,12.096884867541313 +0.14904975911375615,0.30051888879180627,23.585822884672993,7.810308005796969 +0.15033547489582336,0.3093301851853609,31.92586290048714,11.625898577532325 +0.1521731811672535,0.2982771781154603,30.822286853263,10.216994542825283 +0.1489718548210939,0.3026478527962207,22.027517984647478,7.456751834977917 +0.14953516681740536,0.2935369689195258,35.19610210508812,10.87603681264883 +0.1489228190179259,0.29950726111170733,25.76557692631601,8.426232597555902 +0.1478966444142877,0.297890814029667,34.6369113780826,11.062427456510699 +0.14941494795930088,0.292707226649036,25.482868046918266,7.814336521145477 +0.14894124066952769,0.30097493272912906,30.519418994165925,10.175104713344705 +0.148255898366642,0.2981466590148759,32.432301192709104,10.395759148289969 +0.1491221958347865,0.2952332935983251,28.399007659301187,8.932168098313609 +0.15173668602886603,0.3032318315191781,32.86117318742091,11.412157127368344 +0.15155745390097639,0.2928468324545638,33.99518923056355,10.564307854390917 +0.1505342492797515,0.2989127297191076,26.150535419349477,8.647319427417088 +0.1486535623398866,0.3056236869496995,22.177181903558292,7.681015120851905 +0.15131870672002226,0.29633802764698236,33.07405751670692,10.626570376397916 +0.1497012045820449,0.29839091040652693,28.605646563782667,9.284460468673855 +0.14968908514563126,0.2959262944660851,28.407098537743458,9.04850036818359 +0.15150892933055,0.2938491524296571,31.39705578306925,9.812686789579217 +0.1498383213345217,0.3003687351574979,36.66966873274587,12.164549441625999 +0.1493262384102258,0.29838443611844784,30.179307977625474,9.80094568260822 +0.15133018305928017,0.2994736763771403,28.443375915027666,9.450862405057096 +0.14812724114631057,0.3013400350963725,31.503811623849572,10.48759803839701 +0.149102508150125,0.29597422578351024,35.38654614132557,11.168538588521699 +0.14920028547970546,0.30248712583082865,27.99970882664968,9.51503416840568 +0.1500121850413416,0.30601152086361355,20.641804469953325,7.243760988122401 +0.15057626152206843,0.29735070699882515,33.92986187827747,10.999087385002486 +0.15029434606220002,0.2995230643351861,29.018779531873673,9.577835817955815 +0.15026058839465115,0.29566600614662647,30.884592681279926,9.775147566357493 +0.14923054593951401,0.30500014363477146,34.6205765896816,11.9519026268492 +0.1503751182258582,0.30724397851783636,36.82974258808557,13.136329518255415 +0.14736539667172774,0.29295985830391935,32.31414686175476,9.766788134743045 +0.151436666735034,0.3029031852182668,33.734978571721605,11.66342262438646 +0.14999580781187805,0.30253235627113617,25.24618749626313,8.586963240176617 +0.1497855262381143,0.2974763045756337,22.80422479015791,7.332009937150737 +0.15000913605364022,0.3012970395266194,30.07177376426583,10.049747486979495 +0.1502697517442431,0.30372832571076847,35.01389516538243,11.983889359421985 +0.15009548489417443,0.296236732954601,30.713681791677583,9.780406638274213 +0.15050356834797207,0.29505399065504406,32.04455660781237,10.1918904804869 +0.15022570537396598,0.2955751127534145,32.59555437240464,10.364451579743173 +0.1541253544048846,0.3004515748836325,30.356597337777888,10.377847975842611 +0.14909308227950266,0.3108749915738339,32.65794601044207,11.955397616999566 +0.15075031662406957,0.29410718145052794,32.98148975378295,10.341071696570483 +0.15027640388126415,0.30271297222803584,35.8673575079377,12.258373509441494 +0.15012699323718334,0.30396773242785124,29.605231536088525,10.173169642879389 +0.14847893873819612,0.2978856755764521,29.03176852609575,9.298996727797807 +0.14932208868156813,0.29682994155084913,37.931109558774196,12.121541960357423 +0.1484760176088163,0.29323082779311155,30.58232519199428,9.344385668123754 +0.14955007006584428,0.30428150510949575,28.539893795676832,9.876179139846768 +0.14875930381496902,0.297063314758587,27.66309360547066,8.772014397997182 +0.14804469175991514,0.3063638129261576,34.930603032211316,12.084066090442631 +0.15049015806552257,0.30290816321999897,31.89697299390119,10.88324944178865 +0.1491134500042469,0.30204026296487946,27.349176736700393,9.180196510289905 +0.15011277287212096,0.29324960594050575,37.824564519376565,11.723865303409909 +0.15008027665698848,0.29899392841126576,28.69117537459435,9.379253045386427 +0.15007647871159227,0.30030529597488287,25.757918629692323,8.524865702555907 +0.15115936149630305,0.2957195802393353,35.9906338767519,11.5118336189257 +0.15064831024824618,0.3046260458722657,30.06259569307638,10.424443933595269 +0.15061854061738042,0.298651842685468,30.06563900185221,9.877213710634713 +0.1472410114633279,0.3046053679469337,29.365277940573637,9.961421188773118 +0.14885271575033618,0.2929230177866814,33.27832795625487,10.144988988669086 +0.14763158385478267,0.30016643013789956,33.95751607022685,11.1688710491121 +0.1481331227520816,0.3056443320514526,33.20105326079599,11.51808569209138 +0.15059581778922207,0.2987190835351159,27.739652984504797,9.098552323255127 +0.15096322172102536,0.29620597936477244,28.152337846860718,9.069890936191646 +0.14796236694144,0.29540086953130834,26.003689366961517,8.120686990122989 +0.14852248281736602,0.30301847232268253,31.120503951316074,10.55749495439212 +0.15199501900506654,0.29834275943558053,31.90023003122476,10.566760530851038 +0.15151692292434182,0.29808091482146903,28.790855202768014,9.462445543245378 +0.1498160108603793,0.2995151857952507,27.29833029162393,8.997101616007386 +0.14829429777762995,0.3010163145079291,31.424286638247416,10.427643958937841 +0.14769255667161754,0.3034204733095527,28.19757013946703,9.532978217694039 +0.14898896817657564,0.2990338791200653,25.809761326170367,8.41263004540696 +0.15074153807620777,0.29655949037315066,28.001490157797264,9.024752047221845 +0.1493168277589642,0.3027254519479955,23.284140620146275,7.914455012435694 +0.1503611186602556,0.2926156562218475,30.736034028612934,9.521811403857292 +0.15293179652456165,0.3010022951070993,28.782444286325596,9.800103166743373 +0.15087276622315324,0.29779155412550723,29.29994431511974,9.566762735038978 +0.15099772625666125,0.2990477316028815,32.094884719567936,10.586004424647749 +0.1510039740031792,0.3048556433323015,25.84446807859412,9.057696379014065 +0.14984147589714847,0.3020788842734044,33.49062803443666,11.402008529541865 +0.1491864374768795,0.296324292505538,31.158599294004592,9.90043845529374 +0.15018982046007234,0.29787068226744956,31.47530671378272,10.238081568873996 +0.14966174932865067,0.30403623490480475,32.28499886121257,11.088480395553287 +0.1478033462397156,0.305319467022185,29.966428201006128,10.280193519546396 +0.15063383620037016,0.2978734472046847,29.618379387831137,9.68047930873138 +0.15130208967867814,0.3004945108738517,28.30268091560731,9.561907316102051 +0.1506814775098273,0.30180755907834167,27.880083461224373,9.366857234422884 +0.1511572348280962,0.29979050077150404,31.038376166518272,10.360140877006076 +0.14866869753909778,0.2926709201661216,32.88745158662809,10.009305914272359 +0.15226691699987518,0.2937388887104163,34.95530929760862,11.0096746429252 +0.14934006534291994,0.29310247245463866,30.27405786892086,9.316492146428859 +0.14936805154714156,0.29359338176888433,23.918886405768276,7.387981622739293 +0.15005757084794466,0.3020044903894831,31.330718671532377,10.600543462985913 +0.14851388340801255,0.2953337556609643,34.87777080389785,10.950662194226238 +0.15009109692993175,0.29799788272338024,31.882547685634517,10.282570526416867 +0.151085086752437,0.29797857387418974,25.168008518328755,8.220848236698597 +0.1500094072603394,0.2968654789132185,32.58699250740536,10.488327722177884 +0.1516036468440127,0.29806408418627883,38.49098255722489,12.632209192201381 +0.15063048670489304,0.2880238754315832,33.22747928071147,9.73041491135319 +0.15219536853327797,0.295088082986279,31.14419732748949,10.007163006350808 +0.1518362714714353,0.30573901702423795,32.73018437466706,11.578871377212147 +0.14990365919096119,0.289869061110288,35.27973947432988,10.508634421777819 +0.14885078497388307,0.29913259202099884,38.280275028124976,12.510183824812295 +0.1500465318909749,0.30095792543855765,35.16279112465505,11.705435000874463 +0.15084583043640223,0.2932465747424362,33.85954000166095,10.549285365796267 +0.15063091187643252,0.3026180578043312,30.134962218085207,10.294715467750898 +0.15072915811492968,0.29506268733874186,32.73815725806781,10.388533999765423 +0.15086560649258787,0.30181879568734565,27.65584021249451,9.389382614327396 +0.14893432591318886,0.3007101712127336,28.048323892048117,9.300555531458098 +0.14934633656986754,0.30082631782538016,30.10128497124913,9.9827520039988 +0.15058346830024935,0.29682860520845117,31.884864277758993,10.281198846924365 +0.14994273821151236,0.2989563573587353,28.364413772967644,9.345919607953862 +0.15046381671226747,0.3009938504914261,30.024701639162753,10.064183109961856 +0.1481107263873777,0.3106386507421088,31.500454428379335,11.402214536797219 +0.1522505684958246,0.29913747085798403,28.003161494645294,9.277244563468384 +0.14969038052892794,0.29641869520628367,24.250115175925863,7.779955055511824 +0.15021846496702582,0.2950626207440858,34.49071448013288,10.872584559701343 +0.1496622898512506,0.2961421327800227,28.560521219905844,9.0327199960694 +0.15111307091653686,0.3063462819345197,32.09247145107929,11.403729931050297 +0.15147229652945604,0.29924370233646647,32.40231042428168,10.727319280927055 +0.14931289322021388,0.3014478817018315,27.542440212213013,9.220504517908674 +0.1506799074971242,0.30051954428720556,26.23776865396159,8.727972167286268 +0.15022615587462393,0.29312475834557883,37.4106389960629,11.54473073316374 +0.1504079496538665,0.30017375463371293,34.52954170915029,11.480378500856457 +0.1504346870265654,0.302949244717278,39.79024715832648,13.564020694553422 +0.1497704180402627,0.3014060622463955,35.68777566068148,11.982445409830543 +0.148830586548473,0.2981893944101862,30.139032442716097,9.700975719940493 +0.1498133356169675,0.2971894475072934,36.15541910062582,11.66058415988126 +0.14934627471315728,0.2986112300270741,32.9730824649199,10.726389611560371 +0.15013194998655394,0.2973389539899595,31.53572770683821,10.127925173972598 +0.1504956745283661,0.2995677114014686,30.97322649672768,10.276708450475148 +0.14935023906071948,0.3010877991019005,30.915131094911388,10.282805375579395 +0.14812241357389902,0.30475855087982257,29.95201686315676,10.24123720097579 +0.14989669811128958,0.298461373196468,33.09700324799643,10.744100919658022 +0.1492561659217553,0.30327440436437786,36.303340172485264,12.400366943248542 +0.14861332050276532,0.30663652575002853,31.697723233930066,11.082901234306297 +0.14802988450220764,0.29465175364442936,36.7316098408919,11.399667714265444 +0.14808982819166042,0.29819576526769315,35.38188412573766,11.44965389920476 +0.15110079294968418,0.29813795048313524,30.209822424408816,9.921130617775239 +0.14860174946799598,0.2996874790399959,28.975966700244093,9.433671311768398 +0.1519268003305498,0.30259144873814214,32.14781077467938,11.046969291115612 +0.14884350482969838,0.30617372380367774,32.204948185321996,11.26158747795014 +0.1504164928599217,0.30005962127732644,29.848425658530587,9.920749853573188 +0.15018789476123962,0.3004224858254894,33.00674236009305,11.018850819662257 +0.14989464923363205,0.30344596557262643,26.214870284490807,8.956724033868175 +0.14898227844873121,0.3132645358180188,28.108834132766663,10.551836441551044 +0.14974728228462691,0.3022633765423788,28.07888026698464,9.467948600832127 +0.1523054714012482,0.2971129000915304,36.29044532214442,11.823021112413187 +0.1495608733225599,0.2917387152760334,33.02095387898269,10.032267876599438 +0.15022830637641693,0.30025239867977005,31.66147781026031,10.560162304860485 +0.1511251602278049,0.29830688012048223,26.293626988146933,8.623960905439844 +0.14859821078475055,0.2948076983961369,29.623880310023214,9.172949198030988 +0.15060779333658947,0.2948601130379905,30.04808116876368,9.519607543522763 +0.15225786250725795,0.3031859355821476,32.94167394413386,11.411783496390042 +0.15084560136804875,0.3058825595741398,35.08423134472492,12.337344496166878 +0.14906769286433283,0.3037442358444106,34.22823983176138,11.712661282028284 +0.15019023858742317,0.30852169543721936,31.72471498798709,11.347519824454352 +0.15214655950602984,0.3045918874699029,27.39729923676181,9.660427536653797 +0.1494396910553607,0.2999942935879489,32.75525706242243,10.826369523752588 +0.14966725637120973,0.3057204094279874,26.218304354032995,9.125035875219087 +0.14846685105564017,0.291805880053344,25.813355422725905,7.791538141358105 +0.1489397926141716,0.2984140877050535,30.156884011046824,9.75630555258237 +0.149294217538122,0.3114123090671663,35.69749033730956,13.117261533941036 +0.14919096631247186,0.29820338218289383,36.127863871944726,11.695763584782329 +0.1497126466264272,0.30257572664234644,32.40779528517657,11.022718274035775 +0.15122992187880355,0.2944124652446419,27.764984326158224,8.758252768327848 +0.15101154289755866,0.3009151077640613,31.115682338068872,10.4537324881121 +0.15005176329466977,0.3019602629327272,31.52397285499096,10.613874924364499 +0.15120698377981412,0.30130586504744034,28.489327578015487,9.61334981044518 +0.15002669293883,0.3006834850556554,29.649186330177386,9.876739463228597 +0.1505652096586512,0.30134604653327723,25.09934580064816,8.47754809376351 +0.15029425731807475,0.3040257183343747,29.820254089447925,10.317144568404991 +0.14754226060636277,0.295373441009842,38.41431242985151,11.877181332337956 +0.1493858122890561,0.2958833198427828,33.82930616283398,10.68290199077261 +0.14986449688394698,0.29957046280098615,29.821992445587224,9.770760639111494 +0.1496367540079199,0.3002724208142547,30.69765363934773,10.16058117723614 +0.1489719573974355,0.30260524473037365,22.005483270771357,7.482772959608084 +0.15089198638756454,0.3022787685205133,25.58102899361957,8.756225333836186 +0.15190337414508878,0.30178780224239304,30.454234865060403,10.449089921509202 +0.15053105342290185,0.30644323179590416,26.418917028438685,9.422455120751719 +0.1492466377192569,0.30122371217719435,32.00922903523707,10.704367210336057 +0.15150227241498618,0.289205335809165,33.97706275463741,10.186864461243795 +0.1497251606159094,0.30082872857891746,26.630621379953197,8.881426185824573 +0.1521442762197517,0.3058244860946295,32.10218377687763,11.524860244093162 +0.1510610867889601,0.30474779291952486,30.252421794452076,10.571288238035349 +0.15113640307603035,0.29674573091382633,36.02377841698766,11.6470087552758 +0.14954285733444406,0.3068643682615875,27.19871334816883,9.600354192765712 +0.1489305318306452,0.30063984548988654,28.21553103825766,9.379663588253973 +0.15102257906447664,0.30038933694176717,24.731427101611565,8.26554090478089 +0.14977734341497934,0.29963063232018555,24.02740914838079,7.907705235749013 +0.15136062020006774,0.2985463466605579,27.468347540156387,9.065545047123626 +0.15160505418070755,0.2944455122834969,22.198497229012176,7.047818248732284 +0.15142169418789814,0.2998678515096012,30.389223322759502,10.133264743071111 +0.15124235621566215,0.3001343894934945,37.133010498358786,12.455808923133633 +0.15322419643205012,0.29625866497199543,28.286926014356634,9.245588466871451 +0.15182002799044503,0.31313553867361654,28.06361196107925,10.679060364378989 +0.14895866669005625,0.3015752702256339,29.059504664438307,9.702656208372137 +0.14965264472088438,0.3008599472111389,35.37087390405713,11.842693341287399 +0.14904772487506102,0.30543244202842695,28.492334688827185,9.881478787621433 +0.14926271553756862,0.301336232359347,26.341280732068192,8.849011147729058 +0.14823410521307318,0.30617905633684794,32.691322942859834,11.383213314099596 +0.14900561998996026,0.3036881231762268,24.33115911683444,8.292501816497323 +0.15143854744628196,0.2958779812321583,25.129058342172236,8.066105606583164 +0.14989297196548387,0.31007492595056785,25.66650949355442,9.392550856256872 +0.15085176574867082,0.30321210854245556,31.28464734775251,10.739376159245959 +0.14861823649256442,0.30294499716514567,33.129519747684796,11.111786944053247 +0.1510948574668594,0.2909132333519007,25.108503358711562,7.643009249650786 +0.14874447595416243,0.30001806900747424,27.517948605910433,9.018044971214799 +0.14990617425815922,0.2962007482390801,28.67453517084541,9.147810939910197 +0.14941922601634963,0.30219102378555474,35.579296143591925,11.95819258110935 +0.15092340675121352,0.29941264484115837,28.760134933461693,9.564020605591743 +0.15098478335341817,0.30112322661412466,33.15040852296728,11.162146744754397 +0.15169710791057792,0.30435413477724266,29.113324949625284,10.155092572894294 +0.15079847170199706,0.29293909677534474,37.09023087116677,11.564023918337094 +0.15127050907939035,0.30566304279433704,31.187007847405106,10.925097167927861 +0.14932354432414074,0.2951760086454565,26.20140117994901,8.243983301479993 +0.1495345774688778,0.3031471043674174,35.87318147045349,12.187311163105646 +0.15020680260867653,0.2987871224042107,23.64620522346327,7.765457237006853 +0.14933175612877905,0.2959127904806434,35.34437988362145,11.1875385728892 +0.14964744773590982,0.3012767617295626,26.978608141682614,9.021664508189168 +0.151145371777391,0.30051029398959794,27.11569227431594,9.106186671732084 +0.15111955167466576,0.29295694306018033,35.488265569215145,11.066496313314644 +0.14971940502963643,0.29818482164800797,36.225830863171026,11.751852630894621 +0.14844470660531048,0.2981811702953357,31.431417900754628,10.152141175623852 +0.14939225383637997,0.29563432727383315,27.208364011550376,8.568257630636538 +0.15017198536653975,0.2951166341953343,35.11423429089011,11.08040484706066 +0.15011315158496144,0.30271600345618455,32.43881885057949,11.036882359738408 +0.14992216664467153,0.2990871181528048,27.118617657836957,8.86366722133734 +0.15175406886338114,0.29670504087922767,32.474843472313694,10.47386135973643 +0.150127933206049,0.2936240137629463,28.007121095296352,8.701485835911893 +0.15036849881143918,0.3035837196838063,31.09839903842599,10.717982896647312 +0.14941907541743543,0.30109077129859835,27.8014635226147,9.23392852879676 +0.14906286469676874,0.3109754999834244,29.21009422167637,10.724307807887305 +0.1504970875809081,0.30291645025656566,33.21441327446024,11.340373445618006 +0.14896210366945206,0.30203667872603285,25.89583835748918,8.690948022677132 +0.15128921703570983,0.29846953166160833,24.617717808822785,8.131978501014634 +0.1488725249346793,0.30148616462831496,29.252164038388667,9.74820577783682 +0.15117242370617887,0.2995695301273475,28.962572808333153,9.62962219798294 +0.15022239163387566,0.30434209506533694,31.543667279743396,10.967257943284338 +0.14957530807736327,0.30093737586358743,32.348605481583235,10.794051141420857 +0.14912582179311112,0.3049678947152007,30.76968555228279,10.613918426805496 +0.1496386797517009,0.3072106658179281,25.85457676891932,9.198425578542896 +0.1515675993171849,0.2978501224463362,29.469686803241498,9.652752847318808 +0.1500297924694628,0.30138410209185634,29.724173335132342,9.957973209466008 +0.15041352228833896,0.2979384023138176,38.68980179184523,12.604852751008584 +0.14918815200313923,0.29183427495423425,33.458283947861496,10.140648608083001 +0.15071152894797057,0.29832892972832353,38.387858462146355,12.601504026459208 +0.14986652747449822,0.3066474503327988,25.651208947296563,9.059638940159171 +0.151561693967517,0.2927568654541119,33.295312503291754,10.341066129705744 +0.15086294999832375,0.29763717654564004,21.744149338192965,7.048884840944611 +0.15256479599414996,0.29415933695187657,27.962854041051393,8.902834396999987 +0.1512074376777576,0.29659193776537884,26.329704675953167,8.489946238385286 +0.15075946854027344,0.2963422943240921,39.60367759354076,12.697384159384901 +0.15091058474286814,0.29625006798650644,25.12926605902006,8.088442363062612 +0.1521340700130335,0.303414844263604,33.55805825268406,11.688944607548681 +0.15056411287505123,0.2980821551571164,34.85711830668656,11.403214969134735 +0.15055837156094368,0.29737321282557255,36.02893198369916,11.69868036242822 +0.14995617149883886,0.29787116232945976,31.08820042039598,10.055997490359635 +0.15023082391935225,0.2966363398033971,33.09250364731737,10.64315935280745 +0.1494726904573847,0.29964771064536977,27.174538708162476,8.965135396486836 +0.14920072834562562,0.3064964410402077,22.778640032474637,8.031898358089402 +0.15147178868725927,0.3047472274174656,40.93979616455492,14.271121717263156 +0.15132870536557433,0.2998870104596311,27.87978606331332,9.284929045384395 +0.14981101103111522,0.29761004567993304,31.076909101720428,10.089171783479022 +0.14927347022090487,0.30520977169901803,26.916700514251357,9.30385142084077 +0.1478053152370585,0.29381871293393946,33.77511051100764,10.405804969249724 +0.15203011339355585,0.2979734266429518,33.427208213918,10.957501805474324 +0.14952889971886757,0.29797681069983173,31.716868079212063,10.271564353479542 +0.1493101122266086,0.2937132681251049,35.7528257981979,11.093519480421532 +0.15081589742144147,0.29713834350148005,29.446001575331437,9.492752464592886 +0.15101117697387964,0.292397404298454,30.701605434161163,9.46361387862647 +0.1491520864309564,0.30547216654865955,26.166749444370666,9.1455255227331 +0.15059247080512933,0.29768760284348883,31.176957197773817,10.125909202310742 +0.15133852724258548,0.3014394760106775,32.582137157495815,11.01871966749891 +0.15094814853062322,0.3071505506165795,28.325168913752357,10.163478449827538 +0.1493840112107584,0.29489207138094714,30.46932622774596,9.525443529513161 +0.14880854376055452,0.2977761789325469,34.50303285411248,11.114008517527502 +0.15223426719742603,0.3054890888998048,32.38573643326654,11.480336320832942 +0.1501488958172099,0.30386209462866426,27.295798831660232,9.363534482697851 +0.1497384878839139,0.29263416121062436,28.60287090020875,8.788433165366559 +0.14866834602223822,0.3051387761227575,31.25323272516459,10.764370733721872 +0.14888610625422405,0.30183085480543775,30.266480886667647,10.135247680042836 +0.14974090982936505,0.3020660096594753,32.544570471828855,10.97218986969217 +0.1521298637222844,0.2993844078537772,27.324380455095028,9.137778967575036 +0.15043668583169326,0.2916470504709213,32.28562412235744,9.857861000927526 +0.1503224116176071,0.296749151256866,26.726582823233322,8.544967889621184 +0.15018367744359695,0.2994759326535422,33.74031154881786,11.133827018471907 +0.14931394600667658,0.3010354208235388,32.021040696786436,10.710487059446583 +0.14998424910574618,0.28754859802615323,33.68595141255073,9.791898334294954 +0.14961392165771523,0.3015330409384611,25.217375803164902,8.493563802153865 +0.15053486931035737,0.29888191085825133,35.20737012181189,11.486302712368355 +0.151142586219533,0.29778372305645195,27.03883686627093,8.823299133649241 +0.14894826676660325,0.2918400317845817,34.141419407230565,10.32387492883728 +0.15018379273216284,0.2960231801001271,33.75459338646803,10.811651928335586 +0.1506718259056363,0.2989787978138815,30.178258842110296,9.928258137909094 +0.15014415150861565,0.290915497153799,29.944102709680642,9.022925002584005 +0.1480310157137127,0.3028215192862707,31.89268952213591,10.694691272908768 +0.14996134204222694,0.2974932247769126,32.26728830357885,10.487942996793732 +0.15034071134023674,0.2979739878101016,30.008760392673665,9.860086600171636 +0.14909155066244903,0.30156871707891,30.782905181615323,10.304133052165374 +0.14852178867457222,0.3067924998968724,34.21845453470047,11.966155296267727 +0.1512506814955317,0.30213155838835193,28.82714246112647,9.830896485709994 +0.1495571476787501,0.3005010150069177,30.787242705571426,10.162159194800498 +0.14949883834791064,0.2980819377813016,19.6258908978537,6.397772198785832 +0.15084007937242583,0.2961632241753646,25.952239710678967,8.28730874771679 +0.1506545264657286,0.29656219397990546,35.7965638060532,11.536390672964867 +0.1516477684486405,0.30075570777629484,29.402510400154082,9.909401372167569 +0.1496047314538365,0.3016821358845868,32.6351573917845,10.92338220146636 +0.14888934930908235,0.2952514109433,30.047070401267252,9.388801729904365 +0.14861533212939357,0.3005917926606154,34.90578674998347,11.529410543901207 +0.14922286098631735,0.29866994812324027,32.57027551713953,10.61792734206064 +0.15065703720230675,0.298943170846755,29.377173456210226,9.71039984744528 +0.1502155017551837,0.3016186214100062,28.63154783804462,9.643395259747725 +0.1491486372197899,0.29944895380753417,26.706146263385428,8.778457814857441 +0.15086808975830185,0.3080825928796563,29.529543909566176,10.647273703153807 +0.14934790055401306,0.29962122900531424,30.983280585215127,10.245545568601331 +0.1515831586600561,0.3026301976868861,36.4562194944923,12.547735637778032 +0.14910593781848044,0.2948255540853559,31.24849391843507,9.827977117224076 +0.15103257492283975,0.2991321740705448,30.083590960673412,9.910015801452266 +0.15166254789709696,0.29455929920605767,27.830511240464887,8.873359474051721 +0.15074327180274424,0.3017558614717207,34.59588783921133,11.682467177715024 +0.1510608713235501,0.29896309740494736,28.820325772372662,9.498277388967354 +0.14777732884950742,0.30000172492927263,27.68298074483772,9.049637951007414 +0.14979211952961013,0.29339258200200713,32.95323455338379,10.259793187733061 +0.15095525933221648,0.29474443866357813,28.602314532354846,9.008429806042852 +0.15035433986595811,0.2988222829879352,32.01360599093954,10.542340322790563 +0.14750188812901335,0.30364006141156796,34.30074730639062,11.595623388092449 +0.1504791539812429,0.30204651126913884,32.77281454600361,11.148147845681782 +0.1492416485679526,0.29709710286880975,31.12619777780687,9.947950416856036 +0.15017366299012835,0.3041146862391496,28.27865264321392,9.824269248310651 +0.14839609954423916,0.29995316359199725,28.74228086073487,9.400082102196803 +0.1492446337581718,0.2962007342539894,31.144262743131087,9.898108080112248 +0.15140404301143381,0.30053941556347147,30.417202505995732,10.264103906179074 +0.150442949910232,0.29339147656246206,33.481859265304166,10.402088021535837 +0.14953665119713627,0.30009377341384075,31.310048372875727,10.37342296677762 +0.1488861425588887,0.29919176370096817,30.63692014990333,9.963704582919277 +0.14950247892925136,0.30370134831252193,25.188874401915577,8.62972413882716 +0.15220577924821688,0.30529913582169177,28.41838377578928,10.13501805247569 +0.14979055224481774,0.2975311008612549,23.058283298558667,7.471389513606323 +0.15070262307354995,0.3017957559481223,33.603330063451125,11.362312493987947 +0.15202844963798107,0.307598262964139,28.31409712817746,10.273603230781486 +0.1511315711701656,0.2942840776145417,30.500411218717208,9.634320831173573 +0.14908571755591962,0.293805979587032,26.792266049604052,8.251382679744808 +0.14990871542608614,0.2994830878797163,33.756139837226904,11.110804754760034 +0.14955308892528868,0.3049899705269227,25.16086034680267,8.761036080197803 +0.15055353447564473,0.2982317943488366,29.134731378819858,9.456379970033511 +0.15089446491319494,0.2995502491022185,27.999742866030946,9.268509450422663 +0.14961168227650315,0.29747741934696964,33.25837885141998,10.67293191854527 +0.15173476422385293,0.3058457713873027,32.546363179702524,11.488558520973434 +0.14899129336804925,0.3085183296164596,29.462853474235914,10.508219363752321 +0.14880087583163304,0.30078599143067003,31.312820759347503,10.344466244148961 +0.15185280753832014,0.301097799432167,34.08964958414464,11.571705746281204 +0.15149786666976914,0.29750639973516857,32.820818800950036,10.699817752184854 +0.14951829097215283,0.3022263242869996,36.65908855590047,12.331709429953394 +0.15150307452008413,0.3007483184923705,35.317748904629795,11.967028847366075 +0.15093507337281828,0.2923859682610989,28.227785735261786,8.652626441499697 +0.14871082347643194,0.29822038096405024,30.282944197321953,9.703823815943897 +0.14975117624955195,0.30078366796927136,29.44162765625469,9.776070308947899 +0.14953845579139444,0.2992642658157021,29.490424576603434,9.627338942129208 +0.14968005104502005,0.29652347913511706,36.848887909614376,11.75124491580683 +0.1503928045995043,0.3057638308924176,35.22296066512316,12.412338113581262 +0.1510290761450909,0.30176757038235696,33.44946674370856,11.386359809265437 +0.14967251523433858,0.2975295584201429,35.53523220957442,11.506425548838877 +0.15174707403638224,0.2965522213707628,28.851603917384136,9.394251107211947 +0.15104598098775351,0.29547170730558664,29.648837853554642,9.430004343976206 +0.15029232141111662,0.2953800550655445,26.366623541425675,8.428977806155663 +0.15051548994963002,0.30434660820759446,31.370205778147625,10.828580780602662 +0.149809091704635,0.30244855913974156,26.08814004309508,8.865835620982448 +0.14898567174917257,0.3035883558151573,30.201274317898058,10.322624598287563 +0.14887104084292638,0.29419070474778297,28.703957801023364,8.929079470385005 +0.15052001383088737,0.2971864947401284,29.127662769294613,9.402419299681794 +0.15151567902251742,0.295795539261503,29.740264041164995,9.547748548255436 +0.1505796857389685,0.29946214850449815,31.008913265929074,10.215326004523678 +0.15143304649420267,0.3040776968131699,39.92561655358517,13.862457004382225 +0.1497195448311107,0.2972571200862042,28.32587027990827,9.093486229302009 +0.15119790714136097,0.29681228191937464,26.04978670814032,8.404798095039222 +0.14987354402325684,0.2900341734434252,26.530923795304602,7.9185370812721665 +0.14952876177248123,0.29895970188307947,32.900135256727815,10.804866704973763 +0.15000533438179742,0.30108848785158343,26.20527835290352,8.778910160423719 +0.14897510910960718,0.2969570626750955,32.135284310739934,10.212086571470058 +0.15077275989119177,0.30692324397186743,31.647578858898683,11.308856584866088 +0.15041264595985135,0.2979900298950135,27.451462481800363,8.973301605247967 +0.1510344149399867,0.3005652675399589,31.50016163446022,10.567032474837383 +0.14852155070840928,0.3122976006149431,26.784356697344702,9.883214134179356 +0.14916463478027822,0.29819907021399306,28.273823761094597,9.150887552458656 +0.1513765609507791,0.29405142155869907,33.899093257815565,10.649806100646774 +0.15009394595042144,0.30737037958901614,26.607599435579694,9.499680749009011 +0.14943807510159646,0.2955714186034058,34.679680629203894,11.011560035676531 +0.15065666978335784,0.2961919776732675,32.361305175736675,10.44153231603996 +0.1503573423874384,0.30630699116151533,28.42476004751399,10.061499441009095 +0.1485305666734166,0.3076325030141995,27.00556497102724,9.585118379103307 +0.1498645987871358,0.31130995990397176,30.12235734934505,11.104001385389955 +0.149613547462557,0.30136674962510906,25.395497076052735,8.489969402228283 +0.1508462590124835,0.2995741362538597,26.4012322294235,8.76599343545489 +0.15184264642439255,0.29157404108685947,31.175073513407856,9.602563300719648 +0.14902708025334177,0.29920606144446443,30.10617091353026,9.820289591814513 +0.15067925143318403,0.30021348348902127,28.419533771472825,9.526138506174336 +0.1491333230639334,0.3036205244871966,27.97583055503591,9.566800422520473 +0.15011938192646496,0.2992628248156925,29.56845844602312,9.682032608720256 +0.15010133842038284,0.3086003223287547,28.309488888131042,10.199500932842986 +0.14823542770895357,0.2994313915598302,28.04282202719333,9.122037185348661 +0.1496992930364272,0.30541445290457114,26.611269414647463,9.29961820624645 +0.15104270107094583,0.29755254980832435,33.02016206502069,10.79678255209703 +0.15047958742121037,0.29825871539913207,28.72303669756765,9.321673550143162 +0.1505266803275588,0.29929573229495027,32.10690764117034,10.54981803794392 +0.1507756720093018,0.2979962710538632,33.43703938201512,10.872928476276089 +0.1502191945541916,0.3047626420083809,32.347995577292586,11.267130753810077 +0.15079658249355812,0.30406515022357794,33.71607050255752,11.693614598629372 +0.14800605909233314,0.3051980238187954,27.841508262129892,9.617138948591503 +0.14956072434879308,0.30106041627566793,28.234560637016806,9.428547387987035 +0.14974056096969024,0.3063803684999037,28.011662585021984,9.859588998656694 +0.149748465585612,0.29554550797923884,27.869790916554003,8.886555579997898 +0.14968690340760352,0.29500297270217196,24.679872733312475,7.7256666619817 +0.14946937122029516,0.2961629380540845,38.74878436190127,12.250217548053737 +0.1515344500512161,0.2944219919265016,34.73872011294477,10.981216205738567 +0.1497758646224404,0.3015951844868561,33.01143945917801,11.085392527731745 +0.14968482461378135,0.29482269263604205,33.40750485413376,10.50125961595117 +0.15017562679644741,0.3004621131945901,35.22726688321199,11.7467347403298 +0.1510504598635516,0.29840205477334897,34.17635408335288,11.257622298446048 +0.149343492370526,0.3064716726792262,29.904360240296075,10.584249256027228 +0.14933207032546078,0.3037492864274846,22.77859756334208,7.76264002862742 +0.14936464104755526,0.29785777313010764,31.96978923889302,10.331561288589917 +0.1518412771895563,0.2994739605102518,30.201337330420078,10.123159621927957 +0.15186406232421334,0.3063044089776712,33.452334349509364,11.918410430123709 +0.15063330584912726,0.29208438208066906,39.99279445217967,12.26058834675306 +0.15016536003182393,0.2984169796198786,27.615038222475047,9.01478188715027 +0.1501870338592334,0.2964432680071716,28.69189501184259,9.242616141283198 +0.15087485633157044,0.30223832971972997,27.307615420325725,9.371387621303093 +0.15001022248898382,0.290054268613154,41.82188749997335,12.597111291659678 +0.1509229912489039,0.29282053531408725,28.985317309374118,8.969141727805312 +0.15229196140962825,0.2993102554101151,26.4344045043552,8.805186100314476 +0.15111742383059157,0.3114372136531628,27.38210080286549,10.176549939157905 +0.1503161130804667,0.30172310527093477,27.428194281679417,9.271952657699885 +0.15088942587935258,0.30293962172235944,34.55649754746703,11.82732179983293 +0.14968347004817967,0.2963681507678417,31.6686442713841,10.071909610944154 +0.15121548300945423,0.29935537318548283,30.764580687190946,10.268309031748062 +0.1496712805259904,0.30268975871505416,36.14961770685619,12.295691464811078 +0.14988978664065455,0.30104385035006287,29.49680977930108,9.916412745526547 +0.1507718846600001,0.296087914366192,29.201373658513827,9.34899272291679 +0.14998810080052064,0.29906604484174776,28.172674329139873,9.229284528048545 +0.15036948988425683,0.29647951671551354,32.559920287163486,10.414828944459021 +0.14994258538276717,0.2945250821124289,28.046889308522328,8.808079298686172 +0.15065895017558212,0.2995442437423178,38.1196634358324,12.586851288226853 +0.14910340508092693,0.30597460652679903,29.378356860378403,10.279660903076387 +0.15021687872998443,0.30243021178272517,31.64099182658393,10.746730881013708 +0.15029389176663036,0.3073254360362671,31.49963100818114,11.209109847829364 +0.15098178955569894,0.3015026429644915,29.381772942858035,10.011548144629886 +0.14998407323899132,0.3033420623055259,34.73047774847678,11.89325845068741 +0.14911413997671102,0.29513167956418984,33.82609652006528,10.640128675183343 +0.15021296747843083,0.29362966531270995,35.95831394020289,11.167250573333277 +0.14987248062936742,0.3002577710729399,24.098789340422023,8.000105268791062 +0.15135232283735608,0.30157132984740626,29.315174399759858,9.977251418957046 +0.14885805625036697,0.29417866078243804,31.917689450149755,9.879495051140061 +0.15039569861527252,0.3037316621056822,23.825414358736644,8.26254613412473 +0.1503412335326959,0.2953960426019914,26.520821103336996,8.413805602380233 +0.15184348060687908,0.3035138456633141,33.12726576611029,11.506401747558224 +0.14930499604914743,0.3015342195214826,33.66274701094979,11.272261034140675 +0.1493676515996755,0.30551357611837265,23.666249913295722,8.275274925329487 +0.1494298072647658,0.3025664247428508,27.563567553961484,9.367600114146345 +0.15007814088649948,0.3000549342854823,34.09165457913022,11.332599341822851 +0.1494891405939133,0.304940521099979,25.5188981534343,8.841653147115647 +0.1520684367029533,0.30333074619473405,26.263149334026245,9.118743523335933 +0.14927726563185265,0.3017961691331789,29.287114938756815,9.785472991324657 +0.1480269603074748,0.2965944756056452,31.87575975821562,10.107630019042514 +0.1518193094698921,0.30294483925519994,27.958077471475075,9.642311244121093 +0.15097303675808948,0.307196442565776,22.12392205821388,7.93656320522342 +0.1519735606108645,0.30841532883341555,27.89363843770941,10.164819134198458 +0.14996791377911878,0.29582664441056306,28.081467166050544,8.884566517679108 +0.1531689991449198,0.29433693707958725,29.549678155116666,9.446568279792606 +0.15123880820516833,0.30377784793593926,27.549991752148834,9.529123599289019 +0.1500749316737607,0.3041549480576537,34.11535572262504,11.770923466036407 +0.1502942310389208,0.30185117304749415,30.081066402119315,10.183267013302787 +0.14932002409181153,0.30089938882158723,31.91108532321774,10.608848081143748 +0.14903441523397976,0.29467251606634565,29.031538714306475,9.10003613525027 +0.14919764360713542,0.3015096936019632,29.649247987895897,9.920648330026053 +0.1504178720967435,0.30167584867698904,25.204712060578686,8.472776777918977 +0.14937428632792824,0.2954677970000206,29.201837100627788,9.210474370105015 +0.14923659850703425,0.30384504232515536,30.632543996385866,10.458092930323943 +0.15168119400094357,0.3032390531296838,29.90878482000189,10.405293610530896 +0.15104520883768593,0.30909414245148314,23.27815042665581,8.479006516768493 +0.15096693220556273,0.30583673014123547,28.732627440425958,10.135677913412426 +0.15260862447714585,0.30248374768612657,34.18650288453313,11.838722770648536 +0.15179227721233832,0.3045880136891935,27.639786003554775,9.665437249008212 +0.15022802182759984,0.30523732169773543,29.3574639188076,10.243633006787688 +0.14969412482666858,0.3022224370478047,31.274326669159144,10.611566293486629 +0.1486690385772201,0.2985767400811006,25.270347501749338,8.158969082500693 +0.1506723929492869,0.29874290483693544,29.86431806301067,9.784359472470458 +0.1490988213219637,0.301807980469396,37.012204771860986,12.381478724596835 +0.15165348101340928,0.29542307905843057,31.796588923763906,10.14508242851292 +0.14924108140551937,0.30937697248255797,30.29057818174489,10.922984186189638 +0.15067285073314496,0.30008675738002444,23.94532772351791,7.965912387155629 +0.1525580814659607,0.29608549021037606,27.13980955828739,8.798245675546216 +0.1488520047043616,0.2938426557564193,36.26600887791395,11.161192830944437 +0.14854610757163458,0.29746645963126167,33.061016509568844,10.589611368351761 +0.1503403163716151,0.30304841201678334,24.652837787619198,8.455667527047247 +0.1491654630906485,0.298159298536353,31.992245699835102,10.333431470014016 +0.14874977844241816,0.3005474113701993,35.16661275448858,11.641876831380314 +0.14982798489329338,0.2975900516824233,30.92905084326061,9.953034698933799 +0.1502784968557064,0.3010514805195591,25.7901368657444,8.740547268320514 +0.14872629376831528,0.3047199337580296,25.765062555081542,8.86842327286035 +0.1499447015755763,0.3078349636338116,31.28391105076725,11.140847784853893 +0.1499804679737111,0.2908019844851951,30.167974328875005,9.107846992720729 +0.1500712367313619,0.29543334863141096,30.31430523862297,9.552872401198497 +0.15191481088892564,0.3025726775450782,29.90973595829352,10.292087817382015 +0.14966547007599815,0.2997420801022403,34.373567255400424,11.353208562141775 +0.1518013590364544,0.29540493294027537,31.72180445494497,10.182001083148872 +0.1487280216495855,0.2911403045553556,31.50306957958248,9.471416107454315 +0.14944237471776173,0.30892328801401375,34.88899396921994,12.540344894459622 +0.1511286811310313,0.3030573071722334,31.067358551571452,10.69783314868141 +0.15099472297777933,0.3061067800941891,27.527539529535467,9.705992018742105 +0.15077150788550756,0.2940615128990289,30.118299828754527,9.376212489706758 +0.14999115056648413,0.3061321324250115,29.916347750418005,10.476553940631478 +0.1487375524605342,0.30231389238414536,30.841355684601066,10.373484579760536 +0.15069986825794535,0.30048525301507906,36.26397486944406,12.090702059402926 +0.14870475167174868,0.29807045850494357,28.56265873841055,9.169442020910662 +0.1523782134317165,0.30576346710508756,32.1821512187119,11.431026081304616 +0.1504590293608006,0.29670122119319164,36.48025074863726,11.709446244654666 +0.15101358843513132,0.30960752722614965,26.87718189221372,9.873518327348648 +0.14925675864194418,0.30449861870596395,34.15268368801648,11.758455161207806 +0.15032526865802828,0.2994120051766088,31.634118034225843,10.388692619478775 +0.14897868392468921,0.30347987840336516,37.870246469894525,12.882938727156004 +0.15033547315302165,0.29424555820972587,35.36830686428407,11.056759620587576 +0.14961787032965754,0.30502439582941426,27.610174174348963,9.625944976827414 +0.15090436643043184,0.3018468564086428,29.881265904641808,10.107684413867466 +0.14990028378740047,0.2941607298435432,28.259158055442075,8.779197772945894 +0.1505822056785037,0.29770832089490573,27.99663516690238,9.135687449225397 +0.14968624223845758,0.28751959886636175,30.564632886228885,8.845362358018036 +0.14967474554887353,0.30188488937383756,34.49988748256376,11.588681363609691 +0.14954807707502596,0.30498880298153697,34.96952327862831,12.14518303032861 +0.14950125468570355,0.3007746170106346,27.455615810509208,9.146313683986227 +0.1514378921196374,0.30281247944731726,25.92234356830935,8.940960277737116 +0.15014300421380464,0.3058694756975804,29.014745948967583,10.19000508001916 +0.14884711706718887,0.2922822147255014,30.030813477359064,9.114208557338348 +0.15028306986615797,0.3041773500103569,31.697902555516077,11.006777935958013 +0.14967562457293263,0.29384700645155193,22.953836430368085,7.145231709855658 +0.14916196598130044,0.299986672144408,30.3838394732929,9.995705418271783 +0.15053444544225805,0.29778573770123695,32.559939942109025,10.545910701263361 +0.15031606768746014,0.3049145962833051,30.866558394995412,10.768989206723667 +0.1498781448851506,0.3014155997121122,28.09299886904244,9.43872349700542 +0.15045520316462554,0.313148763552408,26.503646353085053,10.028786455323218 +0.1504399148819768,0.29903316922606626,25.490417733822856,8.392393403052093 +0.14951578875272567,0.3083124021224467,28.381332384299416,10.14422925273544 +0.15139838673974115,0.3037531366058669,33.16189789898312,11.501398125230772 +0.1492815558818799,0.30687509895790427,35.405547826753896,12.530772699271555 +0.14973598468331248,0.3011453420856062,27.606940782416117,9.19685412157689 +0.14896151183545464,0.2960874454788772,36.32292505781397,11.542395925038445 +0.15056321735472536,0.29914837871775,36.41021646373123,12.044131753496337 +0.15296797459352632,0.2919507076384568,33.39068463728705,10.47569640503674 +0.15032417050023703,0.2964351288527715,37.44123425062528,12.076377250171044 +0.14904507900004393,0.2883954189827876,33.78670937856983,9.998770239140066 +0.15001202552660098,0.29779136354324315,36.003361330421754,11.714174979184413 +0.15121147892312442,0.30161169758941203,30.072420235168583,10.222361554779464 +0.1496038235068478,0.3046264063155847,37.82297004630484,13.059081646345078 +0.14914555536520616,0.30090670894524585,31.197693088438985,10.394491363436074 +0.14928554421418372,0.29035239167155596,33.84413781939642,10.152140447471535 +0.14968623820751964,0.30290973347162664,30.017677555152538,10.259614582990839 +0.1491260791798458,0.3009399504381811,22.837430232415365,7.615550958266082 +0.14914175041791794,0.30076892395672417,28.968396295594044,9.622023124198686 +0.1490601038627124,0.29513226861150027,31.651325718703674,9.933809202227467 +0.14995519582918143,0.29111166263195537,31.107272299735293,9.423152984380092 +0.1503410464134173,0.305144163295508,27.55138247398326,9.673437258886295 +0.15187647335887333,0.3038126713712855,24.651444305739997,8.53909479786559 +0.15040008845925257,0.3064480925294294,28.92500119499235,10.225069431056108 +0.14865675980464615,0.2961931208749516,25.267364417395093,7.979684766167419 +0.148566642762258,0.30453020189864455,27.702585285768023,9.5116311346866 +0.14907216388017433,0.29904046917584787,31.242391181107653,10.177893540648709 +0.15117921775206944,0.2975342948486884,27.69026504180015,9.010669753420958 +0.14793771412018225,0.2988544155021851,29.228167838592967,9.450703942620626 +0.15079386272291634,0.2934540573712781,31.16353439422895,9.656296131605744 +0.151443257605908,0.29306308548585636,30.564737843053436,9.601889358323264 +0.1507446436800092,0.29113005372052925,33.07769823178932,10.084995104896159 +0.15076942603169716,0.3031282452239175,29.733884584233934,10.171399398928182 +0.14912899257408707,0.2926021152993033,34.42249456964207,10.541868802850217 +0.15172983994009073,0.3000049525744535,30.720474040224023,10.244211913507186 +0.1500499029535393,0.2909995381754903,31.741298640037765,9.580042045838699 +0.15001186943085146,0.3021939752133033,29.82831868456542,10.154689053399647 +0.14901290698822747,0.2960383191453897,33.31296401382358,10.582114886109114 +0.15044446124998886,0.29516374327006506,32.036840751720206,10.125727438979784 +0.14841518785321603,0.29678104806595673,30.70317215609433,9.712041678070014 +0.15259206154516802,0.300713110947691,33.16345133207845,11.254919764886633 +0.14826082943366248,0.2990522655217091,26.97827797372749,8.740926605459839 +0.1506957158051959,0.30002230035774907,32.753506359667156,10.942788972259141 +0.15111929860086884,0.29406988123356326,29.834841289004398,9.401731512647478 +0.14923129005118269,0.3064189954738967,31.224410377978334,10.898516171571666 +0.14936746117538355,0.30107915492503967,31.980563490303304,10.683527290079416 +0.15007267744010963,0.3010756712630488,28.212293691129105,9.455335086870447 +0.15001599014911476,0.3007428862547265,33.1514906027294,11.011608616097684 +0.1490438554696667,0.2981857707661694,30.12944667092234,9.75157693896294 +0.14891986814402838,0.3111664211887233,29.56900990106741,10.816237694838591 +0.15019489307633668,0.30686416083205487,28.228689109657243,9.973974418319408 +0.15190817727262215,0.2953403955946364,26.67066728334512,8.558884096042 +0.1490750432663226,0.2967320122016201,31.697075894639053,10.100015720670571 +0.15254311422472636,0.3039746732007331,27.671599357048205,9.733741866144252 +0.15202838324927517,0.3025673771141059,33.006563723722465,11.385826110575797 +0.1479133515889009,0.30181748275262815,36.19878088452278,12.00378849701912 +0.15064950375908343,0.3022749747527126,32.23039997457845,10.981496753648385 +0.1482269444347546,0.30164399223972177,21.542968565409463,7.168069279305016 +0.1496966319949425,0.30008155357827265,27.70174779880516,9.184572322531057 +0.14851425441389077,0.30381236227683783,33.140264637078836,11.334335455768969 +0.1501793878783565,0.2945422894065405,23.620522305220625,7.39065118091739 +0.14687643843287412,0.300172497923128,34.6772242562673,11.346224253892323 +0.15193554191175593,0.3033933693083523,34.839639605013176,12.123589158060131 +0.15151647428032047,0.2887964747830914,27.355891845168905,8.196571576818044 +0.1487212339636145,0.2991792774613197,36.63529510329732,11.915546050010652 +0.14978708297678134,0.3031019438405156,28.79596373957083,9.803591889184975 +0.15083023531082104,0.2928457876986027,33.476388023897115,10.401803846471305 +0.14988336582394982,0.29636674749804903,37.997155909348535,12.125290644324119 +0.14849041002974703,0.3063039275841574,30.69531522743358,10.66311357818529 +0.15132972004336623,0.3001837677873126,27.14982375813077,9.042910251919869 +0.15009290220780028,0.2980083777527282,35.16384480378739,11.396998288590748 +0.1498063119729323,0.30518494012629854,26.810820220302045,9.284140289991559 +0.15067086870520985,0.3032117544269888,34.24061741796382,11.722440823129627 +0.14949328834325437,0.3024362874109427,32.983768312712805,11.19022715214461 +0.14803025969739506,0.3015453578534581,31.942518519907605,10.575419077784721 +0.15125996375758358,0.29666134307019476,26.894499688439637,8.680600586161708 +0.14943739735978567,0.2983644396538379,33.98664487114587,10.979041490721045 +0.14712420871666174,0.306824215698437,33.38818870811331,11.568067780213337 +0.15142388475908272,0.29626213584856176,30.662003811891033,9.86979978178947 +0.15191876619105962,0.29988783231489413,33.16059898435999,11.068151616648308 +0.14923520320873646,0.3062771403457535,36.26637449851822,12.677572622629109 +0.15081317473431097,0.3101126421478605,25.38020319416251,9.351881586650173 +0.14967498521505296,0.3038691236564812,25.760522773499808,8.810976780658896 +0.1514269415274487,0.29890785216937454,29.560122898590325,9.781688485555557 +0.1496177949552043,0.30820085946801606,29.170086365967812,10.457617478660818 +0.15217851313380848,0.3002341808673266,32.317151759651125,10.937958472048853 +0.14913527710966742,0.30032152357554226,30.95298200834668,10.283122500916537 +0.14781530241790922,0.29720990423556864,25.47809441623854,8.047605199659406 +0.14768392690432494,0.30219089153579826,23.349513471078474,7.795303995334805 +0.1516470881500991,0.3026994134043551,29.912032070698938,10.26878500372278 +0.15112759633838316,0.3073827646888915,25.367161313974247,9.07937675622594 +0.15019197898037318,0.29900557404328276,29.101399706769698,9.579177735000156 +0.1492989013436578,0.30421783867046376,26.11690395093281,9.018554278397536 +0.14923331602360343,0.2992482910862512,29.234392508161324,9.59815268841428 +0.1516379596968497,0.2952039234771228,29.48949623792357,9.429713632627797 +0.1497548725328338,0.30137005325513,25.16724516789366,8.426133038861806 +0.15152821936260927,0.3049139033313775,31.430778230300096,11.05530172985707 +0.1514639785493207,0.2989582947554092,29.611514911092154,9.757406543866452 +0.1513318427424335,0.30285533471077225,31.952693607554473,10.965975369976833 +0.15070551001769397,0.30398377802945076,29.103839415193104,10.014841192400509 +0.1496236397523721,0.30452791863284706,32.57719491731183,11.250851620814151 +0.15012779097509615,0.2974404626733659,27.143878581210437,8.785930710244072 +0.1493968878630916,0.29893346351244193,34.52630695117597,11.244469223830427 +0.15005470726414177,0.2978718315043907,30.715982419704215,9.93702590036286 +0.15028390201115416,0.30137955981887227,29.185094661795276,9.813616392444246 +0.14925333677705585,0.2984380390587616,24.963728523283265,8.110095305701833 +0.14939994266866383,0.30170874650032814,27.768718684076198,9.277728246719393 +0.1500131414429461,0.3077399397728205,37.904990351961416,13.560332181353605 +0.15216845108546445,0.2985042466722253,27.170359644732912,9.074245178861938 +0.15192874519610167,0.30271904093103225,30.12461555929723,10.447564556257861 +0.150046147977674,0.29715865324442453,31.17273033957152,10.055101719008173 +0.15102597438813092,0.29770404423573416,29.084898004521573,9.46731905600441 +0.15080555419358868,0.2966666747646737,23.972398631185307,7.727248718447187 +0.1490651219533254,0.297534485053295,29.20125265285949,9.371644686208448 +0.1497890119185867,0.3000925065668469,29.39856064384749,9.726778674909841 +0.15037912600948014,0.30293089054279365,28.63629343158419,9.801808780044402 +0.1507372384113627,0.30028250156083275,32.693933548156316,10.887193074868533 +0.1491882824828134,0.29659773622832664,34.198311587951196,10.889788769108629 +0.15060354978183577,0.301526538411565,36.11841615740967,12.16724095125079 +0.1503923149503815,0.30495113989355055,28.454856251643264,9.884123194908263 +0.15078187421309006,0.30472614068745857,32.15973779939213,11.249811336659917 +0.15098209140326854,0.30007842907636234,22.738708123998073,7.6170916658274095 +0.15249624438069645,0.3034411534645371,29.07861238548314,10.129934754392632 +0.15059998675778805,0.3038196546952482,36.38692437115568,12.618675125873223 +0.15055756334563944,0.30345815413883387,36.65189453732317,12.61078639080324 +0.14982906115850447,0.30388369245634944,30.48122816906691,10.455102150890458 +0.14996173352217984,0.30231690101123715,31.09844360203634,10.524918820727468 +0.14941673407246125,0.300194648073742,32.06471809867783,10.605987786620709 +0.1505001967057278,0.3035897769720734,38.17531173233613,13.167932049080964 +0.14998101408242645,0.3041665277993631,32.80892813557876,11.302663239245323 +0.15176569942084592,0.29431073279385533,35.442054504366325,11.232764257708174 +0.15217949051609225,0.29450305003675303,31.966266464203624,10.153633170082692 +0.1492130682627556,0.3020040688732654,38.37923798312481,12.855964653840998 +0.1492579107357715,0.2976413761312364,36.50938572214635,11.700824698968303 +0.1493850842767463,0.30157502239520345,31.162226525603316,10.430262637757362 +0.14956527966246802,0.30228128790993275,29.95192915579808,10.142499523184968 +0.15034379421598784,0.2970538378764963,38.80567465058844,12.55686573051348 +0.1485951343083641,0.3002167178882183,28.050994286370887,9.270612683685165 +0.15130457116778478,0.2950884775818384,28.085233659761702,8.980908285906622 +0.1514358012694854,0.3003983283318158,32.206568235994794,10.80131060163404 +0.15124997277180627,0.2994081006126801,25.670124442904587,8.563589360643979 +0.15139584078591997,0.2999163308969949,33.71422013411371,11.293140057772767 +0.14826156873230895,0.29600846699681227,25.413225682037435,7.999103223820981 +0.15046330326399301,0.305115053364588,29.479572833622196,10.297053594355999 +0.1521228418232238,0.2990336438102852,38.213593173129944,12.752124866583381 +0.14897180134702614,0.3089619859553204,28.108127601833807,10.05793232733896 +0.14968953206904412,0.3019798261312883,25.34214132988688,8.541194416440742 +0.1513895899853502,0.3032969211838139,28.796946966001112,9.979926467852028 +0.14940373739804896,0.3016987483835339,28.417672766175794,9.545918692832808 +0.1505002631713607,0.29744794487254056,37.04787498433575,11.997952238267803 +0.15167133602108435,0.3008264875259064,27.015646557148155,9.089407925797602 +0.15073915765555146,0.30264086639658383,33.514583645084166,11.477113047253614 +0.14913732717427605,0.303070989716599,33.16497207181506,11.284786315366716 +0.15201316363911738,0.29982907448348367,25.640680147947826,8.557867525470312 +0.14929412083175617,0.29840810998723954,26.944182266555764,8.726442456768709 +0.15002568689345946,0.29571755995269733,33.02223675031753,10.435500734458932 +0.14861770536660227,0.302392847808127,30.196368638703436,10.141204132806491 +0.14884003470622845,0.30458444936649115,26.57520145052348,9.173139119387987 +0.15035053869578321,0.3005143885297653,27.403112745979424,9.123548347038396 +0.15196124917288942,0.3010712429521651,35.20020112284193,11.885601877311707 +0.1495384508454159,0.2984376685849325,30.97202961561825,10.099607360317783 +0.15011905654379945,0.3026673929226585,33.32511929442392,11.432971230618032 +0.15013696417851205,0.302942043823826,29.712475807642335,10.136431289815329 +0.1503640640290826,0.30020911927699995,29.586651191426895,9.81717622755239 +0.1504183728934049,0.30225496292595494,33.059602407904,11.25648097406072 +0.15034959956524607,0.2949377704465128,32.736020146838676,10.361347645471636 +0.14947707350247275,0.30517266359743744,32.63599534077347,11.36195600308782 +0.14971888222859253,0.3099126865234497,24.050054450145716,8.801073848526782 +0.14947792672382457,0.3107106473956141,31.943060119010855,11.745544440165457 +0.15231113174713887,0.30104313965659796,31.890737406135493,10.825260544259079 +0.151391643587782,0.29614992700460163,31.671573301639413,10.175362844369854 +0.14860162055193404,0.3030121632821078,31.397717273289466,10.606545647426717 +0.14925529695210338,0.30764101546254985,32.311705810769574,11.485004605866376 +0.14791376667732695,0.2892918063831737,33.04321532788703,9.651499251093403 +0.15091819215659405,0.29947527612334024,30.38949671236414,10.083067058708856 +0.14887376855704412,0.30416558825375434,35.748298045724106,12.22126963338494 +0.1504961686456,0.29708085036984144,30.002391569725003,9.646781734799763 +0.1469263265903933,0.3070120118819256,33.12923595672171,11.517100103173632 +0.1482529951310335,0.2990589485217361,30.026301368011396,9.733599275482511 +0.14990895570920063,0.3074206973729467,31.084642287589748,11.061467965388768 +0.14888640119995158,0.2955471045490833,32.092158649653,10.102796006670047 +0.15161174655513768,0.3101609054399772,30.063459425779183,11.154523394549395 +0.15060689284132314,0.29402099596449977,31.178450316885176,9.710197587624995 +0.15095865050371923,0.2988620636023181,35.698341750189186,11.73377481921148 +0.1492890388818151,0.30215713023269963,32.417517223562626,10.829347441017475 +0.14985687122635838,0.30518305192588835,30.79281272811263,10.71486189639164 +0.14906143934155944,0.3018387446160004,29.546686373755065,9.868461228016198 +0.14921516149806432,0.29897856745156615,34.59116426634562,11.304922174192294 +0.14944412176107702,0.3048379050780518,22.717310627725894,7.859214628032586 +0.15037571129115443,0.2980963191400674,34.523555144107206,11.282425400309384 +0.14892986048644763,0.29704062169211043,30.50421632300667,9.721071305915471 +0.1498755542954255,0.29933927080655476,27.441465934521965,8.940740581087605 +0.1484415643764022,0.3028336983317804,35.60806955587981,12.054488514130618 +0.15133863968604896,0.2968513380409904,28.78027922173128,9.3346376231897 +0.15028039324301537,0.2946015458486449,34.282690862979514,10.78504880965671 +0.14977819193217629,0.2945966859423778,31.32042277011551,9.763787513369579 +0.15136016399864735,0.29825681660272957,21.72064015901489,7.1590874799728095 +0.149845733056684,0.2953664144027013,31.953823069572202,10.092023614180897 +0.1494612746360977,0.2928339567575342,34.8611271787322,10.634688046449225 +0.15002671464157444,0.30200174290598036,29.752881883070284,10.00653776386124 +0.14921303013360696,0.30144611304071106,28.262957720967943,9.46525368083433 +0.15192999045790093,0.29581110575133324,28.384545867622606,9.130645681620159 +0.14945754777246434,0.302393366826936,35.9771636837808,12.129650948372202 +0.14891488455297958,0.29538227201861983,32.135761515223244,10.084360741109455 +0.14843706247995214,0.29978349551768746,32.65018882690158,10.75380063969143 +0.14917970822336932,0.3067610132549685,25.754854989496458,9.062308917125474 +0.15086485749355869,0.29402436724568637,34.11593797467817,10.717472148593192 +0.1517776679112957,0.2975883744837424,34.044913814442204,11.155878409179282 +0.1497825355572467,0.2990585273096529,29.116470075175968,9.584954307085214 +0.15127482963959688,0.2950493367530104,32.3286066562779,10.247723225630262 +0.1505436460144164,0.29860119974717264,30.940260598811644,10.136200623506221 +0.15131992558222607,0.29635349669246513,34.32613602727081,11.10418299787992 +0.15160111433766657,0.3012913237307157,30.141159103522643,10.253807680158248 +0.15054303849002112,0.3010440833962114,25.73638843295387,8.633974933056189 +0.15164812471813746,0.29442981770628934,28.140761216148483,8.892958681814964 +0.15262061161858842,0.2960933218772424,32.78117879908843,10.667906004903564 +0.14935479429458515,0.3007600181532845,27.084466178814655,8.975580986852533 +0.15028790657349997,0.31060488961696175,26.467193036319394,9.724393258437562 +0.15116933726055998,0.3030480163782465,30.65983042860432,10.551596369823113 +0.1503201323615433,0.29827585542984814,30.53372632537816,9.888652417349284 +0.149562780413183,0.3052800164555544,35.06503863228523,12.179134302949285 +0.14916735459475433,0.30349770231181444,27.948736906504827,9.500849047896608 +0.15163915345022314,0.3041651165434515,31.54610653192802,11.046401316647664 +0.14930466591672995,0.3006487717538172,35.103701249726,11.701890460792615 +0.1500138676696879,0.2999785518309521,30.872927919686624,10.235184812982457 +0.15109582870085728,0.30656815184551095,32.13109346722105,11.428343459860208 +0.1499405190797085,0.30020191835578414,32.433392348936806,10.763840403789889 +0.15015209100568827,0.30453927335064845,30.964183008404337,10.736196119709573 +0.1503464017148804,0.29930525383395973,35.7240180659116,11.811457762444281 +0.1523155747769102,0.3016266391566455,24.08008893168883,8.257899936365678 +0.1500808669544526,0.2991370113877244,34.02882898632075,11.171579231256947 +0.15243773008043984,0.30086029239033163,22.5726705843173,7.656812511178764 +0.14640385469092712,0.29411099644128597,42.60651276283195,13.037652779165677 +0.14967112752200207,0.2973865126864653,26.392873000140042,8.529107027421674 +0.15091537961193402,0.29478454316226055,34.66874742085817,10.991111766264552 +0.15003720641810614,0.30117776071679964,29.855442611360616,9.976572630776142 +0.14976989541266042,0.30010661832795305,33.01569916415856,10.91062561797314 +0.14899637603241536,0.29935695043775584,25.493946030742986,8.304565831043181 +0.15148026560024344,0.294857185291016,31.36998686861471,9.968129360497972 +0.15135371540500644,0.30544498366050604,30.841022421617907,10.898277625058746 +0.15096231706105742,0.3010502557019304,20.51026826451455,6.888863637449898 +0.15051724310943038,0.3078078705198324,30.070243438485175,10.826875295737654 +0.15075211453704232,0.3047503740143827,30.36602345300454,10.585042574095601 +0.1506636646368206,0.2985187887133845,25.530021198102773,8.374384061036382 +0.14977728341337698,0.3012266873690849,33.098832012906,11.140078975977016 +0.1509487149897625,0.29163577321456824,30.13911652818915,9.186474049524076 +0.1501715414250172,0.30603087804974216,27.024448312204754,9.502502545113709 +0.1510408822895049,0.30084602708648006,27.598998452688356,9.282463964683611 +0.1497465006672607,0.29718543145827253,35.11920938058179,11.262386806389603 +0.1493090812645483,0.29635044468748056,26.77048007306443,8.495053579314526 +0.15060364604977572,0.30097341986201387,32.044116865180676,10.79425032694535 +0.15184487419969514,0.30089035952608867,29.310148352585422,9.904501384462309 +0.14717596185900003,0.3007356501732257,30.161140851714116,9.907321704268458 +0.1492467631336167,0.2969791747670931,32.34483478804846,10.377568451411218 +0.152053232822031,0.2983811990108403,25.31967784569931,8.38793577477569 +0.14904968784270392,0.29723987001777114,34.36313907162602,10.971545415890294 +0.15148603905170138,0.2997173443298445,27.088331644148575,9.01483938097891 +0.1506668468721423,0.30221297346982956,31.424154202447884,10.702368958197741 +0.14840841409958214,0.30798324757521706,28.26524544985586,10.038187438387139 +0.1507432554813399,0.2947889016030538,26.27780656397841,8.270072025558676 +0.14955094139774325,0.29997706516428846,32.35245522647768,10.71803306443025 +0.1501425887010411,0.30593997990755695,33.43873560271986,11.83751923594647 +0.1497314033603708,0.3028855048244029,22.165982694599677,7.570957243099782 +0.15094488945153453,0.29787537113381884,35.137616321271416,11.457149663357278 +0.15264469703359304,0.29969479437353924,24.805196361989175,8.344077842255949 +0.1492161709901235,0.296861116756426,28.7026364846107,9.15783034038603 +0.15056301873468894,0.3033520252378034,30.126990262174,10.376316368554317 +0.15146302743704865,0.3026024476679413,28.807865994052747,9.897306757631688 +0.15025128304983146,0.3010891129835965,30.477215055447992,10.204766297759269 +0.14977054794398087,0.2973887530282773,34.44564925839204,11.088388340969319 +0.15035501146911828,0.29326817610480677,33.96785605565053,10.458220524619293 +0.15212270932137134,0.29848755761785206,29.643898897707658,9.827782134641872 +0.14947036829529348,0.3065463195608687,33.50551252749616,11.813114213467209 +0.1501155361334738,0.3001766607647801,37.61476487834727,12.535294096349704 +0.14814562531251002,0.29336941500612834,32.44365116573127,9.943876593870678 +0.14917743166564368,0.3009025521910665,30.538678613272705,10.11015234247907 +0.14962298106315555,0.3060807462000656,31.16376410397238,10.915458911975 +0.15067751608773602,0.29792048835440466,29.299876671860506,9.546247811893974 +0.15010498299466873,0.30124563129596504,35.87372190846971,12.023797297232022 +0.15001957192714968,0.30205025058779594,26.008098714361886,8.80478661320749 +0.14933759318664291,0.3008790818767488,26.191736274776936,8.727212723867828 +0.15070886692700458,0.2992621507302316,32.427011861604754,10.772753391551262 +0.15012325433754412,0.2958153654089091,32.02284223478399,10.223101024014179 +0.15075394148584115,0.2936838929969213,32.916408143983446,10.287193528654251 +0.14835175297687955,0.2988658964236221,31.430099837837584,10.136652627719 +0.15119750669530663,0.3025585684740702,28.96615497527928,9.927715184201048 +0.1506077842833826,0.2901873366864283,28.1504332796466,8.47713388446175 +0.15235411388812584,0.29848914193881076,23.008609095842832,7.647887353634898 +0.14696431613479077,0.3033953674571166,29.486847492352545,9.858633864548334 +0.1530734013973854,0.29529384970079187,34.55351908400977,11.082459241901802 +0.1503333362688662,0.29953016244568714,30.601281040028248,10.142547223705439 +0.14956195182507637,0.3025964597546039,33.08021056856159,11.195032656387303 +0.15241789859856839,0.2953455736605998,36.18646373706774,11.612171559536556 +0.14844049909993584,0.30258804430565306,30.97306861845997,10.45337731478702 +0.15006284545367687,0.2990285039629638,29.400332683108502,9.636277341383055 +0.15129994488283904,0.29998980344880277,34.237309081560056,11.46359669364862 +0.15005264435754795,0.30062863371559045,31.61466327619749,10.559082117870673 +0.15024754972477425,0.30030026054633113,32.054646690677544,10.655393177813204 +0.15021336810774263,0.3059942470506242,29.848313072677122,10.498861432951504 +0.150977788992247,0.3031512154606973,28.890888415105067,9.904537632021311 +0.15183313255154154,0.29760092713630426,30.716496430606597,10.10166671939118 +0.1504110456161813,0.2924581016692708,29.821792386951802,9.185716410898426 +0.14858563010802447,0.30796294872662205,23.49419781132876,8.368653603801045 +0.15005840654190203,0.3015090160072002,31.222287161734936,10.477120861652606 +0.14918978379704492,0.30273918976841335,28.828253659792892,9.799401910126678 +0.14976149319308787,0.3042193628572581,26.43371261111924,9.08460512344191 +0.14710670439099674,0.30250540222439565,30.97926814092399,10.38162431311321 +0.1516372291580266,0.30484401069199685,28.264801864300328,9.882052774173982 +0.15024443218753772,0.30514390856316714,32.00029563447177,11.164388620085603 +0.14842279777590653,0.29903168956166476,30.65434022339509,9.934407879512179 +0.14992842764792497,0.30015429946528854,32.937217596478625,10.980411186822003 +0.14931957208250202,0.30503012793166023,33.38464391262266,11.578901509022394 +0.14810711805608992,0.30409928874919084,28.63256498242467,9.779010328625377 +0.1501040369661922,0.3087308018329468,29.50880900080927,10.699831713647466 +0.15187583287734058,0.301436079952307,36.06549836433489,12.27252118924845 +0.1472950004741637,0.29765935520042774,36.68763045813521,11.682994082634181 +0.15054572994455756,0.3041182509597554,28.42389463372921,9.831678742643463 +0.15037367338738172,0.29442919068479906,27.25108319359063,8.530974604721157 +0.15088347389913434,0.3040002482656745,28.85633748593484,10.045572806511872 +0.15031725840817742,0.29850062957490725,30.335113745144767,9.85790705315956 +0.1500895655985786,0.30499386406794765,28.674507380613743,9.973386481855508 +0.14898864128800937,0.29174418309267347,26.553143210754428,8.060604389305993 +0.15024520803189936,0.3060389078992302,25.802497694737628,9.081244787834347 +0.15114815372683482,0.29178808656237354,34.46514186386355,10.627957080207684 +0.15055425927648716,0.29351751503904877,34.66079097159373,10.815481486469102 +0.1475919599292886,0.3096583092425613,30.771850105804724,11.012299268394788 +0.15112607541470477,0.30229513480081227,33.545646821558925,11.468737570031251 +0.1489602683076575,0.2992348894874152,36.48016659058428,11.819829516152165 +0.1500783569864268,0.3005407377756637,31.400847368125,10.449708904810512 +0.14887161196511686,0.3054017542434593,33.07833881399068,11.476175229037233 +0.1500824071931335,0.3032980639410305,28.38362669683266,9.662329994401198 +0.1507747151799427,0.2995097756829107,30.318056866097816,10.006105616158987 +0.15013186046990099,0.30340043410991824,22.044989788310637,7.5516106174054904 +0.14736443033320748,0.30276727349594806,30.059463379812644,10.068394447238738 +0.15034648595443936,0.29592758412430403,25.732618999645283,8.200143205588606 +0.15143625735135105,0.30352773041293846,32.45925729704859,11.241606249247146 +0.14763112208486298,0.30262161765777934,32.80534995440052,11.026054688978697 +0.14697993022284828,0.2991442743730576,27.32065675082318,8.81130769976259 +0.15038412726328262,0.2979575880968836,30.81998852204656,10.02606288574631 +0.14917748387343258,0.30114780536225055,31.00924136667265,10.3279736419106 +0.14833020214733048,0.29788065201054575,28.976343588554922,9.291433599085668 +0.14744686115806477,0.3018605693883467,26.409855615042645,8.740532600169475 +0.15163432486121547,0.3018665167643657,31.489897954344134,10.716904073607125 +0.15056794978923452,0.29811089566870835,34.8922774660059,11.324902860873596 +0.14952558077306027,0.30290005986087826,29.32094118969261,9.934533216659197 +0.14967166825675776,0.3042286436261707,30.304435669131312,10.43049967468529 +0.14922910213866605,0.30072301245577227,36.550645046061916,12.149594814252403 +0.14883622485537695,0.29995594657131336,32.464940336170066,10.675790055347568 +0.15086535081063543,0.2943740920726484,31.737821218816592,9.981316873675087 +0.14944684415213688,0.301472219976935,23.725642142941595,7.9648064721225005 +0.1486924403021516,0.3032135686511745,27.989046400611233,9.529383186158102 +0.14934101333818864,0.3046984418127398,30.968612030474453,10.73797796316355 +0.1526615967072547,0.2961613465393479,38.583915617323804,12.501097194468944 +0.1496030334691639,0.3068391860388616,29.21663013109385,10.302812971259222 +0.14829822720071317,0.2965188148916003,30.273086486896133,9.642994520148386 +0.15145484611521406,0.29946417209492554,29.199617782408012,9.69092905768839 +0.15038426902483948,0.2976762790246592,34.57390088715837,11.218834018832593 +0.15061570827463214,0.2946970359547593,28.74873981968714,9.123872360015703 +0.14842029844985835,0.2981188356810185,35.39437561439172,11.400321555131368 +0.14948447304444823,0.2903791626055825,23.935228132926355,7.178595645038508 +0.15053621252782468,0.2985547383606632,30.142439524779167,9.938090553190921 +0.1484192751608765,0.294205286973151,29.701488510246097,9.166979853228057 +0.1488423842870384,0.3040728978485254,31.657061251967896,10.775994501198669 +0.14876666631748436,0.29341498641976416,24.21117534255397,7.396539436923691 +0.15059890754231617,0.30225284925027457,26.592527447572003,9.055552159271585 +0.1497023661111011,0.30095002886190597,30.898791241251832,10.315881820593214 +0.15139632445252843,0.3018957360350153,30.571618037024788,10.40699668039149 +0.1497741026850853,0.296192647495289,31.998372882448802,10.165588371784068 +0.15121027817856092,0.30276573631553266,24.719615945934816,8.494617130936504 +0.1504612482049946,0.3024047985646427,24.04616950760311,8.199566612170614 +0.14901422967782407,0.3029981547440798,29.018734014554468,9.867685470804004 +0.14929382405399885,0.3027527204287797,34.63124782895191,11.735324006920541 +0.14859959511382925,0.29987954699092784,31.965532281299524,10.450328047777441 +0.1507123407760944,0.2965442692539055,27.25351713435549,8.765655337978 +0.15061787870144314,0.30001242254006555,24.625261632617804,8.212106336674728 +0.14869042318142658,0.30313178854800965,27.34424358689166,9.313848403751008 +0.14995701064364939,0.3016435670506769,26.228468252807875,8.818234669685223 +0.15057715660546558,0.30166233007565907,29.616562960629075,10.086897944495645 +0.14898381283738243,0.3001513234119247,31.122657867243166,10.193004231173829 +0.14751921301544546,0.30085848510752655,29.45937407326413,9.747153259425923 +0.14805740693901312,0.3042844621084076,32.35806622079182,11.05693688268902 +0.1492978966368991,0.30621744721234156,28.106837318799332,9.833287434778535 +0.15026990857995193,0.29824490045710433,27.536957445790623,9.00677628426733 +0.15130556940790504,0.2898321977226333,34.230504637292974,10.31071970424607 +0.15056077533458948,0.3000385857944367,31.50910838340417,10.496010023957385 +0.14689632558588017,0.3021748398051718,28.119434228736978,9.346828786956694 +0.1495239046763199,0.3002144803378804,31.103944690015897,10.335316125464564 +0.14866174109032046,0.30072316893474293,33.16052246291774,10.953567143154654 +0.1509676545561624,0.2989264991271055,29.592923105568595,9.792705189456873 +0.15091608827097097,0.30210964476539676,29.546603651723906,10.1029386951781 +0.14948773123929954,0.30008503385533086,32.54221333336309,10.79743627504119 +0.14978320313201457,0.29063855708461717,32.40535703761503,9.724696042642625 +0.14850565344692662,0.3059250937837985,29.38480566374315,10.161202271496405 +0.1510610636263801,0.29878855701839774,31.36931434954963,10.331802059715496 +0.15108880471839312,0.30074905169248645,33.67882090604154,11.3544659592462 +0.14971464856440642,0.30033359742344934,25.78540605689962,8.543811940657509 +0.15000734184206635,0.30520289451598925,35.02846846492514,12.191050179813658 +0.14917133192260076,0.29857785815109666,28.255349243410237,9.111967750914951 +0.1497633312230556,0.29825509371409065,31.423318804953166,10.177610149277102 +0.1474781306542059,0.30859091191346744,27.151656863403446,9.619581664077087 +0.15007923736673015,0.30092108136955714,31.32023464708737,10.490634898918474 +0.15210174626980896,0.30121892598394223,27.467053684389565,9.336478452711644 +0.14950162748928805,0.29948022118959433,28.95217812708163,9.525253108493066 +0.14860190480106442,0.30574942233828184,27.3635493330965,9.465123130986855 +0.1484033834850222,0.2974273607560903,27.8465556810614,8.876416956474003 +0.15030743286959977,0.29776062131677455,35.41894228133557,11.449320469790454 +0.1493857031939053,0.30529275652659005,33.85061980169296,11.799809688247446 +0.15056522534420938,0.29423885173469555,20.4061866706715,6.442529089979428 +0.1496502244747218,0.30063171980512265,30.27893979271538,10.06178628483616 +0.14974754507551713,0.29932904007932354,29.92070963197893,9.823498675150564 +0.150176642328073,0.30471235030117544,28.784610769653064,10.066782161874022 +0.14838842748828587,0.305528603814064,25.346153938250858,8.778104524625592 +0.1511385422527532,0.30575699045323673,28.18790613137957,10.004946119029565 +0.15156883548579528,0.30434990175830245,24.307817641966672,8.471457510520171 +0.15063904487837296,0.3028891818693188,30.010062424868178,10.28979966241607 +0.1498296466945018,0.3047690529871518,36.02148989120478,12.4915754339683 +0.1485024283807383,0.30384259052430884,26.44060766605961,8.980669396800101 +0.14769319511339865,0.2967547222446457,28.505135830986713,8.995520239163834 +0.14937106034385644,0.2981341352496086,31.300896578489787,10.195981978409277 +0.1510799574976736,0.2979039325741071,32.32026100030609,10.565480815261978 +0.1505444737510929,0.29865751482945824,31.815307127132577,10.435142956670347 +0.1477035230691269,0.30350857887771143,32.09157982676877,10.830877686416041 +0.15094490302926694,0.29572304358739526,27.570727876509054,8.791837836955315 +0.1497127244974088,0.29982778192206366,34.87604252866591,11.520465006087234 +0.14872853052427518,0.3081125296020819,28.135071763552787,10.079511617316031 +0.15095702922989288,0.29813652532973517,41.90662928283387,13.659813351678073 +0.14914064173173897,0.30823902882862614,34.87664842325537,12.443083929427672 +0.14941410137260297,0.30520188406157045,33.817120262075846,11.732695805087461 +0.15010314584386433,0.3044555922757267,26.74318677240506,9.220189043920044 +0.15193379266306706,0.2989389583614642,32.497930603126875,10.789845297574233 +0.14889298542148374,0.30186966626774686,31.90019852871584,10.640252199697843 +0.15113798640491885,0.29597545557071014,31.179835088288694,9.986181751656352 +0.14956105368336237,0.29184883366412295,23.39414209781873,7.145592191049254 +0.14869873401367248,0.2991027497078632,27.93189685163424,9.092363103578244 +0.14995692750090733,0.2967164751845955,30.519284275282867,9.73387103401675 +0.14931912679002265,0.3021304171274075,30.49075621720164,10.290515515519534 +0.1498527364480125,0.3054207674106911,20.542870238903213,7.16125034506927 +0.15021630026492885,0.2934898502763073,27.860068534238664,8.627087272008225 +0.15077400818363815,0.2951906391772996,25.132388635655204,7.942860511349548 +0.1510555955684775,0.2975904528606819,38.849984744662706,12.595153374876448 +0.15025135325640127,0.29632694273817844,32.67323340894848,10.439536349377098 +0.15042801613987383,0.30183293960592694,25.90950667582245,8.766041025138097 +0.14793055451319442,0.3040863727600646,31.825812614968683,10.780476316731464 +0.15154189206577365,0.29911811927434107,29.11174487254573,9.689740404294053 +0.14999861955820196,0.30311274579266806,34.318716465685256,11.71882934150541 +0.15033892986813954,0.3028504714430225,23.452304483414544,7.9882943090238285 +0.14902371258910163,0.2945654670423399,25.136389932243745,7.791813888345468 +0.15147894706200019,0.28791829452899526,30.37461000719967,8.95957478724769 +0.1492867741248367,0.28843169727682527,29.682713173662464,8.757405206676955 +0.15106549522389137,0.2978617170731287,31.854053753897396,10.337171415966418 +0.148531720345562,0.3067434880617907,41.20963341131617,14.44349349652321 +0.1489788094669434,0.30465203247593825,30.857383638498042,10.665529181550694 +0.15038515221413853,0.3018322691184811,28.803490727395797,9.711943420544303 +0.1504974617745137,0.30624145628996025,28.041534386670836,9.91116666428447 +0.1507577178485505,0.3006375362694962,32.010918819541715,10.718292965118264 +0.1501177437185653,0.30684556454540296,32.13912452893557,11.319470420634433 +0.15017047876431402,0.3079641106639827,31.37021892240959,11.195432350470156 +0.14834398742747132,0.2989634082338377,33.52603565884525,10.854872091072748 +0.15023745156542534,0.2944064468845404,31.69058348352274,9.962756539533675 +0.1491157701192888,0.30275602539772056,28.14244107841479,9.554416311161827 +0.1503758468792976,0.306209915519742,31.21676149762719,11.004203732148522 +0.1486436355063401,0.2989723058239245,31.92597105819175,10.408284139350538 +0.15086621078367796,0.29628911425525906,27.75931010463462,8.935466442817654 +0.15147614965477685,0.2955895261322013,26.93092783989931,8.584455959076601 +0.14911645292352924,0.2932898686853384,33.39508362988866,10.303340704258723 +0.1496364404516829,0.29059502103527374,29.641098571670216,8.952760091309923 +0.147027880469636,0.30426296136518277,29.801032148954743,10.049430990299074 +0.14891394772524785,0.2993645993549251,32.90339619825229,10.714566765728428 +0.15093476827313276,0.30105413098270045,29.599066125930907,9.933562782586959 +0.14987255683066023,0.29915994953656205,32.266097215902526,10.608919263769295 +0.14958996541149946,0.2937147750508535,30.89607940326249,9.565032040499025 +0.14908015764903865,0.3123194112796737,26.241019155018165,9.742891505599353 +0.15061641045358817,0.3018475100855154,33.593009803779495,11.446832946311023 +0.14955235387118204,0.2979489338832176,33.753228185209785,10.88724653210664 +0.15069185865854257,0.2972239429026966,27.038760519893163,8.669531267710287 +0.15201113616355771,0.3020737955276874,32.47770706277574,11.152282823725312 +0.14984943080534283,0.3024527317174001,29.04332043492169,9.809413488297954 +0.15074713395667957,0.3047980584891643,33.1377280170321,11.600436522166875 +0.1495353546912578,0.29639332010638203,36.29265597820508,11.593974081361084 +0.15003240893680975,0.29528280025050624,37.542827427435505,11.812480728264276 +0.14972956807196575,0.30196324690690896,35.10289201996529,11.833278042288827 +0.14828873957124014,0.29609750304904686,32.39848631402207,10.257902456148958 +0.14865330300456137,0.2967246627381232,33.16465779687901,10.497824471048437 +0.14966155024437983,0.29509791935006924,31.78234682567392,10.03031742578582 +0.14986962017335587,0.306445224168253,33.23556732277841,11.696795324115964 +0.15248603682877335,0.2958177335131541,29.6471976145796,9.65473484414891 +0.1509516927299662,0.2999398802331043,28.134374769302642,9.352455972118888 +0.150601172316588,0.2982589373643165,29.379068581697133,9.58293309791269 +0.1486354299821071,0.29619895559445897,28.488409925071366,9.035590230178444 +0.1498139001266759,0.30534561297644186,30.25924493191094,10.521001492012033 +0.15133382519341687,0.2949798505339,34.30215787554859,10.876184008478875 +0.15066446991281843,0.29747496894532827,30.49016302762538,9.866065044035206 +0.1499595285592916,0.2989798272322519,33.867723782272066,11.133908715551929 +0.15200939424137963,0.3007485357947868,32.73792765751691,11.016623339398691 +0.14889693230485843,0.30140840817214776,24.471058131876163,8.169232797372462 +0.1508982764902275,0.30475751712732163,29.89548201011301,10.418827109022752 +0.14783928150981948,0.2921040297645299,24.87025387254415,7.483716791744612 +0.14907567334800537,0.302350358511202,34.38013228970431,11.623025731288394 +0.15133844571039054,0.3008619062794803,29.89305346142908,10.10617276011796 +0.14929314296257,0.2968827993422997,35.35026807115244,11.282653458928486 +0.14813596120952782,0.2979922806167811,35.20472358467265,11.279985719170408 +0.15005390479111397,0.2965385417849527,24.62148847964554,7.918866765943692 +0.15068343689947436,0.3044086232805141,34.744846500123,12.124180680847747 +0.1498513410007534,0.29322079190506695,28.09204780253396,8.662976425568651 +0.14745575673690478,0.31268775255476083,32.92224265913776,12.166210664401307 +0.1513479919656076,0.30043985217740765,27.662236763321044,9.264113064409889 +0.15143383298654425,0.3009504299764782,30.79719270409832,10.41018096105287 +0.14876699646244088,0.30676889974576954,33.754950604783296,11.83287839513116 +0.1516315811165425,0.3016680131830352,31.39564100369263,10.710912863562335 +0.1490057003780634,0.3092700239095858,35.10942011194418,12.66482129049237 +0.15060835957084753,0.2979620432300075,33.6640250542346,10.974764350232665 +0.14892611356338223,0.300768253764401,31.313351850261267,10.385692240101458 +0.1517325902101329,0.3015768966548038,31.252762608041966,10.644124808841818 +0.14884705060460707,0.2978934468933973,37.756639950645706,12.168881111564541 +0.15002329828815494,0.30105364031056925,27.64832525576019,9.259015863430092 +0.14756071409743723,0.29774179180400445,38.86831832991771,12.417341302544871 +0.14866113293925226,0.30424783785102477,21.628239665556592,7.414595009507637 +0.149400426143059,0.3040905756639259,33.91351360878527,11.654908629576997 +0.1484964148667106,0.2943864542273601,31.08431468823938,9.667774154836364 +0.1496063480702611,0.306803415290516,30.442656829151456,10.778234442035632 +0.14914052386412308,0.2923920067119457,32.403306224552395,9.890620346908236 +0.14850321473480638,0.30347532399569677,30.486372016562964,10.332742012049552 +0.14867682243197294,0.30595780866447514,29.54352445003212,10.290888512884337 +0.15024416171172378,0.2959528883389809,31.081633335298164,9.857284245961031 +0.14892024001791684,0.3010605646336227,33.31348781538232,11.065809169638026 +0.1526789236522256,0.3003791188758125,30.547419987587833,10.349329541461284 +0.14966565515219457,0.30702092254817775,26.112026351908668,9.262508978424657 +0.15036091753305236,0.3011573498364422,29.26060023961026,9.923449418619397 +0.1475328752047374,0.2912418866814865,38.61806249080919,11.527317142768783 +0.1500385690491146,0.2930459082665301,28.96228481600575,8.899493768954494 +0.14938656387008437,0.29898999766249434,33.710406901571304,11.008120739629298 +0.14855194857906362,0.29626334714779945,33.435679613472644,10.554715355849323 +0.1486377711383267,0.29905412515417934,29.921955582476514,9.747913889923602 +0.15131163553991003,0.301785710532218,27.521733771244286,9.380494334003952 +0.15104825117308043,0.2945770096690725,33.24877956806304,10.558381377976941 +0.15021611329003545,0.2969820390474484,30.830758987707362,9.9038570870767 +0.14859218863394177,0.30111412817146593,34.85228672650996,11.503795709903258 +0.15104633031587195,0.30207148317130444,35.42090060762947,12.055750280215952 +0.14968425294319265,0.30736591900426624,30.825869046453438,10.972581651714485 +0.1500201333471858,0.29593611067626774,26.486957482682417,8.467113545647635 +0.15102157410792352,0.30046635290433393,31.284865856274017,10.440594791642908 +0.14919875005967556,0.28825147171016213,35.513428430710846,10.391810464731298 +0.15225057274401743,0.3033207532145998,32.16361078535137,11.122859298684405 +0.147694711318148,0.3048778391845451,30.991128315444556,10.646324423625675 +0.15100001033873028,0.2906515323694613,32.61487495095011,9.948636886988593 +0.15034935509772523,0.3003623073179973,30.919449246039886,10.296953095023298 +0.15114712549994277,0.3108131566849106,29.691626122926913,11.066118974691303 +0.15066687761599692,0.297585400726578,30.163695700101986,9.744450602571586 +0.1499451895341623,0.30753857395005635,27.985679103816473,10.00538037576907 +0.15142994375269495,0.305965022216757,26.99268991865117,9.532812546087971 +0.1505154309125753,0.29720735831532324,34.120974249215294,11.024984573327362 +0.14925362239430248,0.30320294760359084,28.403725103024968,9.63765860370307 +0.14790559757825153,0.2986773223720424,37.88549593673652,12.222720380731182 +0.14950177127760841,0.30476630482615624,32.459896616309855,11.288507331747471 +0.15050035787656818,0.2954690220626269,26.81885631832578,8.570378798618712 +0.1518875245524575,0.2938740074520695,28.296241974347275,8.937943368511764 +0.15095157301693407,0.2986984145480129,29.458488936940096,9.711815386825974 +0.14967651191384718,0.30571073308834873,25.763663168961983,9.008668238682874 +0.1517356853088471,0.3022296333376397,21.067432776428063,7.207643039187311 +0.14933303617411167,0.3019478557598254,35.23142692469331,11.865048754461524 +0.15128662753621003,0.30352331284716405,30.94328482466505,10.745606940453609 +0.14899521264575968,0.30250098992452273,25.540784681838275,8.654278811324899 +0.15216498888677782,0.298400071527448,33.80849295120059,11.27515587275705 +0.15116088482321902,0.29587134115652686,32.11892223928817,10.299166096963441 +0.1512954111236403,0.29721931148611314,35.7571963374887,11.544162927649978 +0.14900347427345392,0.29942051996758723,30.204537451615803,9.822656820012886 +0.14990983092292853,0.3028075573691384,24.241504190223566,8.250518445528655 +0.15135986482486394,0.3029332745164925,39.52872108187138,13.585858492617241 +0.15042756489865045,0.29820321118647114,27.2973369873048,8.93536700512366 +0.15032523596308323,0.30215505233666357,32.484388649827885,10.946395806503599 +0.1495341285889984,0.2953633100367463,30.8122123132379,9.7388391537973 +0.1497027275997581,0.2929339924658949,27.261116389756086,8.399479046770693 +0.15111975644882808,0.2960802837473879,31.435329371780703,10.134146308350891 +0.15108088053241245,0.29720549745917113,29.915650816074397,9.707651472927314 +0.15137742630147097,0.3045550849613984,29.645213725760748,10.405598410809006 +0.15058669315261605,0.3074079823435643,30.96856506454106,11.065409866090807 +0.15139277705663012,0.30079136307653137,28.449521720971802,9.595149172049206 +0.14904416344803467,0.30540633760012414,28.17955097641573,9.776509834884653 +0.1483234746211784,0.2981721712404344,26.605183165732406,8.626057431608004 +0.1495791400421314,0.2949781256311675,34.0320749388703,10.739013575765988 +0.15105785228065638,0.30103745743693344,28.216571945601196,9.528867846298487 +0.1496451198515781,0.30340364424066174,30.470266969080043,10.471269098037697 +0.1496350830757834,0.2946919415936463,31.629717111183766,9.912779976532434 +0.1500973201246035,0.3017557188937894,28.73559312351281,9.632477537550406 +0.1517140166821574,0.29969840293501954,25.39010651932489,8.508112420148114 +0.15092186593265286,0.2976860264898121,34.229824384156295,11.155078727350393 +0.15171104818027298,0.2968287315398702,32.359279520751045,10.491698855686199 +0.14903762177538651,0.28660731929739425,37.18749445206692,10.669049928401865 +0.14919425112590068,0.3043827485531474,27.707641216395075,9.521010834025883 +0.15052137709030916,0.3007353088062307,27.92845310714174,9.308095275222351 +0.15037027493139934,0.2938112793792112,29.528911072783824,9.191160241967621 +0.14900938890978385,0.3004379586191235,32.952653533516184,10.954918309211678 +0.15020304095740417,0.3013010222127743,30.3624649378055,10.151260849023762 +0.15029413181847814,0.29988995468765495,21.803540007513732,7.2058040251558255 +0.15091212341638396,0.2994838823148906,34.07255576382622,11.35710864774199 +0.1501450573043919,0.3044616738085073,32.424173154330695,11.285571359008625 +0.15006098542641516,0.2921775603115543,32.90784379969928,10.03170270791135 +0.1497290832193732,0.3042614942098094,24.546688321137022,8.459227859421897 +0.15107676706778977,0.3026185889495377,24.439431878606946,8.39133778278312 +0.1491179984985929,0.29846770175029314,34.80978944056957,11.31980128958988 +0.14911935325714581,0.30400009714258147,29.232441840616925,10.033255734840553 +0.14930287865230873,0.30064612913957645,26.226601357775834,8.726463412734041 +0.14983121372356484,0.29993231413202415,35.83656744817248,11.890337723297675 +0.14919053899627654,0.3108527121655232,29.210498659517356,10.703553044896431 +0.14949658909761324,0.29886887015979446,32.48377604081301,10.600511276983271 +0.14964669362977298,0.2997944045028376,39.08623179639169,12.87156447787363 +0.1488975043092358,0.3097350701335145,29.155874963247825,10.549315096189261 +0.1518260962969777,0.2975291761171754,38.28841339225859,12.479870700378484 +0.14973976105491346,0.2967518858021264,34.853679951718135,11.16001692336541 +0.14894303540829373,0.2939096002875871,30.43732315761615,9.414787369906993 +0.15043085126732866,0.2993480677666867,33.09315292283303,10.868402347096172 +0.1490973552938733,0.296728194571988,33.33457801059657,10.655172916451008 +0.1482047104902539,0.2988691892828034,35.14865120309461,11.324036464556894 +0.15093305574206697,0.29611981156706024,31.80011663530029,10.196824360833546 +0.1494306594973502,0.30480871418843924,30.55491421732481,10.624806804794925 +0.15033980613735276,0.3004418646637459,30.659014803608464,10.253958123906225 +0.15028341270753642,0.29996525601060076,34.86924997194588,11.538124080150258 +0.14925406114078615,0.3037124384124956,30.842014763806592,10.521383822293503 +0.14949878834220506,0.30032888783955036,34.722897587304715,11.490030107761388 +0.15006296906898087,0.30369156432953837,34.055462551461616,11.746988854654496 +0.1493608172470925,0.30025502739069365,35.44142254007624,11.648826917870487 +0.15205979477833187,0.29920190624048193,30.757116463803733,10.252210707651328 +0.15018555097229083,0.29715920544078506,36.96435324791557,12.008713656825348 +0.1496059326932456,0.30444200993603093,34.634726731639724,11.893727414798349 +0.15393987515099855,0.3027254191334045,29.276313568249297,10.188045564264758 +0.148823920852141,0.29637841369448026,29.23145458925325,9.289976026693521 +0.14987823609870252,0.3066220414549402,32.89972477879181,11.711580930733373 +0.14852604047365553,0.30239796323047036,27.67210910680731,9.33336864902933 +0.14940425259588058,0.30211920476421994,28.18005348022371,9.515713459787298 +0.14818353446176097,0.3004353639800979,28.816055734004788,9.473595926016463 +0.14847470997562703,0.30029028114402173,31.67007438881051,10.411527170137521 +0.15136327549844208,0.30009219390743325,27.01961588776916,9.038442478054105 +0.15248355570626684,0.301499272419576,33.04707749096501,11.282406825106197 +0.15199760361348585,0.3031456318462413,26.450605549384488,9.155150524741584 +0.15042077808481877,0.2972116997254887,31.516993094298478,10.158602969644054 +0.14985182549516174,0.29494313934881294,32.42361332165663,10.15460830711343 +0.15003006376276273,0.3040652634127746,30.917704075643734,10.674338213355442 +0.15100806705578995,0.3027883976724576,32.198293087340105,11.062040747767856 +0.1513154159244092,0.2967723912671493,29.208721763298392,9.47561539727457 +0.1510724884759975,0.30057996958891714,28.39935595697831,9.49461536818756 +0.15039471659303968,0.3021519660273604,32.94402864842117,11.201092394962956 +0.1507043428134657,0.30027443575282325,30.504657345476957,10.185005887703207 +0.15007504274168298,0.3015630006797986,25.028393256071475,8.404317683280748 +0.14972210630372232,0.30881027925171284,28.873533938254095,10.439178224961367 +0.14995656465616677,0.2969364521972715,30.14588666279061,9.653211846836694 +0.15133380159445756,0.30172572896062283,28.155038801533713,9.518673917430363 +0.14970735764074597,0.30182122963061697,31.27022315578836,10.480761333843954 +0.14987669028579548,0.29876595213634655,33.77156902249107,11.066239933620832 +0.15066621227237553,0.2965026523069077,33.82277279630746,10.86494660042369 +0.15064444273377195,0.29846446956809086,34.68813725035511,11.424405845451437 +0.1509240754414,0.2926298380774245,31.10762981448265,9.633555128567396 +0.15015543254805233,0.3102951868016629,26.198627183730682,9.547648448295675 +0.151187887036382,0.30392602769001636,35.54158900012908,12.357404683857702 +0.15096124138461778,0.30116808667878175,27.528886872450713,9.27762581252288 +0.15074469633372353,0.30357631347616165,31.434568640306654,10.888885137740026 +0.15231728083015414,0.2950433901735654,30.49784223852318,9.772775452148615 +0.15261278857034563,0.2976769971244754,31.521346610488735,10.361597220273207 +0.1491201771452977,0.3033897092134494,25.352366174146475,8.60507361117999 +0.15117968918016764,0.297063922532459,29.650298595542957,9.639535258536151 +0.14984471178615577,0.3039418984840158,25.198007417434606,8.671031915885104 +0.15127434032431572,0.2967269953441405,30.26242415102831,9.80020777430459 +0.15057252779787725,0.2921318364077078,30.074049208303528,9.21428596990824 +0.14918391934935213,0.29247787217776766,27.72054315309689,8.436040570672082 +0.14907462628923807,0.30153932148941814,32.27860760807237,10.804137399952669 +0.15054167314435105,0.2945817195406632,27.233589007951593,8.574582546912406 +0.15205903487835912,0.2954107984478039,33.5815530184291,10.796468826096957 +0.14907184604396997,0.3028846647897951,28.153514119167276,9.570593357401277 +0.14855915814164752,0.2976866623413082,27.643788487118528,8.885300843148757 +0.14962334888610582,0.2962308774534972,28.238008908866753,8.963907909006995 +0.15034081806608715,0.2988082471690899,34.36624249805943,11.26218078745 +0.15131397181464104,0.29965878561969256,25.551394559305198,8.518828835550021 +0.14957568335056004,0.29819074549633967,32.4460635261558,10.50901252598136 +0.14941386420823394,0.3036087425515535,29.41560914135012,10.078804414703177 +0.14930908210663293,0.29904205540046913,31.46034002469062,10.319727805694665 +0.15014416150018647,0.2983216662498582,33.91817074643053,11.045831606177728 +0.14843420529325052,0.29584218639320503,26.427630420759638,8.288935143872928 +0.14935162685215703,0.30258003530406663,31.709785881067106,10.779365553312896 +0.1484003934954019,0.2957778172077712,31.239248423721946,9.808467492517146 +0.15126517499981362,0.3065223598905063,31.82135409922331,11.406286117479507 +0.1501159027936589,0.30676538788915125,31.096004531909788,11.009485622588134 +0.1502300340358268,0.30650648795697294,27.82515685495974,9.846980163415775 +0.150733083678099,0.29478925458307453,35.13115861226888,11.120631251079207 +0.15012103078327424,0.30259408318590536,31.82108630012362,10.864029911724364 +0.1495535482827588,0.3056839141080761,27.782103177203627,9.728978818072942 +0.14892485040545458,0.29468936012551117,34.597633606295666,10.790975334092131 +0.14996277874799566,0.29717205170731187,28.55278660495845,9.131355142452048 +0.1491170945405512,0.2954801486526267,30.86321737947841,9.72906827289226 +0.1504737544383924,0.29657549717619036,27.580781440857557,8.84869312686575 +0.1506268826706176,0.29945553671630337,29.948330283472895,9.9243027706091 +0.14948382025700868,0.29888876378448676,29.938674371650208,9.824021907382772 +0.1515632676058128,0.3024108173244632,32.04212660735104,11.044982849409127 +0.15030804420445695,0.30975795362533026,30.701691801681175,11.214475464366036 +0.15011097131749862,0.301567456135062,34.99205210234097,11.804452530965325 +0.1495995475207416,0.2995346286759122,29.49127606326851,9.737538504466146 +0.1489380037404065,0.3075371180379913,29.128929968151244,10.390478132436426 +0.1461371616546646,0.30017893361050646,33.12539687839055,10.708828494439661 +0.1498404465152227,0.30811031323360766,23.221254678849252,8.370715138489697 +0.1485247689715927,0.302528065397603,34.401385208341516,11.589669362671525 +0.14845342850709162,0.29634331842577005,38.41954657661079,12.115240906248179 +0.15091825458156335,0.29952979519137674,25.875348900280727,8.60908646947146 +0.14955109782407647,0.2956367489421641,29.43251611526833,9.221358620406383 +0.1501771065615232,0.293456880759401,37.90896859119581,11.821650457168007 +0.1503635018578888,0.30484194752221594,33.273665410957776,11.513016857175039 +0.149810512529218,0.30368550031556435,28.177412289786616,9.684504367002942 +0.148527868907781,0.3002801812581374,30.015811521555527,9.865075261940797 +0.14815347224927553,0.29427902862812755,29.582489361367315,9.15202012191882 +0.1485415441601237,0.3072222336327934,23.597641006242057,8.3656519933588 +0.14927068930355938,0.2951046054581521,24.06353820771672,7.531267301583464 +0.15103769218436275,0.3015965899359185,30.645307458800655,10.351115501051677 +0.14887768434369197,0.3065870789992836,29.095640008050868,10.202334159542612 +0.15073766923747908,0.301433766933661,24.515113382499344,8.292801341056801 +0.15340947646511838,0.30227038125255407,29.8181751745794,10.337843080820736 +0.1506495839907466,0.300783370070874,28.140787823005173,9.46817577300456 +0.1512376417989485,0.29983775563939147,33.57245732829386,11.201090790895941 +0.15053981882125825,0.29751989615459584,29.25003643000913,9.449101664590913 +0.15221728196702,0.3087235816482445,30.24560456569879,11.104355253736912 +0.14933414036706344,0.2984513942174392,33.998821903656996,11.05731246680475 +0.14925196503487678,0.3039332036290466,32.36084230920982,11.05954101031912 +0.1508171431271309,0.2960509621595055,35.18004165632749,11.263583596334051 +0.1514012625695033,0.3025305525863239,20.835507479840576,7.163041881983164 +0.15040320915965236,0.2938396973575154,31.610475275489456,9.850663181898154 +0.14903549572723307,0.2920007721639386,25.747566419348058,7.810978030142471 +0.14956443374274261,0.2913411127971414,32.86782977506564,9.906599480362251 +0.1505874978435055,0.29978848402518365,28.010683407739158,9.316856019325835 +0.15010684600470395,0.2906780064911754,32.635711786596495,9.839350799436527 +0.14865150166713487,0.310147401093875,29.650146103310405,10.690635175163155 +0.15068683388723486,0.2966218117647218,32.72433430090361,10.486190016159235 +0.14939332647676357,0.29670510164521424,28.834027409304156,9.2174046236861 +0.15147545989811723,0.2956011731907298,28.01110245698955,8.98287545028052 +0.15007989923997067,0.30707357370461635,30.999336454628207,10.978922669434603 +0.14968885836801518,0.2983704404171525,29.774092460635142,9.698236943256742 +0.15105738333145605,0.3027371807164543,32.88381563979346,11.27352169644442 +0.1504482853811945,0.3076565354312947,28.565851171996716,10.19422806858283 +0.14940886740933051,0.3045242555096369,34.810683242030144,12.017463932904382 +0.14951476317830154,0.29722996628883486,35.77505804186834,11.503950325058447 +0.14974142129556475,0.31236033841830235,25.127267981652512,9.292416444331025 +0.1514741554422508,0.30193224924474,28.06663221585369,9.60363480807595 +0.14884541716622232,0.3002726634428214,31.003341562012054,10.222929233023898 +0.15008731819245644,0.3046886525892817,27.540694959026613,9.55466465059206 +0.15035192037690884,0.2973916158113025,30.292086876375066,9.821702126469011 +0.15007624961232682,0.295181472678694,31.67276697671139,9.954465393918783 +0.14943236130265353,0.302520465909543,28.964405728326426,9.859260910331562 +0.15096069803315135,0.3122985581187566,22.997293452177516,8.64166803339203 +0.149905934199855,0.29796058964846933,29.83516937671395,9.69934831511868 +0.15206562676466753,0.29987396453434845,30.756572071565948,10.352713098352725 +0.15181482660968426,0.2954205969277141,33.674906128238696,10.819049050552058 +0.15066022642385013,0.29809668059152167,32.23285459912112,10.523908461745721 +0.14872420820316457,0.295677014828812,35.28447902022936,11.058509779922593 +0.14919267630002434,0.3079929253310883,27.301499075719914,9.72982278319373 +0.151195740484313,0.29828017460936185,31.90239306021451,10.508921132838367 +0.14847051818328738,0.2959028040123085,32.54816143769567,10.19319127713054 +0.14891540096107067,0.30301189131472295,28.39883225788003,9.676500568756666 +0.14856067853097182,0.29866720792816903,34.483110597998305,11.19132741859297 +0.15099640109158308,0.3013257346369828,32.43162926033125,10.947577794737045 +0.14992386548862122,0.2973825213488473,26.039516772577166,8.337966411987656 +0.14979567699585092,0.3007711814565209,22.178515588978303,7.377255834725323 +0.1488834595412765,0.2967296213854131,32.237864863043065,10.251718975290927 +0.15105080210916697,0.3078235919147671,29.010719602377964,10.497214447027353 +0.14962052607059487,0.29887597461329063,35.532733029664605,11.51818092712987 +0.15051176468864985,0.3008317780945194,34.087530306342984,11.45422501795107 +0.1496638410538255,0.29739106329268156,30.497409646600982,9.893251282421687 +0.1475283190098092,0.30001262416344165,25.889311270080093,8.414107776792289 +0.15141939138396118,0.30346333934903325,28.568445480728503,9.89671852602635 +0.14953579991479152,0.3054416156843027,19.62948447266443,6.836154309855296 +0.15160925473286974,0.3023545137651828,31.677690790499565,10.899448428621973 +0.15170259489562538,0.3056002152221959,32.20742536978436,11.43153218458201 +0.15029126855475228,0.3018769883595856,34.008303724772475,11.512195015153056 +0.14875397098944085,0.297915996598035,28.521959588948153,9.211149379174298 +0.15022581388341094,0.2972302384595297,31.89538545145334,10.301146079781304 +0.1518343877468685,0.2995550930844325,34.45993343964761,11.534108191580327 +0.1504985210036231,0.30852764177166064,30.67564751794201,11.120825946639169 +0.14718803997714522,0.3013294637723279,33.31960179586998,11.02063408504256 +0.15136290375834152,0.30340779914978555,32.71855708531034,11.312251548344655 +0.15041896033364155,0.30370343616700973,27.497926852813684,9.474610345812014 +0.1501266869264382,0.29923367166592735,29.981285892846213,9.876816944419174 +0.150504650882017,0.302961379053167,30.31010623939813,10.377305125459655 +0.14904380219696375,0.29962239684420006,29.401414231678654,9.634073011175083 +0.14984238689970963,0.29548506585853157,35.42920295184827,11.200533253125592 +0.1495299289710056,0.3042044842718961,35.473885641967925,12.20125939568891 +0.1509853238099516,0.2992233647088931,33.63135876908111,11.098272715970781 +0.149699528339886,0.30033334362869946,27.800949494704888,9.18081840186161 +0.15195169486875026,0.29759968872265463,27.29560128531306,8.960661191413271 +0.14846568665068594,0.2971448638182939,25.05884725507444,7.999762288754454 +0.14969925191152958,0.29560660830042723,31.831185898923472,10.172847405611444 +0.15092000924039667,0.3058486589859063,32.41285369264857,11.473198295499948 +0.15117333748727002,0.299903491643092,26.880660460927004,8.933877083316148 +0.1500115098337956,0.2954244669706926,28.405340777371308,8.990188906338961 +0.1507038370900229,0.2999608310203366,25.956220028865225,8.619141542627144 +0.15000729172305646,0.2985834165615822,31.76886949724714,10.394573558387023 +0.15008371182533833,0.304759449519094,32.404221506053375,11.286860365641454 +0.14954647040832605,0.29193265475580726,32.180279621011366,9.800569548909865 +0.15026352713039168,0.30667054864627613,32.563500703799775,11.567457976025736 +0.1512197796864721,0.2978932626815887,32.28903622368725,10.577577702107725 +0.15238247548005923,0.299727798873198,30.020973312479917,10.085291318219184 +0.14963471274357273,0.30833490631991184,31.763680628541575,11.399222356347066 +0.15069096267976723,0.29555559725305225,21.945145281526106,6.999783217315004 +0.14906332119602608,0.30078907541737004,31.82857201780256,10.53608151630675 +0.15096897077479235,0.3061998790380042,33.725308133346694,11.883238164180336 +0.15303905981895968,0.29652596958464833,26.763467153734265,8.765633790462555 +0.1478600663223602,0.2983808573383068,33.48915353562495,10.775677750584816 +0.14935287474535486,0.30778356482222485,29.78557936862807,10.604893054996161 +0.15030597013935515,0.297368154159861,29.634432661699464,9.559298425641812 +0.15014882924433626,0.29793900652451377,32.10173908971657,10.455855136243636 +0.15029126155730482,0.29499503179725545,32.36240420224954,10.21511932852995 +0.1493695735451285,0.29456297925207664,25.26744910964684,7.853210368946722 +0.1506264799985951,0.3004012712167485,30.984337748161245,10.380640499437291 +0.1504959960745103,0.2985506096318322,30.701727969817608,9.99587664425099 +0.14730420545928904,0.3054293425249275,21.498694617507013,7.3931630438348765 +0.15011991927676532,0.2917606772406839,31.871302363247022,9.698514560408283 +0.15049152874605512,0.2998635834152635,28.939804453484097,9.60875685738399 +0.14861715853069818,0.29377150168966115,33.88056885263483,10.484055433097371 +0.14954170603195424,0.29958826700348123,34.26125126580131,11.266765295293034 +0.15028540137036217,0.29957248149268023,36.31808622681673,11.98250341076789 +0.14980149075370627,0.2982014204622819,29.943244965357902,9.67781938523417 +0.14974101220961694,0.3007720743652712,31.87129192687078,10.630076291671175 +0.15043448161946263,0.29911860754168434,31.682542497939846,10.367434946230235 +0.14965365927148866,0.3064274278270651,26.481989849436903,9.356588330705788 +0.14916242581306716,0.30284602153686674,31.814429648367987,10.836784700722232 +0.14840511580669916,0.2966374439664789,27.72986329394353,8.799276236294478 +0.15066665111234054,0.3035633042806067,32.87731108273644,11.331720676715786 +0.1499988547439509,0.29375838860089315,37.73029297237324,11.705213345516691 +0.1503946768808426,0.303027305948094,29.556884163357076,10.101801134219794 +0.15033336328330446,0.28712042826616097,29.716418208527145,8.64581471342467 +0.1499164639143507,0.3076644812970313,32.80319812415531,11.709399981196864 +0.1494875838175278,0.2982945145400079,22.9859717335433,7.475518835242214 +0.14834483880313576,0.3041760036664769,33.42119127948036,11.399047511107959 +0.1495707537962058,0.2976638855266377,28.08836454516386,9.050376525600512 +0.15105016406805605,0.2935114807535733,35.43199709641456,11.086920087173864 +0.14964186997612972,0.29677675073120896,34.00123824114151,10.877933731766037 +0.15004654409814153,0.290443587333257,29.793474865237595,8.979665820895963 +0.14987645049698783,0.3035345959006752,29.808577046027487,10.17054853869589 +0.15042934365167723,0.30142370738832797,39.976397530094786,13.42119402116996 +0.15165518319027266,0.29876929702375304,31.975515652581407,10.592778032707871 +0.1484127397037552,0.29804497549077325,28.792305511977894,9.220972500236284 +0.1513425003292779,0.2952631576344503,28.8979471336642,9.271742967769683 +0.1523495143231631,0.29269848264865816,37.98575401231982,11.85860090783325 +0.14823832975520698,0.2945966802602164,29.01959759382838,9.039989711102104 +0.15008833608400537,0.3065103556252731,25.464078710841417,8.93603369783883 +0.14934975588118252,0.3023978391848593,39.753869781398514,13.428670244510142 +0.14954780991863534,0.3038794416198502,26.457671084031077,9.108902820086826 +0.15021074147750382,0.2961490991789463,31.797238023379204,10.16003922418946 +0.15150800144780566,0.30510130821426296,23.320998384663305,8.189843909502367 +0.14972060151039338,0.305334552387785,31.08238777574914,10.825131286613994 +0.15071350718856238,0.2956339529582213,27.91910441878462,8.915701397303552 +0.14776207428935823,0.30376010941986387,38.50080070979914,13.01534503532434 +0.15021858676240835,0.2995165761693487,29.994361106315086,9.922274880468667 +0.1499842563313311,0.30457434082795765,29.960509895617236,10.353678260894942 +0.15158037569352312,0.3025840503227385,23.132742678746716,7.97613992075369 +0.1486824228909639,0.3068064689316353,23.736287842289165,8.287659076765763 +0.15089448642168105,0.29843970677396375,31.65316319904052,10.370024134291691 +0.15059994197774715,0.29948226295030317,27.41278032311454,9.070320486661851 +0.1495451723666315,0.293580115948483,31.522491875118227,9.77092998648504 +0.14905393495525013,0.30064066694401764,28.403398476387025,9.408616695095459 +0.14956962527673787,0.29372033511292045,31.47469096913138,9.749553360024645 +0.15152768132541225,0.29113162239141893,31.78687483032784,9.719632719084078 +0.14992172772480417,0.30500415591407054,26.73841147498423,9.324908945459596 +0.15007908096987654,0.3083259257435715,31.23474537152478,11.343425018475052 +0.1484305587004544,0.29813185858543145,27.059824391240227,8.719741770749515 +0.15013260666003247,0.30164777037467105,31.781739027043514,10.69477834862357 +0.1501221982910582,0.30290767363185667,30.570537473007754,10.451262925132175 +0.14955971240174162,0.30553827273064804,23.85797314083792,8.349455279996283 +0.14742182802714707,0.3100328616077529,27.790669203603244,10.044960508486021 +0.14951348265486752,0.3033070403297169,36.05189617904461,12.312945166099151 +0.1505636977409086,0.3042202724158908,29.240706772621632,10.118053347532847 +0.15050767174632826,0.30330023060599,31.09619405423005,10.650680934389129 +0.1505112975587273,0.29183596971304504,29.64542956132206,9.053422002746295 +0.14983940968367063,0.29894693571588526,26.031936503313894,8.534260677387074 +0.15018905952930703,0.29503432917093486,28.740719573980122,9.032415838068875 +0.1503119575775075,0.30209702561396656,30.365409852605808,10.27668837460015 +0.14866657432968375,0.2927697726054152,32.71434272170407,10.025319848439704 +0.15001747373076518,0.29838438322272837,33.85380739533931,11.055148091131448 +0.1504638281689992,0.29614539750735314,34.186010612699484,10.984530623517518 +0.15279144421815125,0.3073850187591904,25.50058817011695,9.254127866120534 +0.1497246281155596,0.3000550888447516,32.90106588818892,10.926628781542133 +0.149532221988721,0.30577487257077623,29.869371113794045,10.40676638581266 +0.1503799554939536,0.3077174270811872,31.27022627602555,11.23318370517471 +0.14839452045728455,0.3052216820170324,25.80853981986696,8.847452087759237 +0.1484434196857105,0.3018665564593739,30.646244619704138,10.225902255311492 +0.15035689143378028,0.30011845925638003,30.3848829220658,10.108905853593402 +0.15122960273799693,0.30268262933442686,40.49249158382302,13.880386308108509 +0.15064270393178764,0.30263491515115437,30.54757882174107,10.454551939237284 +0.15062402479608974,0.29995483114727906,30.728901520323927,10.228294240364802 +0.15034643523032404,0.30033205536040075,32.824714826771604,10.975320193004437 +0.15039922107687734,0.3064911790888299,24.894688772644646,8.846928525618587 +0.1478402767022365,0.29981478069867007,36.22687384124418,11.823883598756138 +0.15096228609533102,0.30821683883793266,29.30332431612397,10.560829159960232 +0.14896398145417414,0.3004601101378839,32.60066976580299,10.766665895824332 +0.149090849738353,0.3035190654809991,32.076224730559595,11.011745702239166 +0.1502191750915234,0.2962532824496803,28.891242664861668,9.237864058261346 +0.14819990219259774,0.30125358118360623,30.275358761646324,10.054876375065364 +0.15059831075819485,0.30353670278921374,30.107687869021095,10.368896517807734 +0.15007460001560333,0.301496773945415,29.439087156744865,9.849206317571326 +0.14978654122823423,0.29618968164510245,26.363362767234698,8.403383801839116 +0.14942175328983148,0.29974530428604645,34.963496403498,11.479617185169529 +0.1495800200467064,0.2989566584881638,30.16552138725714,9.8333982804796 +0.14824832904209867,0.2926886824299055,34.57094013841479,10.425896459076101 +0.15040418941157982,0.30542904401624577,29.7286005960694,10.443534634179846 +0.14960445935515512,0.2989117121470337,28.17913401077612,9.259022161948035 +0.15049645787541147,0.30010925330796495,35.526072435488615,11.746207886775757 +0.1502920127812123,0.3007627596036902,28.473182835553807,9.51538333509737 +0.15003616108911877,0.2969102160840476,35.75321225542645,11.461235151570149 +0.14900859288325075,0.29576760203975627,32.55653477844018,10.218122203601302 +0.15148816840431745,0.29786024753366647,24.659049637283324,8.075870221609039 +0.14899160509870846,0.2954923111437254,31.24562402174696,9.811439749492953 +0.15031236931034347,0.30405442071201094,28.089355465920075,9.752970570284168 +0.15099063631508525,0.30337788271759314,30.46422373850013,10.535862105604362 +0.1498711814749599,0.3000310492113073,32.11500345041348,10.589514986439589 +0.1510578354971278,0.300767868355497,26.72592038578928,9.050197784202208 +0.15026126362638156,0.3087833938604004,30.37093206481986,10.998813748036719 +0.14925594063539818,0.3064601308690526,31.27988008386527,10.972079926892425 +0.14999340817149734,0.30215454800392216,30.12425778047354,10.196886168619903 +0.15124014370398545,0.3112408869390791,35.54231657976504,13.231842108889946 +0.14939070796989323,0.2983126075137707,31.76266676052733,10.355483494323897 +0.15105315595733473,0.30110076762567856,27.733921080069788,9.363282553373928 +0.1522675063738427,0.30243731685207836,35.998029256830854,12.336205787525653 +0.15137718826335542,0.3030631839194479,26.71540075844504,9.257688655494318 +0.1505129796217725,0.30442757403259013,31.95205628553071,11.069838506409985 +0.15083321732790148,0.3075938363319539,29.3075055138151,10.482356095495415 +0.15076199380864716,0.30501111161853534,28.301471306319755,9.83157229505239 +0.15164840825144268,0.2979900337404267,29.702201602242653,9.770348266742376 +0.1506159382088891,0.3047478746692576,25.667898813944042,8.936966424058694 +0.14781427069899347,0.3002791178092623,30.561090821483425,10.017085521134605 +0.14991150817041568,0.30167764433770966,27.51190087550193,9.19326484296544 +0.14860335106142353,0.2969871025806413,30.633142224439514,9.794576140360453 +0.15047529242251503,0.3071077680038786,28.351841342603908,10.13869981976002 +0.15048738101856848,0.2979406085048884,31.579346059972963,10.308691751907041 +0.15081732624385974,0.3017368960001518,30.739268419839615,10.395962207409895 +0.15047582078668134,0.3009112486806818,25.165386383635436,8.456140137549104 +0.14698154008586975,0.3019701359347489,30.37259097833686,10.055104719710538 +0.15055912155285428,0.3042619346488645,37.99439001126802,13.128286332968244 +0.15245386743130163,0.3031803182659711,26.725139008648917,9.299197705046604 +0.14933421759586793,0.30390566855274315,24.75051873483075,8.49797773720767 +0.15098035540313015,0.2975437725131452,28.26419207614187,9.236316334401748 +0.14974296280644311,0.2970443131178998,30.350469208350393,9.744256832612125 +0.14959654933529112,0.30045108314702534,30.635669640334832,10.122762011736121 +0.15300285703403874,0.30814188209171656,35.58379491486449,13.103471627329599 +0.15174809129180103,0.2995560920240514,25.338925781979036,8.469018894113725 +0.15134705289674905,0.3026412134811962,36.93951648627321,12.685565269309706 +0.14972044974670232,0.3010014365734588,30.721217070806638,10.28142533975891 +0.15076663399113646,0.29906105489095497,30.187364942475934,9.951993674601098 +0.14946082362281138,0.3017221657863229,25.901307831328705,8.703314322305722 +0.14814378987189988,0.29989537016431295,31.597855838156626,10.274303415528205 +0.15071527787518674,0.30307148420688046,31.865722787252437,10.962048633789829 +0.14887233348452286,0.3063798821311468,28.901091711505533,10.084527175717751 +0.15006651012737268,0.2999572089739547,22.439234529744688,7.406452049007694 +0.15143126530568893,0.29978260793972933,32.43894508645403,10.7851596840271 +0.14929619676265496,0.2949699790324807,28.681329534044835,8.959908550534198 +0.14921911080818756,0.30772368829437746,28.897637104650155,10.236593359726196 +0.1514704486937403,0.30534657080917466,31.080560067525877,11.042920363139318 +0.1492268347760353,0.3015024345446527,28.454293992855412,9.52362538799083 +0.14889163951984524,0.30456309213111904,32.12152952681251,11.027074311002497 +0.14994437825104304,0.2973577290319032,35.80449280436012,11.599314819558693 +0.15029620712668457,0.2995920134642264,30.21350965393811,9.997212926593829 +0.15075921607986922,0.3054426849363509,32.521528883256615,11.377384042037555 +0.15277998645686627,0.3015691401763589,33.04996296131755,11.304308003870812 +0.1495530241254761,0.29775488710425874,30.77479637504087,9.952836314683168 +0.1496246783293217,0.3035442807640575,30.977065386234912,10.549032626692393 +0.1477338961065218,0.3045376877099549,23.29782432211352,7.947893151678534 +0.14987008971825747,0.299361973595382,34.04464745498466,11.219273039029504 +0.15034416790606064,0.3017173506852343,29.983845702056662,10.188387707307122 +0.15183477297391265,0.3011125936500516,35.75884652094452,12.03530685853131 +0.1494646340263628,0.30133067547886755,27.72414127393786,9.286971608347129 +0.15014855786359685,0.2987012080549104,27.54947087388112,9.013052564479484 +0.15011097596219167,0.30321879832728243,28.892222680326256,9.846611016479129 +0.14891517326006778,0.306973628951811,33.77368696149364,11.987799864929343 +0.15158964099473385,0.2932741429834015,37.439121550044995,11.72438926298804 +0.15043739752561508,0.3013977044368349,25.251892991924773,8.48374367460529 +0.15177473551447093,0.29377130655543576,33.098028762263276,10.431363174568787 +0.14971500833053702,0.3006475980205889,26.261018577315586,8.723228674784597 +0.15037619221653864,0.3056806014568973,33.438140829680854,11.720684015115708 +0.15050063343719752,0.30132439999456323,31.361889141667476,10.617293179792238 +0.15195044855286752,0.2964530142533747,31.697719622603724,10.267709605438295 +0.1509997213897438,0.30083947594422683,34.09507487977175,11.401923442310917 +0.1493936764103301,0.30430481260768383,25.774607536991198,8.904072801620746 +0.150285399861357,0.2964984653829919,33.333150582465386,10.666566954439423 +0.15170574955173022,0.2970335429289505,32.177326573572145,10.45407799972523 +0.14885982144042306,0.2959821573859365,35.68042547999434,11.214783694733185 +0.14963654069873492,0.2960877995114982,28.334346227304643,9.009632266933693 +0.14942410194698472,0.2969217052895385,29.92328867245512,9.541373205304504 +0.15201042833132936,0.29504970596595764,34.53445348444968,10.993666085874604 +0.14920552591838968,0.30350980567207086,26.479334224920702,9.013117692876488 +0.15095095269613323,0.29544407770972037,26.88632572350824,8.5584802110092 +0.14974533012061716,0.3008155268082256,30.07740895007837,9.974391308613784 +0.150452457299708,0.3006608856929653,30.098359297776593,10.054876658776728 +0.1499609393462675,0.29455573706014,33.1733116952727,10.459643208154443 +0.15003011356997148,0.3053249254863244,29.42136433484925,10.260414308245997 +0.15152231299088925,0.30654515879498717,24.19232463470094,8.630481869250877 +0.15007709548049963,0.299248943478987,36.132354776899014,11.870758700641085 +0.14972172906559045,0.3024270914068886,34.303454829047894,11.69199328622275 +0.14744932482940104,0.2983158890015547,36.06856264978344,11.554236227541642 +0.14930939184521574,0.29879160926849035,33.14200523290236,10.791490227885047 +0.14827792815752758,0.3001635411907756,26.009004826963697,8.527776435172644 +0.15030824774095938,0.2922818159280644,34.201404745980135,10.50500327007261 +0.1497687721925196,0.29393469784213433,34.96823323688797,10.86253957046205 +0.1504772255297223,0.3004851501880599,32.83204543843338,11.016377517399015 +0.1502123969560286,0.2975156392132613,31.119483775158223,10.031620281646772 +0.14881370878314598,0.29783617794752804,36.074226143035,11.580741003247546 +0.14811228883959004,0.2950584001931784,30.64119640983703,9.555861576747883 +0.1502709833778278,0.3074470083930091,30.856364290109493,10.999227860793168 +0.14971501197611034,0.29894233419685406,31.693648376861088,10.351507042053706 +0.15188943229338664,0.29262729869688475,32.33857929478733,10.118144931254232 +0.1505881762532277,0.29449515151212036,28.248264632413925,8.868049781529843 +0.14962957772965027,0.2948321224579357,33.68736455003864,10.509070086709325 +0.15022714289313405,0.3022334853240312,29.989349146264622,10.181014058481725 +0.1492676522531901,0.30288338330402054,23.79621560742798,8.040845989477088 +0.15016352417594228,0.2970415834968029,32.9576105072256,10.613939569728256 +0.15087663369708124,0.29489192630298183,29.25899261762829,9.228823984818831 +0.15066494068946434,0.30182956154672885,34.06356524567266,11.463028189783495 +0.15052450373897486,0.30024126704606485,35.32144724147946,11.764968400074517 +0.15097920524485783,0.29396442709290305,37.089111340193085,11.649364587669771 +0.14999559420243685,0.30769915219071736,35.335171770534394,12.63161130950466 +0.15129324950342174,0.2937844570746633,36.70103830424468,11.597319945160516 +0.148624439964103,0.2988571735172921,24.856336096672255,8.037254678883912 +0.14874680760987471,0.2956017910400362,31.274621031742267,9.830912721012163 +0.15031138112595765,0.2954051999378654,31.95477246420269,10.143882284023913 +0.1486725534277802,0.3087354948558257,25.338350710035044,9.088399881132492 +0.1508691106951796,0.3028155838955236,28.531232510868513,9.816610026276138 +0.14991884952395507,0.29986560250204414,31.456794501035947,10.354143443443194 +0.15101650314377255,0.30191944872083354,20.40968351284777,6.982569134070589 +0.1489028003432585,0.29997051830655425,34.100386314718314,11.19029447207648 +0.14947179840744554,0.29625233713796184,32.860406695548804,10.460020527478997 +0.1513007882547658,0.2989673078819293,32.124337207384016,10.61666910497183 +0.14962303075309719,0.30927241968968566,30.535196841300163,11.050710375498394 +0.150203749062056,0.3049514772792416,30.06495799788686,10.440823888173659 +0.1496738183366613,0.2951282732393422,29.55485122655795,9.292735249675323 +0.1504656092519898,0.3006836244173087,37.447899265188596,12.422564096345393 +0.1518391511286107,0.2964608972811456,25.64094296610233,8.299438132919102 +0.14894480784825112,0.3030274015230403,25.769206702664324,8.699532759918915 +0.14994401647591324,0.2997704649080038,34.09713282642293,11.295414429330572 +0.15091996732170812,0.29557947527129574,37.60097742129681,12.00239116066689 +0.15103487382031225,0.3073007208211147,29.69758553534111,10.595283549231368 +0.14921500535935,0.29734873693425,34.48501218774419,11.013155843024803 +0.15004647816833308,0.2946441868146561,27.349080486092458,8.626672425272654 +0.14910192844557915,0.29476182654477634,32.13774967170808,10.030829060707859 +0.15009325272174182,0.3050202227194285,25.007573130584486,8.715864486565915 +0.14843846459316606,0.29865306151804866,25.771060691150485,8.364694120741532 +0.1484996434749374,0.2992491357834512,28.065852423673288,9.101224747816511 +0.1491896776163524,0.2996091248299141,33.31395174252376,10.887811024138056 +0.15074385633224033,0.29708282304709194,25.431023931637572,8.204435182378214 +0.14878130361092867,0.30264604389771826,28.389835573750435,9.564040350750982 +0.14888400896336834,0.2989951046517956,27.090582107793278,8.798165246892236 +0.1493752734527502,0.29828436317592455,27.961389338307384,9.026890574536429 +0.15053799719618718,0.30375644286700915,28.313153164677956,9.750139592724032 +0.15249660566769366,0.3002438790638846,31.688193436766415,10.730175910986688 +0.14969918970051768,0.2987399323172421,30.384309404212097,9.92899122147034 +0.1513120822823098,0.29659918266115154,25.184492714373697,8.14250776455921 +0.15154488196851798,0.2985429025933996,31.358667050327256,10.337324153650313 +0.15131848544270254,0.2959657930493102,28.664921673514364,9.219661339532506 +0.14859534537554872,0.2936794054400765,34.32001612654417,10.588318488388532 +0.1522497694023173,0.30037128625233805,32.43932501916078,10.985415618753228 +0.14980485133133742,0.29790326912660825,27.062161960583545,8.750691917664522 +0.14957444922451812,0.2993558016529249,34.280166893025395,11.260952528563772 +0.15027385175027963,0.3035097829498189,30.956424252729455,10.592577698939682 +0.1514279621110235,0.30660352122469786,26.099703976103896,9.322835797400263 +0.14959602165188984,0.3044426164971176,39.77227981854566,13.734431086846826 +0.14861179930026663,0.2998820979558367,28.87051054580255,9.468094262018537 +0.14964599253960809,0.3004610212867709,32.305175447111424,10.755759998955668 +0.15133651739280576,0.29713909904633373,30.20642569048708,9.805925977855937 +0.1492581928668257,0.29209745008257665,31.446993517617766,9.547307518470944 +0.15062405788799085,0.29905272637925995,28.058865741919167,9.237860141711348 +0.1512562871754747,0.302389185983912,33.990716318977896,11.62005921535147 +0.15072381839786142,0.3034413328169774,39.34995285574176,13.591755739853848 +0.14974983617989948,0.2971032982544519,27.11347089204517,8.717130239887624 +0.1504737484616696,0.2939773577737072,31.13119378296351,9.739478772326397 +0.1496896355338431,0.3031460470104097,39.345161482398126,13.469768379443533 +0.1510377242085587,0.30224289772970575,32.79810438361782,11.227797358814206 +0.14901467148599062,0.29931957167310436,35.23773011246068,11.578175976031568 +0.14926121483946952,0.2906023540514064,29.119571892836518,8.700806879754595 +0.1495532551560739,0.2963871541816736,31.60866283541361,10.099248959494352 +0.15038384487200787,0.29902463980447497,29.04668693086314,9.522465278158487 +0.15085109265056304,0.30301544127535474,24.43433268935008,8.399926493783124 +0.1480664595781356,0.30543285605636705,32.60082666849543,11.275406571382439 +0.15257487130087916,0.30698747159079737,28.201896126169157,10.179603900481647 +0.15224863381155257,0.30256819231350973,30.430132672961225,10.49948051472565 +0.15045785555504043,0.30984028234629385,29.441347729028482,10.752984580326572 +0.1522877936963579,0.2908553666671632,28.409603492895528,8.686411118460873 +0.15186537244884848,0.29915944457918997,33.92499026237375,11.29244757400555 +0.14919784547863216,0.3013066141916268,29.432221275585977,9.802422207263307 +0.14921066691129106,0.29277757068958643,34.25178827731303,10.459856718439683 +0.15124509827722338,0.30183565327126216,30.793706877728013,10.503426439953618 +0.14903661685904163,0.2991914343551967,30.590796914631078,9.9834496325653 +0.14943060234616568,0.29779374040997203,30.762084850999777,9.951735699653582 +0.14964014364821807,0.2999442320728595,28.659571886198783,9.50032127633544 +0.14949332945039434,0.29460291068000016,31.730665495422503,9.93142751278643 +0.14854455283695037,0.29218923402697283,29.710739865969142,9.051012908502521 +0.14967608524476597,0.30632864315673075,27.976653442243553,9.8494887637866 +0.14972582632731116,0.2984468030073468,33.56047995953689,10.916803751009283 +0.149751460907365,0.3021773297632562,35.26275222635192,11.998781159840615 +0.15050409321221306,0.3038144933442783,23.027530153505833,7.93404139983004 +0.1501191437584678,0.30406095969897096,28.18141589205536,9.690260927054194 +0.15089790497606143,0.2989960356931945,33.99914763437158,11.306191675367797 +0.14960146688877243,0.29775216677859206,30.62478070876906,9.886604940453712 +0.15163203244888238,0.3054986711957548,30.209428793936617,10.705526300695931 +0.14934680492695457,0.29649645625954457,27.114338550981365,8.63116263936718 +0.15089652035708273,0.2966231247965731,25.818925420968647,8.367892389359435 +0.14837996327825118,0.2984946479712351,33.72275523380344,10.917236727552558 +0.15152946976073273,0.29838689259869755,38.864371605531325,12.828100633395344 +0.1511116291593096,0.29971131427462855,34.2713176726586,11.419489383955074 +0.14868831084143888,0.3068465825304793,26.453326720667544,9.269484257594735 +0.14875579465956834,0.30351986751218535,34.795189805153534,11.86223885654985 +0.15147483108100215,0.29214762444785625,33.99225877571399,10.515682171482293 +0.14963429638610848,0.2969359500965749,29.09017897984522,9.357430017376188 +0.15056708076387043,0.3006227331485528,35.10333901659912,11.71273419992228 +0.14962517059327002,0.30116558432034074,27.474476199176703,9.201314957613148 +0.1515117925177827,0.30451597442400974,26.999702780557392,9.425967795580993 +0.1500345949445627,0.3017236514057741,30.889584790849135,10.417839043095919 +0.14889852755646008,0.3058318091270072,25.101943500285554,8.811297393169474 +0.14971766350864477,0.30439287544683835,30.54882256666543,10.517984737129993 +0.15122084278678719,0.30204995549403396,29.944888013580634,10.16937153687168 +0.14909322799124655,0.300941119131474,28.324501216630008,9.39504185153295 +0.1500725448558092,0.3096008486823499,25.391980985957222,9.321465191122105 +0.14971028784801857,0.30356569981722054,30.99365467372147,10.634823331313976 +0.15023174062551567,0.30454114114792497,28.128764574412855,9.741460456470882 +0.1502068080676623,0.3036793432364135,27.237656834001864,9.358788041323383 +0.15141021391591103,0.2943595567637614,35.27662833369138,11.168360010761585 +0.1526981810448354,0.2947877665544794,30.2348810951829,9.647044158201139 +0.1511407747033369,0.29871737485312405,27.150666795757402,8.911503008741384 +0.15011753896402796,0.3028871384522722,33.32597728648213,11.385042381439787 +0.14911829989374217,0.3072879622849187,27.075606986936002,9.603672362390835 +0.15255675883892658,0.29805192026486005,23.83736991701679,7.878819703093543 +0.15024860486393266,0.30504214282182956,29.12901997218977,10.153791204030993 +0.15111279030780286,0.3027341702584137,27.182425929361983,9.382552995399879 +0.1512480470367665,0.30264364547957856,26.522525379378422,9.112812713702818 +0.1517961422721186,0.2957009025390981,30.42304470500082,9.79726231754013 +0.14940113082552847,0.29767671391993544,28.79527819370619,9.248355401321312 +0.1501012916943746,0.2986534021382506,30.981523033901016,10.120321230856375 +0.1508669667945632,0.2999391267464977,29.71653616457537,9.91916152523609 +0.1493572435382864,0.3031229860175865,30.802334439611702,10.500890212175937 +0.14936382467269696,0.29533109378215294,35.97257223871332,11.367100386495729 +0.14868204856148268,0.3026410738262118,27.388579022796847,9.344308031798583 +0.1507757559647749,0.30896992147857316,35.20127201948401,12.79459964521298 +0.14867606017861779,0.30074110836926754,33.80690123265691,11.148275970033982 +0.15035599841723,0.3067037755588122,35.49157290416888,12.584072680336586 +0.14936590777902642,0.29856866773362256,32.23459040899341,10.445437206914516 +0.15160155864749766,0.3069906561219389,30.588771982146703,11.022571519591997 +0.15077573840768896,0.30096158146498636,30.153183532608733,10.184847497895715 +0.14952257273686848,0.3049881563575047,27.685655866833862,9.575673393509062 +0.15066244435702095,0.2980896929035425,32.597183134861055,10.6500381402429 +0.15018181984119144,0.29132043090444776,31.864313731137578,9.710426126815037 +0.15131924512021863,0.3013108160856183,30.28846216867025,10.165747061499001 +0.14948675443128087,0.2995042902902087,30.44995724802021,9.960873586451429 +0.15007195674472956,0.29865176682203753,34.44974101410525,11.265736922646948 +0.1516668150220137,0.30300155127775896,31.645318701701317,10.945690909291267 +0.1504938818973473,0.3011284014824035,33.10085830675867,11.086551250829578 +0.14904939577798532,0.2944106833000758,25.015848812035827,7.8101687444922305 +0.1512109515355217,0.30538926367640656,28.88719945851428,10.18147076110747 +0.15128811395753677,0.30774522490505796,33.44875493081932,12.007657378060625 +0.15086873098346731,0.29470157550590775,29.442979531694768,9.261595734855659 +0.14755773027331617,0.3004357717345492,31.931021303460554,10.496689126994152 +0.15077839658777725,0.3022925308101452,30.57250358763958,10.355346705434448 +0.14866263592410509,0.30643249806851647,32.06308989754519,11.215140441372798 +0.14853518646960184,0.3023805334484592,31.96834181640001,10.757903757427387 +0.15106050539512483,0.3022691007087235,32.720564467999864,11.1728216048679 +0.1488518366283142,0.30259313765116763,35.06563095616793,11.854954235533114 +0.14986852133437634,0.3040957305799187,23.621177453582643,8.208047149499038 +0.15032972852704402,0.29948039384010755,31.723641597608943,10.495622541031254 +0.15002980084767795,0.29798333108680475,25.32922730793718,8.219170070840118 +0.15098373502963386,0.3026884378271235,32.35475210222846,11.102326892626891 +0.15060975015751246,0.2974388511062278,25.109243469825657,8.086523323021016 +0.15179463063999346,0.2897613675037335,31.324064558434202,9.465224000111336 +0.1475961803121066,0.2979036582746021,33.61905158431908,10.776275932597883 +0.15037363591454309,0.29948384732395555,33.17916340428305,10.985304317931758 +0.15189461732029347,0.30013331174790503,30.492071372787567,10.271155752239066 +0.14875209056050612,0.2996225199226073,33.93836723736836,11.156497603670742 +0.14971162433921525,0.2972451855470223,28.06482987458691,9.005660829732 +0.14881177752559402,0.3023604016866651,31.794493610876486,10.68216281623272 +0.1511639107557923,0.29538741317105105,33.155228117856836,10.572002817024417 +0.15042382906838347,0.30994214674868875,31.81543148881401,11.666658845816443 +0.14875610336571182,0.3053870851238211,27.80800458155309,9.662523378155399 +0.15077300574940825,0.30744404274476694,33.05553788429799,11.781191410737039 +0.15222711908605477,0.3043380120005267,30.244464622267262,10.591456273563175 +0.14941757140610196,0.29789414693009436,28.47259907076954,9.20462515657633 +0.14911951422666206,0.29855402847033097,24.97967885690278,8.12947097331001 +0.14853592833785773,0.30333476023739997,27.879967411598162,9.466990522565773 +0.15010225072791747,0.3058703265116351,33.103852360849835,11.678342255840498 +0.15060315995420367,0.2969139745991651,28.80613717409047,9.275515289369668 +0.15095259074221296,0.2963460142765915,32.14728745160446,10.322976200574312 +0.1500986667640763,0.2994607327949401,31.482321335234694,10.353982153972376 +0.14927050053953125,0.2961516123828877,31.624694001895783,10.048398841758873 +0.15019962808412976,0.301342131715061,30.73723535140479,10.37324094277632 +0.1521049460892921,0.2976848250851517,28.600743490185835,9.371785884287366 +0.15160986941429458,0.30325015991713183,26.86751314394502,9.313633169347288 +0.14879176759986468,0.3065982624437267,35.72521043997491,12.504480051295715 +0.1503633686542998,0.30233459785123007,28.239554609108975,9.644307206547206 +0.1502467034394644,0.3015126049021954,30.10906453564904,10.146217773713333 +0.14795497671269872,0.30274671874061715,36.20083737102175,12.107179806003458 +0.14942085652317363,0.30244964056303575,28.17884100955623,9.489458032616566 +0.1499321863750081,0.3092977163752517,30.863355167854706,11.185835895916568 +0.14894813955756647,0.3039556781224703,28.739259641663757,9.891173469247008 +0.15037338034232833,0.29832669997186584,29.438871425663972,9.640407649789305 +0.14928196949946518,0.30299775065062057,31.51584555859477,10.707583041052825 +0.15015944216572516,0.29604416142045864,34.433464823289476,10.942976715660155 +0.14994983881146187,0.29698796511307485,33.46268926798564,10.779506708640216 +0.1489998073965514,0.30316367943920636,27.71086197829281,9.416602437600098 +0.1493740236367495,0.28834310710702155,36.78603145767693,10.78628661401749 +0.15027278247539458,0.29793283512375757,32.453093109958935,10.506287687700915 +0.14716155962591726,0.30420267199040785,23.17396406926514,7.837974576127341 +0.15006601948464496,0.3057051239120304,26.096207561390724,9.140850325352282 +0.15050295787144727,0.30203551740486084,39.42446965638594,13.363759800688827 +0.14891127912237007,0.3050661313054745,29.44774999446891,10.142948253944429 +0.14954175460645588,0.29195368015525447,29.023608739554287,8.830830415377447 +0.15040552897069795,0.3030355803400293,35.12180017393751,12.038902470576502 +0.14986088564187877,0.30084396843032774,34.18479290320459,11.415068666883869 +0.1493816450440643,0.3069230753311129,27.066005776719944,9.51972754332856 +0.14862886581284707,0.3026675631078573,26.9571194179287,9.098948748548148 +0.15024883005594214,0.30087829271742444,27.24221441950601,9.127873152308092 +0.14879640702553681,0.30448197791299897,25.958264320489327,8.904661957869646 +0.1506688614307936,0.3069330865389922,35.65216178965902,12.668533728557058 +0.14865695618488445,0.2996825316624834,36.44149859273257,11.89451639715007 +0.14998352330112344,0.30458266619333835,28.108489501800484,9.738853379036234 +0.15124269261856874,0.2949966522515439,34.98781571628529,11.100619945090358 +0.14963698034529632,0.296810846424187,34.210619218857445,10.910248214699676 +0.149570405494151,0.3069378075770276,34.26203241830685,12.070764405798634 +0.15192144245897035,0.2978243305379515,29.469752015329718,9.700543293353013 +0.14980309769487335,0.2998840229117691,35.90737865557827,11.907968642777318 +0.1476947374071023,0.3040380876528218,25.203326943600263,8.558160391651223 +0.15019913317363365,0.2983290109917805,28.580128931098113,9.376421305997205 +0.15065088947818234,0.2952808301257198,34.760887469507175,10.976317410574794 +0.14991429073071938,0.30256065444713215,27.92763707097879,9.468257628465777 +0.14908551911487652,0.2999616472702972,30.756786847825662,10.148590479613263 +0.14952241390306947,0.2992318114559588,28.42637909867104,9.344981761844082 +0.1508230019306415,0.3081910829639969,37.930212515719674,13.582645450411306 +0.14833361174082507,0.2963278893443571,33.322479383314295,10.524350691429188 +0.15030895652556073,0.3047439259632357,31.118367911359208,10.8613392403731 +0.14992554181734735,0.2997130574969072,29.31257040474037,9.626406830907014 +0.1475790227581228,0.296858802352097,31.00260307652868,9.805904070235139 +0.15015557446484623,0.2988966979500642,30.20761981401578,9.925559860387866 +0.15017746682914498,0.3034171434553139,29.547355206261948,10.133644105275591 +0.1520075429559238,0.30724282650354395,30.637865380048034,11.056137697391799 +0.1507671662045852,0.30571992304155593,30.359204416834903,10.686748638318134 +0.15203027963795226,0.29263124384101086,34.81325836507224,10.85628241038444 +0.14887416256991456,0.2989394662654653,30.207323346277658,9.83620912031533 +0.14913628480801333,0.29710095477366694,27.633380470011986,8.852086805357546 +0.1517182434722385,0.3009707802920664,30.25979907271415,10.206055928012152 +0.15053141765612635,0.29821763397976314,27.319932392308797,8.958056354281076 +0.14841832335630978,0.29846429196926744,29.180327807361493,9.420305148340038 +0.15165536360236312,0.30128397085023867,31.09351871481871,10.578104300707668 +0.15098910219823153,0.2999933188965368,26.815786768504037,8.994467283502395 +0.15009583872222962,0.30663467053815696,25.409299742618686,8.993825175922384 +0.14913435235167535,0.29333160315946005,29.362735725805628,9.00663938681733 +0.14982865493246916,0.30183931607687514,31.82999515734605,10.764210714555109 +0.14973506725302016,0.30094804600245834,28.984229334787745,9.644660099926218 +0.1513514103866163,0.30574818982095475,28.147078223079355,9.979373764038153 +0.15014341561122121,0.29690666886536804,29.534696678137216,9.531603579425342 +0.15126380331953496,0.30236918063079293,30.879494275215205,10.542940783942615 +0.14937439524391094,0.30259299763469916,26.494984198007685,8.953792474880377 +0.1490593873716119,0.30352637194954746,24.290386783876393,8.293776557288819 +0.1513601679763086,0.29718639628159516,29.60473879377047,9.639171029238986 +0.15097485196231697,0.3001823380278837,32.451936625168834,10.796142869243326 +0.15046776917145274,0.29781403511915966,31.3315614031916,10.225781990952306 +0.14883666300274906,0.2952449881387239,29.576944825155103,9.32194290360819 +0.15066354684624875,0.29572349597227554,24.901188207274753,7.935699203450763 +0.1515789921874879,0.3010661757038723,17.077719061584705,5.729529855616555 +0.1492356866205183,0.30423780835066155,30.034261918641796,10.216993199536482 +0.1509844111898398,0.300234234163882,29.452527938398383,9.78157922194245 +0.15088873226643115,0.3057499100030522,32.164334388320576,11.381270941134245 +0.1508248307879321,0.2996504979967204,23.146414020011974,7.686255908408043 +0.15073614624480536,0.3037231889609596,30.71867380464822,10.633158666299103 +0.14881574777206436,0.2935747103263872,29.264144515479163,9.00956906242753 +0.14901109871549897,0.30463717822811326,31.495026967031365,10.90977148337577 +0.15038193467003627,0.2949751727458213,28.643610811516563,9.006677471251905 +0.15004558832304157,0.3079579720404774,28.055408221550096,10.09934653950414 +0.1493789148154548,0.30277837099241667,28.41656359683177,9.630569981835235 +0.1497860516979651,0.30327597165614356,32.53562972697548,11.136002510219312 +0.15110200443717184,0.2900209425872197,39.80316979543555,12.014392732161491 +0.1495642240631646,0.3024917837443141,25.69225036944193,8.734039532154105 +0.148405836622192,0.2922860641235475,27.050731545811075,8.253613470226615 +0.1514004024446554,0.2972899433843857,40.45103533664401,13.248977092631131 +0.15055276138784465,0.2933509408502407,25.754475926253473,8.04702498162911 +0.1510100978189771,0.29801790461719546,29.89343336847201,9.814839562452919 +0.15024813960404648,0.30581318417990083,33.264488663157344,11.715992948633215 +0.15077672716966917,0.3055674983288447,29.113230742435473,10.186807394331254 +0.15101760741836642,0.3045132639514066,26.34739164283007,9.194576199538865 +0.14967965253321014,0.3020931230860692,36.7484705191902,12.382010183692497 +0.14965794604023056,0.295045331281845,28.406306720822506,8.918873207022653 +0.1504114195995648,0.3042960647800742,29.497803145364706,10.238474238995106 +0.14927921351220244,0.2917411293265404,30.80639663146129,9.335155589739738 +0.15073978039012884,0.30189381688961836,30.27134639851194,10.29361873800645 +0.15128900351495328,0.30605723115483247,32.78995996114908,11.637412129967414 +0.14972005930993432,0.2892525082132915,36.94027328642144,10.997972760999673 +0.1504626287701357,0.29883000929604103,26.676230956741822,8.728364631241067 +0.14967815188267694,0.3075763371455385,21.368063514150197,7.621294239914396 +0.15077631111800863,0.3021181354041155,22.105491737454777,7.543142323396401 +0.14866287112208848,0.2961182128219566,28.401607654404444,8.953967628499244 +0.15193527916093685,0.3000042938533572,32.80646936440046,10.987508827543984 +0.15035551635925323,0.30468341611581945,31.535633551273467,10.96386002320138 +0.14827470859022593,0.299799959542347,34.99962382245651,11.385351171365514 +0.14777750142767757,0.30292673562423317,38.119265910439495,12.820325314397216 +0.15256472528364867,0.29101983625859146,31.17275704424588,9.615035135788188 +0.1487029719304728,0.3039734660915847,33.389711086849545,11.399779294773367 +0.15249023089846864,0.30393524056871896,29.32214676597838,10.251415185540514 +0.1489973971373786,0.29951943487887567,23.59628233637533,7.714320291066112 +0.15117098571098167,0.2947276929023416,29.724126899453296,9.391297507327778 +0.1511137722835984,0.2905139119319532,32.5801944258856,9.87121633975025 +0.1492740274422806,0.29473325505255127,33.387826136394565,10.439174935050133 +0.14892855761812382,0.3015406848925036,29.586250231172823,9.919088373937782 +0.15113793121441482,0.3057777232202852,26.13057414848542,9.226036750272996 +0.15174223906316872,0.3039353187824259,32.42537584853134,11.356532535591851 +0.14934234476290992,0.2949468793665314,29.549272426012294,9.27393685745701 +0.1490402277512992,0.2987238267373555,29.53181646536327,9.582268534183985 +0.14826882362825816,0.2975812051557993,33.81175296456962,10.79286922185885 +0.1493435503171579,0.29330883912175737,40.482933491346984,12.438105651757319 +0.1504008149472993,0.30492821567488654,33.502042682893205,11.637790690402568 +0.15036960109991435,0.2994998107716525,29.244172693717218,9.635854259745244 +0.14950713748751568,0.30339810790871724,34.53868613842913,11.759251426290856 +0.14997597785427608,0.29789857553084537,29.772285080732278,9.668963887258249 +0.14992968319716451,0.2900621699470339,25.100786840808166,7.507257230111522 +0.14980570422228298,0.30215075075416126,31.663753087921275,10.664714739239262 +0.15018339292841276,0.29610064012688897,32.8740038024459,10.465373787975686 +0.15125849698164043,0.2986652750197369,37.598022285909714,12.380331649976458 +0.14923136735863332,0.30098058274842565,26.78618233676297,8.934081854792115 +0.14951226229122133,0.3011719689163863,29.926419783690857,9.990576843155981 +0.15036417749696465,0.30574639229446116,35.30241838748062,12.42704241422639 +0.14949892092330513,0.3016650925230108,31.03109936835361,10.403943747808786 +0.1481451506648985,0.29554496162330907,20.60403224450084,6.471993744518181 +0.14913306698858445,0.29755963443017347,29.267674291203296,9.414774412208873 +0.15052278672540734,0.3128443852116192,30.43756706504981,11.465555296608722 +0.1494418573448038,0.29888737140909455,24.90339111278916,8.114624167320823 +0.15048991656259456,0.30165236028217673,35.71927823405465,12.071572404427727 +0.15065372244140615,0.30312900389009306,31.91200972152223,10.937538027492506 +0.14956377265167994,0.29586671558155664,28.39759828351739,8.962725100186917 +0.15104313747804582,0.3081095189770851,26.40663142711467,9.582075108431361 +0.1500841177576905,0.29861517490490813,27.995250503595148,9.151584088356588 +0.14977792437246584,0.30651978433027205,31.376375708782653,11.087878305787639 +0.1481742410430165,0.2948878839842837,25.86223004562825,8.061502129812864 +0.15171343433961257,0.30374886634851295,23.40476194373009,8.181340291175696 +0.152316287807448,0.3053740447725618,36.34825318802376,12.945707788574076 +0.1508471475379125,0.29839823851193265,29.30651605503477,9.609692803343718 +0.1519945641559389,0.29675668378925335,28.768069642233424,9.321966266688987 +0.15064688565650722,0.30433464782224917,32.47007909077459,11.27985566439424 +0.1503111245075296,0.2890249960943951,34.30271576230506,10.158646334479373 +0.15079574146765137,0.29722769144658484,29.58517044412024,9.55551301030745 +0.15026785736780493,0.29268389873754425,25.07831762712695,7.73689469628687 +0.14975465727268486,0.29492804102266773,29.497382677529657,9.197214737269766 +0.14932869959308986,0.3042472594989322,34.466656700604865,11.83368224772098 +0.1485804522453124,0.3060047943819215,34.30907279995165,12.011934310338338 +0.15152494582558068,0.29397748210495045,29.954332099137957,9.448352559242176 +0.1498005628197167,0.30154443187253793,28.719225421554807,9.675287162414955 +0.15070141719931232,0.2972414653208322,31.529222474433134,10.23426361350408 +0.1489608235421418,0.2946971039504677,35.648598673779006,11.103765925905943 +0.1493874160719063,0.3037950168691799,26.586786335903454,9.094962041600828 +0.1508410635531712,0.29484738517817355,39.60353184166207,12.561584458023875 +0.14881284035934886,0.3079822432673712,28.704397430348692,10.167250506422404 +0.1528387613234047,0.3063751092678785,29.09402581518462,10.471787509200173 +0.14952969846445832,0.294502470802227,27.898547897179533,8.678143879581258 +0.149056219355559,0.3022218142215038,35.70599521075651,11.987365261432995 +0.15191427451211212,0.3009767473429413,35.5769006135537,12.056062822066362 +0.1513963580213853,0.29903956671175413,24.897857018214125,8.252207071833368 +0.14813547087625997,0.3002181839148556,28.976694011533038,9.489243695656176 +0.15146127426488862,0.3018138430468053,25.705269725292347,8.738901661848878 +0.15134501823795732,0.3008753327937054,27.676378232895665,9.35873628268931 +0.15097089037466074,0.3025228831331733,27.16911740238612,9.272959756667545 +0.14985889758599388,0.2954662584846817,27.457028602416127,8.715813174003278 +0.15183669663296862,0.295712975642533,30.25401769576005,9.687116997731646 +0.14930935536329765,0.2948829038519649,34.74999969647181,10.889625600499508 +0.1504244573544395,0.2971309773308677,30.57368004346955,9.89573112164375 +0.1485169014716955,0.3036672037493647,21.74230782875913,7.391586008643754 +0.15033605229412086,0.3038163739094664,32.856173746241865,11.312007681491497 +0.15261950093438661,0.2872252632380152,36.27874290540974,10.730080975176921 +0.14860912787948738,0.30269192378626847,32.681088950627185,11.021514563069651 +0.15025124504295637,0.3074169225799592,28.314607374696603,10.054749508600077 +0.15001029042633415,0.3073216384669239,34.01335828205734,12.104175552962841 +0.15066684372984945,0.30375017635911844,30.22921830077118,10.44821304693802 +0.1497703398512665,0.30451628445433787,35.95635247491908,12.466390598077057 +0.14991987670607854,0.28939918973213075,30.323061076651012,9.006000060372507 +0.14919217579848312,0.30616083703453717,32.3544071933298,11.238447211704964 +0.14907276943481274,0.2935437327872171,32.30531955288704,9.987832450049028 +0.1498086676408268,0.3023829007521592,34.13886707964923,11.552560059666908 +0.15126894432004367,0.300879605225048,28.297738293002432,9.474913920387873 +0.14894363244180778,0.30217063453178344,23.633910143855015,7.999237844698484 +0.1487327457187228,0.29854683261629134,28.663098239411184,9.280473294713168 +0.1506283627669213,0.29448934251807407,33.54798804909986,10.539772807384237 +0.1490892564270037,0.30420741814880975,26.480542986896374,9.109584516151852 +0.14877206178422148,0.2907517246801888,37.2971723503208,11.129624458168127 +0.15101402126085436,0.30645105835004827,22.061476803777282,7.8425793187469965 +0.15204509400000107,0.30281466157980635,38.07831238068781,13.120697857520362 +0.1484978265967712,0.30658970153177945,32.41219250400278,11.36192057944851 +0.1496176100625182,0.2995609200711106,25.556455744389133,8.419556700325225 +0.14881016790900303,0.2962940510562634,34.75399616780125,10.987315339568639 +0.147868608381278,0.3037849651990767,27.237112825496755,9.205234220460005 +0.15142193927417727,0.29463710925892744,35.50968416419404,11.224402453220597 +0.1505235312133665,0.2941319719876135,25.58516122571984,8.016371214258852 +0.14975031481029155,0.3019165607789426,31.204717605836795,10.510988454351587 +0.14998930285840187,0.3055161968283803,29.885444705502547,10.462110407521566 +0.14999910443279338,0.2995004223782685,30.65117813445528,10.115448046445643 +0.1507369572789277,0.30485289722653086,29.080611566150978,10.172214379402504 +0.14902592891480126,0.30018971272243894,33.71235683952253,11.118601573874297 +0.15129168135643017,0.29391648240204726,28.015019163570688,8.80799964932115 +0.15027372896681773,0.2961566617957027,34.143804799472264,10.945524899440793 +0.149484634852183,0.30136740699489656,29.714207233516376,9.898727420742283 +0.1487457211756787,0.30151931069925036,26.207686976724908,8.785458769758652 +0.15143265275767312,0.2964376059483856,25.276854994768357,8.188542756588697 +0.15139086751668163,0.2905510634820422,27.049741580810668,8.226908752301313 +0.1497281341484409,0.3010681608177375,30.739059929485013,10.265480097968426 +0.148352965304989,0.29957797847043555,29.880649175918133,9.802509589516466 +0.14997124129794312,0.29729443473426626,23.21583032839016,7.496022126619774 +0.1511582831988996,0.29622011316383673,27.596499706340694,8.89809041337201 +0.14934784490295788,0.30388910542971476,28.527906462637898,9.829411053166867 +0.14890186355726986,0.29870330928195504,28.375378599332237,9.204660460438028 +0.1519486862786064,0.2964492703427155,29.40040297348795,9.470413145100792 +0.15096984781695383,0.3066981002729265,27.794548747130033,9.873484674115735 +0.14815836226332718,0.3020412709598494,36.44843381296452,12.141803337984978 +0.14901335266864252,0.2999422615775993,21.525930812500363,7.123437089067459 +0.14964911712336768,0.301500781903965,27.172112230189168,9.077134439339417 +0.15061051202783746,0.3048268168580336,27.382302345159804,9.544537776855663 +0.15176942442792843,0.30510592179048796,26.635070380175822,9.418732892004543 +0.15227249128672962,0.30396980515928684,28.38857123194456,9.919870064890972 +0.15011881303242472,0.29990114607598917,27.8027601396428,9.219411415688066 +0.1512252696397605,0.2952274540763439,33.94983036643821,10.811975300237595 +0.15103648165824599,0.30789477670773896,27.710084872849862,9.984248412520055 +0.15042667502564433,0.29567445090479927,33.23914355159552,10.553429498355431 +0.15017856107546237,0.291681520612389,28.520210710035713,8.664674771915104 +0.15054314336123717,0.30594481918340294,28.403206854575814,9.973989709510807 +0.14944327224935602,0.29614289759884416,35.82809891323813,11.472036938984436 +0.1484591602306376,0.29771080454721294,26.655212638244556,8.516895464293466 +0.14994721692123086,0.29552754287333044,30.21560314753735,9.612310726574407 +0.1493668523878611,0.3036418836140332,24.97707102583834,8.51880188936206 +0.149210353301041,0.30800640417231917,29.83783963368145,10.627566890035528 +0.14996728809387924,0.2975571564732516,29.17612223261116,9.373676969563046 +0.14877899796430535,0.299929082966661,29.07788717532433,9.498049116667882 +0.14799387370611425,0.2935819792846831,33.75733247549169,10.301231267757412 +0.1498505214745692,0.29092385930173936,29.496233651550853,8.94693905740981 +0.14974634325964614,0.2940875136680478,22.750094165821398,7.093363357913476 +0.15081598425579698,0.2992396821728906,29.502769388839102,9.689364141884381 +0.15100464436947988,0.30185457508717567,24.599831633547975,8.32797414829455 +0.14985305560398912,0.2985181317684791,31.77206444982856,10.322136980726848 +0.14829067244054475,0.294248246771512,27.88263283764035,8.618357118568104 +0.14887914294047042,0.2943785417943244,38.3994861386073,11.943192027472662 +0.14904484552842884,0.3050595157863739,32.71662846050488,11.293570677158414 +0.1505876956753349,0.2935675195778064,27.638203870176067,8.644179325625398 +0.1504201840757617,0.29959377696586564,27.86863985435561,9.206248534853477 +0.14813191091782518,0.30565840805654765,26.863375132452585,9.269975645242349 +0.15056439033036756,0.2961674128096989,26.97119020262887,8.683458289714183 +0.1496443451504504,0.30409368745167437,23.400304950165896,8.04435172738503 +0.1503990171345256,0.2949885165212474,26.497437749947363,8.34104036707168 +0.15082656430484606,0.3076853564676946,25.88454898531704,9.270214323597884 +0.1515173951281202,0.30138361162197425,33.93984646226362,11.523601100231332 +0.15025726538451953,0.2944559436102272,29.422116095816637,9.181820685644512 +0.14974081932425565,0.3013555587129272,26.250902213175365,8.79701644147418 +0.15079086472072467,0.30208223106466264,29.27490552890737,9.90352437094126 +0.15004845752920462,0.30215029752649675,26.432519374485707,8.961462916516817 +0.14955973555394345,0.29848978813772276,32.530393632817486,10.546819077718354 +0.14913117609236892,0.30070228596270304,31.088930291763507,10.311215796749677 +0.15031698678454228,0.30047981554946773,29.827697000181743,9.95458553337318 +0.15131829798752122,0.3030736497725929,33.00012859866436,11.323141587279578 +0.15025644739461036,0.3014924649963853,27.557602736831036,9.329963855544898 +0.1486481918587114,0.29861095163811713,32.23132642070543,10.458346625443648 +0.1507831692948567,0.3042430380574915,30.043686803875264,10.441349151779857 +0.1495066646468747,0.2975090988134588,31.795866662867713,10.25810165447931 +0.1500964455626395,0.30409174689365087,28.23955087659364,9.769229843088242 +0.15121456012232437,0.30238945340379036,30.356684176052063,10.354822900198457 +0.14962327630413702,0.2960723790194963,24.74679062067522,7.869590294250776 +0.15087686798051697,0.30479072340252233,32.55227708882578,11.375660209630892 +0.14955358954344525,0.3051704927149343,34.489160507100934,12.041367205337245 +0.15069197240010881,0.3040389115565127,25.940464025484243,9.023619616085128 +0.15189528840059877,0.30385297127993105,29.621159291356275,10.371863549695489 +0.1493159607288507,0.29656974918272205,28.966629116763215,9.229274520089744 +0.1515002682194467,0.2987030942477214,28.61273909978265,9.422943105620979 +0.15030388496780656,0.3081635991918897,24.833209659769878,8.860082659629592 +0.15280140194394928,0.3005201535401504,26.575046095105932,9.014920811259044 +0.14791115286961112,0.2968613009031673,31.85408167477797,10.09451622572442 +0.15190509135379723,0.3010676244364285,30.17214883452839,10.211436388228146 +0.14885502464178196,0.3043998810664289,24.509625456371616,8.426868362826555 +0.1498596267174399,0.30336434871415147,28.73819969183472,9.84023172384028 +0.14932707486481142,0.2926652388359681,31.242696204741513,9.543317229519069 +0.1493393858153243,0.2987869148684968,28.651787287600474,9.315085350799475 +0.15099745036163667,0.29977071719631043,37.4050401877667,12.45120883001505 +0.1488418381147123,0.3026596855413209,42.59882215266009,14.386584795757706 +0.15063650249999375,0.29419481288069693,28.516172927012345,8.90915561425285 +0.15069119417305382,0.2982169053772128,30.96976041813503,10.232778456778851 +0.152056374749353,0.29752231417496616,28.916657520783,9.487978660452132 +0.14824250837712677,0.30176054813705266,27.745890849911284,9.294188181249169 +0.14873451016092865,0.3047790496063774,27.885351242125708,9.604953688054325 +0.15081679369703693,0.29758854103461974,30.581122246376886,9.968364395289598 +0.15150756190414705,0.2943604212380749,32.54538953716241,10.319436951483336 +0.14903660266400687,0.3028423278861127,21.276470081412093,7.187508178420005 +0.1496626775881661,0.29870817155686535,30.511630229898426,9.96627475328159 +0.1506732184952405,0.2947038571920508,28.758969676121758,9.086331464560272 +0.15062948162625067,0.29690645717199626,30.70014268953594,9.925012085549103 +0.15151573416965533,0.3036745219291603,30.92756816248668,10.740750745325714 +0.15072701504528252,0.30808276169644905,31.447010135883513,11.337112294145143 +0.15043333332142783,0.30302826347005024,35.29427478860694,12.035500234064267 +0.14796175849488954,0.3020567570820356,28.815101208258547,9.631760880593152 +0.1513400430043863,0.3076281735992787,29.77291347747532,10.73418877143884 +0.1494993065490059,0.297668120838553,30.07005786251861,9.711174925165354 +0.14856096107400027,0.29153614762712277,34.915980974326985,10.539045118434398 +0.15037946377243347,0.2955069659821628,30.657723867577307,9.744096319839903 +0.14854160111256157,0.2963864691016436,32.89592679235993,10.412864309559142 +0.15042599338683654,0.3029734823023102,24.987765480242363,8.586218121065816 +0.15021562533111377,0.3032159931292589,33.66703858225691,11.48900597622827 +0.14881058478687018,0.30895293791906847,30.55108481654164,10.93832670224577 +0.14887862160876264,0.29293248293516827,33.066172325341824,10.11942977013656 +0.1505194414684429,0.2990052335143073,29.48253111801957,9.732912575853602 +0.15035718916160726,0.3022417341367291,28.567237588230533,9.689909659345533 +0.14970782120008713,0.2981900043044635,32.30276495609103,10.494453290381088 +0.15065067079719835,0.30305076801313735,28.05348172577606,9.659162602177085 +0.15010640224938784,0.29954321366637976,33.07278116121323,10.911123313564257 +0.1513780759433102,0.2933529765014724,24.863163734229083,7.79542530007503 +0.1485025802354504,0.2889561975765875,33.12404286647056,9.641095407828344 +0.148617980812029,0.30220871572676977,28.044282595340192,9.395006328245783 +0.15026218240862932,0.29359956155811845,33.992159730091295,10.60338924099093 +0.15000746619165947,0.29951452169333237,34.78046716834855,11.446516080988198 +0.14735464504874934,0.3020071001085679,29.974756878342962,9.94887352474156 +0.1489462015123405,0.3014231302177988,28.942130891156815,9.671886272716655 +0.15109221766934,0.30116865003203064,26.492630291160495,8.984764389562315 +0.14990607372801418,0.30903928738158565,26.939505903552536,9.729430120606647 +0.14905837851256684,0.3051426384726208,25.673552397923636,8.833788877606993 +0.1513891621680919,0.30290477934116955,24.391017342327338,8.35369064943788 +0.14789909058675638,0.2970894460353389,26.381353770069122,8.411129401766395 +0.15254560358486308,0.29645230584511,31.353383868520964,10.202200961537606 +0.1488904267263674,0.29530382624705465,37.83556017160271,11.912258827540295 +0.15140879043548014,0.3054891849757798,29.911101487108457,10.518217676343962 +0.14862298999967535,0.29331065458643363,28.887379413464174,8.830967619589696 +0.14962246089278627,0.2956538836422225,32.67797429568475,10.308838456314307 +0.1521307751457236,0.30188350583000534,22.719545844540868,7.7678538025006 +0.15049891535654303,0.2967385385518372,28.45081790951352,9.10818910606717 +0.14897410954073512,0.3002299685864089,31.815986693981817,10.421228707294583 +0.1494912115138194,0.29124243201836814,27.794214948095238,8.365145410311552 +0.14943883006566677,0.2975645983526866,26.586472000897174,8.587964441361477 +0.14899893945695014,0.29667462887188845,32.92250023885788,10.474033715922342 +0.14947747249227583,0.29635377044254657,28.60013094033234,9.123292076925118 +0.14997226444901463,0.2947625854186301,31.037801096619727,9.770253207878708 +0.15246488673462943,0.3021736807755437,30.648198405846475,10.481947403181147 +0.14824531672427677,0.2994292432301637,34.37180956283645,11.250197449138518 +0.14865770507028667,0.30132572409142006,37.51046135359798,12.439531915756536 +0.15035181486755173,0.28941820576670013,32.21432934807907,9.603175567663637 +0.14929396627779182,0.30020717231648014,36.106663579366696,11.97131460901144 +0.15103542194235361,0.3069167523843013,27.131839745223253,9.659835555411176 +0.15136773830648148,0.2986100535172269,25.57658382661763,8.425075152288189 +0.14943806011517735,0.29202707629072766,30.913831975060624,9.405096187122044 +0.14907297100519426,0.2922491326678277,35.16351529113215,10.686186674390004 +0.14969864237559743,0.2927590191045011,34.72509779386152,10.655325684311508 +0.1497313383171787,0.3047354160287112,31.819867534114376,10.990007966958355 +0.15186542869060218,0.29600383766372257,29.368372533172288,9.434149370911298 +0.15112123392353846,0.30437258285404006,27.068927374219776,9.379897056589204 +0.1508516700890937,0.30109521603089207,33.400996711349876,11.198274029555446 +0.15068949343267324,0.2942418088646415,29.372602234871,9.266902327087687 +0.15102577176475696,0.2997107061696577,28.1719087195424,9.387062530444409 +0.1504485627500814,0.2976272135729436,34.737108477785235,11.237030287306142 +0.14830089682360362,0.2961224325448165,29.134770092504777,9.142657898438621 +0.15132367115796574,0.3043506884586855,30.56693362728469,10.672935086885879 +0.1502265142393036,0.2926597354277678,31.310233389420013,9.607198020201164 +0.15084480360592287,0.30021170237433986,27.79690125603611,9.31925817206537 +0.15095041560138905,0.3006780835414468,23.91329428189747,8.023045911503072 +0.15020810245431784,0.3048874532769495,37.340642666530016,13.016013995018469 +0.14848684961360598,0.29978391724523995,31.123688697752538,10.206180900471018 +0.15067508446354327,0.30352155659933355,32.956394834204104,11.389353290280566 +0.14954027762946218,0.30039358358375917,35.04366538131222,11.634510135282273 +0.15037838505393444,0.3055381475600791,32.737411256220774,11.447152342519269 +0.14866323480476623,0.3012210584816714,29.637635939304193,9.837704880727571 +0.14827188914199638,0.29367161192487085,26.2698744648677,8.084857638614839 +0.15177835111378607,0.30039706778481,26.824855880194566,9.017337011565477 +0.14833435066201958,0.30257181607538025,34.42705286173292,11.535401459287252 +0.15060316221460077,0.30212586278922193,31.624855689878796,10.7320473475806 +0.14908307533219473,0.2935353604253471,37.10457517818951,11.408904478375941 +0.14870631449029914,0.29932021953678384,34.43784612758388,11.267240761816762 +0.1485201473554818,0.30102184552838845,31.732314832055422,10.539435884702897 +0.14948946561955073,0.29636052121567247,30.002111204000876,9.512414772360371 +0.14921252502903107,0.2971400729624772,31.499371376912332,10.07272907696372 +0.15180221421211734,0.30434460820791004,33.280813542989186,11.579149689204927 +0.15010939461781456,0.30134029575213417,32.204936717504715,10.851668656357907 +0.14953906772613068,0.2978298873443882,26.542767272941774,8.542149330144447 +0.1507394642148946,0.30400926577767534,29.71079738022095,10.200095120393822 +0.14799749176002927,0.312869983790329,26.463430966566104,9.809436127348643 +0.14854114843857952,0.2990479426931967,32.827999727906544,10.716030161348108 +0.14978052646974108,0.2995558776012969,28.155833915044095,9.293798455456168 +0.15014942047149393,0.30421334224983326,30.98380707350468,10.67406981485291 +0.14825063430551946,0.30020784748827994,29.60448936924272,9.687722607921188 +0.15016135649974457,0.30108827851317294,28.43309157795463,9.512905823693828 +0.15206481736168875,0.29496344762338333,32.89688383443344,10.442621078391005 +0.14961393820487712,0.299569089233074,26.738589171594395,8.746953395867845 +0.15023527367418746,0.3047444215850807,29.38703666715634,10.269709058670607 +0.15053004669463044,0.3003759320126394,38.21593850787973,12.749458522494162 +0.14702435955123497,0.30374565359790173,25.724637559617882,8.67554918211246 +0.14838398534065744,0.3045591245561123,24.887606359574992,8.494434819382256 +0.15146818323500197,0.3056103983124078,27.820375691849772,9.850403925176295 +0.1495000523007236,0.2992260784871481,36.38009177383761,11.851935998884331 +0.15140971938397185,0.3032298015513754,32.739484606635706,11.335907507328574 +0.1488271716271208,0.3031409961730739,29.09002263453478,9.87134649614667 +0.15197682556210312,0.29570213225627057,34.22638111512736,11.001198088677128 +0.15036034426592493,0.2924390502431486,38.516196081749584,11.846381633759574 +0.15013245279650164,0.3015751239066393,25.20266327902171,8.49507437103592 +0.15043160940227787,0.3056629474381446,33.55719133883869,11.837530521083183 +0.15057948928659837,0.30075618383939,37.15248144321009,12.441116134088613 +0.14961259473477834,0.298566103398207,32.71511346269855,10.645462335809999 +0.1480617648334331,0.29373608103479454,28.551739055781596,8.768378336339058 +0.14984702711159298,0.3016832686885607,32.11442414947639,10.827205269950252 +0.15095118818533287,0.3020289032555212,29.37781873948084,9.977214865971488 +0.15226940511809825,0.3023391256598035,30.681752334544527,10.573787268929967 +0.15014751802294166,0.30530170403736884,28.55255993636637,9.986581477813894 +0.15045999650742806,0.29680956456131574,26.002749700286806,8.377904820595237 +0.1498166807826996,0.30044329233124956,27.897594008021464,9.306996252313214 +0.15137608027843172,0.2997704842351296,36.11904285095457,12.09955623535999 +0.14932630106671235,0.3031496527451896,31.480360819561433,10.686550129299967 +0.14777251897529387,0.3015865666843013,34.703860125744,11.585688721671593 +0.14864780320086327,0.3027697463286341,31.20361532833983,10.547997276089935 +0.14904518444718204,0.3088662234470121,20.621495666721188,7.394529786091176 +0.15168767069747616,0.30183692214731606,31.699337250620093,10.809657567887475 +0.1502154232903429,0.30082998511963027,26.729417207940628,8.95131064440568 +0.1502816517624262,0.29562353113247597,33.40996762657556,10.661524720689957 +0.14990150047736905,0.2952763133063949,28.684299798747684,9.075167708758684 +0.15109878672360738,0.3017908635442332,28.15947624040362,9.576848033514212 +0.14966113743997192,0.2978890924405407,29.89054894957842,9.68440891342258 +0.1523440791901335,0.2991610313548832,28.606736122590952,9.548593589665304 +0.15188182758920707,0.2896411648152917,34.560299859328566,10.415967684428193 +0.1500739797467171,0.3005551278450767,31.108258079846312,10.324178166194624 +0.14966290501315066,0.3050704851299481,30.54229099469924,10.59810448706134 +0.150117220412984,0.2987633719435091,32.109617051356615,10.49735182722204 +0.14999700224795112,0.300894024162922,32.34488398845356,10.85836038909554 +0.14852273278117456,0.30681293971398166,32.03293610355612,11.305356497539709 +0.14981061853669592,0.2975322410076269,36.895664952401816,11.915639730428335 +0.14836067525898564,0.2999712023404381,26.418067837304594,8.677048213106008 +0.15051615024583717,0.3007433232544039,32.69987523779992,10.925551142969109 +0.14908703362225473,0.30434776230674154,34.28802799493467,11.842314450581972 +0.1505287553182353,0.2950362682177472,33.581819114094166,10.573156775847217 +0.15048564191763408,0.29810089696847875,34.55986452781451,11.281720117724017 +0.1510401797183199,0.30373805718889013,25.545443281943733,8.80616355512323 +0.14911938925416693,0.3076847786096034,27.691425144674056,9.797648571839932 +0.1496509161656514,0.3003708299469825,32.19100573844747,10.698035382879109 +0.1494529074978864,0.29763998269006314,29.008166282029237,9.359190689540705 +0.15015535414002032,0.3028874834519318,31.738964238627034,10.84226870362939 +0.14980862417787866,0.3025504932725788,34.12748458215554,11.560088950221997 +0.14869895041216769,0.29786796090327583,31.344704906797304,10.060117345258254 +0.1500464412623499,0.30496487743726286,31.968772371261693,11.045334582401685 +0.1514897736187552,0.2994585644275404,35.0906534138814,11.77342813384168 +0.15027535846222037,0.30524534024379807,32.29585354737274,11.277178658638825 +0.1491280776532678,0.29385254058544924,27.577891541263465,8.479062792925316 +0.1494859117446408,0.30944891861670565,29.152826628066464,10.569902298405088 +0.1493015397422585,0.29747934053674613,33.61905901260987,10.854406800692015 +0.1499255365093614,0.3011383710100658,25.57933503402411,8.570368096445911 +0.15085552402738706,0.2951822905839919,33.10771304998813,10.465696099103116 +0.1498655560839994,0.3048579479788069,32.472556088798754,11.25680857071457 +0.14901241180556443,0.29193982782152406,28.833055954384356,8.730405400776146 +0.14805696856048636,0.29966431409083555,24.756456811611404,8.10782091232095 +0.1492961095354459,0.29303034081792395,32.90013412462343,10.04844058828422 +0.15102939503865526,0.30242649314956377,26.553129109203383,9.079238632518909 +0.14910317009658672,0.3010415199833536,31.269410134030696,10.351955880218027 +0.15033687017352396,0.30132087384907574,27.793891873699913,9.413476267951497 +0.1497411515929939,0.3024566332015011,29.938452215415257,10.16056077193686 +0.15011493518789243,0.29706436042421946,28.22507065292436,9.092947774677222 +0.1522352846223091,0.303171415944236,22.25513583563076,7.692358719951711 +0.15006260996974202,0.3034246280696961,29.781559131903816,10.14044053303566 +0.14860670748870447,0.30399389430941903,26.283195265410903,8.943981352584952 +0.14912327176131135,0.2972173955354641,25.891187856194513,8.356968537234174 +0.14989889774676396,0.2986839955122055,32.30942722171709,10.59126063918395 +0.1494283775266292,0.2972453168812659,27.902408501779583,8.967974602019655 +0.1499333314537789,0.308567785743977,28.170102082844583,10.166602364228671 +0.15104536867750967,0.302148443772199,32.380816992806054,11.085347160219317 +0.14927187306947262,0.2960677099389736,34.06056957879332,10.78939647688732 +0.15147049321730152,0.3023394499746647,28.821047415273707,9.909594480546575 +0.14947198972239484,0.3011104833864904,30.40200671261128,10.16495920550631 +0.1485928599924232,0.30065274351695087,36.857322404574106,12.181878147397649 +0.14788677659117797,0.3014934108711243,33.684847394998926,11.182213696892944 +0.1534450955405402,0.29164945737725545,27.547020850463838,8.631200052724218 +0.14970223468303828,0.2962741450194531,23.57887987194736,7.553885482754489 +0.15005571803635154,0.30207705467014256,32.04384375789667,10.864960341752953 +0.15129064893057087,0.3024499208051496,35.528603954076836,12.214324044287103 +0.1465487423566503,0.298522157161681,24.833782143618812,7.90340734245203 +0.14905969372158398,0.30290695354624636,31.398765608724442,10.687594326555972 +0.15069448310580943,0.29651549968841096,30.340475347170333,9.773573483221156 +0.1503850449170778,0.29738938021208405,37.05371860164672,11.942025646425002 +0.15109464468925787,0.3058060848246122,28.376192479321986,10.030465224674131 +0.15092026978481918,0.30165547582873664,33.62551618104959,11.42170161383231 +0.15219612317402734,0.30941308524379824,28.255545906388182,10.405068037444318 +0.1502526850953579,0.30715345172804187,27.579466395650538,9.812116235797857 +0.14926894006855657,0.30044447103806055,24.724248903221955,8.17340271437005 +0.14827295038916702,0.3015139718887347,32.98376882644049,10.954790235308602 +0.14948834938608707,0.2984763002764802,26.703873590945438,8.697522258475837 +0.14920052994182254,0.3007602881528303,29.395944075338203,9.782117970214184 +0.14889528503040264,0.2909872996198546,37.49724028539502,11.254635462682575 +0.1526339208382566,0.2965342885069346,29.53001339247526,9.630592954595246 +0.15073555713512418,0.304831718129562,36.35748343338501,12.64444505272867 +0.1518608169778252,0.3047871391714829,23.513047664432236,8.236457378676949 +0.14996173832801762,0.307889181065468,29.64620660857909,10.593001040303488 +0.14876993672651284,0.30137569059980474,29.222946470931976,9.808569636247842 +0.14831698231468565,0.3090350217247938,32.94886262081787,11.84908585367105 +0.14922916240985257,0.30367907930970056,33.423168480748124,11.384824680410453 +0.14986845679461588,0.2989213409134879,27.06223561508166,8.827600986802167 +0.15024404872277405,0.301918515370348,31.77707339629321,10.682278853661293 +0.14938430977263206,0.3011509217102101,28.414422031043664,9.469284994657531 +0.1509499781033675,0.3022101309851175,32.88142400863307,11.110441908383848 +0.1507888503621036,0.296918931384189,25.582584363916112,8.253921281203368 +0.14894686001643886,0.30336337122284296,35.05678398313572,11.776661359979537 +0.15075415908753562,0.29403609481463133,28.15956218009198,8.847847959124518 +0.1487923772514489,0.3071790801833122,26.200664895081065,9.271040237627192 +0.15107002534773875,0.2950562071288171,34.96498761834912,11.046759183020216 +0.14988044029556732,0.31067720624280387,28.268991469140595,10.333312151510395 +0.15086750357367804,0.2934697612698689,26.751213005907324,8.364472794881905 +0.14885455717661109,0.30167510303048406,34.73100822539255,11.561228342351926 +0.1502541500449367,0.3031764977364861,29.816153569693878,10.209462668964548 +0.1503528360755281,0.30646308775558595,33.248669916170016,11.817149153369378 +0.15091774123042762,0.2901652349815411,35.17873521447297,10.547555735497365 +0.1495877173943139,0.2940223532781928,36.53360025977236,11.402314911228187 +0.15002257435210956,0.2947256698208151,30.90490726031993,9.699326698231832 +0.1519549058520446,0.29992409412345383,25.733870311051447,8.608871746396925 +0.15000211106029943,0.29471578772441265,31.6301514270727,9.845369551716582 +0.1489180567170011,0.2947507553251591,31.925144971068626,10.000493310630022 +0.14971059480000662,0.28988442502402495,33.795701993172,10.148910497686016 +0.15109356095862123,0.2969819921447525,31.306806646278783,10.120043224294855 +0.15198264220534038,0.304148894905014,27.483058629707383,9.61050647769376 +0.14897506862611645,0.29848599815535387,26.55579794295399,8.611612934212031 +0.15094964225346486,0.29550456245959383,30.337149502676944,9.634014184994209 +0.1494934582733417,0.294688995336541,31.436887522177226,9.84827084717634 +0.1513460882606624,0.3039522565981036,36.81068221816568,12.761237796387192 +0.14961159228275622,0.3075540757328494,27.729881230162828,9.859738438340095 +0.14904821060179504,0.3022214134123605,26.231863666208277,8.783562953794359 +0.15092536717519364,0.29048061037102024,26.570770026138426,8.08118916542722 +0.14997307458668188,0.3003204709074739,33.937665336028836,11.293134548622719 +0.1507379341674516,0.29771805021479814,27.24705703761347,8.836606922975344 +0.15069751389170552,0.304910509168307,25.651003207644138,8.952736151857765 +0.15192588820169364,0.30357719884366297,37.291391651642286,13.041536493999775 +0.14926661140244188,0.29914640686968624,38.6896026998953,12.667427663210246 +0.14867923868783592,0.3024091754438188,29.608991606465246,9.922620132013492 +0.15023055023452545,0.29522525162099744,33.10039732488627,10.48120791342317 +0.15005674450729864,0.2973327972026254,29.12398153162336,9.378592793622097 +0.14860231337978883,0.30526405618629127,34.15811440584288,11.79832423603548 +0.15063917442891148,0.2961681081232702,27.03122331875921,8.65065291660294 +0.1507794980345681,0.3044005089842395,28.920214700039754,9.997297650100334 +0.14969647245056217,0.2949170860834301,25.442222140669255,7.979398735359632 +0.1499364585256781,0.303731504858062,30.45917463345155,10.436651341363108 +0.14933179242065167,0.3017697152854228,31.421884684545105,10.582523966678865 +0.14890239606114092,0.3014754324546571,33.075336726605045,11.096719370441585 +0.14903699398636183,0.2966914690434083,25.46332963525938,8.127613506530858 +0.15019932349464388,0.3012439829248921,34.89887994161067,11.716463236742038 +0.1513546877921181,0.29528728516440056,36.2146324243392,11.498234482846144 +0.15001868941609428,0.30503672752671357,32.134543910383066,11.242015650973794 +0.151249720336153,0.2974595376618949,31.476501757241376,10.226516806565694 +0.14964099274873477,0.30902497554482167,31.287773027969088,11.312391907096606 +0.15126217046083892,0.29916032632769624,28.984274049023853,9.635435687264673 +0.1497821079999026,0.296815107908888,34.93741855972432,11.147102367427705 +0.15099872782302493,0.29622232316795405,24.72793662723326,7.969926097638872 +0.14813448603770774,0.29817423942352095,29.358431700961614,9.42017318438075 +0.15014534296993506,0.298666684137654,23.759845313360163,7.806113911938393 +0.15145504676205232,0.302830588500263,28.367106168001598,9.678751950038567 +0.14846861017124688,0.3055880429449785,32.4523568284763,11.281842842727114 +0.15105586892568001,0.3007656935422262,24.195492485674503,8.096330557185862 +0.148319430215602,0.30184185686371523,30.35619167529384,10.038249489220105 +0.14790869157292738,0.3013889225119847,33.29212571309671,10.980495133512086 +0.14992797029618493,0.2985458221960667,28.465090127518515,9.258350737998345 +0.15139042434189637,0.3080865611920626,27.123095627916314,9.821726008597887 +0.14853037414207285,0.3018217384497203,29.37304809625043,9.846609036455389 +0.15105307195557519,0.298047350982027,34.48556932002956,11.316443023021991 +0.14959842917846974,0.3019691734891241,27.591577968767115,9.269141395772568 +0.1493937208482183,0.30140470089916505,30.431032784853503,10.168539386477361 +0.1495122995268323,0.2985099040635329,31.730210905183917,10.285892283056292 +0.15034963921120673,0.30464752548532453,33.26205234186775,11.56507447635402 +0.14988711156120407,0.29971813325130897,26.299294227021893,8.71993811984543 +0.15170918938180084,0.3021648960917383,28.001030365228118,9.549338663473081 +0.14873455839735883,0.2953097338186062,30.976014616628948,9.727657006065758 +0.1482526294873665,0.2939687581601697,31.01641054391824,9.54685361604032 +0.14978834552647866,0.3035929370923891,22.85158145823892,7.854512110889571 +0.15064534357747447,0.29789532851811695,30.176549723443927,9.847280064415953 +0.1499353294298719,0.30214993796382983,27.801573658579606,9.430783415303049 +0.1508015667616332,0.295945246549652,30.817836313350774,9.807732270404276 +0.15119573930207986,0.3029512307649275,28.873206503399185,9.957238618867455 +0.1513343675066051,0.30323865051553595,25.86418591858291,8.934865588297727 +0.15102395343458125,0.2985337015093916,31.389621037245742,10.348530899458288 +0.14909935657614576,0.30150730327119424,27.744378344633184,9.321525363953352 +0.14799883654732868,0.29767847218769755,29.893882008354968,9.569892633358771 +0.15011830875101023,0.30491850217079497,35.78934919167952,12.490383370264542 +0.15036872420816705,0.3011543293618798,21.094531303016034,7.114836782941664 +0.14919508757361002,0.2974975525422714,29.01344616729451,9.348211204227884 +0.15045985120209265,0.30655280040476574,24.735846894397316,8.736340322571591 +0.15041882113366625,0.30374813801100814,28.616751866594097,9.843928472718217 +0.15038618106089033,0.30373284430420855,27.944221781204686,9.629999296666975 +0.15024740511423207,0.29996932997606574,29.593343089564843,9.84068807077319 +0.15058812941131425,0.30273651725799045,25.23530118615858,8.61100377122666 +0.1491852140120376,0.30020353774738756,32.29292094353527,10.634007524510153 +0.15055205305303637,0.296051018661512,31.93800930584642,10.160357681160134 +0.15218479630266712,0.2982949607819614,29.971809077698108,9.907797520622855 +0.1511738422813631,0.30285061158479437,29.000360073039403,9.890843427806097 +0.14898502676481884,0.3003609857685698,30.76287184959528,10.134151616260668 +0.1492396885005696,0.3129014897025312,23.355609958695464,8.703475850297787 +0.15068954056924036,0.29995452377227644,27.121918716032788,9.024102312186214 +0.1507193145356798,0.30278014745891574,35.59357881226246,12.152839289383953 +0.150177677631047,0.30511608999874107,31.566935426586223,11.022630571887593 +0.15011029301926526,0.2963720663850639,30.311736631464964,9.67237331042449 +0.14956646868907353,0.3004292489549872,27.66734872442327,9.14843010753461 +0.1501764198816447,0.2971921821852169,28.411789008120525,9.13535444925497 +0.1492675846839113,0.30384110553014265,33.728642160264414,11.521214151125157 +0.1503890913442549,0.2989649137423486,28.242903769900597,9.295181418102398 +0.14960555952363722,0.293553399403261,37.67793676897928,11.665375312183281 +0.14923607342729084,0.2915876610197609,31.834189496829204,9.640339761258684 +0.15099895342196842,0.29735154818652115,34.68469994281711,11.225876704501749 +0.1492827961276359,0.30124835697004815,34.484560252242304,11.469182395128254 +0.1492082967198867,0.3066600147515532,21.763527165537987,7.660706528670348 +0.14958476575920931,0.29942199481592974,26.921301094569905,8.881571950254422 +0.1506170764470775,0.29850584179353995,31.50486206284666,10.326942358209852 +0.15066294330778884,0.29475166303611866,30.735251397302076,9.711031403177827 +0.15039960373806469,0.29954917423541405,31.871453513816324,10.506725096610086 +0.15038360651891883,0.30411495802183575,33.26839520643552,11.577601241918899 +0.1492926676191027,0.3051310236502594,25.153593482107887,8.81757472533746 +0.15014933242000017,0.2989386644363175,34.85654342933141,11.408159297309084 +0.14956983781023406,0.2984828686931834,38.59989520644059,12.557841048532621 +0.15029669082979438,0.29331654060769496,40.72087411938509,12.646674697306084 +0.15023816923574768,0.29884688804984266,36.29063056354882,11.832952337682643 +0.14895810851794447,0.2996367895458192,25.62607699798423,8.417207112018616 +0.1488229926662229,0.2931306845847303,31.55811453592786,9.683485319239631 +0.1502748830994016,0.301770028414485,30.941466540406875,10.454513736091233 +0.1508183994939936,0.29918292101924415,34.01787246782353,11.286134659568411 +0.1514334614877137,0.29988294228244283,34.64206461325075,11.561536513701439 +0.15033309990750587,0.29396369704077635,26.300653658882407,8.201538236375109 +0.15094790279978304,0.3060515324844584,26.730576716823098,9.43164559618192 +0.1503674619335804,0.3025815567833557,27.262460287968377,9.31417153784119 +0.14684094116674157,0.30192363271123435,27.70143106974904,9.157390012175188 +0.14975083901151065,0.29790376733011875,27.803517043271256,8.976639705138691 +0.15044620884782595,0.29930461804864894,27.156790697383784,8.997593963729885 +0.1497411878489146,0.29777805027618176,31.604816642515875,10.223777170729724 +0.15083253984836467,0.29808375848817104,32.3134871578629,10.586429678713277 +0.15152855995812176,0.3090632737764064,28.47696369625653,10.393508968594054 +0.15101457761939477,0.3032977344742639,27.945593617016996,9.625998452445055 +0.15084310819275346,0.29349565382900866,33.27676958626664,10.345389243771228 +0.15085491554265365,0.3021933198630372,27.261326767905178,9.265981532123753 +0.1515868072944303,0.3018349219664475,29.64395409537417,10.07895309002416 +0.14838051888977336,0.29645714146121155,34.66521388793286,10.99298187546579 +0.14872113936317696,0.2941752177513343,27.781412503624622,8.620205033640095 +0.1502716106006808,0.30378168186319754,25.87233968068197,8.905886652306144 +0.1494606526771229,0.3020408078275209,27.30000410744591,9.186713583169913 +0.14805998331115525,0.2975410512595198,36.70432634026305,11.796432676541592 +0.14939314291672123,0.29986858004746597,27.077631190859677,8.993470264235327 +0.15075588720167263,0.300851483012567,36.19917270759613,12.13263943846799 +0.1509326389534458,0.2949754078922568,34.714724827496674,11.054291212413816 +0.15138858382758066,0.3026131209002586,30.872036145440124,10.57373967140795 +0.14914178436387637,0.299862319809515,26.01755515227816,8.580735530277664 +0.15056881562648386,0.29989240234088904,31.724061970127636,10.560745395334024 +0.14932912910274593,0.3119926784972076,29.57576466418941,10.990776728060661 +0.14849213766759733,0.3021364196609171,26.74580161668225,8.946538982356994 +0.1489334197655789,0.29629806538814013,35.86520034650329,11.350002670987365 +0.15021677976924774,0.30884280321231333,32.09587365314105,11.648530821805952 +0.15059299335220533,0.30375425050143195,28.968119275752816,9.968512642098972 +0.14998996156300157,0.296154015826597,29.276427907885285,9.344756810961114 +0.15172035565235537,0.3007442121371496,37.867350920028564,12.83717119189501 +0.14922456403041703,0.30081981687462594,32.65276024835169,10.826367218164261 +0.14946741916897519,0.3003101914027999,33.34297461980381,11.053973528829186 +0.15025543263372534,0.3021579851506451,30.439583502185545,10.29373220196607 +0.15003875660122135,0.30137417587092735,32.03929910258014,10.776538113346524 +0.15018023203048453,0.3071920023937107,27.78105138876704,9.93264274322018 +0.15001859654708857,0.3065685034975503,25.7854819832491,9.16053134037225 +0.15128749381711218,0.30167273334308414,31.59540513858968,10.664974133439017 +0.14991605630840996,0.30490508912724984,30.770290161367342,10.726798199225577 +0.14966519845196866,0.29733707229006023,32.699495539775356,10.45925635131811 +0.1496623004039936,0.29854373731845285,32.000981333811616,10.47013988798992 +0.15099125429728752,0.3014235424295824,32.10478019388745,10.84083825400878 +0.15064815314581614,0.3013209615661064,27.466591156527,9.229790125419798 +0.14945301106507863,0.300933377550713,25.149835842268544,8.334603512835368 +0.1499615756808566,0.2976613455549162,27.470437040736073,8.896065969535172 +0.15193734316447108,0.30055628284606034,25.486926591736097,8.558631151434192 +0.1501480262652061,0.3033407324860105,32.29919319780624,10.981026935595676 +0.15027217644863589,0.30125412783275807,31.93838404739987,10.63735841178267 +0.14962706740198267,0.30330944144611965,36.501956901450455,12.48136982678313 +0.15051835166125535,0.30061714886699126,36.15859907808126,12.08208306644241 +0.15105173234262076,0.29651328318625236,30.532276263999833,9.84484153064835 +0.14927044761532215,0.30301188555432196,23.41575012114615,7.885288830626537 +0.14970159891164067,0.2989857399528463,27.527391313482664,9.000159347592957 +0.15076835996938107,0.3035918943696703,31.51159632084542,10.881764143778913 +0.14742774186063176,0.2964464146682,30.618276499884217,9.594209276427293 +0.14951862628074358,0.30433446958978405,33.87006542192904,11.762052428429033 +0.15157279267562157,0.3017088544534536,22.635261502301322,7.6924489815960975 +0.15029126933672765,0.30097597348049193,35.09474330854233,11.720130278117585 +0.15013517563372422,0.30206146571327014,30.873859477451543,10.429549112415577 +0.15150136733667993,0.29278887499200396,28.486946950352777,8.908175577480772 +0.15108611992470827,0.2929763473045553,33.23617001638077,10.362973147352905 +0.14889635849214522,0.30532178221377543,24.005144179498075,8.309769374931872 +0.150937685638516,0.29593633189772023,31.881305074622567,10.188644452330943 +0.14998654077364318,0.2931192437911638,25.91754274596232,8.007533983466832 +0.15001372525248866,0.30246740777850173,28.583944117863012,9.721550051528311 +0.1508059402373685,0.3033347795517856,30.388657534307782,10.444991035255544 +0.14918613954106863,0.2998074160659683,27.33758190080939,8.962927060864109 +0.1510236003438804,0.289987662392049,31.6555682613191,9.472140840876072 +0.14950143644270464,0.2997811181288079,23.073341875991286,7.56832995873447 +0.14995499538363685,0.2945212898066783,33.76754668725887,10.592191115076549 +0.15107291062233838,0.30028824095241424,31.604892867334573,10.539783860010711 +0.14897744160366866,0.3085046054170418,26.45831618482862,9.420444506685868 +0.15141283023521593,0.3015041341878187,30.136922764413423,10.185229746053519 +0.14762666649594935,0.2993637662029128,27.291392295213935,8.873284770562869 +0.15006423875398403,0.29989562891229926,32.41392338278956,10.75243625106582 +0.1489512208018944,0.29637795881969037,34.88342010337186,11.067613438171369 +0.14852318123230684,0.30419513252641256,35.9896688877274,12.331662807356187 +0.15041761172546658,0.30094156366002434,33.29561415398657,11.20710952724135 +0.14936673570650297,0.29934612429443463,35.63410509301917,11.596052507269599 +0.14999615201392985,0.29716737188817866,27.245571049802972,8.742134763668354 +0.14901868450845251,0.29432479924205845,27.04880734044346,8.369919414820473 +0.15071597819450855,0.29992889311433496,34.181118301890436,11.300229727379396 +0.15018866456604216,0.3008217376428249,33.44091945765427,11.220056409410645 +0.14794387604954953,0.299945474345407,29.198011113527915,9.514176261026051 +0.15088968154762258,0.3022619673657594,28.771051319827812,9.76649300418183 +0.14914889985130467,0.2978580941484519,35.70690459936236,11.522204684134268 +0.15025996788273904,0.2978002544553836,30.214609929955195,9.816563407186466 +0.15026618887022195,0.29870525029477446,31.80347751078522,10.43956326575468 +0.1500137539124828,0.29708434099728376,33.063176596445494,10.686008637865871 +0.14953949754577628,0.2916234793561537,36.32707234013692,11.004653642711645 +0.1503129480106543,0.2988898825982795,35.19959801916428,11.56929031067122 +0.15170443049506974,0.2996211150114338,34.447648197249144,11.432129182682546 +0.1501752195272987,0.2927535344724037,31.804551205309274,9.825265260870875 +0.14838358741597696,0.3004080293425511,31.093975537133975,10.183096364258576 +0.1496067981768419,0.30211837611273085,27.63191929961708,9.32010694088763 +0.1476939995857755,0.294806881413546,33.96506422008545,10.46960718282136 +0.1510533905869901,0.29829219621223013,33.406410205237215,10.957776374901826 +0.1512242049490659,0.3032870134995776,33.80445147157506,11.670589657708819 +0.14916744963982242,0.3061261883443064,29.407473356573654,10.303071677091312 +0.1501204022371424,0.30217714612460683,32.71552216260066,11.097094010430462 +0.15080888615692886,0.294735017358906,31.456994421047533,9.933285342533209 +0.14978579080645862,0.3026652664402885,30.19299026386127,10.253523750369805 +0.14823173193558636,0.30018954236847534,26.97234864159212,8.862328648479297 +0.1508816361315773,0.2957853667688422,37.42465495206485,11.96280147088533 +0.15033343762128457,0.300561720799264,31.721720170211864,10.59817170291047 +0.14939919409839245,0.302508523376945,30.305380707156544,10.233033207692523 +0.15006763693664407,0.2981711107285202,35.855512776273734,11.619723193631305 +0.15002520749919218,0.3026130516136215,34.593621498129615,11.770056402184327 +0.15062667677313957,0.2969836196710375,36.20042937635599,11.695876578225128 +0.14956622090726757,0.2982735185074939,30.680841265240353,9.94572882688327 +0.1501291804880908,0.3004859160830332,25.736741820372078,8.580036312323314 +0.14957997111358565,0.29607779323199995,25.897047668044394,8.240589033330718 +0.14990880397586995,0.29745501312143396,29.39660497745309,9.507115420622418 +0.14810116189704758,0.295115683198499,29.54458089848283,9.18348460222281 +0.14913530822175125,0.30270925072468485,30.485640208739824,10.309818619860062 +0.1510290807570725,0.3020427974475401,31.853770023353228,10.867387555148479 +0.14869509840329742,0.29926660885657236,26.51632463548105,8.672069524224176 +0.15072078078182774,0.3017304271744159,33.361510264567436,11.242310713831738 +0.1509367605754511,0.2963234152522311,27.68947073760433,8.896595134724901 +0.1506830469350529,0.29694822946232674,26.434389760897645,8.579453983659022 +0.1504977494317284,0.29889582470758785,31.24640089011988,10.254247797759087 +0.14906374205329614,0.2989539374740569,31.910509296208765,10.386106879165496 +0.15043294783217107,0.3022923578103525,30.479594507469496,10.385825502885126 +0.15103033376788386,0.306558769330646,29.114676009900517,10.375406011182175 +0.14813800100510763,0.2985758406645905,25.983801171498932,8.375189142157899 +0.1498239478978008,0.30395755867524604,32.049911180077785,11.021361371939852 +0.14830487926303187,0.3034081430133935,32.5471203996736,11.06495093536526 +0.15053478252873861,0.30453961152271075,35.59144116307631,12.352695862727236 +0.1515203393270186,0.3079747960900987,37.123394827212344,13.498755986199946 +0.15100960549879305,0.3007039491224379,29.256633260245682,9.837151677984464 +0.1476158617298777,0.30236277449305604,27.234355514259505,9.070490729137697 +0.15072330919523244,0.30253145915006197,27.59895360141533,9.46514951290072 +0.15144397693259856,0.3025853020045724,24.047993818909195,8.25354725186766 +0.14976916870570445,0.2999385961403044,30.719932933637097,10.065942738556982 +0.14945411194360014,0.2945401631480439,34.96909307431436,10.920156468596382 +0.14856798008792343,0.2927448735811818,25.072014310215835,7.636178913210427 +0.15020901157943053,0.29956654801610744,34.99302487141387,11.583192757805296 +0.14863197041458337,0.29797735622241217,34.783059379367934,11.161632465566225 +0.15110530025835425,0.29921596374742093,28.251532981484026,9.31401755151908 +0.15048452882289368,0.30011501010920477,27.967516910313158,9.352098923992132 +0.15243895483406758,0.2975008420199631,21.650865789222493,7.107085211072656 +0.15067138335718613,0.2970915417518866,29.99061812260256,9.721014478828373 +0.1515247804056468,0.30317031349612356,33.059729283195736,11.361672418892676 +0.14953099259110703,0.2921683087911748,28.431904907272767,8.670840393366774 +0.14957457977824412,0.2914517733387389,25.781854344021617,7.801649019914036 +0.1498902377627716,0.29626303964398026,25.097552230910587,7.981953616048438 +0.1498006955516171,0.3095514188456642,32.96534165555802,11.937590414783557 +0.14992211996844215,0.2956438729616089,27.499617964178434,8.690186643323932 +0.15056435963681028,0.3047674293501293,30.56532167665073,10.669978065969064 +0.1495138894325046,0.2880664905932088,21.883329271507712,6.417950263282249 +0.15020964920694496,0.2988724279659941,29.283225588971106,9.6107859898356 +0.15082697546186735,0.30065932155023306,32.85995724210435,10.991574391161471 +0.1504118438320323,0.2993437012961043,27.91229244476032,9.215587839641776 +0.15237753531682657,0.29977232642238977,36.54926100909067,12.257913980499692 +0.14916746084735927,0.30571841346496953,31.318280451474283,10.906867446401455 +0.14980871251157968,0.29196342457094177,31.089335366468816,9.432312685067243 +0.15052803513510668,0.29683738691145545,31.968677448488375,10.281480808269658 +0.1479024251901781,0.295846705780382,30.941350264546113,9.691274285405807 +0.14897218005543578,0.30015655339358105,32.85721050937354,10.823515432651437 +0.15114125169489967,0.30204159106289247,34.08228645353533,11.584930382793006 +0.15052720153998558,0.30171089751491736,27.75606936023637,9.3793462284118 +0.1490189532116427,0.31339213590916637,29.282629468392027,11.020600640177715 +0.14931858255736838,0.3045059111676515,25.364211422566452,8.737833109831781 +0.15020911549698143,0.2996736504595719,30.93095963370729,10.246001443613583 +0.1512471836611624,0.2977910292707081,30.089065165671336,9.803992129689632 +0.15189530899743495,0.2986461604770501,28.20517986604195,9.351932241057213 +0.1508691292370478,0.3051062150010043,30.058256235097634,10.495639055747139 +0.1499322836335957,0.3043476505734612,37.46630126977707,12.920569432220635 +0.150527559254552,0.2964948641735151,26.746121279229676,8.594892458484802 +0.15054727252357028,0.29966143130475625,28.27589033133696,9.364626273409906 +0.1495166882833843,0.3025465284559638,31.6187293525856,10.743421113529362 +0.1496149122080071,0.2988446072305597,32.14063234538184,10.527418153830086 +0.14822810549607887,0.29855471406750284,40.50216035830114,13.045942907881523 +0.14958110380085657,0.29622429559008806,30.042987888871412,9.613133930636812 +0.15009866425000715,0.3048230748560001,28.841776676405694,9.989615941981587 +0.14918783620076195,0.29829332209061327,26.090096135423217,8.430721543889055 +0.15089008483345806,0.29462508197623516,34.78567159799842,10.971799138270168 +0.15031324270911942,0.29584364657253964,27.360308007465825,8.700360249968233 +0.1490067256156974,0.30586547270079606,33.96027395289742,11.86044751949246 +0.14994735727886896,0.29999057568664284,30.24169409691199,10.021821587565075 +0.14986122000819457,0.29660596655518484,32.17193130267108,10.326364992280173 +0.1514659648717259,0.3008358517144191,30.51487565645458,10.247957704262044 +0.14934166676786056,0.2988898854693365,37.05438062622995,12.101372536950185 +0.1514357648599,0.29436326811462066,33.527773857055976,10.607357023246358 +0.14935547119016884,0.2962995151275229,29.8841395530142,9.446401141681639 +0.15039603376297547,0.3058240216010291,28.068024960179443,9.848597907580814 +0.14996729653090501,0.29975602550900576,32.67036288114924,10.756640194378935 +0.1488991565664524,0.30566500198673685,28.105002025050656,9.848045414433072 +0.14864280712223094,0.29771316528132863,33.78668686487765,10.843820787728273 +0.14887351854828854,0.2951575289930031,29.093557734549307,9.082114271091546 +0.14938027195051046,0.3042836205209738,29.29201755246359,10.110029547405741 +0.14891354401303153,0.29509796621764844,36.33896817961727,11.39053179135551 +0.15113669043137987,0.3023279715822817,28.639375334428042,9.81310299978404 +0.15052272848766524,0.2999170936947808,34.913787003027835,11.543948571053724 +0.1500252556185344,0.30435383123377585,31.414343797073936,10.828464232926 +0.15068956020418137,0.29643931527458756,32.2446765564611,10.393210941184396 +0.14858706217324727,0.29791320239282176,34.30211782006229,11.060143320312433 +0.1502274209983394,0.30129035948968425,27.916171561600315,9.363678586290343 +0.1502265069004289,0.2970912447943692,33.76873550401297,10.858090756806757 +0.14988050973352157,0.2965877609370473,27.545067302340406,8.839018737190695 +0.14848026919664828,0.2995691535953948,29.607332868993275,9.625359862745617 +0.1505813509878999,0.30088642359710344,29.55176898364864,9.925190573280528 +0.1509229185814729,0.2997843622412984,29.9712161995814,10.00939843856159 +0.15107011097115747,0.300000621920198,30.81194368297223,10.258691685885609 +0.1492170096696856,0.30070771529744617,37.506390657732695,12.475251818368552 +0.15000423669964397,0.307713162439284,32.38927368627511,11.597845364038426 +0.1498798536213614,0.3064370633147597,29.704236775236442,10.525736870788263 +0.1504176478965641,0.30117906931284427,32.637321267897384,10.970785593132737 +0.15194528249256337,0.3049053065387763,30.245800043204603,10.649854805371916 +0.15085633435763687,0.29695610675817086,28.52881167630997,9.228645262844987 +0.1512214384406079,0.289955649363796,33.39641694979857,10.082530387363066 +0.14876669386805672,0.3084198096622454,35.38609048143071,12.61738068526331 +0.1492980527876731,0.2916488087442748,29.07169849936675,8.847135360170599 +0.1508140668907221,0.29391335449230316,39.503654374452886,12.366217229207333 +0.14965989468233906,0.300212058617775,35.551514648235305,11.777463542519078 +0.15230251647049375,0.30499636388842855,24.892018318160332,8.789224160734591 +0.14948378829391232,0.2896675413672151,32.910640350527125,9.812529234935022 +0.14891461207732828,0.3048768140604178,29.44658371926898,10.130587051305382 +0.15037065525049279,0.300307910281548,31.359361773172278,10.455096844860542 +0.15198094096467527,0.3028770800716521,37.35490171463296,12.88725329435983 +0.15007239552825205,0.3022284718225873,29.784375187623425,10.142038499756614 +0.15050842902699438,0.29564889145887113,38.11425141742676,12.139267826207918 +0.1496908433526373,0.3001025493340731,29.172366850873175,9.647477218564111 +0.14896322030323522,0.30203656932377193,29.37823289361273,9.792395477861124 +0.14993481677988327,0.30169299876207045,31.548994585398223,10.627899187689952 +0.14724446318997697,0.29961403920452073,30.746484693573542,9.980440979504785 +0.14840156152653608,0.29850862010238655,34.58554484358456,11.151374621223978 +0.14970014472678264,0.2978662446870938,34.93739547047796,11.324639201111518 +0.15008693225266287,0.31120615852848216,22.785055005035783,8.445986831804309 +0.1510068729769792,0.2975969834002878,33.364789040028946,10.842024137827318 +0.14986308082535857,0.30394543157449244,30.36708525477716,10.46064206170533 +0.14999417816297356,0.298699524938535,23.35615347859842,7.624812148029841 +0.14917786476179606,0.2896892900632804,33.60566948833966,9.962832075369574 +0.1496564852955943,0.3023315201934147,29.910749115122886,10.13532608098323 +0.14989096029553303,0.3015594005074382,29.962681107061627,10.07448710361358 +0.15099152743702818,0.2980664045686478,25.864971662339094,8.455933057439545 +0.15000195991331366,0.29022719203342534,37.15389419105281,11.124104230330971 +0.14732159894226532,0.2944248097371885,28.9442618085757,8.902662571367227 +0.15060641865651012,0.3029626505486804,28.832894045907757,9.88253862130696 +0.15175533707065642,0.3024543550754417,25.967765633133283,8.926422475105827 +0.14922166228034395,0.2996031594590853,24.072895206766074,7.874507522159357 +0.1495974524561277,0.30149968194178745,30.08102670913384,10.15752359771379 +0.15030369232994675,0.2977802392533552,28.929508941792353,9.385589435460103 +0.15047145784126828,0.3091227961115721,33.453919277423395,12.23423492550545 +0.14979968222080933,0.30869684968815564,29.1240331719265,10.515182765634954 +0.15175202020452652,0.29978662983013693,24.6182210519918,8.230811076383706 +0.15111664367414696,0.2929350094907366,33.8070186665512,10.493042771003543 +0.14773141658685507,0.30607896668907947,38.98967597357519,13.544809983048282 +0.15048592577426922,0.29878713049232064,26.437012745649692,8.678134751206814 +0.14860420096978091,0.30230835995059174,27.72777258834572,9.300707687431101 +0.15033857813973972,0.29898312387821013,30.242799146657802,9.968959689094193 +0.1501744352338197,0.2972616334358997,34.0690912287057,10.994471489005111 +0.15077366270278045,0.3070321211120317,31.577679594850753,11.245284211837168 +0.1493241753644689,0.28674473066892975,29.456352127605292,8.51200181832041 +0.1478064272661276,0.30505432656709514,33.835177705221355,11.590950243971786 +0.1505774285902777,0.294560162915343,34.22712842613574,10.72403014862635 +0.14926900797162154,0.29895090526510254,28.007679866037286,9.170429441547109 +0.15100579517590748,0.29166961934724706,37.613694721406496,11.483456086165248 +0.14778256094339723,0.3044204794036007,28.276269757243725,9.64385619069253 +0.15048855839513084,0.2902302281460755,33.02458259298037,9.955742388369185 +0.14916755359347547,0.30574124040546263,30.335564879439982,10.518654547919645 +0.14856133614992226,0.2981573998111574,31.13901131765107,9.974524641155586 +0.14886770353586712,0.3026241367369392,39.0054792454266,13.206429102868348 +0.15123834622570734,0.3024339978455535,30.37779539160693,10.34128559347785 +0.14896924427864364,0.2985398389688477,27.69811415336275,8.975303452126942 +0.14989465091262683,0.3028398121113737,26.691848022855588,9.067952102646695 +0.14900125815311938,0.29427807199618483,34.69372234963657,10.763265927519457 +0.15012800941965512,0.29896757939988955,32.52707625302109,10.72483526325635 +0.14896763672399874,0.2956297048716726,29.105496923372485,9.139690009810595 +0.1510095734377822,0.30157313627069643,28.041499549481767,9.492583904282302 +0.15002612834017148,0.2991004427329808,32.66359320975826,10.684455039595068 +0.14935291167696893,0.29188246346721447,35.82420320821113,10.865994594070365 +0.148930753573382,0.29170717525589995,30.651700834110077,9.216494694636975 +0.1491201210648723,0.30743677326365626,28.9237296966962,10.242124792689873 +0.1488128520083098,0.30422749241349867,27.570868774851107,9.38837645971629 +0.14936186508401317,0.29609047874087924,36.737616308451706,11.704560750742143 +0.1503536399264487,0.2988513317709341,32.07128281234893,10.467220668550107 +0.14968514564629695,0.3033158747234857,31.195580302653866,10.63128252851007 +0.14940747341388372,0.3063282989236877,33.10768514992995,11.538294337126352 +0.14935097113494486,0.2982184420631594,37.799352996109505,12.237690897707221 +0.14948755911539913,0.299896697619842,31.080531093369164,10.227364067411656 +0.15108574145137174,0.29556980989193826,32.52853372346906,10.3807612010461 +0.14923022771449942,0.30398469955910423,32.23819002851473,11.03872272932681 +0.15077514643881865,0.30066407404864104,30.904446062744473,10.369327423043895 +0.15164312556257578,0.2990816996631193,28.57204817108694,9.463817672084044 +0.15034817272081039,0.29429165616988623,31.96820599336816,9.996467156689155 +0.15008002057169414,0.3085144442166189,33.50378237681346,12.068551749304376 +0.15168152183315847,0.2984382555973805,33.171127352305824,10.960291375605097 +0.14763798205510104,0.302755150993925,33.3675500554672,11.188347029656578 +0.14967276125566992,0.2964768111929752,31.179787092686556,9.987883627481677 +0.14995052511842089,0.30270949910514416,35.879603289500636,12.171853657803279 +0.1476496015440522,0.30731891581191495,26.608187235868897,9.253813084500436 +0.14979747703184182,0.29914297820385344,31.6992151657291,10.436932794737087 +0.15036996130707483,0.2996290087383762,29.36445062956181,9.700214374704615 +0.14951088846188748,0.2991240739592116,37.302322599505175,12.173233430849326 +0.14990952257728607,0.30498428997612653,27.575936816078787,9.645056387359476 +0.1506024417954991,0.2982149870435256,33.84410044419234,11.039655582056586 +0.14941565610824922,0.30269401376813276,27.673236226362214,9.38072767472633 +0.14935653419745867,0.2972316726355529,26.459513695576813,8.519889907212963 +0.15034619453873455,0.29826118688405157,30.018066383633442,9.803343078629663 +0.14824270056919864,0.29953624994742994,32.29152288145788,10.46195414009125 +0.14829486237895032,0.2952601939462196,32.041579676760584,10.045994770127374 +0.1495483176865841,0.3028689123938377,31.905102481804825,10.86627170737425 +0.15060847348222262,0.2946587973050093,32.331126670766274,10.165927890397915 +0.14877148654725128,0.2973654914017494,27.589606473519304,8.87423677170513 +0.15093853085285633,0.30356885576257364,24.29356600897471,8.433810667069713 +0.1484150564116612,0.2996020609305658,29.013486390589364,9.471226968349903 +0.14974728380113397,0.2991960724669115,38.479467441650534,12.672399043975279 +0.15041623134378926,0.2958220142843137,34.250376901748446,10.912395141046838 +0.15039723001587324,0.2958192900763976,27.438832154094058,8.758253472855051 +0.1496213497245857,0.3031862780052477,27.145335742023097,9.240787777012562 +0.1507335733456856,0.29489015007701436,21.996937643645015,6.911074855230369 +0.14994837458031549,0.30480959012181186,28.880256929370557,9.994587168667703 +0.14892955227798266,0.2998049260297808,29.50286362880089,9.698570973924685 +0.15079364029295547,0.2973367608647315,29.25986697952863,9.472131824358128 +0.1489897882812155,0.2940538659978483,32.207631663257025,9.988222890392136 +0.15132294426315115,0.29209846362898856,27.445562364428323,8.452489802895817 +0.14968012303706404,0.2986486427303969,31.736089274152295,10.38522811136267 +0.14982222204296783,0.2979044931141044,37.59949579750225,12.188160566568948 +0.15049154835354348,0.29850158128242715,25.212214052189623,8.283537090356171 +0.150369326272289,0.3030893953700662,36.88173728819048,12.650215702585939 +0.15043402036582945,0.29643084963385224,30.24736283844757,9.623714537608368 +0.15053893678008143,0.2997600127654389,31.9112660326813,10.609302279229807 +0.15070298055060644,0.29885549411288603,27.720022152370458,9.111265911311907 +0.15020619370799074,0.3083728671632446,31.28111048427418,11.271043379770273 +0.14850278419933452,0.30109403328217715,29.955173643419986,9.935081287319292 +0.1495685853286746,0.2912853366038912,35.68645900127483,10.788105521393948 +0.14941037729604192,0.29560090126079264,31.209077027714027,9.873645671689829 +0.15237487638363023,0.3012558753540944,36.1396464222715,12.36605948618309 +0.1509183350045229,0.29949213597654406,33.67983039587432,11.214600355945327 +0.1512639339746326,0.3020244101506172,27.176593211766242,9.210257975869581 +0.1513060218981293,0.3011194432541889,28.378362883644794,9.597806323294545 +0.14916548853416908,0.3053376445264287,36.54292541370676,12.72790195657198 +0.15019903172890167,0.29653904927699953,29.763313915514285,9.588910323945578 +0.14803633986788978,0.2987713764794884,33.704847985443536,10.885475350338126 +0.14992693798238738,0.3001308785761139,32.10155798303616,10.59817180458969 +0.14945607801578312,0.3066097991369827,20.677754947807667,7.31458741730987 +0.14936149526160059,0.2946531826269788,29.353966883727157,9.136693437230443 +0.14842637049092258,0.30231390710500855,30.726673694174274,10.333354488079568 +0.15036454875251018,0.3009337262583554,27.94601562241559,9.392342121726884 +0.1507433864127477,0.3039369530372789,33.210124784592225,11.54931938463243 +0.14882338343393606,0.2999167307326857,31.300513203363273,10.28573097907366 +0.14936511958533982,0.2978899374360118,27.13762066452605,8.745230845042599 +0.15004509760551735,0.3121747037511047,27.223813910959553,10.183258932000975 +0.14962144162065646,0.29513392715019315,27.811170986424617,8.734631310124895 +0.1493703297245617,0.2955040696642449,40.72075313303382,12.899352917078122 +0.14912284142533444,0.2968354987710728,30.80534377662007,9.793629925502563 +0.1486433832010338,0.3034305311241754,30.501747914534892,10.41818975063858 +0.15156955389972887,0.3010023840286287,28.18771443914046,9.539312332094283 +0.15070284893189362,0.296821484652287,31.75290882594675,10.233887091153015 +0.14820328187416673,0.2939635857091676,36.15611783209857,11.123441184379374 +0.14961524202391252,0.30540549333451034,25.773909295932828,8.967461665919046 +0.14852123994275365,0.303345854564181,29.44445425976391,9.995818427934164 +0.1500279996522272,0.29451913232840315,27.675272128031548,8.67069598594607 +0.15016583888284507,0.29478329329794967,31.667412427686205,9.969842445194951 +0.15074326491673992,0.3049079976968613,30.188924100931313,10.523473364286552 +0.15116874788587056,0.2942452573600888,36.97549864905807,11.6144951136105 +0.14887704950754382,0.3027640987203028,32.056288989286486,10.799629232097987 +0.14827447429757984,0.29930106936574313,28.921863541258748,9.394477697303614 +0.15025084700925903,0.30261570109488956,31.349164529526462,10.653555033654058 +0.1470584218607265,0.2980859657694158,36.15444618178909,11.490333563813492 +0.14712976211860232,0.3038254235157501,23.554965312381228,8.01005674988358 +0.14929371441248226,0.3030347010851166,28.752313936268823,9.812561075021252 +0.14942245946941152,0.3105450516623863,28.147393911978742,10.289569727346931 +0.14994124751057558,0.30434247841766576,36.41564690658018,12.615297581157886 +0.15041600295970586,0.30047935067582504,33.92848887642686,11.345858051340354 +0.1492297463926909,0.3012417812051819,29.879038420923518,9.935954092260474 +0.15028486685580042,0.30419080195448983,33.435666862621325,11.564221402161284 +0.14975741766409373,0.29703805385374604,29.48314915825477,9.409584395117703 +0.14984177362601503,0.30297871902610113,32.37642612150913,11.076635876617612 +0.15074703016309415,0.2990666471043573,33.80923313328867,11.203894278995381 +0.15077836293640656,0.30243859962630965,31.27161841445128,10.68402937925728 +0.1494111276449715,0.30247723090918416,33.48409641232628,11.371689680811881 +0.15037795862091485,0.2962450680675679,32.94272495124692,10.50452289039227 +0.15046923736910248,0.30007952297787427,33.145595494331346,11.02405563501966 +0.1498322992142315,0.29616666278973197,26.749294423184747,8.527147905492836 +0.1516247019771861,0.29793915939891547,32.96158384035529,10.802201849679731 +0.14800760080521488,0.3047344725920896,28.550689194643244,9.747183359410737 +0.14882830919817405,0.2991130949982938,36.46571990497994,11.888958028540173 +0.1523989870137238,0.30729643713866445,29.706522990827544,10.685276944601641 +0.15029716627657774,0.29186405607044985,32.197226290434244,9.83325582396172 +0.14794680396580245,0.3078230610617153,29.697071949608137,10.434151719027476 +0.15092498034035182,0.3012773320414277,32.94348755068926,11.054685585687508 +0.1496979857414595,0.29757610711075627,28.37094100768026,9.141916905449506 +0.15168385126874626,0.29742510710855197,32.40317375033911,10.632726633963207 +0.15163851489104488,0.297780393297562,29.42314170999978,9.624565942021144 +0.14878670244962217,0.30363815463550076,24.90808548247289,8.427820472035355 +0.15120976349572732,0.3023990500813756,34.587735784909,11.829221768025379 +0.15240187593429178,0.3010293301943819,29.88097596783993,10.179007781059518 +0.15008276957758526,0.30279579787618577,31.19844246639446,10.612251681382192 +0.14790564940273407,0.28899923723894383,27.570864044735767,8.107963837249777 +0.14825065131910714,0.30114020134000974,26.549245923165934,8.800865789642893 +0.15128351939828763,0.30302175609109744,25.74601759927487,8.8649513110186 +0.15130931660459537,0.2936985971781909,34.40277947700914,10.779466319929336 +0.15079520564085203,0.29308300510306007,34.267179148397936,10.535502056871117 +0.1492951504653158,0.3033000858483651,25.544685889766985,8.702974658355021 +0.15090966749230297,0.3096888418980245,29.769388536754242,10.850189572400199 +0.1518557909996164,0.3026499074940581,29.135972765306267,10.04110706017011 +0.14952884549219642,0.2986342740238656,33.08918355717275,10.772624710301033 +0.15124842402942196,0.2955763158282231,24.026945916890895,7.69070709195597 +0.14999945715726432,0.2984295126585671,31.939564223482673,10.40604290756835 +0.14889464205216732,0.3035987065561859,29.188950042678833,9.919934951005317 +0.15026522100028816,0.3020283085466606,24.54099314348005,8.288251140018547 +0.14954314385688236,0.2939754309900081,33.173059040732205,10.312777422785024 +0.14970272507408455,0.29768306363394675,34.897162561709905,11.314770639942527 +0.15271868726180066,0.2912164128602422,31.16995964701568,9.657639548182411 +0.14977714505328044,0.29986746268268055,30.085977468286522,9.932647808008072 +0.1520524037885954,0.30352647144754735,33.14252911750455,11.584009463634427 +0.14828174056077514,0.2957845862002923,33.12813917444116,10.366751102333607 +0.14795614979041186,0.3032703107459883,34.24879225027465,11.575281231606544 +0.14866576498716522,0.295413276153987,35.440284037607725,11.061192585400065 +0.14945219747636365,0.3012790017269356,31.763652459883694,10.584150615116968 +0.14961294100393924,0.2996612121180742,32.298921448438506,10.628765140384235 +0.15059856685343245,0.2993103550307022,34.97592145975992,11.549777934718719 +0.15016441525784224,0.30040589898810693,34.38882429370533,11.532882830762391 +0.1502092166934864,0.2928309886976596,21.74295443448976,6.716755416958289 +0.15149816829228197,0.2961328605831056,32.31212403224867,10.40604234261362 +0.14897342687786946,0.3043279717656695,31.05911280927118,10.652602868343063 +0.15004558120298933,0.2953834037819675,28.802156360268015,9.16165794096953 +0.15024836794486515,0.30196202845059894,27.733877787833464,9.361259958269066 +0.1491221471391855,0.3031948696231033,27.63056204199924,9.362207861509567 +0.15008306821062553,0.29821859474455054,35.0967350304914,11.403112669910563 +0.15086129091799794,0.3066732719027212,32.15202566300617,11.35965219840607 +0.14997149625870432,0.30222762143505594,35.57154229735635,12.060745787776181 +0.1498781177721117,0.30300363403917147,27.668469244843724,9.421557147855316 +0.14965442989082026,0.3046840678501446,31.771531704697583,10.984653319392388 +0.14818107329777067,0.2971358134378948,26.604002829897734,8.431666456547042 +0.15046157458971735,0.2949292742527998,31.13496143828097,9.849437832752928 +0.1491152647866057,0.30114746285366645,24.268049838363435,8.12308585219697 +0.1510252942825907,0.3014785347273398,28.572798873678842,9.652889640930008 +0.15154254827038044,0.29489463674504185,34.891319536744795,11.111084380152667 +0.14989411751424553,0.29908908551194613,41.102404554948535,13.526415950112074 +0.14915756425025528,0.2998371798520187,31.64358574399457,10.426353436039792 +0.1486523670723883,0.29515085815352726,27.082596490558004,8.47676414591574 +0.15187153168580672,0.30521730846071643,28.038370134126875,9.989687081454052 +0.14717237928272345,0.296081068507249,26.504348524287046,8.298868371718122 +0.1522029007652614,0.3026590389912453,30.830524112005154,10.661550683308748 +0.15055689370541295,0.29699106967254185,25.313458753359015,8.149554847064563 +0.14722658640453307,0.2865305586520426,30.228897639850373,8.570984548807846 +0.15185234142220128,0.2968654363240554,24.011376566580388,7.77230523539533 +0.15117814254505815,0.3017747945622344,31.839586948785765,10.809910471309694 +0.15022314796230954,0.2957943151470525,32.67168628523149,10.348763742779333 +0.1504513867080999,0.3007201992713968,35.98269219271867,11.93211911862384 +0.15250416911581083,0.30065490478182916,29.537868572143097,10.068624228648677 +0.15285204484693823,0.30381370375040645,31.795101355636437,11.174161646612594 +0.150799659342597,0.2973340933396511,24.2700873528348,7.8488609347304825 +0.14947730948203178,0.29930807618546384,24.775072540357144,8.14446558216435 +0.1507747972002694,0.2992691913201169,27.463779813309372,9.074210418940561 +0.15043193672748797,0.30115158547515747,28.87964246496451,9.695187360630133 +0.1486439458121444,0.2961820023461523,29.933515026673515,9.40036158238847 +0.15051204576183067,0.3034771342403714,34.352491474717,11.843500345816077 +0.1488150459774939,0.2972042546522167,31.341047120734263,10.063117184251048 +0.1497015670823031,0.2992103632636857,28.980071552568404,9.499415355543498 +0.1485285781479657,0.29716281023163005,29.802452665339892,9.438410624672446 +0.14983694909204961,0.29749695877494603,25.15737825775932,8.138752526428837 +0.1500378881401528,0.29375534103806206,34.326776056191,10.615535834328954 +0.1490298874020154,0.30343188912389535,30.5767041995004,10.436821575606762 +0.1506656300754701,0.2991386211099758,30.670444671275778,10.194419709138508 +0.1495463689533794,0.2998957979418523,32.81753221578038,10.791768508348191 +0.1497766094076069,0.30534304733170453,30.981210891778304,10.796664980840802 +0.14900863874111983,0.29938121331999,29.413743224901673,9.579141065797973 +0.15224021884529318,0.30142331884620693,29.04782875821011,9.912115835803585 +0.15129947198437194,0.3078269985228101,26.89827119637988,9.691824153143124 +0.14826080806521522,0.3014072254295658,23.619337335316466,7.862061418807246 +0.15184917985875127,0.2996028351286746,25.51432283204836,8.566124637325471 +0.14999905628228674,0.3006656020227518,34.301096559621755,11.41883231719507 +0.15019228229692283,0.3022706219239683,32.210089792779726,10.907458415246467 +0.14908439848117278,0.30916393163699346,30.825092027015735,11.129838528304402 +0.150836557366633,0.30176658939568995,24.421409487907493,8.231826223901782 +0.1486063538906154,0.30296737338167384,27.486751369095856,9.346583102649928 +0.14797986077799483,0.3002458728058413,37.327920115602396,12.227058429483957 +0.15072768124054528,0.3029592165826463,34.1285443385658,11.749986581343354 +0.14890687018064147,0.2989810285276185,29.977829491747944,9.775222191907552 +0.15068743512738056,0.29539047258074735,31.30285771817441,9.962720928128768 +0.14944384205949157,0.29773551203563325,35.441240817056475,11.426474015138549 +0.15108929523505413,0.3088737311630149,24.506237777585085,8.933677377863795 +0.15143827657017672,0.297599614053814,30.19531725443829,9.930029302703419 +0.14915975647706403,0.2950783672704274,38.94819927042723,12.223090538014613 +0.1501014860727677,0.29942015544059103,24.023528480249688,7.9557441223497385 +0.15028540174785118,0.3046045758931146,31.083999713157993,10.808873810697703 +0.1491665774245523,0.3011479272639561,27.751822782893395,9.247282471607782 +0.14955779181019413,0.29401690593270385,31.382984532731253,9.792928519189395 +0.15012901157724032,0.2964096651107698,33.18119282511111,10.609855777469527 +0.15141739284643638,0.30320256224289543,26.059715401801334,9.043881611164247 +0.15048432881933616,0.3001110660893503,26.35947396604435,8.787272250911114 +0.14978751036976373,0.30436048668597276,33.57905974614406,11.536622001144199 +0.14940893312683448,0.3042421553707964,29.123298221357057,10.025330974660562 +0.15066549458284567,0.2934892792480278,25.240453226007936,7.883124385720567 +0.148639054723853,0.2998163426711326,27.860241871551516,9.150468323489577 +0.14908231998852303,0.2962545678312695,24.528586547251972,7.7427674249576555 +0.14909810441637353,0.3044294970781771,26.94944282281854,9.281956981151525 +0.14941428927852252,0.29946221424307257,22.17795299237561,7.279230262860078 +0.14937363277595173,0.3057574857198953,34.44401703718449,12.061714717333512 +0.15113695684658485,0.30351633535405875,28.789693096659523,9.940269430082827 +0.1490267271079294,0.2951467852501461,32.73336641163018,10.284394603520202 +0.15152923334965354,0.3016052783177185,31.337062751974685,10.709436690941715 +0.1512570901742366,0.29757265945692263,38.27162608370882,12.462552549579769 +0.15063884409396996,0.29861159914769797,30.551863480748775,10.03753123578051 +0.1499119278743356,0.3011174553987141,30.182168833483743,10.097177886349368 +0.15191302014569985,0.30112609185195294,32.88449028631618,11.105558071934354 +0.14994828349347578,0.295920614076779,36.019905549940695,11.380818651676677 +0.14928409092327896,0.29720822529776936,31.2002536942577,10.019422340583901 +0.14935111884498675,0.2931186562885259,33.37515068536127,10.26429514642783 +0.15024273104523303,0.30867223252817794,34.70996285888496,12.569416778065255 +0.14706236099162628,0.29984196033581867,28.888690549253727,9.35105296261869 +0.1480976320768652,0.30228186632718895,32.21477833038945,10.754052491574704 +0.14991639344151628,0.2989965511877896,29.82375974290315,9.78919035154897 +0.14856708938901259,0.29292598939613906,30.405693258467434,9.342820593778514 +0.15249026782718075,0.2955275627749801,29.460663497514094,9.503476488100269 +0.1512441561408844,0.3042575544229997,35.662384445431776,12.40665663380423 +0.1513044196544343,0.3022562439684038,28.81138659122557,9.81878959630101 +0.14894457493897215,0.2920560745713303,29.217651394351247,8.868408419165155 +0.14916094658326678,0.30499010263398674,30.724076624310026,10.678098424396806 +0.14940818254721758,0.3013228893439938,26.470960891930904,8.899949132600215 +0.15179643574898577,0.299930107843136,25.848228475271245,8.68823162876136 +0.15049941315067564,0.3000341787519676,32.895711603207964,10.910223375862326 +0.1481658161669803,0.296532977867018,27.81886386752761,8.763025554774172 +0.15181865579795076,0.2958862387672113,26.53539202665052,8.628085602302269 +0.15073750526295426,0.30597375909987107,28.127415811682205,9.95871771933104 +0.1490652861346166,0.29669884314119105,33.960869006703554,10.850851088884006 +0.14998629213826295,0.295302570534676,34.64806249198976,10.923482048135305 +0.15029533161994796,0.30158482729332814,26.40454511864855,8.870686147519876 +0.14974857263327326,0.2986613933379147,28.333234772233336,9.186212315515668 +0.14968965627299946,0.30174521311530944,27.18910806472239,9.144861850834735 +0.14795155214737638,0.2946653371682274,29.924012958099283,9.291098032670853 +0.14922507486158787,0.3016890099365056,33.095286243717545,11.118300457492415 +0.148021144398743,0.301292854429391,31.816663124369033,10.49324879585377 +0.1486534533003364,0.3008990938111918,31.286938421174334,10.33984791293095 +0.1469475706671714,0.3023484324029646,35.53152264321541,11.795115020853292 +0.15178920781473065,0.30155361339710735,31.31536265363243,10.655280332410461 +0.15072056491624622,0.29647317568425424,30.995155393347158,9.930448585779278 +0.14854232123378763,0.2968054929060531,35.91784802391071,11.399836922916275 +0.14924202036554815,0.29849096481671555,33.84539006179409,10.943744878949214 +0.15034298481234673,0.3009670441178653,29.51152589529176,9.898916159846058 +0.1501163203311695,0.2960598700815152,32.27558126253294,10.274146331553037 +0.1518829198484428,0.3013864355466777,31.88395481889839,10.85885664399941 +0.15022208150097036,0.3045651172055795,22.254778943468875,7.768409882108543 +0.15023278840743035,0.2980026151803848,34.70690383554117,11.290021742032184 +0.15193624298929623,0.29512925423050035,32.21662814889485,10.307678732338392 +0.14981018178662486,0.30549390620299594,29.54059380070454,10.365877107297848 +0.1489599556817976,0.2954561071394947,22.574428423261743,7.050521312636185 +0.15234615812927063,0.2947490079267672,27.314098304336305,8.707496511222491 +0.14966759933183155,0.29577391524638624,22.864444464511937,7.212366915492233 +0.15054659734581263,0.3011330657391337,32.97534424613733,11.018320612837865 +0.15010361517323487,0.30430363474135197,35.37313844987407,12.235227373343129 +0.15039519619592187,0.2958432431164147,34.01618926144468,10.7999635413438 +0.15036698928169265,0.29798828864119625,36.015130571978546,11.750677137321418 +0.14953134313970884,0.29801375226420673,35.52135111652815,11.490332831988605 +0.14992300057951277,0.302298323935611,27.367598860266604,9.312536726490121 +0.15099039589687105,0.30419580351678016,29.73544158009539,10.3094474956076 +0.14734207717363776,0.30292791840054106,28.053752547889793,9.351756619982751 +0.14934610868208578,0.3018718846252582,28.367442197550186,9.529800918828192 +0.14988102301916797,0.2997815328428469,28.745100284872333,9.47965631209071 +0.15101812536903775,0.2942536957575838,26.538621991728085,8.329156053576513 +0.1542977259546782,0.30239397990189903,32.04439545882984,11.18785660939395 +0.14899797092505307,0.30009541928536826,27.265256850502183,9.006247951708957 +0.1504699937050365,0.302040853636646,31.6915824562699,10.756361685404014 +0.15099149579377966,0.30553837767713815,35.31843737521924,12.471835613549066 +0.14953258413343912,0.2969398152898945,29.978798021746,9.578510672266418 +0.1516085837626562,0.3020864695487571,28.60564932711777,9.783511282627003 +0.15007872607951725,0.2944438049480725,34.6947669576105,10.883355771748391 +0.147454451575264,0.3041283870524879,33.45459331508136,11.347096306781685 +0.1512207292406704,0.2942293227501555,29.92183288923934,9.417193974103512 +0.14912434377340802,0.29745127506763575,32.408188728551515,10.38315218561443 +0.1487316364311185,0.31003631877768284,33.24179060643001,12.010757714364058 +0.14869274517078818,0.29327451077643096,33.777906791916976,10.410663766616949 +0.15026164735836353,0.30010639816225776,24.901807163844758,8.295580133428208 +0.14997610381021376,0.2957364800583772,34.74129818571201,11.007588295986638 +0.15051326951347796,0.29781385503924607,29.038599548732492,9.442441131383713 +0.14991581717988492,0.3036823955557383,33.7735103665097,11.587219742204974 +0.15019854258277696,0.2979464315024034,31.998208448078127,10.388489415490174 +0.15045950340344708,0.30259697445595,38.37439023140611,13.095655658294346 +0.149697633689417,0.30351588029257676,29.85932851337762,10.296195914164743 +0.15048208024374526,0.3059570923726008,30.637052307364268,10.764706405159654 +0.14997033223789602,0.3020435603699073,30.98678426699514,10.460911117614831 +0.1495357877851856,0.29830313548285303,33.67303180637947,10.913470416684358 +0.1507145822167922,0.2870859868841147,34.758248235128775,10.13564586214739 +0.14969576049285008,0.3008135926302299,29.96489061269328,9.972156669511824 +0.15033993254092562,0.3045769029277473,27.588412198533284,9.603257473593528 +0.15035769319879244,0.3005213909692996,38.00094210390058,12.670909998915139 +0.1505929622883625,0.303096124082179,28.234468041783703,9.697300486987391 +0.1498703148716866,0.3049082367213551,28.0118704483275,9.811894697339866 +0.15056529447156763,0.2975616793114516,34.39092248319009,11.194912267844815 +0.14901148653588198,0.29937223488775355,31.240930482031512,10.275277131946025 +0.14920116188489602,0.3044075166494896,31.569364887660818,10.849692127627772 +0.15097921181309348,0.30447832822016907,27.767857088338573,9.6608829177008 +0.14961974458668678,0.29251825691831174,30.03747735927649,9.227513746769016 +0.1512230144896541,0.29693313648681424,30.915526916916914,10.039894526260523 +0.15056220277070828,0.3016910946995463,31.550438480881596,10.677322373554853 +0.14974701660646178,0.3021308147905168,32.248123830037166,10.881934370295447 +0.14758352038436331,0.2941550975666623,27.46967344882966,8.490806564137657 +0.1505745421600971,0.2957514120816745,31.73499438084291,10.069401437645014 +0.15013342809196428,0.30264896588421675,33.035609220670814,11.201482246987222 +0.14952491657495828,0.2890725856443675,27.837978379864055,8.254198110493313 +0.1493953765105691,0.30004301470033135,30.144582679942793,9.946384299168574 +0.15181686549391563,0.29659503646392377,25.072149735968747,8.079509612982806 +0.1521507201940413,0.3055210984972169,30.478992597719373,10.853374191476826 +0.15005297658692504,0.29410642811380916,32.264588868914814,10.063297970922322 +0.14990234989800952,0.3048190855278523,32.96191810870839,11.427818615453548 +0.14951692288604412,0.30014646600666345,28.47863030253805,9.428243892218742 +0.14947667566623477,0.3040518037880625,27.565821563768132,9.469295442153994 +0.14935817641263474,0.29440700350877375,29.332051160584566,9.139153324358887 +0.14985933753391265,0.3027952077277238,29.811284379769134,10.095885761295856 +0.14965838812182639,0.2999554120881189,31.20842670900739,10.335682715501923 +0.1494690857460436,0.3019092379234986,34.70172492857435,11.641479389142313 +0.1494537401637109,0.2958470574634553,28.48591941559183,9.003404500402578 +0.15101086951404322,0.2981655497494426,36.75022422208407,12.01254565859684 +0.14903458240996964,0.29910278190338063,32.613651408623966,10.602575091536899 +0.14853404816596275,0.3012244621133848,28.45043417599989,9.45127053290686 +0.1509804697152294,0.29726452947526705,28.12115855461133,9.134980837245008 +0.15210881704125884,0.30246518199100114,23.666492516841245,8.163752398018547 +0.15009154551109663,0.3015837485929191,34.45475891564947,11.613579616440829 +0.15039182857081396,0.3004071757065047,33.39230737404556,11.128527889823776 +0.15060438825197517,0.3003817995847454,31.14089739103776,10.43712049224753 +0.1507742810738182,0.2982325711722114,29.15696833267372,9.521703186391573 +0.14850989014761115,0.3017628974969934,34.00785897494529,11.217602874181853 +0.15098833654739977,0.29646224638174146,28.534139649826244,9.146597251602495 +0.15160504453155607,0.30679893437893324,32.27025152923241,11.521359443745007 +0.14997592259440032,0.29668646200541393,26.992048773623388,8.678785815832995 +0.15093133594479025,0.3034505865376927,31.062000029319584,10.688246109289402 +0.15070643993270236,0.3028116612751269,30.741867441193854,10.56864513144559 +0.1485208506221559,0.29719832302133803,29.491064629466266,9.38890425710288 +0.14954223360954574,0.3017810726837369,31.824315570944275,10.681407939125206 +0.14977684642493458,0.310841238083303,31.000665172626157,11.427550916794594 +0.1483751055452602,0.3033775358381169,21.6742283553193,7.345477363335229 +0.15085547817486294,0.30488127291024686,27.961904940560263,9.736854523903865 +0.14998855193250907,0.2949151772734072,29.820022872164582,9.387260750975237 +0.1501935660552114,0.29737435440373056,33.19559549505197,10.683541572678283 +0.1509082558937118,0.29874883150453296,36.73976956089476,12.1260629648676 +0.14896041189384288,0.29519964974947566,32.048863984231204,10.02292416289313 +0.1496311611852509,0.3011614430213373,28.85929653789033,9.663344262127241 +0.1498982971341209,0.3024146023487233,22.077920935322155,7.4431134224339175 +0.15023983841205155,0.3047797182819962,32.377612193920264,11.273604626116443 +0.15120407829922186,0.3017220207324411,32.139042247704566,10.914869836008997 +0.14896836443029812,0.30416174496339,31.17485608417208,10.701200667996927 +0.1513106181041353,0.3002265720797879,27.525735231227696,9.189753051391067 +0.15017062641485016,0.29542325835442845,27.695231770798962,8.751120777142164 +0.14897483580186202,0.3096440766339139,32.535308755992524,11.74519728060254 +0.14907165805920639,0.2967042396459767,30.681445971499095,9.739789654658656 +0.14919817052370132,0.2980471299647953,37.05813051067359,11.959069111569795 +0.14894808185056307,0.3030666789816048,36.50489397327337,12.403597933967253 +0.14911619702837497,0.3019857881647587,24.423911870068665,8.202485593872485 +0.1486320719366379,0.3005405687549569,25.06160342515638,8.29630344220285 +0.14877646515201273,0.2968052978892778,34.06918640451484,10.84200774236898 +0.15034583386644804,0.2922195560469238,29.083785302403378,8.927270361303675 +0.15004356192167267,0.2990523291365325,33.13152588574674,10.891318911757944 +0.14939983640451954,0.29769782386820426,33.72425034082211,10.856549674355591 +0.14876205637510803,0.2940081200640076,21.08158006977957,6.4910922003086 +0.15106525367289794,0.30008102529153646,29.82410323302063,9.977423864021274 +0.15049029641303371,0.3019006336828716,28.240400061194155,9.558339969431563 +0.14893844009279678,0.3033799866971777,33.505959960726805,11.311633882741457 +0.1492574384719436,0.30468782691380497,32.59902106149704,11.235333069301568 +0.1492872985035771,0.2958571504805146,27.167139860054462,8.566686954926933 +0.15104575143224824,0.29446104188877115,31.46827193350436,9.921845745689087 +0.14905875435534435,0.29864081277185134,30.7872952789074,10.025578350811642 +0.14904671847527154,0.29341401096286157,19.256800157532425,5.935231637388169 +0.14991184778426642,0.29132180383371487,31.37302389558821,9.488554836644735 +0.15059482550360526,0.2931936472170608,31.48587754441544,9.71383353552105 +0.1512382316914387,0.2921169649534023,35.33224545333346,10.935561925455934 +0.1495448013995574,0.30069435068749234,30.052603060305838,9.956257102464027 +0.15018376313101886,0.29121345673840116,35.72432370903973,10.844025582853197 +0.15097508128435816,0.3024892664456214,24.142206530000145,8.270500649595485 +0.14868480996165098,0.29889663230754965,29.498090942060028,9.567991115290484 +0.15006072840348558,0.29590850417207626,31.407208754429732,9.981251331130823 +0.1485336526877529,0.29275561413480533,25.971375057914493,7.923397584679459 +0.15083081901508658,0.30170624357807024,32.74478822279597,11.115095128583638 +0.14999465770130932,0.29171082508038776,29.79692025200401,9.03533047923699 +0.14818403703298402,0.2959481674760528,29.296263149774944,9.237281098622946 +0.15045375750830617,0.29907385712185347,31.383844388058286,10.3790390684005 +0.14987834798816482,0.30114509064591055,31.969426061675872,10.696504519272944 +0.15107384542968083,0.3066554432347324,29.531126419455255,10.524678552452551 +0.14808350684908447,0.29771562050019135,32.0880389308299,10.289592601951972 +0.14998303431734303,0.2943447882209162,28.095036012869215,8.776501797398971 +0.14781261539528318,0.30942179419900456,33.46596967020843,12.073426397880356 +0.15105116661165982,0.298286393186438,34.5266230462814,11.305300238574393 +0.14908695445554504,0.29536077868254557,34.273378231696924,10.765632948393165 +0.15098283332609405,0.30024988690015125,28.082197821502668,9.371059944232735 +0.14842557334024312,0.29905830127550703,32.438701832004725,10.58693904563232 +0.1488187585807128,0.29400097088334326,29.377996523288388,9.051308357848125 +0.1492773452023682,0.3002679660159002,29.307054501866702,9.680075485115486 +0.14922482959319153,0.302452662322166,34.622487771019756,11.736944650981005 +0.14912944923162857,0.2904014323948326,32.24684589153352,9.694467445767499 +0.15222575452965917,0.29178060051938104,38.082721336193956,11.728157720391417 +0.1505687616121568,0.2977595143371976,30.305785088394,9.908643692745638 +0.15128744513908593,0.2943498331443096,33.468349711210465,10.548132416476752 +0.15092825991578426,0.3033520753420487,34.20068063114669,11.68593282432623 +0.15192949893807386,0.304138410325739,29.45725344285228,10.273581795006743 +0.14894659827188872,0.29985927063863205,29.27085390642178,9.621254652552093 +0.1495131604992782,0.30481544367279717,36.748692285987545,12.718504032436346 +0.15134199550084199,0.3023347365224781,23.90600894658675,8.176311593168997 +0.14933139478178714,0.3004929358911997,31.40582642313447,10.416526817477157 +0.14895863393224915,0.30325023409227614,31.27127649935541,10.66720934519102 +0.15044838329852264,0.2956799385508049,31.735077594166803,10.087713057340759 +0.15002863698867852,0.2969633843276273,31.180162084674055,10.0204524487767 +0.14941592248994662,0.3026226154262668,32.532862428639355,11.052136441992266 +0.14923057824901106,0.3002930789587638,24.02021835933481,7.88080163139588 +0.14993637167902857,0.2973247572619883,32.797970170439065,10.558325147253994 +0.150427507675164,0.3065739526712268,27.992738879817882,9.95015806508557 +0.1500351138583956,0.29580086839268316,33.930036994120044,10.79337623863258 +0.15058650313869099,0.30006340096509504,26.730185947657986,8.930932317597076 +0.14944393028634065,0.2989752809022004,31.152664987920453,10.137325615329818 +0.14994686849274413,0.3019951696172883,34.9585369906738,11.738951421965123 +0.14842662348046234,0.3003056751577144,32.64267271676609,10.735823750630887 +0.14859670352124357,0.30018052211066787,28.880610259198136,9.478615569791447 +0.14836200578061046,0.30215479523925143,30.319802675015175,10.16515832866473 +0.15057973567723992,0.3001588346190782,20.64792691053741,6.8732791470349985 +0.15139220528609856,0.29708803149821067,31.999703237326106,10.460410689395717 +0.15018201701181763,0.2892807320969717,33.530096039335945,9.93051892868961 +0.1509762801809613,0.3034151270127956,23.064729940984222,7.9435940026176795 +0.14870535067251722,0.298356146302538,33.69644066416409,10.911616720863204 +0.15081697081238907,0.2987881988002808,25.8677900481857,8.515817674012736 +0.14993408317691514,0.30006292979166604,29.396460440704647,9.721456834475095 +0.1484461797240552,0.29862654517241577,35.85058875090493,11.496333007805577 +0.1507236841962306,0.30083625432274813,24.110448563353238,8.100756937411633 +0.14959052703433418,0.30451175574105016,32.539844582686406,11.258578016756552 +0.14990297970672206,0.29607676632618246,30.63598051414949,9.724823539957638 +0.1496571473157076,0.3019161978295728,25.472404803943697,8.561906448726068 +0.14889695107657216,0.303264215636668,32.12242849175659,10.830346862064069 +0.14969424592246455,0.3027376804635408,29.610209069869022,10.045663328572646 +0.15015708367841898,0.2996409348284474,30.183355424777098,10.006410268042096 +0.1508873292731702,0.29614895531208163,32.19556571565813,10.32665076729002 +0.15007770754918012,0.29764104849933876,31.185105048009532,10.136560443494748 +0.14968205639863114,0.29559165665367826,31.350934881343225,9.956540385153398 +0.1500066735229222,0.30286699876248624,30.901633811698556,10.561927628982309 +0.15000136513565637,0.2973350592277371,35.65172635787433,11.540676785179759 +0.14869394829003105,0.29408983023486773,29.48304494818623,9.164698452201064 +0.1513098916069711,0.30959952196119295,25.60637510356099,9.402925156700062 +0.15075716960396413,0.29721922670536066,26.012056235220495,8.386261345483152 +0.15058816925547444,0.3012366162598834,29.38906810156734,9.854878874309932 +0.1494347481079723,0.3043831626365798,26.31989062453836,9.057744427175502 +0.1499562149541483,0.30432974187267775,30.31937288956581,10.468993342611126 +0.1498814601432157,0.3073587783815908,28.86685780066414,10.349627544170376 +0.149764128767413,0.30174994998581645,34.25226686755304,11.510412623932597 +0.15051644875441925,0.3006445096255513,31.90629895406775,10.688806450553447 +0.14960371041951662,0.3014467041035283,27.433020891314012,9.20631523339963 +0.14913469408316016,0.3058987784498792,31.079915069288525,10.810946155886736 +0.14952743489817327,0.29874865128571176,29.019369467639425,9.449088610740558 +0.15112731143765903,0.2938923632296102,30.743109661922862,9.642157161920588 +0.15075886695102883,0.29875682975655565,33.15445598377537,10.95525409398866 +0.14945676851547454,0.29823387344076074,31.37293637532068,10.121525420492498 +0.14916020799471555,0.3070007077695401,29.056266427618596,10.307045663074513 +0.15156158090664945,0.29687337740908776,27.676250844578302,8.9820462358796 +0.15034760504050634,0.3016948637125913,35.06497682052266,11.784224075504046 +0.15077776848695496,0.30341420632808186,32.5283345228566,11.178311565738685 +0.14896328831428673,0.3048678538205391,28.638098498967583,9.873992779893683 +0.14950971848446604,0.30226444389085466,32.53790101882153,10.998825357057648 +0.1498128827459202,0.30210024594747636,26.928617181662446,9.069281592248139 +0.14928420346523227,0.2965651450762306,34.65976509824766,10.978472281002066 +0.1515454193587206,0.30884789873424673,25.51434065815729,9.332723949000655 +0.14980889447748827,0.30086693200560183,31.815938296251108,10.609261446956577 +0.1476180874269917,0.29516460074875994,29.378472479316596,9.163421755656742 +0.14892691811033595,0.2949007289892754,30.02683323279956,9.357533803852414 +0.14983842382776902,0.30085606168864404,32.60935103653713,10.957039547661378 +0.15089331332102357,0.3018297277287705,28.878571183439107,9.857099804009248 +0.14896467655458664,0.30332962814958103,28.340503590866412,9.669412209737484 +0.14994031425655818,0.29600900913239775,28.35098184388226,9.018442706699759 +0.14978366961816394,0.3036558165903757,25.754038616205847,8.803349232440063 +0.1500240332727593,0.29995119761768835,31.667332925634653,10.499923764595108 +0.1495470000269736,0.30647637826404794,25.948072903246697,9.107181973153569 +0.15217003848477512,0.3033367081987749,26.64746565393097,9.297330818850952 +0.15133506900401808,0.29408316694025377,22.790003418140007,7.186426600049563 +0.14991840257972186,0.3037222345289988,32.99959597533918,11.275840258630119 +0.1525053389480852,0.3062868404038934,27.147186723845838,9.662480812672447 +0.14985921710689934,0.30719981905042565,30.346981962627908,10.779143936169993 +0.14954956679256712,0.3038425514899261,31.811931137396574,10.935959841022498 +0.15029342291062622,0.28837470641391955,27.349552392877534,8.045819509875129 +0.14803546401969883,0.2971658308920223,32.943380397351795,10.51829273078949 +0.1494853687386452,0.296919961620455,28.028685151987247,8.9532214524174 +0.14945903115883294,0.3026598752244181,24.328650368874115,8.233744480429197 +0.14910646943503414,0.30810287268678793,26.734840977480207,9.54854231073999 +0.15047728834474075,0.301807104277891,31.335866995585885,10.577220072036571 +0.14990123386769413,0.2990455418856575,33.04566595734408,10.843374962396808 +0.15115255033271224,0.2980369700248842,23.36192552452994,7.640801014648934 +0.1499087253968656,0.302014551717269,36.106718141389905,12.164931037905474 +0.15221084930217602,0.29586431528223744,23.30302906316268,7.490257800982626 +0.1507290298951174,0.30044418629024944,27.98181713584829,9.37794595896077 +0.1529366940834884,0.3042285255319826,31.056314081427224,10.96595311068201 +0.14959351101132579,0.299525774605121,29.903207082766034,9.844541777990818 +0.14853225586884122,0.30744015592629936,26.577057985074404,9.352948891789707 +0.15263227058241904,0.3030669470065711,29.563479228631955,10.259584433961408 +0.15160411605171106,0.30080700685394424,28.445406198748405,9.617942227060484 +0.14983080036319463,0.3064227438408191,25.492639782741012,8.977814077482803 +0.14983093987517393,0.30576112662894966,28.664790660084304,9.960068571335254 +0.1486088436218202,0.2969351215888953,35.597152139470424,11.27680155229831 +0.14731062090026809,0.29818924977237715,33.019285131032284,10.52740386461114 +0.1480165092364799,0.2970227799199571,31.111010714422665,9.866977171042208 +0.14995044774963148,0.2982612690468014,32.66210034464846,10.627328178027799 +0.1504881468291324,0.2975372114335078,32.033011249531434,10.398728307342584 +0.15043342740739804,0.3002561117549777,23.400131541296687,7.810964000438065 +0.15159127832408267,0.3076753035951774,39.24564327033253,14.187831823685514 +0.1486501633999267,0.2965847286512209,25.316716163973293,8.048053499796566 +0.1504333726074961,0.29316604984262074,29.6887167263886,9.227208006276097 +0.14960717972685791,0.30523818378584955,28.546520595190763,9.926983665062336 +0.1497397517939679,0.30055325935499677,30.782475642600176,10.245109463495751 +0.14978636526893563,0.2963782170592973,33.16147415933163,10.570379978023094 +0.1475778777047773,0.3044201693418481,26.92446717930526,9.111618481564674 +0.15001659487482374,0.3082945238325685,31.100668244875756,11.217294553275435 +0.14959308176248182,0.29138010837934225,30.993530929504075,9.389705658442345 +0.15148666698076896,0.2972275182262461,29.549545769101744,9.63385017232459 +0.14983627447640446,0.2962607947049991,32.49173172484234,10.352961334780813 +0.15099590874527144,0.2978532144512811,27.150968894786654,8.865498285252901 +0.1499554244735638,0.2941840076340816,30.628089616784354,9.594905642980319 +0.15146775170455967,0.3005815431568562,30.35828809474738,10.217042263086814 +0.14836414602696432,0.29895861543000385,27.590033133054465,8.856905229669154 +0.1497183438565241,0.3054774825466784,34.179880234789955,12.038609498204025 +0.15202630766027184,0.299159978175001,23.346030337939325,7.75252874381246 +0.14967289055939853,0.29790028600357293,35.08248682042099,11.339435640838392 +0.1513869478309922,0.2995887705966414,32.67250342697791,10.90693833395386 +0.15063878081282941,0.3035930374371902,29.93444825506481,10.349385777612877 +0.15014676767589707,0.2961482182129236,25.565863251087215,8.147892838166467 +0.1506136172276517,0.29652042671332957,32.89231911077783,10.559405661526892 +0.1493411874214138,0.30424845836592534,32.10998638200302,11.073164601704741 +0.15026149835616007,0.2998615313684902,29.686096897542075,9.84723842968751 +0.14788530664316513,0.30329188570395643,30.785745136434066,10.371418256794982 +0.14982672191071314,0.29909410155548916,29.694309674915605,9.68259685752224 +0.14979205206904186,0.2952219349273094,27.89102079483739,8.816931094899674 +0.14988122289467964,0.30193178219970607,34.1414267467148,11.554714061394577 +0.15041428100174042,0.29785600964035097,29.85062026015003,9.749359283270115 +0.14951348092557393,0.30008823944488944,30.699472963389297,10.067845400238902 +0.148798951381552,0.30829100960620626,26.40367682644755,9.423260664359834 +0.15125759334784966,0.29943515908229473,33.5903250626845,11.167466707794555 +0.1512701222038634,0.30708329588977074,30.24256463807737,10.829412610324901 +0.1495307000044656,0.30397829719708774,29.489822950807962,10.1045725514041 +0.15066841025289532,0.29695713240728955,27.40569668016376,8.839676264628746 +0.14863650312369817,0.2971206018804786,37.60003178831362,12.009894913964096 +0.14994912168395083,0.2949035665484288,29.566092505345758,9.269605322077018 +0.1501239299282718,0.2973234181183464,30.437567632513332,9.843147990869134 +0.15174470159948047,0.30082063832613004,31.964140647808744,10.773579088815302 +0.15045369271665135,0.3121252863585684,32.71543494281805,12.193122725087953 +0.15039752639717224,0.30477065736191555,32.587520455245084,11.25269423201941 +0.1505843239502679,0.2962183666822753,26.54342757879293,8.502422183562903 +0.15148533011024073,0.3021135293795748,30.447642990500597,10.383878911122503 +0.15253453012826276,0.30140872777384825,30.263621641050246,10.355998225912737 +0.1511157342623842,0.29171294788151525,38.03999207764575,11.699190589592796 +0.15012497492637364,0.3015099490986685,34.14280736764534,11.507649958731188 +0.14895166798694456,0.30069771042640514,19.670146508061404,6.542967693619584 +0.15109225511910132,0.298129717508938,29.42318876661203,9.672578295908897 +0.14981569639464673,0.30035484529441336,28.459706277340196,9.450561482658166 +0.15046774156969203,0.2943845194397833,28.48458865501022,8.917651622765494 +0.14954892475350443,0.3054637054476831,26.093191368489368,9.096744705267318 +0.1507257794533966,0.30473727715204835,23.708956455117175,8.297601185788071 +0.14879578850901265,0.29586835116048654,29.004619721437365,9.13972880083094 +0.14956158414060658,0.29974854590169664,30.443303245115942,10.059193607243436 +0.14889799768585293,0.29645603372090906,32.4082385338077,10.320484632001913 +0.15110915613971898,0.3017299989441016,36.841400981492775,12.503867584439961 +0.14897358658420723,0.3002674501979019,31.95223395224903,10.541595814498384 +0.15048300023696504,0.2951591525615801,25.280578429466328,7.953956671685814 +0.14959975868456374,0.30013632345162544,34.972134039136336,11.558679552657745 +0.14890689309752544,0.304275314906415,36.064652722831916,12.33771704507854 +0.15257730337223702,0.3037993715883448,28.599341681391977,10.01018709800475 +0.15035767818156637,0.29662228611376323,36.95503552318381,11.828437343399939 +0.14826597638129074,0.3043430993971256,30.77420741210853,10.49470952567831 +0.149346502985431,0.2985283139499167,38.340665256292425,12.506746482074602 +0.150329022266965,0.28937452030780125,27.995959817436653,8.31859502633476 +0.15101444616760587,0.2892626612299043,30.28846112345243,9.091224748077453 +0.14913216195995638,0.2960866423372752,32.04618417626457,10.157515574456802 +0.15048944444077927,0.29268559100563585,25.675409207633713,7.925934427077915 +0.15017614407986668,0.2994734698167665,32.595423144432544,10.740626596641494 +0.14906802232532793,0.30249895296772555,25.627628356908936,8.663706172203243 +0.15003355207018987,0.30674113068815423,28.43869010222964,10.045585100387674 +0.14797265726093028,0.29667877436773726,31.48479175630847,9.938625383615797 +0.15044538673888136,0.29199654057999436,32.087624755244995,9.80303647242612 +0.15212284004800222,0.3011764910650829,28.60913524755909,9.76870118003036 +0.1506814416115766,0.2963780784386757,30.347677031961908,9.757595760266643 +0.14938588199652283,0.3004047564785126,33.431574198190184,11.070835679580188 +0.14790026085225924,0.29499166158223133,38.40316012965475,11.963383108722663 +0.15006553502793377,0.2949281911832335,36.11641154210594,11.321394058243344 +0.14931135374072152,0.295561465651261,42.36109300300054,13.32542693690433 +0.15129066592164142,0.29332980505176914,35.633352744486025,11.061776932156722 +0.14962919544712,0.29977986927540184,28.283971246862905,9.368260185264056 +0.15061961592272952,0.29091506276528273,34.89335369323134,10.550863371553826 +0.15145733272248194,0.3088124541446748,29.124428400866762,10.591662211999099 +0.15094449701963963,0.30103740128359463,32.81770947408988,11.129224211064512 +0.14992343187763466,0.30026072497587225,28.3614391113596,9.426048439287362 +0.1497870598406392,0.30651787249097834,36.79094643422057,13.024187746911117 +0.14805308063350386,0.2994992373242809,31.124075630318153,10.115122552843811 +0.14978308404395188,0.300395081831642,27.389701890396946,9.082213380813663 +0.14906815147161132,0.3070071817911079,30.04709274854667,10.620307362206882 +0.14883710408836526,0.301401290038396,29.899812624146985,9.972667394123079 +0.14915846868046254,0.2958630564905186,31.675917877246274,10.045075458323986 +0.15049040979075487,0.30698419256000714,33.61480174376229,11.913981172340346 +0.14892694770010514,0.30071616057673817,36.68939253723057,12.171753146094197 +0.1496353742180097,0.29803614512388776,34.781456818632584,11.306073972176133 +0.14914143789843404,0.30338587419840385,29.86134955498283,10.181335900138032 +0.15024641099436495,0.30670945650854414,27.283192717329783,9.69792447312552 +0.15133850577187158,0.2967295531413715,37.01410040592599,11.954560162880131 +0.15042857188425382,0.3043091288202729,29.78534729059886,10.28663321076271 +0.1488967774939424,0.29723769605209954,35.636896389241954,11.419506338939467 +0.15220479544906398,0.2937289405563386,31.367913470590295,9.885377988612836 +0.15127480497356902,0.29374147091170905,31.009155774909335,9.737756344955013 +0.1479974772530674,0.30929992280650825,28.600717072383997,10.293364661140561 +0.1523327486382037,0.30417379843931835,25.115747688058093,8.820320207944677 +0.14917597518136785,0.29846114543519325,30.257037513823978,9.778029120913152 +0.14783356932179464,0.30440959011465346,29.612993440725553,10.092942224343217 +0.14913382173391065,0.3022123557313745,33.9112010883691,11.469390261595231 +0.14881853316381302,0.3018136986798845,25.615835154467394,8.669264063869425 +0.15089169726058063,0.2957692040439849,30.038739590497862,9.594081713142737 +0.1514234889976493,0.2974530051373558,35.69324448731246,11.555527054364925 +0.1495459717719115,0.3030769256535009,37.02203108965668,12.619178048848001 +0.15058925893551914,0.30140935469338503,26.882144698426828,9.033792907337759 +0.15137468533266682,0.299803893360839,27.02076786310501,9.014341097544637 +0.15091713521823027,0.2998890310841218,27.793548416568687,9.227401826512631 +0.15087107764422555,0.3043910586030842,33.60653564696173,11.678819124935186 +0.15243131542025085,0.3042141245692451,28.900616679546093,10.118414254155766 +0.15084466556159776,0.3000940746543921,28.325470841013477,9.454135135329054 +0.1501407348541056,0.3020966785872883,36.32303435913135,12.27506603020689 +0.1505501720196525,0.2899148972881428,27.337257932122995,8.220290205677124 +0.14898209392216605,0.30201381199882876,32.25285007556397,10.830024542993996 +0.15270024647873315,0.29251035191076663,31.073666467727726,9.739052979835487 +0.14998672589406434,0.3101108998052885,30.01811558110647,11.041396784563018 +0.14950399985675855,0.30336400725902807,28.648787474754556,9.723013790545325 +0.149689729204885,0.29724950665597805,27.27453235364825,8.734876778752753 +0.1506629258281453,0.3026971274887935,27.283720976523224,9.282629325379165 +0.14912474889250615,0.3019784073806436,24.88072888547948,8.32979784805743 +0.14875156157401642,0.3058748319369839,25.791544284241688,8.972652172681656 +0.14962660151727522,0.3022863757625716,28.334722332817314,9.588677591072738 +0.15070669928882033,0.30122821801749716,30.14087873659318,10.14933042616492 +0.1502877496787177,0.29525073082630854,35.41897984941226,11.194779705876861 +0.14978468371311554,0.2950184088065213,31.36860357469211,9.885729930557304 +0.15162987345044118,0.2986162687679427,31.971436534943983,10.680013262035855 +0.15301633822798022,0.29714408927408636,30.263841932364272,9.945377650409728 +0.15034198317719685,0.30405282055654165,25.398337463543665,8.760132395696143 +0.15177161293600305,0.30290483738074725,29.656422453427172,10.181433951436823 +0.15089106613819966,0.29827005815560304,37.81966700177672,12.353339613987043 +0.14841135226308794,0.3031765393326314,34.96363789953589,11.832091608258624 +0.14887252264948544,0.297082831955259,29.55852917598055,9.47241069960547 +0.15034379689103194,0.3065740469804901,29.070123109073922,10.257369106062384 +0.15079027730776898,0.3021335853000164,27.381653420623376,9.322873773999271 +0.14940564771276005,0.2996730529775207,33.066519741387225,10.887290896225128 +0.15066983746576393,0.29558223512292864,29.019288808972853,9.264055554319972 +0.1499600567750619,0.30973477749179196,29.506323373072544,10.70887932460226 +0.1503202601276637,0.3030461720211249,35.63577936508666,12.194713933024705 +0.14862323220073143,0.2982667492937712,32.910393100202135,10.588843217585975 +0.14909196816101208,0.30196400409871743,31.01330165577094,10.404844125878546 +0.14900679967217573,0.30257344042923706,20.294813072419373,6.796197267001893 +0.1485380440875694,0.29426387161855,30.53123938024618,9.498981414199896 +0.15196675690973668,0.3101078086368599,28.408160354489297,10.517037683246434 +0.15155627523058182,0.3000489164144444,30.170870602979303,10.077290536980582 +0.14726885125660974,0.3058908696280905,36.183303951274866,12.519174424899905 +0.14933408194611683,0.2973125211355466,37.433870178815226,12.008406435743547 +0.14979775274752377,0.30090427961632077,30.77006433821478,10.238135865386178 +0.15012611730942602,0.2972228914720939,27.91591540875384,8.981228047441931 +0.15018285628062392,0.30406069337392644,25.90796175885795,8.968930621681409 +0.14973500771258122,0.30013641551743747,28.608409740433515,9.511448738170238 +0.14988219442179687,0.29813986804671216,30.80834002494342,10.012162533228679 +0.1490370840057152,0.3047052393835798,34.294345571090716,11.748937308215856 +0.14963712070781332,0.297016696839099,35.54266844904742,11.432182475872784 +0.15186431856882104,0.29028256338333847,30.309764620394628,9.206888729232135 +0.14982463129826584,0.30398987152804596,33.44090003597259,11.484377788573449 +0.14845266954592928,0.2958627340983931,27.637615847832812,8.650706611607154 +0.14993502324180633,0.30126651460050785,29.547666402162008,9.918545430495259 +0.14807962864546692,0.3042693043277761,24.77673490124716,8.421636838237653 +0.15027282879953618,0.29737808693217427,33.05248051464212,10.731937748268276 +0.14901807957585542,0.2925757702713154,30.75682828216575,9.39943541369618 +0.15087243723429675,0.2959424107024868,29.831273819406086,9.524129930568147 +0.15014046033668924,0.302432948207494,26.640185732164998,9.016012521254641 +0.14885864812206728,0.30312633448330234,29.73857562489604,10.035869822395506 +0.15059681177566422,0.30960401895410966,32.279361223755664,11.834440619547658 +0.14813291578259397,0.30426812521798313,27.209216986440907,9.220789342754266 +0.1485568153128137,0.2979032144356516,29.324059554392967,9.429175753916327 +0.15067446957796823,0.295856229170445,27.732695088037957,8.849384616679716 +0.15160702414839639,0.3015187996336067,21.593342129943856,7.300711729998763 +0.15058994713204388,0.2927756797552162,32.162077132612644,9.987735589093925 +0.14873705439467735,0.3026539839372458,35.31172745747046,11.929606670124983 +0.14902953079925987,0.29700294944629474,28.757445170338386,9.197191241613993 +0.15091968877220485,0.3053735432026582,29.15978584937136,10.218361528867472 +0.14970712196069655,0.30843915943519323,36.95240493456866,13.265922971327255 +0.15072733957922313,0.2999837479330044,33.74298262859775,11.237601039199639 +0.1491600190498714,0.298610299400593,26.99459233220837,8.748424345220954 +0.1506939863061937,0.3025518011416921,29.877666659767332,10.268239794325792 +0.14849125819620554,0.3026995323863267,26.13533873412915,8.797572545285648 +0.14952292197464515,0.3095596075909492,32.388370570898324,11.798416337468208 +0.14954583375856284,0.2983585540907181,27.0237797631759,8.79572714114451 +0.15030187362034728,0.30433838978893635,28.867885614025116,9.96232489625766 +0.14949825968665093,0.30231164699320223,33.26975512421812,11.28824978451811 +0.1502642177641268,0.3027893526508239,28.146794232160538,9.658656306862342 +0.14895923166618935,0.3049784907031482,30.526969888176193,10.490183256941712 +0.14932546283925127,0.2963419893725216,27.730759571512923,8.824622257900744 +0.14998465918616777,0.29791264315243166,38.10535180496843,12.337748344753736 +0.14875489231808534,0.30392801765489774,30.211649865691545,10.307524358196096 +0.150348153467411,0.30261229974128057,32.88622959890314,11.254985865938599 +0.14981595708492382,0.30172758622129936,28.41511142243779,9.512712231182556 +0.15044335986645277,0.2982564723586002,30.73053449230192,10.0283012358876 +0.15024336881588038,0.2973603434543813,30.30529195517483,9.823257611290982 +0.14992455323590728,0.29462071817856067,29.96745522658081,9.376694605613913 +0.14812418864676666,0.29601761731950565,32.098360643844984,10.073204444416678 +0.15036161232272272,0.30024369145781854,32.21882992277146,10.699882386558311 +0.14857103537032249,0.2942214424021992,27.449202968454806,8.522029309984624 +0.14884585096446337,0.30392063629151983,29.895716311745673,10.208216451960286 +0.14912394433430476,0.30164783252642624,31.146039031349854,10.474976676462283 +0.14932365104773776,0.29750616911244193,30.853822839145224,9.94811251137191 +0.15139988085649375,0.295073162304386,30.704190124030863,9.785144311155488 +0.15039008248506613,0.30127211089320866,25.300566612158345,8.524695777664553 +0.14966534011142557,0.2976921071106637,30.290255954708744,9.763517702393354 +0.15059577504215022,0.29884870896694427,34.34090574715547,11.224824741695421 +0.15025285464189597,0.29942830131697407,27.226108002711157,9.023468884985558 +0.14994708850547617,0.30455171623901117,33.150019304155705,11.464675257414799 +0.15330055767886494,0.30611201322151366,35.129580515653146,12.56430698465474 +0.14880739576623295,0.29476278324158994,30.922158433150457,9.606316687703096 +0.14895306589162713,0.29939663534078736,33.28112922235441,10.91215737867772 +0.15028537673187473,0.3078337342596627,35.47897813231867,12.780271042940335 +0.1509447348982303,0.29731044549330937,27.426891752985632,8.943121913800187 +0.14896887461921282,0.2903639641821149,34.657429529421506,10.347649280423324 +0.14910276306601247,0.30543158193845504,32.91496325367645,11.403037244665983 +0.15060319525843122,0.29952310315353126,28.592246970975108,9.452275538595543 +0.14960114559175736,0.2892881034305204,31.55285925499768,9.327744075766233 +0.15159911660125133,0.2950070275675495,35.698306443044686,11.404397661673258 +0.15242447984123036,0.3006029250367233,30.446736347530045,10.340538305235658 +0.1513084301469129,0.2939775572263108,33.38986000664089,10.451222647934177 +0.1492286331363385,0.30509165939805377,30.469659320002208,10.609410962352806 +0.14852153380958502,0.3050214553897647,31.62801695412589,10.84388859284403 +0.14961737870139738,0.2965157163127063,36.724246047974844,11.718981562802156 +0.14999110046324415,0.30728493292829323,32.435519125355796,11.537346315158524 +0.1469232929693161,0.29399451637699725,32.182460062826934,9.865611479139625 +0.15108343855845818,0.3086931307207892,31.57418923449266,11.528955966520448 +0.14745359769559274,0.29871645912394584,31.601261430331817,10.13948048161434 +0.14970476878786962,0.297329110651904,27.58232296160176,8.876185691253317 +0.1492642711522131,0.2926302904247786,33.85491615639427,10.313070366274749 +0.1481489078366517,0.29368126141700585,38.90883058894111,12.018144829836395 +0.14934342745600654,0.3030445759355111,28.861789179119462,9.85443271151325 +0.15096419878728715,0.2990910030426432,28.549644247528274,9.408940736329425 +0.14871137714627083,0.3055505117803512,28.93178579496648,9.997506313311153 +0.15055148396613305,0.2902800808065348,23.34177416263119,7.015141226801424 +0.15000893362069853,0.2934824069201333,29.031872843056913,8.961002760545547 +0.15013040772187697,0.2948758735689979,29.77865225288852,9.349297937058711 +0.1524160352073255,0.2986973643623877,25.411496063857356,8.433251546711542 +0.15029067041614602,0.3007237501737402,27.80413946434738,9.285279928677221 +0.15160777331586242,0.30220360575663807,37.1674882063486,12.718798235795665 +0.152038447288642,0.3061827356272248,25.671258491490004,9.200144551002353 +0.14953823584870787,0.30607963413378164,34.4393999348103,12.014652550049453 +0.15034527315020205,0.3069076201601502,30.750227894932635,10.902737420872954 +0.1504323631961632,0.29696062674966817,31.124520526623996,10.018933424396902 +0.1493195443388536,0.30084925945174995,29.06995817505204,9.698803702342078 +0.1507462016762587,0.30319183439382263,34.505403134299456,11.870065655436722 +0.1490080152400608,0.30745412639002795,26.3890868719593,9.32154494823567 +0.1495930779134718,0.302062597397883,28.92073078233601,9.723328452061082 +0.14941133567726372,0.2939023213677018,30.604931881401594,9.488872332567002 +0.15102151266921807,0.300836335403934,30.865387784401953,10.459236799647849 +0.1487095495495878,0.2962513271433802,27.94392385655112,8.808188750760094 +0.15023971137371867,0.301163308319806,31.757558800755664,10.712986545844743 +0.15048635240777133,0.3091139883897978,36.94566250587359,13.443753633325288 +0.1503046142553627,0.2934773838938724,33.64845978722138,10.440033438144964 +0.1512951202233895,0.2987181154982495,35.011466607983316,11.561351513198527 +0.15100649558463833,0.30370272247345015,30.3044819410838,10.484357142372676 +0.1505790031776242,0.2977288169794257,32.48497090798989,10.587070515995716 +0.1511995826287247,0.29660193145074815,26.34262373231169,8.513807548247184 +0.15057093031595906,0.2969920015961771,36.62267984408259,11.785942265429927 +0.14968158255729935,0.2987610910688213,30.21409605935066,9.87743861070166 +0.1507582654334865,0.3027903677876011,29.35298059861528,10.030972813450225 +0.15022685844945027,0.3008796443526829,36.00150132031319,12.037497286543624 +0.15062802667419714,0.31089551469947113,24.713236624311087,9.148040505417445 +0.14915131680787616,0.29422801550490524,19.408480699302324,5.993968332279883 +0.15117107415359618,0.2995500763167286,28.225624364149905,9.37402784293218 +0.15154416983979377,0.30728288680973365,34.57509051440547,12.496657060864353 +0.14866226809838162,0.30086775918766157,35.26580574387141,11.70235511886849 +0.15151657904897364,0.30775151621743285,33.279428111892784,12.000753645224346 +0.1498128827417418,0.3011562646597917,24.990045981895925,8.379208843208337 +0.15034509626771062,0.3021302155302349,26.751801976867654,9.095482246385776 +0.14874601373770033,0.300528504168351,26.902131119136204,8.873465044124405 +0.14814879999931446,0.29458936451879797,33.03189535820808,10.26528110748503 +0.14903229147880506,0.30446836811935,26.35097149976043,9.069695703512181 +0.15149259237704565,0.29231044777260984,35.05965975369023,10.846072737567685 +0.15149310243302821,0.30193402450360457,31.43474148545587,10.727561003312559 +0.14790794834103327,0.29422730342373843,29.793708479415788,9.136541233214635 +0.1471510527780385,0.3026114176970686,30.588164609235005,10.275061268783974 +0.15076252268580473,0.2934613245921129,30.256816897290648,9.456358512408219 +0.14890941766519045,0.2947633991788063,30.180937106877998,9.434297691180287 +0.1493459971247042,0.3022908055527914,26.120339822331765,8.78154598261759 +0.15021086795303792,0.29687267571778,28.214777098615173,9.102268591786169 +0.15057817007333987,0.3069888195108598,30.132820205448635,10.768021314980604 +0.15097230917064985,0.2919172131577889,32.80014727701795,10.143262373847682 +0.1510606526077132,0.3044791908004799,28.24578103165277,9.87006755985953 +0.1518832609600934,0.3085446387794113,27.744338608138992,10.11339753628359 +0.14987221480297153,0.30148195303224884,36.03079506961075,12.072921311250052 +0.15132169728605316,0.3025769760856489,28.48878720513068,9.764239648108243 +0.15043460822903207,0.2962315478372809,32.01215207841719,10.194678845073382 +0.15121890413756106,0.2957711340091951,27.73626828771082,8.867996430313138 +0.1495610507621615,0.3010700403202734,29.230307444660692,9.765653961140352 +0.1506859961139968,0.29228985090453735,33.71425011489931,10.394119968716463 +0.1476688031822984,0.300185348629255,30.632505233474877,10.005269327168074 +0.15179730683341242,0.2997641320567405,31.442999698576955,10.53843118945548 +0.14989521770670144,0.2963688187174632,32.92310390812726,10.523198563250023 +0.14999509465965177,0.29287343066557275,34.338768947623954,10.712257019059956 +0.15103744040105455,0.2928559452246967,31.64622324311485,9.78560986176677 +0.15184867032793947,0.29636692609705095,34.58076507587146,11.142639462669226 +0.14992433155587293,0.29730671161399885,31.603342708692868,10.205036051537007 +0.14933033412651492,0.3020121420519806,30.972995535955352,10.451764713300546 +0.1502991273556835,0.29991525562219445,26.803375739250075,8.882596026842238 +0.15059780679529378,0.2943915075617714,29.41196634973738,9.27039415320671 +0.15004697010001242,0.30482192788745854,33.4214678489096,11.63875343973865 +0.1510431269123195,0.3004793461188385,34.70771847579585,11.656824794516526 +0.14772461052238522,0.3023568072861861,33.3103272234157,11.123439000791167 +0.15043008108249503,0.3001295202598569,34.03912496374996,11.234817701816562 +0.14985959336157248,0.2962931671856666,28.154755686664384,8.950468074589018 +0.1507742601229193,0.30845392455592824,25.835804576564307,9.336681200473839 +0.14938313517539226,0.29575539720999566,33.05414518037676,10.489563610332752 +0.14947015525848073,0.29845079245173367,26.330301438933127,8.533428700185981 +0.150774806898448,0.29019833587605326,27.443901903085067,8.27354223247691 +0.1494669749644858,0.3029944896216185,28.430325825833865,9.668443390928937 +0.15118076921442858,0.2987656972855362,27.329464778021244,8.966596705953567 +0.14816867561362324,0.29823129475185384,28.94173004822847,9.322726607983055 +0.15070944583997414,0.30027256256443285,33.941978316136215,11.36853286714588 +0.1484134321573814,0.29232311463446836,30.50202846146171,9.274639341579933 +0.1515086211812547,0.308248374587825,29.775253852747127,10.698355376065066 +0.14971496295241773,0.3026732726909654,37.457763647637904,12.672436691571253 +0.1471304997197766,0.29896410888104147,31.716784322696583,10.101004963425526 +0.14977170923700583,0.2965580583527487,32.695891231616784,10.461885876620938 +0.14992922621184415,0.29864043957917885,30.75367318813268,10.149722727131676 +0.1510957775434675,0.3029882287535858,34.83765705970965,11.978883179374785 +0.15044803665897313,0.29611475172949303,28.291481472269794,8.982107661702308 +0.15067351682279603,0.3066201561519702,26.24525377321423,9.343680343891819 +0.14931070169633295,0.2999911029107765,25.315530572857025,8.327186572942342 +0.15059988950140266,0.2960924993396853,36.00550186517108,11.59136418689494 +0.14788637305403607,0.29564551285727136,34.378470356035066,10.74696323672083 +0.1498810075932557,0.3018473184633435,30.789453751795364,10.427651637042832 +0.1501154019045179,0.29977754810307744,24.938045196976105,8.211883065426845 +0.15068880462259532,0.2992580110375749,28.668489134145617,9.499049334530719 +0.151220005324676,0.2983966424086536,31.07440513697433,10.237310359130918 +0.14927715273671294,0.29086555780458323,29.873202109632647,8.974239740296051 +0.15009968108229363,0.3014850004917324,31.132930379354395,10.433359763661288 +0.15236208927424358,0.29349281842811364,27.54446476247883,8.65215263159151 +0.15049607626813713,0.2934455806171751,31.400564826551953,9.717559003334333 +0.14901844191821087,0.2907298570758176,27.941982095762178,8.39152707653335 +0.1492003437242695,0.30371493911770786,31.263435945358722,10.69239139052768 +0.15094926899408365,0.300980036507261,28.332863353038434,9.555820720839751 +0.15194627306986813,0.3000830175470388,29.59353119612059,10.023241702596954 +0.15089000041168668,0.3045939547671543,31.34401394448892,10.916105412678291 +0.15068162323786294,0.3020121453664716,26.275435971732783,8.948663920870983 +0.1500711029013748,0.29888015910811444,30.69281283995926,10.15271152537821 +0.14948754930045327,0.2938563061474292,29.325267226266764,9.026333686119075 +0.15054754876346574,0.29953768821541915,32.41712957483046,10.77082335700364 +0.14881953089447714,0.3008640465547994,31.53767786571031,10.473319993468483 +0.14999149768807246,0.3018055328613127,24.226290790323986,8.212888943403158 +0.1519213682818353,0.2957139933369865,29.674938028852104,9.48321722263086 +0.14819904468267045,0.30103407688267597,28.175320713172912,9.330949298704128 +0.14932424326465504,0.31240380774565585,19.613020707406456,7.3022173414286655 +0.15057313555797566,0.29126837005250705,32.971681387271985,10.028646554044508 +0.15103374958032303,0.2927180664468213,28.677380459247473,8.851312830356253 +0.14976544763567418,0.30379067520573644,32.19911807871424,10.970022366899382 +0.15108440236489834,0.29814359722246536,29.67576196224293,9.653463618006931 +0.15137181643451889,0.29965713584620485,35.81270265070755,11.910630034991147 +0.15019279577820796,0.2987734815228041,31.567437287195744,10.36565623150825 +0.15045964610925727,0.29460080339939854,29.316874894091594,9.21150970568529 +0.14924145461496635,0.2981768509320001,31.88105576862833,10.342949016028339 +0.15041407556195457,0.2904569958685075,26.268544063632447,7.887997275079579 +0.1492020088427761,0.30226647862670486,30.69778356108123,10.326627318715483 +0.15002326884940428,0.2986838608789926,30.763844859144136,10.033108128473808 +0.15151918391890365,0.30010107480420906,30.955906982671898,10.415449738174305 +0.15035301088470232,0.2965467071410002,35.646003145994555,11.396635648245196 +0.15065487139220515,0.295506106004831,33.051450754638495,10.538313490778059 +0.1502669285542142,0.29888736458630016,31.818577966717747,10.433809351236025 +0.14976653035508358,0.2968343215505765,29.833310953527413,9.556100135913958 +0.1511991229082891,0.30395582144024,33.52930692603067,11.713886132768485 +0.1510369791760681,0.29685055435152147,28.4981228139477,9.178791649541965 +0.14910296596590117,0.2996417013002109,31.578908334443998,10.328219516503372 +0.149528155854134,0.29909337679672554,33.78649739925598,11.102375894597317 +0.14878991791885998,0.29940949485763535,33.797924396901465,10.998126904283982 +0.14926764714811191,0.29983045438090256,32.43006695134997,10.699485746638668 +0.15088681737170662,0.2945029197329137,32.78573928813811,10.315829837334435 +0.14998418830527643,0.302355294791954,28.713218117383413,9.804992915095479 +0.15041074739287738,0.29914360894122627,35.47461208391715,11.607229654750878 +0.149888408771864,0.302836978069785,32.06760975882903,10.887587376684353 +0.14777977560744437,0.2940614551567987,33.92299258054551,10.42685167902315 +0.15055446945947182,0.30768670156344313,23.490979967770624,8.472447015845093 +0.148263509366539,0.29779323493162446,39.035926800091424,12.500774796539984 +0.15086074638623673,0.29621976094924074,28.648313712092243,9.154688188735916 +0.1492925575657649,0.29093658701161246,34.34329099826759,10.323630980736443 +0.14887218395584953,0.30726702229429986,30.58472318644466,10.821063887743318 +0.1510446501368456,0.29224341972526424,33.10438980987141,10.181711438547364 +0.1507400168091013,0.29317815755345716,37.240253616840384,11.523783137010437 +0.15121593800070457,0.30263478468534516,33.63169092637875,11.584530842944561 +0.15117766065255528,0.2976016974457809,31.907158883094947,10.389993180195345 +0.15089574769031902,0.30320318299689847,28.080754215930416,9.65655400737332 +0.15050589037748854,0.3010436753737675,27.99207784014738,9.401914974327115 +0.1520065549257504,0.2988261388884181,34.98933285226727,11.626504975910443 +0.14914959610075376,0.3075858053886476,27.06004976656196,9.614366676097507 +0.1504780599276882,0.29409591887933456,30.821441368246404,9.580612312652418 +0.14980065178164695,0.2965829234196055,33.304331535933144,10.659862424334516 +0.15026182888229653,0.2969626703271358,24.36593755615013,7.861151151410196 +0.14740622536256273,0.30482724143420115,30.8320652222042,10.485218519736595 +0.15004107553082352,0.3037232118263087,31.170806612494992,10.751511218277209 +0.14830044816336907,0.30895526598090534,30.2705608784917,10.860898357156753 +0.15270958549914032,0.2975787699172909,27.455770949429485,9.034566536232912 +0.15106391815551964,0.30341811349685305,31.6331790302197,11.024792988011173 +0.15167386187382995,0.3018258188667581,27.534662536379514,9.448623066105016 +0.1496977540300201,0.30028777197343387,33.74322952656242,11.136740462617162 +0.148701041833549,0.2932289880059655,28.78973272752735,8.854022058610695 +0.14912428104951425,0.3122610152444428,35.39079321192779,13.127925284304178 +0.15033960842865823,0.3029784684336279,28.478844429894536,9.699320876638332 +0.1502161383326461,0.3038731963508528,31.71721101355701,10.89028989067416 +0.14968673120767084,0.2982943734778103,28.44655006217986,9.221234957623127 +0.1530863015986719,0.29903575931841825,35.19079765665449,11.80766352423933 +0.15067607426364735,0.2985207959393135,36.751093305390455,12.072579881625707 +0.14956758124860062,0.3035390712094153,31.819180584663457,10.878812522467957 +0.14947137930874885,0.3024709591986557,26.934387911937634,9.129269128070385 +0.15024181998807667,0.300408770363316,28.81232073821449,9.59159629507517 +0.14918652519283482,0.30074110267546805,33.742301219295534,11.178718430858224 +0.15018888583554643,0.29880777561645266,26.33521557937092,8.637022518048255 +0.14918119003122648,0.2949886745954398,30.349600067280985,9.484178868991917 +0.1500609424969694,0.29945640496878273,32.586820472698605,10.769049424132366 +0.1507930456705503,0.2977578023900573,37.97660672598229,12.408063745495358 +0.1499483875710816,0.3015060352583475,34.70208597655041,11.65744568329264 +0.15002510311239348,0.30598378984462055,26.575215710798958,9.294056691560405 +0.15058553243646697,0.29674539347061435,31.19757417957157,10.019551262858315 +0.14860707857955005,0.3074614676208342,30.35356963236896,10.741797504629394 +0.15063485854581035,0.2958916958603231,31.16232944031297,9.943465958093533 +0.15023543687792787,0.2977655817475944,30.2976514566363,9.810146855391272 +0.14733343495181112,0.3007964467767419,30.42955020754591,9.985837229051368 +0.14862878363405777,0.2974833489865996,33.13930559382762,10.634163067096425 +0.15254406574655036,0.2911122291381535,33.55764185385508,10.368089386492462 +0.14788914002739084,0.2968503290340743,26.916352958850005,8.484270381797899 +0.14893006043991475,0.30296924288550475,26.876907629745954,9.095578164788611 +0.14954490295484538,0.28938656920399924,33.357076720602294,9.865071894993102 +0.14927245458388458,0.30887779257831766,31.24155308539835,11.23364547146142 +0.15031638908735806,0.3019413241719382,37.395881000548094,12.657532820776128 +0.1505363462699479,0.2997831065109857,31.98692920684378,10.613077583981081 +0.14757181606651643,0.290578507966435,27.960739075481015,8.244341919000489 +0.14907816749669353,0.2975942128445508,33.27186659506231,10.662485086242034 +0.1503166101807711,0.2932889649159534,30.312760941182482,9.409491659704175 +0.14991646260878996,0.30199124815161443,24.64443744467545,8.32963856404686 +0.15042780594455243,0.303355031939687,36.49088220965446,12.64427782225258 +0.15035458569994473,0.2979835566289129,28.379381134625913,9.212661785966164 +0.15029183964603152,0.30278520157295025,34.24909377638521,11.657630489943035 +0.1488816458110228,0.29899077477230523,31.30461239076017,10.169906491465271 +0.14947736822905427,0.29890919497037377,30.819045278213853,10.093633072002945 +0.1495774472714237,0.2932235282394989,34.985618140693866,10.8663189491922 +0.1502093669834713,0.29745861278691543,29.534961774571208,9.589313249245327 +0.150288884708207,0.29947931535727773,28.91600978582943,9.552694433632679 +0.15001109404790114,0.29832858786679806,32.34203887139163,10.54768853588139 +0.1499275881703455,0.30369984731247784,33.355445254633224,11.44559014574646 +0.1513014283331823,0.2999003881029739,28.75475568127949,9.604974847741019 +0.15060958081846865,0.302111568381731,26.86255351249752,9.120166063391329 +0.14913580783721297,0.2966410934007188,31.356425182097237,10.000698578913134 +0.15123594992738035,0.3029999655506147,34.07614779142296,11.690871048085878 +0.14980419441133716,0.29861985740736313,21.65418110160892,7.064653320354372 +0.14755325684455525,0.29577129135351,31.45560802140075,9.827939088298221 +0.15111200084379992,0.300375275430702,27.05759584451394,9.034597729719238 +0.1503672167472082,0.2993168419837496,27.347544059747865,8.946689591520146 +0.1508797987486247,0.2979985140837423,32.06983708343784,10.478289775242146 +0.14995192817629743,0.3013063131257225,37.73383129226039,12.62558671033307 +0.15051167272389304,0.3060378456987253,26.850201674371398,9.417138479994184 +0.14916640621633792,0.29443221355127186,25.432660645925623,7.974422911438147 +0.14839627634881533,0.2993851880613422,31.06103690755286,10.09232340700511 +0.1505187950544749,0.29928413615784355,29.329808338819102,9.667827121752978 +0.1500336105632486,0.30091377533319713,27.526275162872775,9.19412672915242 +0.14998065575639447,0.303902857790533,25.864135841626535,8.931738313954337 +0.15080109470597072,0.2936403269697337,28.629353068901278,8.926897165344975 +0.1489656387429419,0.3037636393567041,28.771783541266856,9.83967347268145 +0.15232530060664726,0.29903331404514233,28.405855264011635,9.519114586680374 +0.14747276128914413,0.3013777354963375,28.956363811635274,9.580493355681625 +0.1493956953299319,0.30106346805155215,37.40349273714969,12.478300315646056 +0.15174041100787,0.2965009731225903,28.712680987431202,9.265596090069748 +0.14937580314256566,0.3000786633078995,27.8185524525386,9.183714396705252 +0.14902703275600226,0.2999401035064703,34.583929263271564,11.388814495241258 +0.151190233430722,0.3030337509472216,33.61057203177463,11.57407203703368 +0.15159802254517157,0.29762008463623274,32.12843088682959,10.512306451877096 +0.14948650520637904,0.3015657010973747,22.75852252412735,7.682099955334691 +0.1496642365530021,0.3062310731433325,31.117341917312427,10.955113383448342 +0.14893460894165575,0.3040635550213462,28.326104799733514,9.680153389838946 +0.14981368956256017,0.29634706966985264,24.515147232835627,7.786792643612841 +0.14837738591834368,0.3025612668295916,28.2041636522841,9.478565880134783 +0.15058507328943255,0.307767172018818,24.026217257158677,8.634950671301269 +0.15071512161665104,0.2974263079378452,24.120250712282466,7.838928033439598 +0.14986745802251702,0.3017673577509257,30.98884997428999,10.403769980576635 +0.15061419178847887,0.3024523962816918,26.010232885198878,8.887554610748081 +0.15076773708787708,0.30177464425281686,31.42341309373993,10.64327820582826 +0.15077198551307922,0.29535256317577085,29.1405112687025,9.316532115621941 +0.1509171891624966,0.3015552153980775,26.637589469515056,9.069028802168285 +0.15025449929797186,0.3027407799030195,40.90901754176369,14.007678158247998 +0.15133899708750123,0.29731909805997886,22.917810875216013,7.47403302710069 +0.15096592039757228,0.2977481951673454,32.12315843276999,10.451092681124747 +0.1501180132460969,0.3042766688516099,31.75417422762076,11.037991497898384 +0.14951245686781525,0.2947501304710391,38.55733969260438,12.185092683137514 +0.15120327633638617,0.30676173139415336,30.02003359626483,10.743516196501087 +0.14842085694901078,0.3023849564197311,34.184970207572704,11.425962110772922 +0.15156945357188584,0.3018084210773706,35.91328806842829,12.291936187626469 +0.14834020547374457,0.2901269982497304,28.802247484511142,8.55069405087363 +0.14979524218870371,0.29786927065667135,28.656686992844932,9.367135983224506 +0.15045868672132423,0.3049435641177502,33.05307129489781,11.480228336407132 +0.1483942329696348,0.29962957421272235,27.26291740266668,8.933976901590235 +0.1491995057834843,0.30710004597732055,27.83361017691259,9.84249380735658 +0.1484485181204472,0.30454111321959804,21.516988974191953,7.325137234735966 +0.14976585224782815,0.2983773673446415,33.78232967925452,11.003285398330037 +0.15109298644400412,0.2978244126301829,28.12407870160748,9.128148339936741 +0.14925901981686115,0.29954782840251426,30.865478522725645,10.127005451739775 +0.15001861381841472,0.3036047515518665,30.2535749106866,10.350989183524003 +0.1509664425290446,0.29965141764442393,27.038615442670476,8.96087818049083 +0.14883004450813458,0.30052277040826314,29.33661606299958,9.685695245902734 +0.14856572494398707,0.29976026924651344,35.37448013951501,11.531540048230147 +0.14876709526083517,0.2985619195066997,34.403528065249866,11.160824306219265 +0.1519374995494205,0.3018883468886618,33.2753532354352,11.343168375683367 +0.1506559243433495,0.2977189104939703,37.183921138987365,12.102308015548106 +0.1495068789546399,0.30139826185093505,26.493090639649804,8.81646838131137 +0.14799889156802182,0.298398125735086,34.373375761707294,11.094654528647894 +0.1488554167531753,0.29565195627176066,34.50759284980067,10.861420592122949 +0.15104901291048523,0.30356906946381806,32.86819628867165,11.370904189985886 +0.15030188127232255,0.2977156218739811,36.97153014847191,11.956853369813441 +0.15067934514853276,0.3052041412930608,29.97295514367326,10.51916310380066 +0.15089506253561888,0.299085612373873,30.222565735219636,9.903578595845705 +0.15015417916661541,0.3060428252301413,30.648040413980187,10.789680114805424 +0.14930833628841975,0.2972488491427643,39.31956537560325,12.60460982014103 +0.1500939954835521,0.30206108904455536,29.846907404132438,10.053253326378725 +0.15064559389868318,0.29444978264230093,32.012410829257455,10.12335512275027 +0.14903369309058892,0.2886664472374679,41.86523974514648,12.281069557358745 +0.14940455414047613,0.29425767885210363,29.076064703523944,9.03887866809193 +0.1478846709131926,0.30134157394046684,28.205762233193845,9.369917606315253 +0.15078310154914792,0.30419282285707216,26.974500802757333,9.48534854077749 +0.15012739922854448,0.2996634272667118,29.043598931937762,9.61506608427027 +0.1506704927168307,0.3040273447535611,28.03333102471922,9.720804495472434 +0.14840646908447533,0.2984653977788898,30.19440904560796,9.743713135484583 +0.15076792476451653,0.295841427108785,30.02747214294451,9.63423754014812 +0.14996191496353556,0.30302343913316443,24.42479866778968,8.367892156172406 +0.15059303334359786,0.29708669256218473,24.36637794798471,7.837883664130253 +0.14932176288251797,0.3025862569044024,36.120460693202155,12.21717668732971 +0.15114377690224862,0.3012623097260764,27.568088705529593,9.350293008089363 +0.15139868708209775,0.2994404511999676,30.89046308499769,10.286731279281053 +0.1494914905381328,0.3043462488197178,29.528923992427814,10.17291709717721 +0.1513631835619302,0.3019751716445081,24.913257849395073,8.520317197516897 +0.15086352814518159,0.29735696824386887,32.89385798250291,10.703261951038595 +0.15294431894325225,0.29600077419338156,33.390329698404095,10.819937433259417 +0.14961938826186996,0.2969337656316086,41.60391331355774,13.315599426170293 +0.14958780325107568,0.29800700049364104,30.980564829307696,10.02136954992727 +0.14868556251864165,0.3004343505308605,31.65574551417104,10.449871879558987 +0.15045138409166842,0.30652681260511305,35.768878124634426,12.654930207986212 +0.14924784639126135,0.29400071279425644,32.096217002234866,9.959733116217834 +0.14993371021225804,0.2965532742826185,26.087130161882097,8.316644750798135 +0.15029780316677474,0.3046031214138099,27.3274974525436,9.486191133972929 +0.1516064765431956,0.30179270681234455,31.35472126219318,10.651689604359023 +0.1493558758743699,0.29519051417565834,29.779535788589367,9.343204622779442 +0.1525703625926854,0.29464016300082174,28.656690363781134,9.097111280629534 +0.1507865219169648,0.2927518727426689,34.30725392565914,10.643567221950576 +0.14990576108632325,0.3071638497860718,26.041991870711463,9.231525643353597 +0.1509701340730554,0.2938017014450783,35.41327471286722,11.097048199129084 +0.15206275718509027,0.29930325960030907,35.86589770793475,11.967911233976473 +0.14964386284521097,0.2976650411628569,34.36410563481566,11.117661464227005 +0.14925922414411005,0.2930284250877264,26.751762769801708,8.234830670249135 +0.14883913559172476,0.3009645329309352,32.37105692462787,10.702426208202489 +0.15043752215647896,0.30231484850584117,26.66005812989897,9.116584825704194 +0.1514478640689323,0.2980819265059424,36.07398971181157,11.877759085742284 +0.1512851063130228,0.30178835926275227,29.647354059508793,10.097067526523238 +0.15079868309713954,0.29740237673305037,33.40995542454431,10.805866502171604 +0.149662560010074,0.303604675733528,31.472608944103026,10.807342948217384 +0.1506762125088467,0.3084932692702251,27.918431751073662,10.071743543247528 +0.14782419543131053,0.3023506050850495,29.416612881734483,9.83877681503561 +0.15046478619120485,0.3093496541516581,29.329825945799783,10.635884604419395 +0.15179271441217693,0.2944958468580398,27.934052544840014,8.8858209178518 +0.1512002232089866,0.29653521642643194,21.743940783814363,7.027605920072059 +0.15060844664235318,0.29678401277819083,31.766620468926046,10.272843202269941 +0.15002726569425265,0.29745531038049206,36.47376895388054,11.805868828564899 +0.15075242929204055,0.3009343270203643,27.287057800111853,9.183440144516883 +0.1484453650861081,0.29952744388358765,33.187870844583664,10.865601683529729 +0.14837304071291316,0.30100993971986384,35.844345203333894,11.83045083568649 +0.15050618145951317,0.3028850322225646,29.673298259012007,10.118391419431811 +0.15029785875999183,0.2919472473495795,34.65804212105855,10.604291367652767 +0.14859128207774175,0.30028356250509647,33.43570092258685,11.053662464597139 +0.14926490565642783,0.2974614497826881,25.290674934968514,8.182411078925668 +0.1496825134901875,0.2948095576809765,32.81299060401424,10.31009479789265 +0.15044226228066837,0.2948654006972061,37.668118785536265,11.845821014235648 +0.15268540998779342,0.29937374411697865,25.994114804085385,8.712242335019372 +0.14858861216720107,0.2974894023640524,34.10702758813251,10.887277339937047 +0.1518635466679473,0.2985271903941027,22.196781680856997,7.344883204310118 +0.1497536947134575,0.2977046877583109,29.64126564582211,9.613096844422211 +0.14943785354981234,0.29922856753485255,37.90341403591808,12.433923761296008 +0.1503166713622611,0.3043172520426554,32.3661963461317,11.22711146933555 +0.15078710919310742,0.29803933531631943,32.89411509820583,10.75817903701078 +0.1498462257059411,0.29394545414788037,30.038123804429713,9.344910297943104 +0.15178025321190733,0.308059464988682,32.43842613683945,11.83780291767408 +0.15055498074624993,0.3053690614243249,29.332671122638228,10.332356053415863 +0.15203580092835575,0.30181203010056945,27.684861842136456,9.45385105101417 +0.1500111399875533,0.3030077959156818,30.69067834317036,10.524794548047643 +0.14833781205159577,0.2982966216177999,30.118904273312506,9.68933762676507 +0.1486827549305727,0.2932752637565865,31.31827242655602,9.559841210339005 +0.15048801567206602,0.29367949397890286,34.3714149449578,10.726497578548218 +0.15046997850298868,0.30627115418879364,27.522331244808488,9.716677422029955 +0.14893705952775874,0.30038848810185376,35.41807228497105,11.687757313918095 +0.1499727911597267,0.2996889919954292,35.124151199939675,11.558593794917503 +0.14786225504452571,0.2982375441204221,33.0052503134442,10.589025058666365 +0.15131376222526624,0.30782145879767614,32.540813110276446,11.77523395213765 +0.1516430037873756,0.30207987821487986,34.355402329339775,11.801933386505732 +0.15098007242011552,0.2950849413479891,37.10516579401164,11.737719622488587 +0.1520703797749854,0.3068270463276858,28.573921898456106,10.267344854871046 +0.1490084767659443,0.30737616761521047,34.973224952217485,12.477947950400424 +0.15109793939918886,0.30346697154674557,32.814825817867614,11.334765195332846 +0.14916932882595496,0.2997578491015143,28.529918067730033,9.373951982067886 +0.14925465247216566,0.3035437011678686,36.69045648801905,12.568504926337088 +0.1504007251539926,0.2989149812474215,25.712485991295193,8.46577011459349 +0.15067367911590415,0.29543544976639347,28.221997741590023,8.970829407892522 +0.15006186380694703,0.30103741318622407,26.4439171865534,8.884665515140524 +0.150458602512474,0.29992379409443903,33.0149161054601,10.928122526682312 +0.15009318332513552,0.29334759620661766,29.40316717877247,9.074141647034734 +0.14998094998334777,0.2955356905084732,30.22436574789431,9.54524479612075 +0.1499024226887319,0.2977483730160399,34.28606258304423,11.199252723038182 +0.1493339392474207,0.3017042399087699,29.319380880418514,9.856125544718987 +0.15011265282128067,0.307712054359878,24.472678539547932,8.793160469341734 +0.14962079392127406,0.30312604831730633,28.760271493442033,9.74783063503945 +0.15160264526390219,0.3012357717896196,27.978854793827313,9.510738147642947 +0.1517835729905002,0.298901463237264,26.73451378914395,8.869973544846678 +0.14977907206909624,0.3053728171437475,38.44583677625377,13.414837709503171 +0.15172958607107817,0.30462397517290885,26.182559924621252,9.183515735388715 +0.1503056474595276,0.29308744377324986,36.150191051617696,11.193363634599772 +0.15165046027251256,0.300568271870888,25.734348685190028,8.673804420637332 +0.15058360625962472,0.29752395064539633,33.74599534665227,10.954061194688098 +0.1502136465338399,0.30841594778004905,33.72834938912091,12.203067222864608 +0.1494447310905674,0.3056617103739779,31.625896638837926,10.970614976179696 +0.14901669566095727,0.304278539486677,32.805176798947464,11.356159813747162 +0.14974510920245884,0.3100525679538434,28.12351864954404,10.257872138623558 +0.14989477410624058,0.30222117173486174,28.902852589409303,9.771566899608903 +0.1519380124932902,0.3035371492351673,28.511645846344607,9.869875560889344 +0.15049135121630877,0.30576780341006576,31.573171032310363,11.092190708611657 +0.15000121538841918,0.29248220379363565,26.283968993226676,8.073477080514785 +0.15113143245379496,0.3035866006018007,35.758922943198996,12.385039268493864 +0.14920379009815882,0.2905500488537573,29.186761964271646,8.785607625015592 +0.1505182316508701,0.30561366309689536,25.11715409477581,8.824960381218203 +0.1504111246086181,0.28971564963212043,27.679152679067904,8.264833318180205 +0.1517653126627752,0.2990648616856187,30.563759062048867,10.134209820184717 +0.14711830500830458,0.3039216677131862,29.981307104015904,10.192592991135728 +0.15244821527059224,0.29720624366247356,32.393755277079755,10.654645420316823 +0.15091815716259357,0.29830882485821547,30.568265096482754,9.986659616437745 +0.15135654444640625,0.3022739113468509,29.200623919011,9.977744266470019 +0.14936179389544246,0.30043635162215615,32.427402959303734,10.737224011721548 +0.1501135977559615,0.29614124177416307,33.69551125834044,10.779407787037705 +0.15057437908678659,0.2999563796725782,32.20108130724556,10.720940691730906 +0.15195396274157577,0.3051676508483932,30.892294460746903,10.856726738714121 +0.15316698469541248,0.3031570121557386,32.08647816226913,11.179681328403003 +0.14840413681230077,0.2956900063397883,30.7564095160484,9.617808642340874 +0.14853336583848084,0.3052431719288173,30.51018098137511,10.554134686279033 +0.14978978969625084,0.29950798528816946,25.73759698252809,8.504128867005564 +0.14989138689466233,0.3027347162337493,28.46159515168385,9.6936173045858 +0.14962773750211597,0.294796012753617,25.570170623840113,7.990075517146106 +0.1490959310679919,0.30089989286114743,25.078544952577296,8.308677378198935 +0.15061688127928843,0.3023311170584441,34.63977259626869,11.797043221415642 +0.1506412473412563,0.29999769371254753,35.45640751649038,11.763116077335656 +0.14984560888327514,0.30427414212978976,33.51611710598689,11.513729534654649 +0.15147885917332754,0.30397189796552815,29.34167875338313,10.15776889327649 +0.14952841605327724,0.2968051561276766,31.974405378603798,10.246467333401519 +0.14897975528899043,0.30578039816342417,32.614761068198796,11.342460854128117 +0.1516189178307404,0.3009002899142972,27.387357219553113,9.282891850732574 +0.14991349958260705,0.30642640211005423,31.5038713133312,11.083777150565602 +0.14968809381274562,0.2992576409896357,31.233932754255008,10.28397362046969 +0.14784261107828545,0.30021726221830675,27.28281039231393,8.975500453473808 +0.1498179143072107,0.2966764701044324,31.610927524030114,10.151748757277831 +0.15041559694197038,0.29916741041488054,35.648235754394065,11.76219640264478 +0.15114842004101242,0.30175178675148095,34.61477001145648,11.71393474579716 +0.14992963441145607,0.29819348781943456,28.058300601571993,9.132709725246523 +0.14970269873044656,0.302012804456584,31.376996189138346,10.627310990173388 +0.15103445365916993,0.3011267857925183,28.557473458909094,9.615854342746147 +0.14983286659984904,0.30147985245893505,24.254769547203054,8.166707099317279 +0.15105151504097133,0.2962741915788476,29.024659474320103,9.337742948891357 +0.15174644657474176,0.2982332536215918,32.169106398154184,10.576570702629374 +0.14758083770801989,0.2963723147685643,32.48533962386824,10.193326606874107 +0.15124963628039348,0.3034722324881955,32.67851288298868,11.31839403176165 +0.15059599455666153,0.30187845357756543,32.61667355037423,11.082360697911204 +0.15068931058393414,0.30636598448309904,29.883576778470292,10.5489199236166 +0.15034562597514187,0.30454874421088474,27.064811468697886,9.34741607295157 +0.15013435694275057,0.2977993546068196,33.17177305553215,10.71729113585237 +0.15231048765051944,0.30632905742261296,32.15670847463518,11.48366107794676 +0.15013561033314135,0.2953382592876757,34.88124663083172,11.032722809752773 +0.14954007543665873,0.2987652378741349,24.00627042876532,7.799959333470975 +0.1491219530689186,0.2962949125552235,29.297952156464824,9.314092067683916 +0.14938251031483513,0.30120122632563157,26.107009995782256,8.722244745913583 +0.1495295716595131,0.2990552595936066,28.911798711898488,9.442975991645431 +0.15084112580545736,0.2986681601618449,35.545953544669985,11.753604523942538 +0.15251595841701968,0.3052407358803844,27.278573451843773,9.673833139157749 +0.149258620959451,0.2975906340906592,36.51840344715672,11.762365549776417 +0.15072158376348704,0.3011072141923236,31.080905568967722,10.477529867939111 +0.14966491138160476,0.3033288096755311,22.87802387103197,7.819043528537824 +0.14955245835078781,0.2987905709795551,33.73499384214836,11.023106231668152 +0.14786897400232282,0.3000781133651611,22.92650773745782,7.519749886552095 +0.15057948027630677,0.30803837943829565,29.043048867379408,10.485087231740868 +0.15086523042852037,0.2926523689319778,32.20186634868834,10.032616894970294 +0.15099745740073592,0.3056137345617117,32.34825754516426,11.466172644604573 +0.15002548999890755,0.29797201753311814,29.84987594837209,9.67257754144264 +0.1498995407954346,0.3081939909701393,26.442551898606954,9.492682467877826 +0.14918714578329784,0.2998108385743562,37.09315909413145,12.265553327747655 +0.14975588351327826,0.3039525526331161,29.310812464385826,10.135825425630223 +0.1490657005296821,0.29414362922187326,32.03094092785737,9.94541569389565 +0.15023042569571937,0.30387449924746973,33.3742555004203,11.439189492275565 +0.1495943388088155,0.2947419019308138,33.82153258378142,10.584963155492646 +0.1490807275341675,0.29660932303501464,33.68689130913752,10.688403096270378 +0.1477470430339939,0.29314722802700044,28.827097280086587,8.764213099371382 +0.1504130822123104,0.29994732367885496,36.510029240594065,12.118068141369603 +0.15052669742688332,0.3067723426558577,35.07565167992693,12.414967279986215 +0.15089941984932592,0.30071577212644535,35.110212811776854,11.7184538687149 +0.15061005798919339,0.3023926764435178,28.84140182531002,9.83534219739323 +0.14940956736778638,0.30574335945493997,26.490032852842322,9.267008088411059 +0.15305457869656253,0.30543488340556807,23.780304427831624,8.491670954493214 +0.14998693807024996,0.2988567673227526,32.727043669982855,10.722515241454591 +0.14900611277349946,0.31140915520781925,28.122281723961933,10.361782091553442 +0.14830231140898287,0.3024337623969262,29.00748558998098,9.7306341100213 +0.1509743586931614,0.3031434588054985,30.012083825849274,10.26935429417903 +0.14754947250299014,0.3039426890423583,31.17306250102355,10.546845169452272 +0.14905553122380977,0.29853867348906155,29.562281976840552,9.59859880331741 +0.15226789875201893,0.30510106470968784,30.05668817841987,10.682286375729477 +0.15043913988422614,0.2975169977271814,37.16012280920702,12.042169444367296 +0.15210190438374066,0.29735276786859505,31.782311777782265,10.43422561072627 +0.14945104843600143,0.30052868636457475,33.20622713581717,11.05218520053436 +0.14843056757411224,0.29635574874613363,36.21697138908513,11.535312524339854 +0.15228936479768446,0.29762026567665545,31.514266564677893,10.404642694959948 +0.1490486339479674,0.29537651179645424,35.04635822501938,11.012229323098925 +0.14891396774968568,0.2979667193486029,27.810476315827668,8.93655263359963 +0.14995241474544962,0.29056922452948275,30.07825326155587,9.029857178054897 +0.14961210847164694,0.29551559381699316,32.701847765933096,10.333342134113154 +0.1494078496561292,0.3034747107222194,29.521094197012797,10.080924548093238 +0.1513561996536015,0.304487450402533,27.23849028229049,9.51214173740032 +0.15030256602132055,0.29160478811027457,32.12973866307207,9.78809063765503 +0.1519451866855394,0.3025884024411119,24.753422376902037,8.534614711835841 +0.14984265593643567,0.2989964182460706,35.158661478401356,11.521506826632164 +0.14871622503097046,0.3010293237406419,24.97010013693717,8.307663321972719 +0.14987765194375208,0.3013977537463907,25.917529274620087,8.702603774682617 +0.14930997294470263,0.3100266650186661,30.974907085746427,11.213006263540422 +0.15193451096617464,0.2972551190725762,30.805847402842232,10.078103698950489 +0.14995383698964435,0.2977347862416087,27.295020347744554,8.845510856834007 +0.15115454307489748,0.3059078355377124,35.34122831120001,12.410137345021255 +0.14897212700025705,0.29917425285254395,31.20605508722129,10.21244988552118 +0.1505905944832905,0.30321193138253116,26.088206368038435,9.007940066265393 +0.15089134821943764,0.2995488236399267,31.70561433315827,10.519349789135736 +0.15024343199249532,0.2963381457137584,33.3425478542958,10.618379556387588 +0.15082491025335795,0.2997803381553344,33.53938382104793,11.102324162725868 +0.1502447814794903,0.29544657452389633,33.426058722942805,10.603599032267855 +0.15101602308826914,0.3006422059371935,30.265343936345197,10.169090248052852 +0.15083676344899152,0.2979844083093604,22.8038691623805,7.429778636201351 +0.14938027506107074,0.30749558610018224,34.263783101755976,12.233317627149912 +0.1501226453030666,0.2988524964950044,39.16820591318921,12.792168433106848 +0.1481255803919269,0.296817633017544,23.466404253924694,7.431987096698485 +0.14952660596477851,0.30287918111546064,28.512354293644684,9.733570577178368 +0.14951195086926022,0.3009515154556572,26.00158434823065,8.68371213925973 +0.14911658052828103,0.29885415100845014,32.62153665828278,10.643167264142406 +0.1524121528611297,0.29812224263979437,36.307984716040416,12.064975498203285 +0.1490226130797118,0.30053282724023306,24.195760062833237,7.965568330510173 +0.14998994459969056,0.29493641665694126,29.25616035486067,9.213952849185521 +0.15081610602905168,0.29853924749116695,28.10247848217867,9.202412706131799 +0.15210339271192266,0.30574175045272844,29.454865174630257,10.441639388133552 +0.15090286867020183,0.29947437272485483,32.457623503790764,10.794158832709602 +0.1512236528389253,0.3006095676750337,31.234683201982673,10.504287476498773 +0.14987316219003224,0.2994848902947294,28.830359197392017,9.485381132329348 +0.1494375886475715,0.29164037344391397,31.769971936508668,9.595961030051873 +0.15006652015649422,0.3022988211320481,32.237238930721105,10.91002601805552 +0.15019961866380072,0.3042564408909161,32.68928116098304,11.312482208803827 +0.14716259830276776,0.2982304260744898,33.50653062020291,10.701389055216678 +0.1489370737937158,0.29430041205836976,31.742641050978904,9.878417901800866 +0.1510591852055156,0.30053563549955614,32.314009817925935,10.815930560172609 +0.1500683996864978,0.29319048078649584,25.747266111945915,7.955372701493358 +0.1527351091031644,0.3011973730775738,25.599758837292306,8.701822751705699 +0.14847541765062802,0.2977367874232298,28.392836081200187,9.042832674475374 +0.15103121812304204,0.30125709714974247,27.674250699279497,9.359124456855472 +0.15020930345774838,0.29536177654193313,31.493506610090346,9.985869477952585 +0.14878010848653755,0.3020758740794454,30.469929937362124,10.27736919971336 +0.15015387740268826,0.2990193500874404,31.716325851296496,10.43924965236406 +0.1517159429551546,0.29800062017413753,29.270218851364454,9.584808663739084 +0.1492346238589625,0.3016926611834917,33.46886705843642,11.271266256764422 +0.14838644787747177,0.29839857780008394,36.90683034835058,11.883387600713034 +0.14693957152142495,0.2972634795177829,31.85528718981324,10.106821184323744 +0.14933658254798657,0.29801684951741825,32.79728936807681,10.561361707779355 +0.1492980088942162,0.2947797023444563,30.382262409702765,9.506621347202737 +0.1518251009931771,0.29856166720568506,33.54815058142583,11.078488495290063 +0.15040270525503105,0.2963788839947866,27.614640908625493,8.88218884939443 +0.14961445042414867,0.29464386660592556,29.938352374244822,9.38364209148678 +0.14778180649538492,0.30426672549711586,36.84025826069673,12.584813559446197 +0.14980708082466976,0.3007079069978591,26.252597252246296,8.696058367554393 +0.15274009527219806,0.29999704885990014,33.96727977191954,11.467948083594058 +0.14783977157912478,0.29830624203298106,27.636716968120528,8.870691007422955 +0.1489908891394261,0.3000118769843524,37.84579296793654,12.385013070531814 +0.1518887726862126,0.30501399595746015,32.36591354593466,11.351776981518608 +0.15083728138559363,0.29635252022640823,28.74158917654963,9.197663615606723 +0.14995335072451974,0.29637324071318355,31.68519841956116,10.130306854602999 +0.14993709507753533,0.3037310139209619,37.49994697570696,12.848582257181244 +0.1496377096318426,0.29602110694728667,30.42776691501946,9.710816946620291 +0.1499653198160402,0.2935947245941898,27.351594626547936,8.478986883760882 +0.15032523743454446,0.2981972409625269,35.104035725524916,11.441815417290368 +0.1493399411215471,0.30047033080057445,30.880549926522377,10.227859310193463 +0.14904533706235404,0.3053246237107596,38.817137466357366,13.403397896317326 +0.14869221475507743,0.2987795225241276,30.11741034496078,9.771682317190635 +0.15164199201300382,0.29370244890514924,32.05757070250891,10.055400771438196 +0.14986838720373896,0.3055103733476672,31.491852333594146,10.997081006484967 +0.14966268042376135,0.30154870020743796,32.73708023177034,10.99178327152146 +0.150839487116341,0.29426569444436373,33.44941663331996,10.474217827431886 +0.14810958341244596,0.29845045129940084,31.649616444697596,10.133592060622028 +0.15026941732361762,0.3003411317221501,30.19572926848951,10.021011000695832 +0.15128912127141886,0.29512482110944976,32.3364019911512,10.327089511597165 +0.14923094988843985,0.2993964432909584,26.139239247869998,8.553340611866796 +0.15108863520372692,0.30380747318905627,34.15411764873236,11.889175659331901 +0.15046900596186674,0.3002769642122158,26.198219159765195,8.707152253984102 +0.14847904392165065,0.29470341491446755,31.16174561453548,9.663021863281708 +0.14933903033014262,0.29331610605785424,29.912519291486976,9.194048523394503 +0.15014635738296211,0.2986267144105876,33.009806899845785,10.749820773810367 +0.14926219576422167,0.2991287988370639,27.929898696449698,9.105389174960711 +0.15096232595354986,0.29840640013220276,27.782995112474808,9.148721243105586 +0.15089407912224595,0.29643947435892637,33.958793029606475,10.951831320787717 +0.15139743383288354,0.29676849774214664,32.87733729590383,10.600394325841869 +0.15039077530192352,0.3022892770052792,31.75503987368839,10.779433638871273 +0.14833167063277777,0.29799967019331997,30.631219284891884,9.79974429232994 +0.14886988799974363,0.29968794473882676,35.529083250796646,11.653881356555667 +0.15035230292395393,0.3005821008350977,25.807946187569538,8.689659371445895 +0.15103130484957158,0.2972166618776366,32.0424363608141,10.462623554480091 +0.1484086589860006,0.29844322472835266,33.12803176772427,10.714730325404517 +0.14992245489410874,0.3054023845737445,28.41836447799476,9.895467055983302 +0.14921457724707535,0.2981549205933556,36.76981125047101,11.947194938973292 +0.1487459644599827,0.3030774994877274,26.507618907835738,9.01073109209503 +0.15184982184315324,0.29951190342510253,30.989753800222807,10.366041550774131 +0.1491219136369299,0.291150129295906,38.201999009881966,11.44459886626592 +0.1489544269308193,0.29770653855804136,31.614882415551243,10.125848202879423 +0.15060473123291554,0.2955567662703229,27.81338650034433,8.834854128392067 +0.14936622070804226,0.30565199493672607,30.370794019464746,10.58451785453938 +0.14950628919376313,0.30257710159273543,31.243471278006112,10.611550863184362 +0.14902621766942925,0.29814445313841725,31.09250653049076,10.0634718130787 +0.15146902838990248,0.307951564376593,27.50025977459792,9.931061762408214 +0.15110142272108204,0.30700486794300114,32.06683596307355,11.5741838280249 +0.1515002520709796,0.3032457344287544,36.47759185482699,12.60762154814187 +0.14990644566615946,0.29505767765984187,36.31849042634872,11.45548021190611 +0.15126437388424174,0.3006426006255089,30.95830401748985,10.361369140602264 +0.14856448509382764,0.3023734458839488,24.08396550094241,8.104159511238723 +0.14963467037663988,0.3031807102868111,28.225801476612354,9.670323526919002 +0.15060049721480442,0.30093070793819493,31.492500215498875,10.60098227694071 +0.1512573581542411,0.3041905410073968,29.533604643262905,10.198890557708493 +0.14895422253849394,0.3005169534465003,26.39145255138857,8.681659908628605 +0.14868303557816728,0.3044207469398809,21.848444485717636,7.482759210652104 +0.15089161126319037,0.29586469552301553,32.72457907514438,10.461582193388043 +0.14886507893298825,0.3065206271755803,30.79396386783072,10.774713125245556 +0.15141815657822552,0.2972479456435866,35.639278034834916,11.586746533026202 +0.14927464752957295,0.31163986579615754,25.604549714788323,9.462206945936085 +0.14992581275306963,0.301735924218969,29.335315132442123,9.878306035613424 +0.14939381212662842,0.3000809316233396,36.56674448168843,12.056639512166953 +0.14965191596873734,0.306598500231194,29.625736046083055,10.4630865485185 +0.15013855252018993,0.29374708021665413,34.34137996784177,10.672567598415654 +0.1495905686683194,0.2985619476393674,30.174658880378633,9.829925211106545 +0.14912681335220787,0.29623939308566305,30.284526184817942,9.588267975791927 +0.1502215779341742,0.29150075779298934,37.95121920946127,11.54219236415367 +0.14877067014602763,0.29397198118439627,38.4984019568799,11.949104276397877 +0.15069946841390192,0.30377028003851303,29.602983332278356,10.26588731374153 +0.15002775746741706,0.3060098225389147,32.19458696765707,11.299655729550311 +0.1498389212075861,0.30005143805133544,36.54225154588567,12.081632911313623 +0.1484778092124284,0.3052412132486323,31.51168683605781,10.8973028468805 +0.15061642915702497,0.2937732891367114,36.010277314450086,11.205584057188343 +0.15011628595152215,0.30000993973604134,32.721538327348604,10.822664685939005 +0.15089612167471125,0.30148958753311533,33.780540052020754,11.36103239692745 +0.1497913438746319,0.3020479774812572,37.365943309407044,12.57495678966826 +0.14763957798961055,0.3037769157238261,31.022819642257968,10.502445512938955 +0.14858497983219726,0.29504706442459816,33.65458454776302,10.466324293657898 +0.15068090017356048,0.3002314756160755,35.639545385998126,11.897474091856733 +0.14950458667762778,0.30159308410360397,29.81615605575868,10.028295097258457 +0.15062268938817033,0.29978859148400344,32.01317139886879,10.621052442642569 +0.14849882374732837,0.3031603120177008,29.176934501070992,9.894852809154793 +0.14882818364846326,0.29613832806253826,33.44694234128975,10.616104821289754 +0.1502231044193082,0.294041608680571,39.047636608674765,12.176846653549289 +0.14988806726302834,0.29898821800746217,33.432973110694896,10.954949023725364 +0.15123725164636534,0.30325317546144176,35.43255406710468,12.269003391027587 +0.15137645316363108,0.29576612395478674,30.057553920143526,9.591851729689292 +0.14866128109377624,0.29218335626311315,35.337503665731454,10.74562509102911 +0.1507114449932803,0.29796117097869496,26.42457098351239,8.591653272747486 +0.1474751062146439,0.29683322434024006,32.21729166515678,10.229360651866937 +0.14997323284514189,0.29400548519494085,31.028625387628402,9.700390726942683 +0.1496900175302749,0.3059097007702383,25.21440896633716,8.862649067593082 +0.15017558018779706,0.29672910386518175,32.49455659297476,10.448426544499789 +0.15010804254471166,0.3035593522606751,32.036439888198494,11.045251876298195 +0.15100636584165858,0.29482553698695163,32.118853941286936,10.126401354981654 +0.14807374672102622,0.2924985405397616,30.185351133406126,9.15536108464795 +0.15155937152560933,0.3055164957380218,34.49286277661478,12.190846196722582 +0.14949480600293408,0.295669898909957,30.234182398405217,9.565293384184526 +0.14970491101308225,0.30953116803028285,29.90160110287066,10.852929024672601 +0.1495553403826854,0.3081594853830914,23.939082842244474,8.537768869033577 +0.15114208210183006,0.2992021767245965,33.32716343155302,11.027983060576592 +0.15021687902110062,0.29914359396486145,35.206971175349565,11.526536443542952 +0.15117053191602267,0.3012979610811482,31.367845135534385,10.536431975917193 +0.14988736546992903,0.29926186450782244,31.34656310779805,10.25782416838898 +0.14649013485454598,0.3013520839329527,32.252266088385184,10.581122894291868 +0.1505025665002184,0.3036716701663051,27.796798384631874,9.578633070356108 +0.14852356873650588,0.29683324015738977,25.4189173721337,8.103860066353349 +0.14987759599057784,0.29320326318849127,29.293377047461902,9.05406081776733 +0.15156213376389835,0.3007078379397594,31.18197955028341,10.548439045177062 +0.14812026260256936,0.2972989773059099,33.32751342322278,10.629660553386117 +0.14957647395751075,0.3078099645478263,30.53110293600416,10.926504896738393 +0.1491706990790362,0.30131938423650034,29.074257130672173,9.7328546074034 +0.15056427884327897,0.2969813627242164,25.69424451876189,8.282885423700213 +0.15103247254229404,0.30311041883575657,21.52341976644704,7.431996904371315 +0.14927094757420395,0.29946277169431956,28.555406857833354,9.381069537972484 +0.14978823689411042,0.2982154115695771,36.672749889455574,11.950371968594675 +0.14882592083702945,0.2890596463264531,28.49853231643561,8.386617002939099 +0.1469139289569334,0.30228321835315514,35.371956160619945,11.707798672037525 +0.15014680145066303,0.30181286844138033,27.81434385899134,9.30380644506705 +0.15126085250718646,0.30791897108575067,25.07524547959044,9.065262679269331 +0.14962382841485092,0.2924279977495159,35.03461019738396,10.70976407959776 +0.14828431111980422,0.3002062755141525,28.713589005365495,9.42451393368351 +0.15154922464304812,0.29355448917322297,28.90779943327512,9.07426243887716 +0.1491352785279899,0.30537508642016997,32.8076154896629,11.383593178716817 +0.1487577784668054,0.3002962270250212,29.590969142651733,9.762971240751618 +0.14855671379267388,0.30156423999261867,27.237000034239536,9.127677675447506 +0.15093144785180032,0.2974273809606362,37.219462991783516,11.991494404483154 +0.14885365520571447,0.29885742185938263,29.785140220443882,9.635829567754453 +0.15162965916562124,0.29819363444319597,35.13605439097562,11.55869255437926 +0.14959633481128848,0.29879115705651127,25.873800023799177,8.496709424425736 +0.150020769255686,0.3043194544985938,27.770478594257206,9.610388269535086 +0.14988460676762314,0.2955340599732605,28.84515848258835,9.15175178967659 +0.15000606723801962,0.29469639947946585,24.49700624565225,7.70524253458591 +0.14860461440326472,0.29969782181655985,31.034573252956804,10.131024433302773 +0.15244963838098305,0.30104934808696066,24.914063455184852,8.49840954027161 +0.15027882146888796,0.2937660751602545,26.819496364758518,8.335939011279795 +0.1505674899764466,0.29656207185701045,31.426817636998646,10.083588621581784 +0.15009570710893236,0.3022823633068904,30.92747933841131,10.500239182011153 +0.1503885711639228,0.30772156410027257,28.822604416482218,10.355608214824244 +0.14974219536266675,0.3008762457514425,27.304992269733024,9.084429876112695 +0.14966899392227298,0.2948042227391801,28.341662354602718,8.883020569044762 +0.148605592982625,0.3034936095122714,29.416909398230867,9.980348202350386 +0.15021097777014877,0.30200072136860806,24.616772124749247,8.354562823138645 +0.14842656025365275,0.29445189621797996,27.543132947150276,8.546997006004013 +0.14911755670143723,0.306095437314028,30.303504635363012,10.6675484166124 +0.14791265811654392,0.3023076646444922,25.878255384075434,8.639450750076977 +0.14843212950915002,0.30375563866357086,30.716405215350697,10.455832808594332 +0.15200961928341977,0.299753157006115,31.614102237277113,10.572900659191344 +0.14909050479336555,0.30564899632021036,30.19679529761848,10.572990130119898 +0.148868496129533,0.29835826267750243,24.4515186845967,7.924400539911656 +0.15030580026594378,0.29534900463460656,29.610269965703953,9.427924206573984 +0.14921836472101915,0.3009452047293238,26.349960950912504,8.810483734495609 +0.14968926734555765,0.296241047815268,30.007982663559044,9.556363654695378 +0.1507675672646331,0.305739838324496,26.087109861740526,9.23240860842218 +0.14879517708972972,0.30215990188289066,33.89536819761618,11.338513123383844 +0.1478123407284101,0.2986666247494249,31.157151975644734,9.996265534920148 +0.14902906441344843,0.30230729837306397,24.93539816040477,8.400421843680864 +0.14867776414829853,0.305537011681018,35.11607927788973,12.229601663604871 +0.1494305258332063,0.3038172513523241,30.686047954754752,10.46959547300332 +0.1500489521181132,0.29309649847663083,36.02437948722979,11.096177340253437 +0.15069499728781496,0.2975194168080365,34.06136306494189,11.088937843998927 +0.15260229966347652,0.2932659732715001,32.06200167721216,10.115223038065627 +0.1494073366504768,0.30010300073828977,31.92246502589612,10.488934967213895 +0.15046802303305096,0.2957556079607044,27.49009460457592,8.730630336992428 +0.15291166070287115,0.3018946002929562,31.025346248016735,10.684114737087299 +0.1487076269774488,0.30197105801465624,28.41661696865332,9.532123119876324 +0.15251140053023307,0.29896383036992064,36.53441081824461,12.211228961754339 +0.1505109802268618,0.3014625728942782,32.16237895032973,10.888616588372015 +0.15103285834230312,0.3085536322060762,30.10173690564958,10.931819168505093 +0.149872408085312,0.30592679312053184,30.73041855354044,10.786819045874195 +0.1486821656801985,0.2986732180789458,30.989747686818134,10.073815924299225 +0.14786341740220535,0.3057606593504986,25.297296004136385,8.752806122965623 +0.15010489847325237,0.30242935563788886,32.276113177663234,10.999279466724218 +0.15101937104139346,0.30998376300743374,30.762215837296022,11.308582839646334 +0.1514161551848098,0.2984641278064703,28.818678438862893,9.470514568809133 +0.1490441905931958,0.29399622172168965,30.02618967268817,9.363011767234834 +0.14992942209828453,0.3005407941295903,27.650130122110852,9.198475270565162 +0.14982641688975623,0.29926684017169075,28.53317574233274,9.38569993666657 +0.14938570996097728,0.30335754294917483,33.1658968873097,11.325253222121354 +0.1496986001106675,0.29876540120595557,31.946254741325387,10.405253979064065 +0.1510276693606119,0.30320067088147923,28.35142953491283,9.787071471758606 +0.14919412508629618,0.3064032409435371,25.57273352570982,8.9696252943287 +0.1514789325020476,0.3048511662372515,25.909448997960006,9.105933974383907 +0.14948320292410688,0.30405204432844607,31.444143108423614,10.806822513968285 +0.14917813842391844,0.3066944636520636,35.44527349372798,12.568174839744394 +0.15065447271772733,0.30095319680736204,35.61615156234291,11.949281050445403 +0.1509673692587444,0.3049763224754768,32.999572831790516,11.571716625466292 +0.15008105665036223,0.30767540421063566,30.532122628791257,10.86679405709687 +0.14950938635409844,0.3013159557709386,24.03010542228435,8.033029617135888 +0.1504280170475523,0.3054477867349794,32.791526180370354,11.543137661972022 +0.14846126574152557,0.30068176593343465,28.459584686747796,9.437499830042292 +0.14796115172561078,0.3060840434692183,33.22074033220536,11.540629524830095 +0.14927911160036905,0.30433498869533826,26.85910965664198,9.286526933584817 +0.14893758757364656,0.3007390208786864,28.88869795792514,9.566180099200295 +0.1498978140577355,0.29314893918999024,29.61133148985972,9.127002101645992 +0.1494991657653962,0.2998303341650729,37.070026824191366,12.162348961792834 +0.1497298030300417,0.29811390807737426,27.713647863995853,8.967268042247913 +0.15114875998113123,0.2951321865081292,34.552410663435005,10.97135547546592 +0.15011639886326394,0.29931793188114253,24.674893975387693,8.1162810059456 +0.14874739517590924,0.2948674686452789,28.564048156218657,8.9634082365805 +0.14892853518896398,0.30300184038134126,35.13920256997946,11.95816264791777 +0.14995186508107547,0.2990244752499473,27.830330174561624,9.099283939777116 +0.15055823824223144,0.29969659415613065,33.77558379220329,11.19402052982699 +0.15002547432505042,0.299179712092461,33.204984778386084,10.85470617974718 +0.14832491355571084,0.3017527099461995,32.285458726157394,10.717559094643153 +0.14888729273097226,0.2941482233899941,31.668249000893802,9.75661622298298 +0.15046155190714058,0.2969145138623272,34.278932047079195,11.065813329989794 +0.14984338438844044,0.3030931962534722,32.52048570586843,11.057153563413248 +0.15194084337824185,0.2936991883652056,33.73633464063362,10.624582759149352 +0.15030523384615338,0.3073522583315362,29.58745860079518,10.60983888785151 +0.14826844346969115,0.2965634923448856,23.895162157121856,7.539000408928343 +0.15044771428359907,0.2994932699996416,31.138022924827947,10.265472109781472 +0.14950073878519377,0.3037071343394339,29.775158248223182,10.226149932946829 +0.1498650540106989,0.3017214697642521,33.92631414440393,11.408168536660014 +0.15060510396706925,0.30286649490633294,29.697552224609584,10.14875535539261 +0.14974310972177488,0.2973391312475893,29.237291905865217,9.390918464265924 +0.15122710057409924,0.3013683183886862,28.58132087145672,9.708695459343533 +0.14998038752543294,0.3035197230196378,32.24938997319818,11.075161954623502 +0.14971608015807278,0.30786780218757165,27.84515991949288,9.95060866505608 +0.15055483112434073,0.2952670041451316,31.736832503507127,10.086214909825037 +0.14769071170798742,0.3013162858511099,26.360012075567358,8.697920656874363 +0.14967265886417971,0.2958008051133539,27.48757647487058,8.649877369662464 +0.15148116098535558,0.29715005413424694,33.0205612247871,10.763216301265501 +0.14993637692746628,0.2944501856022593,28.577597267214173,8.95317492650386 +0.1511591822634846,0.3021444058375381,19.609850881116017,6.7212373384969055 +0.14794990366114247,0.3068826406935906,26.57370089822467,9.208509265466269 +0.1498875463838598,0.2956339845170752,29.353800816263114,9.268648469953742 +0.15122947388717894,0.29544324089669083,30.260363626659654,9.718999382323489 +0.15007859674063448,0.29730291071566906,30.976807516305186,9.975143215207684 +0.1508372170410046,0.2979035237474478,31.63107983094313,10.326686683884137 +0.14904740744149753,0.3001619614392624,32.57757914938888,10.716182806874896 +0.1506968695964704,0.28854515889279375,38.522575537015655,11.416516356525829 +0.14932437615884464,0.2996993110612438,27.330179051935307,9.006158857078347 +0.14927923718545064,0.2968329209620745,30.926440389741217,9.87135831780085 +0.1491396266977126,0.29353194988779197,29.72106199162324,9.178845335096277 +0.14934728796948946,0.309092548201297,26.80931298653697,9.717745065070183 +0.14969938107063713,0.3028992053230298,30.41170592392228,10.323579803430782 +0.1498826432031402,0.2985682804511687,29.587491079447,9.644701620347591 +0.151256129955294,0.3007136015387298,36.55179100017127,12.265833913689864 +0.15001181907100905,0.30459417815705575,28.912490131791476,10.02323230289265 +0.15109474699836734,0.30153197141701155,31.584732333269304,10.648805715524588 +0.15002024388613014,0.3060945110114892,25.550090936111527,8.959324901047399 +0.15038421787366277,0.29709146268545134,25.778867013029085,8.312071016390878 +0.15045920784005531,0.2941411551371066,36.427805865021355,11.442820136205759 +0.1504351085506781,0.29409858889697266,33.570220666851256,10.495867587133915 +0.14902706325450654,0.2980172301977332,22.404495018472524,7.246662419349878 +0.1482527766003429,0.30146189528456896,29.898305700059208,9.93431134739947 +0.149999797531062,0.30307436003164573,22.798970535690508,7.726056121080916 +0.15124368910527586,0.30123161594910747,32.69657604438874,11.06045288896375 +0.1502745824536864,0.2979965487107304,26.26211345448015,8.53669948166061 +0.1505955163417204,0.2982619356796979,34.39253880018118,11.202222560451322 +0.15059516148042215,0.3038771232965374,32.28236446810889,11.1908469549184 +0.1498899795384696,0.30822770541865674,34.27793721375125,12.236335921961881 +0.14896247563429846,0.3002682096134269,33.6427313884217,11.127101209586062 +0.15057349782362117,0.2922365923993413,31.858723252552018,9.799332288432197 +0.1521089256759632,0.3069751040483736,26.02604629770635,9.35376542139134 +0.14942300973009875,0.297234025769301,23.415427883202966,7.522962176458976 +0.14946274757057035,0.3017132692781655,29.68535584084162,9.942103570670639 +0.15056916894651493,0.29302228250183204,35.32113814565237,10.898960416331898 +0.14899579085771153,0.29726477112674016,35.45882200404859,11.363986468486127 +0.14986150334751416,0.29180390594953287,31.52343109272824,9.5705680395365 +0.14998292721091064,0.2985628475334373,28.51509364942571,9.351971178910725 +0.14876815600871804,0.30506312056612966,29.466665333994563,10.185953484560681 +0.14964944807373565,0.3022722755294284,33.16263659215154,11.226011352997277 +0.1512921159373944,0.29535846788993214,30.06815055747296,9.602795884714594 +0.15187630307645697,0.3015169389957715,31.94542920178098,10.870037405547558 +0.1509599433121367,0.3011392665231418,30.227826321337766,10.201964446539751 +0.15052120581687453,0.29940413235900315,34.01705651531714,11.264588917245652 +0.1491275748581561,0.2970646868662652,34.53329131647802,11.03305497698238 +0.149652155885294,0.2984228180821763,32.24609969709865,10.533444488250435 +0.14949172491288537,0.30836578794425906,28.235043072115317,10.159140684505122 +0.14690290791864186,0.29136639672083164,29.609733739907085,8.81396746911685 +0.14840514958231685,0.3004488920467771,33.71761010167078,11.11770427388945 +0.14967548612963147,0.2973380126093687,32.27470807579881,10.371030659863461 +0.14987255052138454,0.3015071507167964,27.365056492858542,9.243647503061803 +0.15011960678607203,0.28881497945177254,27.72722165477243,8.191092806841556 +0.1505898572207173,0.3035992634212374,32.65592974637135,11.280744803662618 +0.15199182463909536,0.29465506219971543,37.01846630073175,11.806011112123304 +0.1483525434846565,0.3006264238034318,28.411390722906408,9.327075833968134 +0.14798962999791496,0.2961073973690325,36.1075661430053,11.316368417556644 +0.14851294074294602,0.2984148203204947,25.196911216071076,8.14843027794436 +0.1513202806740523,0.29121455303698157,27.54499236402919,8.385082370490027 +0.1495748675694851,0.2966968031071554,35.38861268785101,11.249389408325996 +0.14868618543404513,0.29625593972376163,32.52465608807319,10.31711154506508 +0.14867940241876484,0.3076733966169209,31.89972393001516,11.26506508090484 +0.15017544974554442,0.30781992405258357,34.532357987073,12.345496380838124 +0.14981906307612894,0.30214278472501,30.36734813883662,10.271257449003341 +0.14760633901480427,0.3001461509069223,29.705354723879527,9.730450725031693 +0.14991595492919102,0.2984052133027884,22.427461878447083,7.307213111049208 +0.15010364658656386,0.3015330608394626,31.832306388667234,10.75728775168154 +0.1476998762419366,0.293772038417253,30.550795535732,9.361262345552683 +0.1486356102969105,0.30276629959023127,32.17717569626349,10.841495529713212 +0.14964491775920513,0.3002376168819587,31.28315866690355,10.376928720821732 +0.14926433552645604,0.3023194191650926,33.090143048768326,11.133046524923657 +0.1497521060262597,0.2941748923516563,27.96302277648373,8.740771357122512 +0.15120206245477083,0.30220826858172767,23.99406961041793,8.12774375281102 +0.14866790266649954,0.2988816971524031,30.769108737873843,9.995779732767193 +0.15231090146045898,0.29421598495503576,36.21682517152425,11.486969271914324 +0.14956779101831866,0.30862051458776796,26.139623152724027,9.427331824533974 +0.1492680766680745,0.3065317319035186,31.507877767630795,11.10954905887245 +0.14896887176694149,0.29302274547240686,33.69573056662001,10.341027787639755 +0.1511570837003466,0.29952074461906925,27.162764924980713,9.028781243713098 +0.1508905222394315,0.2961684539788763,27.56747246567262,8.774106155860837 +0.14796351253080037,0.30151527311916415,29.522034221927957,9.85020258077898 +0.14820822036322653,0.2868816488208629,34.58546502056767,9.902384850909206 +0.15222254485441236,0.31008248588673043,32.08049521414072,11.885854769059055 +0.15002169940636137,0.2945027630642081,33.29377887592012,10.423822805812815 +0.15014865392200202,0.3020486003536902,29.711005022138472,10.083106970587208 +0.14926341877387186,0.2990890939695514,32.78645723759185,10.712630306388725 +0.1490156054607856,0.3008200888649332,27.961460928249576,9.305435281767753 +0.1489283710622661,0.29770155569290213,28.509867777757176,9.168609427570857 +0.15015529736543312,0.29592997443162194,30.57710552590698,9.7420756713131 +0.1488157895998444,0.30776752330328366,36.95199305763871,13.110432855027154 +0.15092684368917436,0.2979349750075548,35.71631287917044,11.624905530896106 +0.15082540122171076,0.2953110015697303,30.921035004907782,9.826204515182667 +0.1501814956988744,0.28784192941841136,29.42492537768089,8.60960935109231 +0.15047271379792218,0.30392230182354457,27.718182222924813,9.655522186024093 +0.15128469168228462,0.2940610883994778,29.054043918428704,9.093265362778238 +0.15033152485418397,0.3038678096316422,24.6445722417661,8.510817685444275 +0.15094813757780276,0.29978069094392923,28.57645512630378,9.551089840464389 +0.15137927599462123,0.3006707879206192,34.89066079846014,11.812133544266292 +0.14807366948395467,0.30355125490979756,31.379793245948637,10.584699116476834 +0.15067075681151818,0.29297064293248604,30.380266171695954,9.411579424854203 +0.14948720685628894,0.3098718363150751,29.872096010906986,10.907423162323004 +0.14934755165682476,0.29950827930477886,33.3551817166329,10.908534079688636 +0.14824409966298438,0.2957396952193832,33.38886648899569,10.468072166486525 +0.1483305253735885,0.2950766640650365,38.631078228392724,11.990444235736213 +0.15020574851441773,0.2994192280628607,35.344757765811664,11.564145269414938 +0.15047681196108184,0.30454978544058325,24.48356829819246,8.493503962300439 +0.14863078088004653,0.29658923949796323,31.34907519206892,9.899472250135085 +0.147939721699655,0.3014808580777932,37.023111600233,12.287026710050018 +0.15081052979099716,0.2974786543879697,31.641295920104696,10.24502030274979 +0.14993771103059056,0.28739279798332773,35.56041645881522,10.358016638779802 +0.14886757148588764,0.3006925033333732,30.76630212519725,10.171674620081209 +0.1501138058850867,0.2940744641510798,29.194309623577865,9.128353272118193 +0.14985358185001596,0.3024551126315369,33.624244377061224,11.389727761955088 +0.1507371133981216,0.2975673031922062,26.448427832412758,8.55233417306252 +0.15032891026685283,0.3022787731880768,23.144514195900737,7.854529723853721 +0.14977211827336934,0.29771671191772703,31.12865088874681,10.090009677310386 +0.14965740472387368,0.2927722726652706,22.150066629782675,6.814084356479826 +0.1513260416002775,0.30252088867811594,29.623413782500187,10.193554364799468 +0.14797847044639953,0.30303949984859885,29.086409210280863,9.854205117721301 +0.15052056091013863,0.30014102729013825,32.42018905583195,10.79442110666853 +0.15114570990299359,0.29653936201104264,34.35984769301421,11.025948946665153 +0.15134160937052382,0.294199459129098,30.240090612220293,9.503677861179177 +0.1497750102349008,0.29882731986890065,32.18207479457769,10.525098283160602 +0.1510526287680108,0.309492087178215,32.32948174342018,11.818541553816054 +0.15023897583540516,0.3000358089088164,33.27946674866395,11.011641346647675 +0.14857436423288853,0.29659238763368156,34.63923904778641,10.976324209576884 +0.15005115613934308,0.29205086926061957,31.43249048926533,9.610103267584302 +0.1499750718392601,0.299276700664247,27.921044747177067,9.208595116815196 +0.1502054853552482,0.3039582367855805,29.98705769961588,10.346851800856971 +0.15099084691820877,0.30487951451208856,31.261619789794064,10.91944775312138 +0.15039945461587736,0.30613664669714774,29.802916474717023,10.513813163399892 +0.15050088557815675,0.2997002517860517,33.33776757747649,11.101550889116968 +0.14645586796458512,0.3025991410715975,26.810149515506108,8.902963939658877 +0.15181569898867173,0.2969935703100777,32.11844502876672,10.467582221269959 +0.15096468258227727,0.29490743416407833,33.00180993969867,10.448591687138393 +0.15161716121049162,0.29787106960149684,34.23414807915989,11.231126790462543 +0.1495378964889124,0.30738021625273765,25.547080434596687,9.066613618071425 +0.15147395987498682,0.2996482729627248,33.98303649397673,11.387055573979115 +0.15013367780401835,0.3016628768851793,26.45488877584498,8.891419389475725 +0.14788972756006655,0.31083044625616557,27.625246595891614,10.047210414496151 +0.14875503528065992,0.30209230479122384,32.16079853583899,10.792382813246666 +0.15215431999176726,0.29794301700840214,33.54402347760463,11.050176078693875 +0.14950936998075295,0.29068274656536347,30.490612020705033,9.191696911858706 +0.14989791510337147,0.2985927652832632,33.65144766558314,11.019352835694683 +0.14929809238786226,0.29785821278826125,30.3366342930611,9.790674644776237 +0.1486613379389852,0.29663249145812864,32.85705517416077,10.443606614067056 +0.14924698416621202,0.3003992056868047,30.898118964305574,10.212706254418578 +0.14873209511372762,0.29273485554001094,35.525787551017,10.863365959017413 +0.1489677032869497,0.2958519804244177,31.121836601774465,9.856044020758514 +0.1490133642817165,0.30318896367802056,29.072364828033056,9.912569299648062 +0.1503037793328231,0.3001477150513311,27.49953834308739,9.164212076247955 +0.14970901643046783,0.3026607947653859,36.29012769841112,12.335353434310651 +0.15125678827685787,0.291104210167792,36.28240369234204,11.054212874375724 +0.15048415136234156,0.3024117876267578,28.35460985946546,9.583091188920209 +0.14884809806260227,0.28872594855812656,33.14009542695273,9.696535469741468 +0.1520694573096359,0.29552531873895327,31.903443178962547,10.260290079614954 +0.15069490879242028,0.30043068456727995,32.54702130355865,10.836860354313544 +0.14999323819321814,0.30302479013506406,28.278277109852734,9.70364736931498 +0.15113114019189516,0.3057374959103277,36.735132256675875,12.962230594486503 +0.14857480290495506,0.29689320636590083,31.27706072785381,9.96023853709986 +0.14923429488116718,0.30651638061720715,32.2983966201665,11.445551115574599 +0.14907315783728978,0.2954324453113937,30.934899308471444,9.744902644638703 +0.1498193377290417,0.29870153031820057,33.3722447582064,10.87859171446133 +0.15002437160459928,0.2897008194000884,31.30456276322422,9.359849828875303 +0.1504846749910417,0.3024792524887086,30.443275599023046,10.400141902550603 +0.1502395954421454,0.2966506271926968,32.22797697358163,10.353494036615837 +0.15021099510193636,0.2980282344161049,26.581462991049,8.598221528856408 +0.1477925543222577,0.2969374079627099,25.529140377476473,8.129704229336431 +0.14953101510800917,0.2991014003277289,28.139138601766298,9.188141523213606 +0.14931153245448342,0.3020998244573696,38.21450464080064,12.756426257211537 +0.15176920756902143,0.3076481903134066,23.37093054235926,8.418612349674078 +0.14982276413619044,0.29805396970263126,26.4028142038635,8.607216865138613 +0.15099199729725604,0.30606382923326814,27.116321902321296,9.625942756395787 +0.14960064647034052,0.3016206833472833,29.249022008429264,9.844585348564236 +0.14946068210733846,0.2916964761473818,20.22793703494355,6.128474155182738 +0.1492574491615284,0.30671121417825115,29.56249321986638,10.35356749719643 +0.14979858865106568,0.2945194249179175,34.25609061280836,10.755577255533172 +0.1504414736356829,0.30249285938138004,30.973992675834705,10.556891103420735 +0.14924102843429962,0.297683332084331,31.328747454399856,10.049411612337751 +0.14913238313607072,0.29497604153456175,29.831367461063916,9.356303666100452 +0.15150140532341758,0.2989084227564561,30.37753657288228,10.040326355235774 +0.14947825764732398,0.29835882179263035,26.541066006112942,8.619780893929207 +0.14862273878055124,0.2935164045643788,35.20845978184,10.88275979713503 +0.1489607529999297,0.2969544442904765,27.73926286164283,8.846257171941161 +0.151169407483031,0.30252952171913144,34.49377486215751,11.808129940560164 +0.1499503207817476,0.3016343591712529,31.89886834918161,10.705606705734196 +0.1485862776274546,0.3003087658449724,28.855166175043273,9.490756513846442 +0.1512960983143978,0.29538797236144215,30.276103554415567,9.646282094244397 +0.14819164620410477,0.2999970267617919,34.84284761231417,11.325718725112747 +0.14940827855299696,0.29663435127174886,25.614546839803364,8.20115261354438 +0.14871767851110285,0.30744405170239364,30.807819514251065,10.884618538898266 +0.14920108145430983,0.30361950370535273,28.497665088933566,9.763695004325948 +0.15139735434464266,0.3035901005776587,29.571485762952452,10.244193134101973 +0.15012181087255863,0.29629184782548823,37.26241642865198,11.935364945086148 +0.1526058280972359,0.2996941884611459,23.330565594694566,7.832109922451526 +0.14939401425547894,0.30229836352029077,32.33574388954975,10.88002501007811 +0.15005453546588723,0.2989713568288707,32.27764601492652,10.547079493675835 +0.15017822558894336,0.2999289760448921,30.471932651372473,10.133583656654858 +0.14871499412922679,0.2977195585800254,30.679688139454225,9.892219278690515 +0.14856527617137907,0.30773488090935464,30.607319800701287,10.91796056725689 +0.14999894269420577,0.295574119779408,39.99920009209341,12.686691102999905 +0.14999449929090464,0.301579592334226,27.683878927883235,9.234572753522386 +0.14993449672388623,0.3015269803780047,28.480080543877932,9.579783258529272 +0.15128804455277114,0.29741193722560055,34.71100860185982,11.292616605532658 +0.14957011679778118,0.3066668673796131,34.260611774647316,12.064115833968636 +0.14799292477898493,0.3030520741567467,25.652221853589353,8.617525236158489 +0.1506538145336844,0.3017145994208696,36.98973439390947,12.592922618281245 +0.1484941993403921,0.3016196320409745,37.45156878576095,12.504825457251558 +0.15035111169147297,0.29537678446931454,30.348668141002868,9.604726361028108 +0.15028801537083977,0.301249299935818,29.764713235780583,10.02217092982409 +0.15087609239424163,0.2989574358526387,33.19310065784189,10.927052207714913 +0.15006416003270873,0.30715163454621597,34.18359749183143,12.165376658787231 +0.1500375567119525,0.29555898577544526,34.04900762928355,10.837860195694997 +0.15123715386073686,0.30264491076595607,30.417198060547836,10.492488747817966 +0.1524887711727224,0.2950338348574098,32.62697042628214,10.457867984966835 +0.15021125472432753,0.3061710874880104,36.33272586649872,12.797485825796656 +0.14862769940121426,0.29562399481725765,27.20463135580855,8.52658413837377 +0.1494495299953155,0.2904695369533957,29.28558481279983,8.79380739353955 +0.14868752295376772,0.2946106126703555,34.08832216253303,10.590925544718061 +0.15255127064510454,0.3059363901167279,28.275416083508265,10.11941138318144 +0.15098732324695074,0.30349123651478455,37.140115798423025,12.84736015807844 +0.1483441164519105,0.29999899714071065,28.53198127407743,9.329726319947607 +0.1508976107992546,0.2917475696583048,37.60362757925471,11.48490266232347 +0.15068288332237578,0.29266699425470544,30.547537778940317,9.405017106386248 +0.1492856216526658,0.2966020152486308,34.81553763219232,11.075600770943502 +0.15103879762551195,0.3026128695676911,40.179411243359986,13.801277934194665 +0.15076605584059574,0.30090647819056354,32.749164059454564,10.987450065122395 +0.14952092447284052,0.3016615638784237,27.932403115994664,9.380393258020973 +0.14981989828136766,0.2953944444753555,37.5410835070026,11.857769967899396 +0.1477135090049562,0.30303885508728867,22.367107318002933,7.531063580446716 +0.14955916641120268,0.3035013663573492,32.477756836496404,11.11677739722257 +0.15050774669158662,0.30625653239252915,28.677321242400627,10.063718570647945 +0.15147601862870108,0.30009022979027,32.469722223948345,10.904852954892924 +0.14878987061438503,0.30310021405411575,27.454728336835636,9.33833837789966 +0.1512930703914391,0.29765698346303654,29.065467802249763,9.403484921552431 +0.1505541802497736,0.29276420167320544,31.123058247320664,9.629502773658247 +0.14793713976626582,0.2941527124435379,37.43058324022697,11.471089212712302 +0.1502697503544137,0.29672793855479956,32.44282865694396,10.393166146409477 +0.14998910921529854,0.30118934907276357,33.087885177766005,11.137541692975535 +0.150616173605318,0.30396562871906907,29.276235831643856,10.148786832018336 +0.15138665333943124,0.29435721976875284,33.11203094387905,10.484862816803044 +0.15049278972360355,0.28930582951448935,26.673790468960025,7.961473961280664 +0.14858593609315945,0.2990753952606713,35.708861160444044,11.619804641382817 +0.1493894778152282,0.2983762200528547,25.60399447580653,8.303018844670245 +0.14867163614194442,0.3021707885395499,29.400435942763778,9.847848237450902 +0.14963832321053275,0.29533778350753503,28.692800248610805,9.055743547286841 +0.14866176323255706,0.29745346115244414,31.99093811619319,10.24603475435079 +0.15137209695641934,0.30250082260839556,30.30541414062356,10.393166573148184 +0.14724325473987518,0.29667388481304524,28.439915447952586,8.949758521424279 +0.14922108218764352,0.3087859263879597,29.674139682053983,10.656634235460869 +0.14983785337394684,0.29214247991098746,37.23113282125903,11.399086481716507 +0.15153558537157175,0.3019834967142261,33.2572436179282,11.391921366859949 +0.14907266546711995,0.29255146105313135,30.362316586428353,9.281652111014886 +0.15219871357347833,0.29764606930278903,25.087937725230574,8.249008476431849 +0.15062548748476162,0.29638846516246,39.089263577601415,12.511309130793633 +0.15116900350568807,0.29458856675260303,34.33076619202574,10.870236705301936 +0.14988833429905324,0.30447137472216484,26.751042784098193,9.261954270438467 +0.14904480781917956,0.29350398680648787,28.397726738012263,8.791249187284674 +0.14876632486771404,0.3040187045185498,31.93851367666077,10.871499808231736 +0.1496081498711914,0.2913254301909701,28.681204168688357,8.70781434806039 +0.1495656481028336,0.29471285578849415,25.004773392592355,7.80950499785046 +0.14932413579102016,0.29712064884545597,31.23647339574155,10.04708449052797 +0.14872617817286654,0.2991559815841991,33.73029098102711,10.991301011624863 +0.14975156834932038,0.3012648177692105,34.133624515349375,11.394661584877626 +0.15021063206276283,0.30045014480302684,28.480769200083138,9.489828408477326 +0.1492128305592765,0.2966913896015689,26.385980545669614,8.407652461814827 +0.14894565732117263,0.30051379691791796,31.144722174994904,10.322902790643466 +0.14950896435219965,0.2946816033446604,27.611680001147953,8.667353410110513 +0.14961311881746991,0.30711174773834643,29.305313186618775,10.394442696226413 +0.1520663535107025,0.29926737823726723,27.133654212636333,9.054538378866983 +0.14955288625925298,0.30077494423906553,33.116899491139804,11.02869790974976 +0.15095699169029458,0.29382087368017357,28.840744237228343,9.022353667737528 +0.15134083281358066,0.3057471261886158,28.12823248516208,9.903981180286666 +0.1494497586070562,0.2944861837156314,30.12540751296775,9.35611919711405 +0.15010104461102933,0.3015734652668515,30.68432571340977,10.3197160959342 +0.15079594539713118,0.306013293783361,27.797471673656847,9.850559173770474 +0.14933119142918191,0.30339328523670733,29.259969466081987,9.995205013518987 +0.15085185975460735,0.29800548605870214,29.0620086959259,9.550174271877522 +0.15132789270657926,0.3014671259196212,27.722591010472986,9.402956037440154 +0.15036556120735342,0.29707660349397746,35.602207035567005,11.424574220460304 +0.1488528795829192,0.29900885055838433,30.315095822258332,9.874839807625724 +0.1493792432638709,0.2940546319700472,32.03383007480709,9.901042504372647 +0.1519839709675911,0.2947217020819583,25.692519102382043,8.190521303835695 +0.14920766458817827,0.3032813964214038,27.02123213046217,9.179801855917635 +0.15034117845487602,0.29898244335967117,31.033436099323783,10.16881935063563 +0.14765779653476932,0.2922180834680862,23.40794243194452,7.030110563814025 +0.15064926969942344,0.3046312404162434,30.47156703891164,10.623390073726759 +0.1499578674251292,0.2998244980593416,29.650948123126636,9.839409139415078 +0.15039095632849084,0.2934371881884244,30.052090485670213,9.28905684443697 +0.15115433439069237,0.29557220183371213,36.40669495248344,11.602408942685434 +0.15230463535928118,0.30097895446168244,26.877816697591324,9.11814166829997 +0.1488384833386981,0.3039354109385887,32.33438477869721,11.115023864169835 +0.1511764007009291,0.2978777886360229,29.2282147736894,9.536420744842086 +0.150653729604558,0.2983684559594173,32.58250195202131,10.691117210931829 +0.15034831028183657,0.30156960444696795,24.53659358808907,8.300184223895048 +0.1499069158081259,0.3051829330620302,25.05523214263512,8.798804250088713 +0.15020995838908335,0.2933526340494089,33.122720943401575,10.242189137246289 +0.14789795748937695,0.29714314541283404,24.015180317701745,7.629136494945911 +0.1497490255614566,0.2942401879846339,37.11894631556975,11.639167005956033 +0.14886633552128506,0.3030341551200493,29.591222189444988,10.024774043175361 +0.14933658153342824,0.3045162294525463,31.073429785486365,10.771386628029983 +0.14920264709700098,0.29225579053370493,30.459711721498177,9.24904385489372 +0.1482446649734762,0.2928670391176107,33.38848329781785,10.1521030698736 +0.15135438685869412,0.2969229977413132,30.42098022765133,9.932298619030039 +0.15014277672443208,0.3000196861884131,37.459940378455656,12.413770785108312 +0.1493298329631623,0.2979177662874133,25.912503979045702,8.333310270388866 +0.14855165735839745,0.29979013952537475,28.10669409284742,9.21518381839141 +0.14842805846243698,0.3043056770128097,31.40496622721553,10.745750313701324 +0.15072681642846839,0.29771655790625146,32.94956258372149,10.731819700850084 +0.15024667587370405,0.302566643315993,29.680824966097852,10.06816731065838 +0.14908924385888678,0.29757736999835044,28.339363857333595,9.121066945039175 +0.1517744741184002,0.29673053705403485,31.375578925495883,10.170048220676103 +0.14842002212696775,0.30060406751079877,34.247559162911216,11.284088034839845 +0.14900337357647908,0.3014189929994734,34.71736394751464,11.56164518270468 +0.1496211063002685,0.29439314197360267,31.085324038483478,9.71712874696822 +0.1494740039213615,0.3044642789050865,31.466918413399554,10.869470762059363 +0.15055313670523002,0.30317067997947944,29.85530237840948,10.277416596584299 +0.1487859970985092,0.3016126088750556,27.82783177432842,9.236857484705734 +0.14865243974388032,0.3026989406539749,33.626533978086755,11.368874992986296 +0.15019731609967235,0.29522161706102534,28.445131764591224,8.98189677883556 +0.14956924451364673,0.30206887692356604,30.949665534830896,10.468452686473045 +0.14836796313145892,0.30049819811884504,32.38861910411385,10.635274558884177 +0.15035178553180187,0.2932534346826723,24.79609275663509,7.669131304754092 +0.14984902868719416,0.29435333946454245,33.965604545111496,10.682517217139205 +0.1499524657469356,0.2984460996070768,27.667050417580764,8.98813735973988 +0.14908510535194372,0.29704099372200415,24.320825965764605,7.7258098321356545 +0.14982234256488167,0.2974484722306304,37.42880519805877,12.103752534928198 +0.1484458597086347,0.2978486814221021,30.350575828480498,9.711388612612947 +0.14989752083867666,0.29910403900479327,25.9700194262035,8.520982556367255 +0.15108036985036605,0.29606678796754016,26.720025456547518,8.575942193359118 +0.14870933884231602,0.29592743504497454,34.19449804232284,10.740054875175353 +0.14814516776684403,0.2981260931836523,33.31975172683718,10.681666718307918 +0.1499466825507866,0.30337355132633653,30.455337430373994,10.382902863852202 +0.1490454449982624,0.3017904951955264,30.912286340577257,10.321304992227322 +0.1497017566448227,0.2919410159502931,31.59855928412209,9.646140783126874 +0.15017053520338244,0.29637698761299264,33.081574395118274,10.641578624298639 +0.1499404753383808,0.29615417064942967,35.21874809757844,11.266719754044953 +0.1492295631723333,0.29192066306717207,29.37835407921179,8.902607144071771 +0.15096991515529465,0.30629875830664705,30.371716903092697,10.84802144225713 +0.14852857751670775,0.29978581624540834,29.39371016558173,9.630326521634116 +0.1502603910804987,0.3027457545304455,25.62263613621338,8.721479452445674 +0.14921070334706618,0.30156799952864866,28.219475037024115,9.448223592182838 +0.15037400864649794,0.29953261641158657,34.19280412033338,11.297265167659226 +0.14968578226200424,0.2940107235667621,29.841462651217675,9.316080598035045 +0.15009826661294642,0.29184035730028157,32.167137408940896,9.788086877294296 +0.14737402606234798,0.3044961194528802,30.48859345283718,10.366157773697994 +0.14939479473064646,0.3087994491660741,28.35872190672944,10.224643020995622 +0.14949017878483578,0.2961674205276579,31.026282214256135,9.855236676899592 +0.15041796766603474,0.29638604277892155,27.077255478202883,8.672116333996538 +0.14935501246803068,0.29427920334743446,26.3457070192256,8.176585285918648 +0.14995614927077464,0.30060121540520446,27.631901526308265,9.224758158241785 +0.14784172021468828,0.2941542711547484,32.81735604963042,10.149024574712012 +0.14920859736664008,0.3036925192952972,26.174328060601667,8.931638855355299 +0.1495743122913789,0.3035037195170273,27.332531315917766,9.399583240203311 +0.1500942992637808,0.3077690158433898,29.924660469581163,10.654892996427252 +0.1502854080726727,0.30130253824596387,33.31958086047155,11.234172674127995 +0.15043310448174962,0.29626056723482114,28.71496003999646,9.215509745910987 +0.14976631528288586,0.30349499674192776,29.780594807306446,10.153503926343516 +0.1477311517198725,0.2899975632174251,32.45463769552771,9.565954930826294 +0.14839862461960018,0.30201043419554224,27.405098265616207,9.114587082720192 +0.14988687207411927,0.3063525509392931,31.607618555728962,11.174284443705846 +0.14860026277715496,0.2921306359434917,30.664154138642047,9.310010813128748 +0.1492577357745439,0.30651099646336893,28.266863448602724,9.892024493061953 +0.15102842831308774,0.3091317525866396,31.83195068734497,11.646940346455905 +0.15138783006106968,0.29855496016923166,33.41878996815118,11.008649109673758 +0.14825064053598463,0.29919579074581826,34.96522842456004,11.320059507576829 +0.15016872202201303,0.3078414952837485,33.778179257372976,12.068014278267185 +0.14861139065025047,0.2981333867410804,35.25272488959999,11.326117506018935 +0.14801192562670992,0.2919287677768186,32.919132810511144,9.947062533683114 +0.14946465318469385,0.2992616424669362,25.904047502247188,8.531294514461806 +0.1491328543750145,0.30198722402428063,30.909061728371487,10.348459104862874 +0.1516555115233963,0.2949977069871955,32.392631408079026,10.28769050190307 +0.15082930771253064,0.2992986431095184,31.07955044340652,10.321294559194119 +0.14949008234689393,0.3006743681382189,29.14827525657818,9.696110058207728 +0.14975770275042077,0.30381420451715097,25.471139143741716,8.734261711841862 +0.1480198740560158,0.2989804866067878,29.62300034335842,9.613663798118438 +0.1503484029490885,0.2955841852585785,31.10030960929874,9.891722978111142 +0.1497500048159324,0.30421813654626345,27.47437400891313,9.49925682235692 +0.1490437606354778,0.293739718011721,34.050432952125064,10.519080007489698 +0.1520745484174731,0.30680132819429606,34.021255738880335,12.16245720256891 +0.1489356403705011,0.3000243023328318,18.669924274827522,6.154977829928493 +0.1485472833570378,0.30624545381821994,33.68706208178396,11.754206912449384 +0.14800748818065967,0.30127888121440183,32.33301824115385,10.674038488981582 +0.14981286956435289,0.2992762111063801,32.089699287167214,10.466302709604163 +0.15073442164293052,0.3016481531980852,32.54174409390011,11.013633578973714 +0.1510567349493497,0.30255489435504257,29.79339627584716,10.188281204876874 +0.14973880588267158,0.30413552385728193,30.58549991496495,10.536777734583989 +0.14960706256577835,0.3022498444699225,29.78172138087522,10.134687449699587 +0.14909432226954286,0.29651940627546586,31.376240044433082,9.972539441943908 +0.1501622243091739,0.3091285178848296,30.304412366688787,11.03092820089743 +0.14939515464805536,0.2952976936462183,29.25126619445309,9.186627145773603 +0.15132246700683033,0.30081608248025016,34.53457578296701,11.62780274822593 +0.1503091747641655,0.30203437940971983,31.344947911719842,10.665318783655458 +0.15137016503222664,0.30094429892742064,25.90660377826598,8.773694801364993 +0.15179818882427043,0.3011352330452675,28.932319531014066,9.830334151648294 +0.15046081259367824,0.30094039943436884,31.92012616577994,10.725407353867492 +0.15083967146596589,0.2948976202644054,35.520841568873415,11.27578750495999 +0.15041601327739001,0.2954863736852537,29.207248792660696,9.221902387935785 +0.1500401227787799,0.308384125449839,33.04548403249105,11.917283742541551 +0.14822975964839888,0.3023966895359634,29.713086050735743,10.006340478363473 +0.15016974903527308,0.30404580115183316,27.174857414239817,9.371206396014665 +0.14918160616652698,0.2964901238404795,31.502075108251642,10.033616147539568 +0.1481346961275278,0.2971270007759488,30.80241107175193,9.815827635240696 +0.1515743056852208,0.30031696175794426,30.484788703241083,10.314051752358239 +0.14907361047809017,0.2981645426522144,40.04689079431709,12.928410893676572 +0.1481913342592643,0.29884484333383476,24.227380272832313,7.83586742468237 +0.14977107902684916,0.30406933736696223,29.241116109863654,10.049993431635595 +0.15127447533402522,0.30750751266025944,29.457563756971048,10.547165976662475 +0.149109103672673,0.2985798821852634,25.95082350353434,8.43415829175974 +0.1500052180066964,0.2981352791288554,30.93882886908194,10.008775778394677 +0.152354230163436,0.2919583941917942,32.937696390581564,10.191738492107747 +0.15008190978310482,0.30256849110388956,30.230721544853598,10.32552114258786 +0.1504872137433576,0.3002427495081483,29.91853867961132,9.940137073578613 +0.1516572059055469,0.3000238696199626,26.8223698199233,9.01802873332646 +0.1512470457073407,0.29331158220684017,26.8652980815075,8.386090787777544 +0.14942920862705247,0.2947469289414168,31.607982587908005,9.926246223244236 +0.15005950123754794,0.296038865063365,25.370099366194324,8.113216347643426 +0.15059588861189768,0.2989162011247787,32.02719941589581,10.5226705335392 +0.14949674363200358,0.2977780663981329,30.66842430340807,9.885801455056344 +0.14863041793181656,0.29847846135490685,32.94676338254714,10.653764957402162 +0.1486087429225583,0.3008020663795074,35.10461540045329,11.677522946602645 +0.150758226127179,0.30748034696327586,33.03496477266876,11.897921127619467 +0.14973620880815455,0.30320327816931997,27.447579810030344,9.392407230874236 +0.14913385144760163,0.2930159313034078,30.44552067440856,9.392738381735198 +0.15004064670655606,0.30313654243491955,31.21650811154401,10.652163341200263 +0.14941974500856597,0.30743434170091505,32.43461830812643,11.518254589133251 +0.14869836583638749,0.30458288930009586,31.090008587329663,10.73761006814985 +0.1504478316413525,0.2968151705984984,33.48226807500696,10.768088896103029 +0.15080580179569966,0.2953336232244747,30.52785575915304,9.725614218256421 +0.14948955555533,0.29842625401706996,32.492833816786295,10.513788630457611 +0.14941641136507766,0.30495588898298076,25.954184614957946,8.990485501083473 +0.15199683069998346,0.2997435593913502,34.039266964101145,11.432318398253765 +0.15224822601553545,0.29802311664568043,33.30495217366891,10.935399174931687 +0.15077054599774878,0.30155602783667285,33.49953368216873,11.303194919888423 +0.15087927693268152,0.30115890173944476,29.97050655306997,10.091072606914702 +0.14936530397103656,0.2962291233043873,28.140543871010337,8.887986527314228 +0.14960695395476345,0.29893421618976135,31.269241642402008,10.18257831225109 +0.1517059848093937,0.30180797940885234,28.306464200761642,9.677874879566797 +0.15138883202137635,0.3014226774393414,29.991053060833334,10.188053593780248 +0.14976707105702788,0.2941709060564584,29.09757077782726,9.06248816684724 +0.15118934934540657,0.2959254332323661,24.48732722024753,7.802420352259426 +0.15077917902788368,0.30868866855059235,28.89059481172245,10.483961697335953 +0.14907276279293427,0.30370938168126566,26.03689976665551,8.85870678884724 +0.15013196261508524,0.3040536580464752,30.59002292868816,10.602686488235804 +0.1493926006906491,0.29815340544594,31.80395096590623,10.321827761325519 +0.14930541810251666,0.30410248847269905,27.789085656557923,9.498036874869632 +0.14990568736909052,0.2992143945472167,31.804761180219412,10.428356808058645 +0.14855498290235547,0.3028474776936483,27.792475996815217,9.373956041411443 +0.15003531415814222,0.30256536173482534,31.71621948078119,10.719834585503794 +0.15186806136960865,0.2962196093187158,33.23490864268922,10.756331226147884 +0.14974691851021218,0.2991913443091309,26.71160560382483,8.715272306797946 +0.1514421747581074,0.30455529490065997,32.421648925840074,11.329456432084601 +0.15191406617636996,0.3002103609286297,33.06295285095912,11.213431079973269 +0.14969194522363813,0.3004612643666757,33.27553707073521,11.021632285308678 +0.14945934516993015,0.29648025822890733,29.413848980581058,9.334514461184511 +0.14997904536628814,0.29851634963749124,30.38987261429582,9.918582522365556 +0.15187477173183844,0.3083010275099292,24.851545838239282,9.031602176491255 +0.15068552106451608,0.3021616559881324,32.820967440810186,11.174712248561631 +0.1505412093991277,0.29644968865538074,32.72755839723797,10.514594483445999 +0.15084033666193333,0.2888174857985579,24.896186749913678,7.422344930560398 +0.1497928336301585,0.3065319513053497,36.362106263175264,12.769160517809167 +0.14904011194245978,0.30027544003191947,32.129561736067885,10.561795640207123 +0.15080192787017302,0.29663754901140627,35.72444513495367,11.492153975113343 +0.15019347028359592,0.30283168364351515,28.673880623362063,9.760585993330068 +0.1523287050362359,0.29829041527459677,27.231637116894962,9.050933130394744 +0.15069802340999086,0.29551809897368997,31.428002069016337,10.03649326172372 +0.14851986601822706,0.3012251381661157,32.585498231519566,10.800288973461065 +0.14968016506727438,0.303321220583436,30.026499016911426,10.28835074886064 +0.15160233890180602,0.3009062979010729,36.30082395433563,12.208546111237206 +0.14812242092386677,0.3003925122536717,23.873204334927422,7.865096166632972 +0.1487214605669303,0.3025192647532891,27.891226309009912,9.39846018906425 +0.15187390700263156,0.3034566827564279,31.181713669054282,10.839446905289394 +0.14987187762483922,0.2965116108166391,24.086954149504688,7.7230121694792695 +0.14993042713215274,0.29687167990378116,24.838571184936143,7.994683234338886 +0.14968797980321843,0.3050089818347094,30.309063962309903,10.510822236917415 +0.15000386423747916,0.2924824083169497,35.46323227495485,10.887632097109615 +0.14975299606780448,0.2976972444698824,32.33181118844643,10.451712669981788 +0.14905566421987113,0.2930696517370505,29.325430901239795,9.006489365214296 +0.14936081892301833,0.3046413176350899,30.953109768477667,10.750506181213838 +0.15020608217161213,0.29698297091812853,39.89057765926289,12.792379334196454 +0.1489398212171489,0.30096054324320226,28.69750896002852,9.541029047098144 +0.1502367406999258,0.30483006778544747,31.608301914016636,10.992591238279495 +0.1498863953375269,0.29946680141881404,30.067833967312545,9.869653910666653 +0.14995874770395146,0.3067949955144337,38.13342201927412,13.521707634835813 +0.15141061958943894,0.29683416438766386,33.052977270373084,10.719516165779542 +0.1510815109532038,0.30212633940163347,31.71925030443675,10.858781289575333 +0.15072766963575016,0.29396474750220364,33.476999527707044,10.516308263497132 +0.14972961735317802,0.3023469322869604,33.98048141843153,11.44088670880714 +0.15067616527960637,0.3025016168771485,32.781952985688235,11.149267552514027 +0.15069765161784923,0.2986159496375919,31.47139915113055,10.306757824641947 +0.1507489578141288,0.2931693367728534,33.90183188914584,10.55193760919378 +0.15065197338780262,0.3105237919889188,29.67454190997589,10.970097286914655 +0.15057715666617702,0.3066599223783641,33.10773254399766,11.806078223385624 +0.15010962352733837,0.30142418274355137,31.178465062011103,10.501458918465815 +0.14955002542314652,0.3069636747252206,26.608670672594876,9.385678119912605 +0.14880874445883888,0.29491212658388444,31.11695618718649,9.690236247007395 +0.1502715775141707,0.3046295490652119,32.40697252817482,11.305994690959123 +0.15079436610174962,0.2962610539507452,30.499895463886578,9.7693536902944 +0.15075696800214014,0.3026730101751817,28.63407026565214,9.808688122983465 +0.15097370967711785,0.30073789476906426,31.307864202660298,10.51155495210636 +0.15078985272900608,0.30760517009623056,28.854616107954836,10.344583682796843 +0.14882191977122053,0.2969559110693046,33.960581457170576,10.830203257439626 +0.1502220834037896,0.2972447306833727,30.298885875108724,9.747014567258324 +0.1472027773793738,0.30397418851765745,29.779437964179426,10.062838904830029 +0.14995334423757045,0.303441341202552,32.67994854608827,11.20811958357367 +0.1527670994536614,0.30000237685706355,26.616511784372406,9.00651640038054 +0.1487475707380604,0.3005622054252957,27.16177254451676,8.946824085973887 +0.15032522255025163,0.3008562752590758,33.046391695537295,11.079152473234817 +0.15080721076707845,0.2955135649308298,27.795577876351448,8.859412648133938 +0.14930860113410793,0.3026531626286513,29.611935924863037,9.999902503914228 +0.1497944431557947,0.3043979766583116,36.06588748433671,12.485792100861987 +0.1508845886756924,0.2987230701239053,31.89152176589562,10.474513570906241 +0.15204338753418015,0.30085451183678036,29.694607770203742,10.080794296559041 +0.1508360625288325,0.2964205011319248,33.38799720975172,10.77716542796697 +0.14931773969525197,0.29337095951701325,30.89844628903715,9.538479717213031 +0.14945537919573137,0.3052573372814481,27.058592089193194,9.442379666341068 +0.1504357013971954,0.3023319198348644,29.128241505810564,9.894514702590353 +0.14854688339528863,0.3041349951423451,31.290409247370008,10.712076115863551 +0.1513105104259164,0.2967438244680712,33.385445988212645,10.77910944152698 +0.1496026799130961,0.29516435601163044,33.56754347301672,10.571498943306835 +0.15114704641894508,0.3057538395034736,33.79686433692095,11.95973389740671 +0.15071592932351077,0.2970341318988117,26.76324654246937,8.65486156377754 +0.15152197972150733,0.2995277387334031,30.342395134448076,10.113647986793167 +0.15036421526970417,0.3017045266364655,29.53081786068933,9.98960664733626 +0.15046383333102722,0.29232757616338473,28.712850083450004,8.826941785721182 +0.1509655795625167,0.30013326882249786,33.21640962285784,11.038170704216343 +0.15073078964278194,0.298512226117998,38.87406978670754,12.667699015806317 +0.15173344962620824,0.2992726522160836,31.77875409603203,10.497415535328063 +0.1502808781068652,0.3045390781465455,29.9666162291207,10.42285982752639 +0.14932367052978535,0.30524678834807195,29.368265329214143,10.157829564377053 +0.14927901009135286,0.2981533022103994,29.469522361544687,9.549534806300898 +0.15037320317757633,0.30140603716143133,35.26562885849645,11.919002149240804 +0.14999985729993287,0.2963197466537008,34.76717474230222,11.068448637624064 +0.14888148555488526,0.3014331902947741,33.08083313461529,11.003634367117744 +0.1494007565566521,0.301065055475783,28.52157033311379,9.546270307059151 +0.14959775241999207,0.2979009059404781,28.12254296751511,9.072070388673344 +0.1492180141733341,0.29376379385836016,29.859852532414997,9.243316469465576 +0.15194036406928266,0.30684370207110623,27.946086026146595,10.00268642225216 +0.14998477878158945,0.30006929891941453,32.79766388448502,10.821560496579876 +0.1490138409813838,0.30341470774757956,31.709715397521627,10.78705829559199 +0.15049780840455165,0.2990262855428169,39.4016506311597,12.927402760826936 +0.15091500531147842,0.3003835079194184,33.5058141172669,11.237692985666934 +0.15008736050359933,0.2933965207331989,26.678454115675983,8.270491944313722 +0.1474308332754758,0.29780890217872014,31.245893152955514,9.956461062123358 +0.1526969268051385,0.30400552746151027,28.67817422073331,10.081099811044943 +0.14984431441129095,0.2999354012821707,26.171946770547457,8.666705036514104 +0.15049958289486254,0.30132488386535106,33.078351859798794,11.18450155189797 +0.15220867183884765,0.2968029341151998,33.12299255548963,10.74639020036753 +0.14920125201050682,0.29940640248002864,34.270793778315266,11.217884261892223 +0.1497466180986925,0.30162753706979234,33.42409775699059,11.234607438058239 +0.14867875290509838,0.2882641010595247,33.240770800727475,9.730202681900646 +0.14927963370516795,0.29244584844515314,34.65836562995973,10.636866485042491 +0.1497554478916365,0.30360459121291283,31.29922151429405,10.723046134545028 +0.15125157489179983,0.30230814676836437,31.888980881236897,10.914069317724302 +0.14864372960282007,0.3026184550948954,24.68731206719738,8.265289553748579 +0.1493032164687627,0.2968825155860467,29.490569388615196,9.399574826256723 +0.14994623912423888,0.31024120870835714,28.071019980768984,10.244456216190526 +0.15006706684492727,0.3006454637244262,33.05868543777737,11.016768361424038 +0.1506224830700678,0.29939463613952344,31.34593157761961,10.343712719539697 +0.1502462713060135,0.30668299738701515,28.7289391069407,10.212404227913613 +0.15159085356295673,0.29457175833614485,29.69717146682835,9.394478799094331 +0.1499844017200477,0.29471659493667446,35.679901872384384,11.15875402297158 +0.15158993132306456,0.2983337762650887,31.172322567145017,10.32850586178081 +0.15046306668741416,0.29613860714434986,29.25642749473277,9.315778440315842 +0.1489698586804745,0.2984757703398498,27.728244975938633,9.045047823154563 +0.15168186424454014,0.2946837204983158,31.529683152156288,10.020714555418829 +0.14971508588846336,0.2896671888855328,30.38723245635816,9.050478942968764 +0.15183601311247422,0.3005830302644944,28.409727330127897,9.545614268503403 +0.1521553948068235,0.2947438103987859,32.66246359838032,10.398921684347599 +0.15079480027239772,0.29355347929825576,30.67618329669741,9.538535578231993 +0.14951905797091156,0.2995081955654008,26.276484066718606,8.623546364028718 +0.15123283684526295,0.30377231701673685,30.74241332204473,10.715897902484917 +0.14870387310069935,0.3034603305019377,29.726467581903176,10.124754894432925 +0.1497109403288454,0.294025462078789,30.126137450355863,9.36972950785382 +0.15061968993239297,0.3008716673405388,29.154360138652947,9.804269839658408 +0.1505344665905559,0.3007339928614618,28.053628856339536,9.3690290595295 +0.15095843320894775,0.3040272371872766,24.88092720023686,8.648622726091965 +0.15006978672791496,0.296265880674527,29.021242776596516,9.286657604489406 +0.14952997229262924,0.2982279938485511,33.83289095939914,10.940715614218892 +0.15152639754539454,0.2999386257483888,22.371974869567588,7.490660754475877 +0.14825865011847922,0.29649131515894434,29.634996874090856,9.355375829797756 +0.15002855158867914,0.30607144915129897,27.210365578522815,9.545951340680615 +0.148466259929669,0.3070457806115962,31.640009261734342,11.109071942478634 +0.14915918217215268,0.29844949384232794,33.60444686711569,10.941363657330157 +0.1502341592819998,0.29419938075548036,35.458890469601755,11.103711875053717 +0.15042621491397754,0.3072120701235366,31.725613846709514,11.2772730139953 +0.1504229720592804,0.29781788878922594,26.50445532406127,8.687976261753704 +0.15055299266432617,0.3009954101128926,33.48338335760052,11.274033417132973 +0.15114802899526095,0.3008172350236654,23.06645741795298,7.797329526914034 +0.1514829420760294,0.29902548599667006,31.11079756313551,10.35575651236677 +0.15048791508247808,0.2942266534582375,29.981445056039792,9.422479213201646 +0.14937600824050212,0.29323572694212235,32.38169121556348,10.042673799954978 +0.14973879208576485,0.30730928234815874,25.592523261447056,9.056090571196272 +0.1504578726046403,0.302279251938586,21.9901272546769,7.465971819244437 +0.1504641950638229,0.29455257036202653,24.618559306877874,7.748001178602279 +0.15128273080375812,0.30305467447868756,28.11888092916806,9.661132103747788 +0.15158392041776012,0.3019104024198162,28.115584594402243,9.561793846512629 +0.15037605453753677,0.30385708271534106,36.25476716889489,12.466440505755221 +0.15197926348001858,0.2915895494296114,31.356471158624363,9.672034160321084 +0.15051189069049203,0.29589631116438825,32.03475213270902,10.274858445265787 +0.1483498091262607,0.2966842723563442,33.10441659513931,10.444535260235417 +0.14994956386713443,0.3068922295621916,30.911747183507448,10.951746922409344 +0.1486570436745984,0.2988577036003469,32.96615503532279,10.628631378259533 +0.15030651069314943,0.297588848959711,29.235702983944506,9.498936550608287 +0.15191474698080243,0.30338501092546266,26.130151433546438,9.121090509324869 +0.14929983455198748,0.29647794536367783,28.214912680738195,8.97423087485924 +0.15141147924930615,0.2931972462407378,25.315958179081328,7.925432838646991 +0.14991586749136887,0.3058177202589954,26.044270364092522,9.112576727364925 +0.14767718645628675,0.2910148146089071,40.289061779511435,12.011983023398203 +0.15112921813862626,0.3029642355947397,35.62505981111805,12.308505253334385 +0.1504869471367079,0.2990959906699776,26.27836867508219,8.616237944988947 +0.15195633890608237,0.3005714478588066,29.28291008275983,9.934423047846133 +0.15028753209698664,0.301144138101138,29.975373944011164,10.058560622602238 +0.1506195930190322,0.3000438501009137,33.32678709780535,11.081594402233753 +0.1508272489820335,0.30661714363689896,35.775909040895755,12.725505705667086 +0.14868103411612757,0.3030837027099698,28.612208457503527,9.75745752321023 +0.15003557779518098,0.30335650179537704,28.17093687454318,9.621504179229728 +0.15103763337471945,0.30255731282695614,33.86615386692645,11.584948939543866 +0.14932435406598107,0.30074806103284507,31.95063884492903,10.63227481271124 +0.14931315625960795,0.3040295758031785,29.40624833982933,10.06380300012516 +0.1504650433283574,0.29409958990664326,27.168726086031427,8.515129468448166 +0.15061282739317755,0.3053014606340604,23.28820572194536,8.147903831827698 +0.1492119782970842,0.2997278889514853,37.71694418265116,12.329842520802298 +0.14998511885140048,0.29702846549255,33.73901245925508,10.85705519760846 +0.1508667098226756,0.29992932184442084,27.851559286819743,9.235368970995923 +0.14920102850078143,0.3030252668356909,33.01996889966566,11.28875696673719 +0.1507210749658682,0.3063064663876098,30.23955918385737,10.683480485744928 +0.1492873727618258,0.2960493858467969,25.64112484114324,8.10342974662121 +0.15097037898794394,0.303449676761166,28.79473569746567,9.93405053961764 +0.14846707199509213,0.3002570732049601,26.453272868430883,8.705670904183815 +0.15078695736168934,0.2974668044886989,31.876957854641496,10.282830539942806 +0.14848900868513468,0.3083387385284128,33.98677737199045,12.09208002663876 +0.1488408838607492,0.2996104272312263,26.035069646698037,8.508334175152296 +0.14883275705840793,0.3102731527051896,30.107443604196416,11.009899730136926 +0.15010913808313814,0.29908912810442956,28.154562557107557,9.273402832432918 +0.1490655639954912,0.3010119668416879,25.359574030855455,8.391844801836603 +0.148558081060578,0.29747509014451545,26.875108313699997,8.560954577476684 +0.1510498532456531,0.298928316158837,29.714747397833616,9.825387439292449 +0.1509891328655058,0.3027539712709605,36.442026054639385,12.471381560361195 +0.14934545468586863,0.3011992168898658,38.844544677385684,12.937631950229802 +0.14817802603662444,0.30148610311764956,29.71032382178374,9.884767270813759 +0.14862514808091665,0.29314426869359006,33.04335421790559,10.101151696524523 +0.14956192066911345,0.2953331466913765,35.79463931302081,11.237391956678191 +0.14882819851081278,0.2925284229608988,27.7049644868336,8.462174726929774 +0.150194578332161,0.30092498170424703,34.64105438601209,11.556561099625988 +0.14805297157197594,0.2981085652542085,33.69928674466049,10.814121744209455 +0.1488304440548724,0.29575087110575515,32.53835987761112,10.253095990772321 +0.14751063183396998,0.2977300978951996,26.586185718579582,8.492737260230047 +0.14998229528725218,0.30746961125029093,27.50700790187116,9.843225593523275 diff --git a/tests/test_model/PosteriorGeneration/PosteriorGeneration.py b/tests/test_model/PosteriorGeneration/PosteriorGeneration.py new file mode 100644 index 0000000000000000000000000000000000000000..c07594b7493d70b5e1fb2f1d0ca33b3a50916144 --- /dev/null +++ b/tests/test_model/PosteriorGeneration/PosteriorGeneration.py @@ -0,0 +1,174 @@ +#!/usr/bin/env python3 +# -*- coding: utf-8 -*- +""" +Created on Mon Nov 11 2019 + +This script generates the posterior distribution of the CO2Benchmark model +for a synthetic data for three given uncertain parameters using 10000 MC-Simulations +of the original model. + +@author: Farid Mohammadi +""" +import pandas as pd +import numpy as np +import os +from tqdm import tqdm +import corner +from scipy.stats import multivariate_normal +import scipy.stats as st + + + + +def BeamModel(theta): + #### write an input file + global beam_span, i + Beam_width, Beam_height, Youngs_modulus,Uniform_load = theta + Youngs_modulus = 1e9 * Youngs_modulus + Uniform_load = 1000 * Uniform_load + # Get the number of function runs each 100 NOT necessary, just checking + i +=1 + if i%100 ==0: + print("number of evaluations {}".format(i)) + + #### Run your surrogate model here. + I = Beam_width * Beam_height**3 / 12; + output = np.zeros((11)) + for i in range(1,10): + X = (i/10.)*beam_span; + output[i] = -1*Uniform_load*X*(beam_span**3 -2* X**2 * beam_span + X**3)/(24*Youngs_modulus*I); + + return output + + +def RejectionSampling(mcParametersets, origModelOutput, Data, InputNames): + + + MCSamples = mcParametersets + NofMeasurements = len(Data) + NrofSamples = len(MCSamples) + Sigma2 = (0.01*synthData)**2 + Sigma2[0], Sigma2[-1]= 1e-10, 1e-10 + + # Covariance Matrix + covMatrix = np.zeros((NofMeasurements, NofMeasurements), float) + np.fill_diagonal(covMatrix, Sigma2) + + # Likelihood + Likelihoods = multivariate_normal.pdf(origModelOutput, mean=Data, cov=covMatrix) + + # Rejection + # Take the first column of Likelihoods (Observation data without noise) + NormLikehoods = Likelihoods / np.max(Likelihoods) + + + # Random numbers between 0 and 1 + unif = np.random.rand(1, NrofSamples)[0] + + # Reject the poorly performed prior + acceptedSamples = MCSamples[NormLikehoods >= unif] + + # Output the Posterior + + Posterior_df = pd.DataFrame(acceptedSamples, columns=InputNames) + + # Save the posterior data frame + Posterior_df.to_csv('./Posterior.csv', columns=InputNames, index=False) + + return Posterior_df + +def posteriorPlot(Posterior, MAP, InputNames, nParams, figsize=(10,10)): + + figPosterior = corner.corner(Posterior, labels=InputNames, + show_titles=True, title_kwargs={"fontsize": 12}) + + # This is the true mean of the second mode that we used above: + value1 = MAP + + # This is the empirical mean of the sample: + value2 = np.mean(Posterior, axis=0) + + # Extract the axes + axes = np.array(figPosterior.axes).reshape((nParams, nParams)) + + # Loop over the diagonal + for i in range(nParams): + ax = axes[i, i] + ax.axvline(value1[i], color="g") + ax.axvline(value2[i], ls='--', color="r") + + # Loop over the histograms + for yi in range(nParams): + for xi in range(yi): + ax = axes[yi, xi] + ax.axvline(value1[xi], color="g") + ax.axvline(value2[xi], ls='--', color="r") + ax.axhline(value1[yi], color="g") + ax.axhline(value2[yi], ls='--', color="r") + ax.plot(value1[xi], value1[yi], "sg") + ax.plot(value2[xi], value2[yi], "sr") + + figPosterior.set_size_inches(figsize) + figPosterior.savefig('Posterior.svg',bbox_inches='tight') + + return + + + +if __name__ == '__main__': + + # -------------------------------------- + # ---------- Initialization ----------- + # -------------------------------------- + np.random.seed(42) + beam_span = 5 + i = 0 + + InputNames = ['Beam width', 'Beam height', 'Youngs modulus', 'Uniform load'] + + # -------------------------------------- + # ---------- Data generation ----------- + # -------------------------------------- + + xdata = np.linspace(0, 5, num=11, endpoint=True) + theta_true = (0.150064, 0.299698, 30.763206, 10.164872) + model_true = BeamModel(theta_true) + synthData = model_true + + #plt.plot(xdata, synthData, 'ok') + #plt.xlabel('x') + #plt.ylabel('y'); + + # ------------------------------------------------------------------------- + # ------------------ Naive Monte-Carlo with rejection sampling ------------ + # ------------------------------------------------------------------------- + ndim = 4 + mcSize = 500000 + nofmeasurement = 11 + Likelihood = np.zeros((mcSize)) + mcParametersets = np.zeros((mcSize,ndim)) + + # Beam_width + mcParametersets[:,0] = st.lognorm(s=0.0075, scale=0.15).rvs(size=mcSize) + # Beam_height + mcParametersets[:,1] = st.lognorm(s=0.015, scale=0.30).rvs(size=mcSize) + #Youngs_modulus + mcParametersets[:,2] = st.norm(loc=30, scale=4.5).rvs(size=mcSize) + #Uniform_load + mcParametersets[:,3] = st.norm(loc=10, scale=2).rvs(size=mcSize) + #sigma + #mcParametersets[:,4] = st.halfcauchy(loc=0, scale = 10).rvs(size=mcSize) + + # origModelOutput + origModelOutput = np.zeros((mcSize, nofmeasurement)) + for idx, theta in enumerate(mcParametersets): + origModelOutput[idx] = BeamModel(theta) + + + # ------- Generate & plot the posterior ------- + # Rejection sampling + Posterior = RejectionSampling(mcParametersets, origModelOutput, synthData, InputNames) + + # Plot the posterior distributions + posteriorPlot(Posterior, theta_true, InputNames, nParams=ndim) + diff --git a/tests/test_model/SSBeam_Deflection.inp b/tests/test_model/SSBeam_Deflection.inp new file mode 100644 index 0000000000000000000000000000000000000000..d8758c4a3f8562d0c4f521bf07e3f472e8a0e5f3 --- /dev/null +++ b/tests/test_model/SSBeam_Deflection.inp @@ -0,0 +1,6 @@ +% Input file for the simply supported beam model +0.15 % b in m +0.3 % h in m +5 % L in m +30000e+6 % E in Pa +10000 % p in N/m diff --git a/tests/test_model/SSBeam_Deflection.tpl.inp b/tests/test_model/SSBeam_Deflection.tpl.inp new file mode 100644 index 0000000000000000000000000000000000000000..6bfc3fe96c62923b0a89bde26b5dd83375a418db --- /dev/null +++ b/tests/test_model/SSBeam_Deflection.tpl.inp @@ -0,0 +1,6 @@ +% Input file for the simply supported beam model +<X1> % b in m +<X2> % h in m +5 % L in m +<X3> % E in Pa +<X4> % p in N/m diff --git a/tests/test_model/__init__.py b/tests/test_model/__init__.py new file mode 100644 index 0000000000000000000000000000000000000000..4287ca8617970fa8fc025b75cb319c7032706910 --- /dev/null +++ b/tests/test_model/__init__.py @@ -0,0 +1 @@ +# \ No newline at end of file diff --git a/tests/test_model/data/InputParameters.csv b/tests/test_model/data/InputParameters.csv new file mode 100644 index 0000000000000000000000000000000000000000..a0ff5dcf2f2576aa57f06a6c696b42db6856d4e2 --- /dev/null +++ b/tests/test_model/data/InputParameters.csv @@ -0,0 +1,501 @@ +Beam width,Beam height,Youngs modulus,Uniform load +0.157273329338393,0.315533780303244,31680127940.9143,10643.4004588287 +0.138141895643606,0.308218660642714,28321606595.7333,7647.68743220827 +0.149535905747769,0.306605844437465,30552276402.2584,9236.23189018043 +0.153383076910337,0.295497711468594,31761399663.944,7309.16022380918 +0.148200930653566,0.293817818770393,28018177950.2595,11966.8615497731 +0.155163413920491,0.298580429033683,26833968221.9714,12509.103705398 +0.15127259014584,0.316329725288591,35178534974.5191,9214.47221317446 +0.14875343824136,0.311973945216133,24850753238.6524,9387.67488771496 +0.151756833722548,0.296311569518993,25961923101.4477,10889.4840523989 +0.150728984042148,0.354436738364159,22957269053.1972,9642.72342687284 +0.150163255227266,0.306203460414847,22160128744.8397,14239.2076304184 +0.146098657456629,0.312141500135723,31358307777.8954,10684.3198694204 +0.159272350629841,0.307411055030341,39307062162.4182,9977.19695224498 +0.154839475948027,0.294281413758414,30242289491.0974,9702.12972655218 +0.15587358045112,0.280152827690146,23121684518.2006,9064.17404524275 +0.152972209050633,0.324842476073234,31014319169.6111,13895.0556840787 +0.142687801246096,0.299336640713574,29221071579.1713,8431.81667864198 +0.155313584912084,0.306312280867227,30769034883.6714,9073.18034281152 +0.150834807159884,0.30176628986798,23455841842.6986,12853.1092616226 +0.15705376912135,0.318983539423807,29806311279.8473,9118.90317351403 +0.142772783709399,0.304533185614055,34222907263.8048,11382.2856802332 +0.152741198796834,0.271688989917762,27609276746.9817,7626.82876146585 +0.149480548119323,0.29362624908125,32190969319.3093,10076.8351340425 +0.153258666471034,0.309588743653066,40530343248.3485,12446.8292730245 +0.150950743452471,0.299061649258384,29786444431.0535,10595.2245181033 +0.151515250705557,0.314919881171,30912221439.4448,12777.1495258022 +0.143045613699742,0.325217637957378,32274204094.4085,6732.64470989785 +0.145960779680579,0.292136380290302,38375526659.6108,11138.6558787486 +0.149904777869286,0.28223995061897,35737057874.7975,10171.4499182627 +0.14541236254477,0.304732753478261,34584184505.3689,9110.76485484268 +0.140565282328202,0.285119556474362,25814768425.2241,9527.04173113151 +0.158405425840665,0.308015378461452,29457140340.3715,13026.4591511358 +0.147062712940694,0.287337832761341,28492800025.1372,8182.37591617192 +0.152818491723875,0.280636382305268,27249509229.5066,9276.57511433137 +0.143616207885392,0.303759929152041,29419129987.4364,10425.3339540397 +0.155847218453832,0.28618257416615,31993300636.2147,8426.08722073316 +0.15954342687246,0.316243931263279,24378400639.9206,10764.3544204923 +0.145446629362724,0.299011083675202,24139851424.4138,10910.0972883477 +0.144982470930532,0.285625531209732,32086277045.9272,12940.1079293741 +0.147494497056934,0.321298053881594,24273332319.4764,8248.31760372167 +0.160195032193099,0.321915676919562,32975333654.6655,10417.2063092623 +0.137309165991511,0.298116959896924,36943293624.0055,11404.4362166986 +0.153526913954077,0.290642545532531,23183383282.8266,8787.98619061344 +0.155616452312264,0.315670464436449,34651222839.8062,7371.72772685946 +0.141255546713097,0.27711640150862,29441333905.6025,10486.9772189557 +0.145868162156837,0.274919344045281,26237098467.9988,9102.33162097466 +0.156799222936308,0.303191200616944,37812275680.1961,8683.27599768718 +0.166017619489282,0.314437909511048,28896826447.6357,9471.51814186481 +0.161566550394723,0.292739048587377,25986821393.9433,12287.6531594793 +0.139996427360497,0.283947071249968,27482201841.5366,11446.6800474391 +0.157174289654026,0.285901851646491,25026589940.0165,10434.2540235853 +0.154540094641902,0.311213582003469,27575409589.6803,6659.86098640352 +0.149658609379049,0.292217677889468,31927707046.4376,10459.5815760634 +0.141627898262656,0.319179715619972,28226735211.1794,9500.57518353102 +0.147966239036803,0.312559246019768,31412833983.5484,13423.8707590047 +0.146417892877244,0.284264506405543,33711403159.5534,8365.59237731792 +0.135739602437767,0.300131288541504,23021480015.8773,8293.26395631976 +0.142317678533382,0.287979438798621,37242563119.381,9457.16433749469 +0.153148034312336,0.295593875827393,22410952918.2401,12797.4937298763 +0.143693331808809,0.30653241553145,33489766918.8659,9140.36529591894 +0.153888677166311,0.333719619384251,17172519939.2396,9407.06817120616 +0.156393424534854,0.310733575198434,33700762681.343,6941.20428805412 +0.143283870154165,0.296935036626358,28414229548.7007,11413.7882194074 +0.145121539613129,0.307810601547503,35446287636.1414,8983.35607382967 +0.170478215712113,0.30285017392789,30818652055.0559,9330.43569992877 +0.15619566449174,0.283647684211104,32668196670.0694,7966.92253038346 +0.142818678137129,0.313271119115555,25528926115.9196,9563.90173552053 +0.150146061464561,0.266311658527246,23507435601.8333,11576.9270780127 +0.146304735918141,0.299477361633668,31439092099.515,10213.5755929473 +0.15771086267443,0.296320585973032,25566218293.3022,8948.01774693703 +0.158574730941766,0.317804400196918,28466206382.2162,10849.5366461918 +0.151969358904865,0.303322605055927,31567631190.9243,9145.82898523604 +0.149948412761577,0.316424821136921,26757859321.1251,10635.2727988085 +0.143467657753145,0.28761941006937,39175779957.8246,10666.3276493212 +0.144493598443067,0.302110162377977,27805892410.5279,8886.59299316267 +0.147119707263871,0.305059616735056,32825131713.706,7111.973146954 +0.157803467207671,0.324050150258021,26251033794.5305,8566.04881850651 +0.150700656560063,0.309320764607116,32546293325.1943,9899.72537629124 +0.147303237240511,0.28547442937934,25644983922.377,8282.26597928091 +0.15113630244456,0.297729010694382,27440203700.5214,5938.77861210632 +0.142931645845642,0.302530804410811,29955686676.0399,7690.54050733153 +0.13776028865028,0.302419812443277,30283418715.9688,9169.01881990784 +0.147572751645141,0.288754682606876,28937405296.7787,8160.22671126916 +0.155353990426,0.281768079489678,36674723305.1636,7478.80530316898 +0.147768073795944,0.298428862881102,37442071230.8482,9627.27056982313 +0.152680996934355,0.300015568646548,27905946579.9334,9014.18193991756 +0.152353469656746,0.286079023378992,34495938356.4371,8834.4651803988 +0.14041354596877,0.317737845979352,33928304134.061,15496.1584436295 +0.154886289438715,0.312425262384327,28959300567.931,10110.9049361551 +0.157196478266411,0.314109663738522,23770915234.9911,12024.1611043864 +0.156429524923626,0.318331697787117,23859315224.5401,9622.11606837092 +0.159408046943803,0.306440352463408,30949255114.488,9356.02692975176 +0.154921970374684,0.294666133650452,26747843736.1099,7888.66581776135 +0.155444537253361,0.284527994765782,30389410414.6764,7587.7578247096 +0.16324433302338,0.30116815314045,30965683832.3286,9132.21092696043 +0.143342180794508,0.305330595490664,33292179725.8845,8801.54892844872 +0.149351883173185,0.31672572901749,31592367300.4922,8575.91166575094 +0.150879311611769,0.300264613649309,34270717998.8489,9055.51085395367 +0.149971527259755,0.30729429333044,34182193600.5918,7565.83925996352 +0.161801712352618,0.329120456262822,37688940135.671,10723.3964954116 +0.156728097798797,0.295916567129622,41214215256.5782,10838.3737156539 +0.147649034150431,0.291420231322581,31063176327.0991,8194.67834047271 +0.149864390976486,0.310459332035944,27124987538.8362,10402.6096940959 +0.139856450734421,0.305506872717147,34834324941.4621,8852.29791650357 +0.155543852531798,0.33051036674213,27734159138.2139,8991.71206127208 +0.148643170161142,0.279369237685049,31788242912.8817,9176.38805581485 +0.132758090787141,0.301591931805573,39816975494.2681,11215.3405623887 +0.148369319847746,0.284938383563526,29019739795.4499,9575.75496199339 +0.155233171281441,0.307157438220847,27204445537.9243,9482.59272438166 +0.159001862993053,0.294876167312886,31126150525.5767,9031.11628261542 +0.149431278939188,0.324275589150095,28036926739.2453,13158.9402066015 +0.145721730791658,0.293842855904684,23312438705.6075,9208.62931697676 +0.16068066818176,0.286584248289735,34396018909.6039,10531.9955592419 +0.166385350363139,0.287855084465017,30355516030.9627,8862.64682342043 +0.158444293076054,0.297316839083123,32636393308.8632,7448.65379575885 +0.156029697492133,0.291094053887777,25936457099.3931,12407.624687375 +0.142238989957683,0.267668231562368,33934825977.7682,12200.5347233452 +0.144192645256195,0.303256866955325,30839267057.762,13647.7207707158 +0.155684066134604,0.301115871135244,25081262895.2011,10258.3950382817 +0.153603769061412,0.286744283415495,32315160909.6734,11363.4634429674 +0.136872740484988,0.264637877372499,26132254081.378,12015.3615277033 +0.153317166033567,0.339083660589451,35108819613.3909,14161.5126582691 +0.155073828704837,0.311376272121216,30303853810.7035,9872.51826712031 +0.157703489238461,0.312641457686603,24924582925.6272,12751.0438209744 +0.145116114690371,0.301301430181125,31538628028.4122,16387.741699019 +0.144693123400298,0.288969049057902,26703122638.8738,9428.61601265116 +0.145807081415191,0.307366093674031,40137637817.6518,11703.8242380008 +0.159783890144466,0.309095801667793,31277628561.9125,11767.3743279517 +0.151915322653206,0.333430730955544,30455022697.403,12476.9229778322 +0.144456279237872,0.294156592298661,26407187720.3227,11366.812164621 +0.147020153695185,0.305221213774026,25464649331.1153,10612.2699803675 +0.144986238690833,0.274503191758496,41799771729.2918,13573.3278951273 +0.158916683987151,0.319305920963597,37199076090.1854,11343.0746670132 +0.141824325363403,0.300880878079949,30906219186.9522,11742.2866279647 +0.13524891901158,0.310066379853646,26645973330.2989,6496.53157802799 +0.171080581126727,0.320436365702539,27313017023.5024,9586.55573110094 +0.162926956782468,0.301249297097922,29091870952.4364,8143.73623884407 +0.160571728702103,0.289552711076286,30018535976.2705,8897.29001806582 +0.151878366429926,0.314855922125476,31483059721.982,11701.982700612 +0.14893234568713,0.326847635981545,30323049447.1572,8725.85255562028 +0.165870232144203,0.309422039067453,32411403130.5673,8555.00902772552 +0.165153309985352,0.308084564518293,26049502835.3935,11908.8120591846 +0.147592790459642,0.289948793535627,25633332343.3763,11240.5925893102 +0.178749455014694,0.29015007311364,38974028493.7221,7977.16464915931 +0.150517959650212,0.285363659791868,34780916954.2103,12679.8599186052 +0.142963519152829,0.301003905259395,25716994648.8892,9254.85722570708 +0.140949996429799,0.301584936697542,29177234474.2837,11331.070153056 +0.140491956310065,0.322502040879565,29064989305.3909,11084.867258023 +0.146030650925909,0.331476319471251,29743581448.1238,9640.54548526117 +0.164034152089155,0.309971888373434,22866032269.3914,13227.3473592741 +0.164390197475592,0.284495471087793,29891258037.3069,13364.860565086 +0.152019714372916,0.319716482915687,25909708156.664,7208.58033911451 +0.14550311191048,0.298178603313427,31652697078.4391,13845.1937954381 +0.135549350634415,0.306928043431475,22616733599.3245,8959.58487916659 +0.150472588254181,0.308981409289052,36166385818.0579,10359.1152497346 +0.131798120830273,0.300964797747775,34904955743.557,7132.82029333546 +0.15229373994684,0.290310363411516,28786918615.6035,10242.1457383615 +0.142604298388527,0.305174156684061,31346767435.9883,10572.3827291139 +0.158034625084875,0.304445316492524,28277221222.6945,11828.405566501 +0.140248898559146,0.308880969242891,34048720324.3117,14147.5061939607 +0.138636581637615,0.314162126075986,26681594987.0349,8110.67439725928 +0.158257417818384,0.291672481989156,32233917146.3581,12533.8876604845 +0.146531370316148,0.319960822532214,24103357081.6224,6835.25595584062 +0.146854571588662,0.295938269603895,30494829932.7842,12658.9183935761 +0.149810370546442,0.29248971489796,24169512602.7517,9925.55842658985 +0.140300090972127,0.289829587781959,32894671648.7539,11604.1066215874 +0.159934737117546,0.315330982962802,31226042482.442,9539.8737163492 +0.149308035724648,0.286913805960228,34975048336.0735,9045.72409623386 +0.146358718445446,0.304655536716797,32220959449.5097,9831.05722730184 +0.162407555362241,0.327359790742973,30527128346.3198,14057.6120160167 +0.146679935279591,0.295855491303752,28107453588.155,6677.85746583957 +0.16009281717824,0.285089517625475,37119244850.0013,6061.58392002997 +0.150013643567002,0.290479974020889,24744317422.9857,10828.9520848131 +0.15400302526463,0.313644346332769,31683520203.136,12566.4235379187 +0.14799675745249,0.288118875273482,21812135975.0026,10518.3018998575 +0.15368177261824,0.275390329530766,32004172800.1284,8239.72910736861 +0.141735406781766,0.311665057040245,27278297982.2303,10256.2978636918 +0.148538063954179,0.29767351561188,36322093303.9344,9765.52913922952 +0.146336705307573,0.306131720352788,35587282875.9364,7708.73881468646 +0.161768303412537,0.320804737472824,28656878905.8989,11542.3825722584 +0.1475402030122,0.318490253071998,34123757318.0155,11226.1142219631 +0.142040976001781,0.28378820651412,21411008573.8388,10474.7438182351 +0.136244316848179,0.273611823542572,32283189611.8502,13019.4591015999 +0.146166399908816,0.305645111325034,28635343227.5101,10175.0162161685 +0.156628976115945,0.279806223876601,32941669778.5597,10234.1076237032 +0.167609818644296,0.294412182516561,31027245704.9106,11315.1989723488 +0.141544003234651,0.295709825198121,33599675894.5981,8774.97273686886 +0.145745764308297,0.290010603556372,24026335385.776,7896.733750917 +0.143751219412098,0.274176711147232,27870292073.4879,12121.6237779816 +0.161317132800756,0.289393802582935,25746779410.5279,10619.777314437 +0.139663543109367,0.301740986235439,30191232912.3226,9570.85271767098 +0.143497964903255,0.306625153084975,22303922785.6408,11065.3724266436 +0.140747108734094,0.303421251513264,43325724188.6937,6762.80181427769 +0.14690787706703,0.296772713694181,27578519734.1774,6436.68414037373 +0.141933647449646,0.29981153685288,35547820888.7637,8922.34475186232 +0.162765673143484,0.294722550171461,30737677391.5392,11462.7341691308 +0.155919347437603,0.300396752963097,27148216661.8382,11163.6638230824 +0.152708691328423,0.297130543934763,39932592556.0546,9401.74579781728 +0.153200337960358,0.286270187030168,27645424991.7262,7771.19257820927 +0.13951239350575,0.305569638660813,29884978251.5836,8514.79427350113 +0.149196442790377,0.267219511412434,27398049603.2468,11871.0802036843 +0.154638442792692,0.293184293670212,27986475908.3902,9935.71001166969 +0.152447606201619,0.310594437589559,29854826548.7466,10563.6038624309 +0.149585725456874,0.279941063872111,28201360653.2733,12981.5251518045 +0.155127279309965,0.313801191719019,21238925634.0642,7942.78972227062 +0.137615128791078,0.274763268574346,33758920868.6351,10508.0345160469 +0.15022939442942,0.290542731198295,24687198593.7195,8370.91207550888 +0.163130781323811,0.302979309378258,27922252570.3502,9951.81513153565 +0.141757168283654,0.289079566209257,30097369633.3866,10773.9759461129 +0.141950943952917,0.291168940007742,32740887493.5739,7397.21626316554 +0.158721197225937,0.278887022015647,34046271691.8816,7427.69597071116 +0.157104789151271,0.290344458824082,26590223554.2241,12366.6948647974 +0.145910595873645,0.307112749276585,35741350135.0596,10445.533520971 +0.14424111769406,0.276827494060869,32760100157.8669,6246.43792746647 +0.152156777290903,0.303681431549114,30660873410.1771,18013.355341855 +0.150419192005348,0.289468562679617,26453215862.4134,8758.2461212974 +0.140165115439547,0.302162932520594,33342081719.9569,11306.3698765769 +0.136405594649421,0.295372031095709,45320635233.6249,10714.2151022764 +0.147703703971257,0.283373533402401,27711835778.761,11261.6154001386 +0.144177197834844,0.284138016537603,30269992024.8472,12163.9482915759 +0.163841822737971,0.28044288934363,29282853581.6705,7857.54937573291 +0.151933846296297,0.306986331528307,24316749829.3431,8541.99178918038 +0.169611267791722,0.299417073659056,29365026997.8908,12229.5326105313 +0.149376164813404,0.31889683760169,26872104378.1719,7167.1387206059 +0.155465542252217,0.300531961249053,24001047604.7826,7348.12498272079 +0.153766354056938,0.29835042013244,31723954278.5003,10306.3238387922 +0.140871130781504,0.309316873222476,25444638181.0368,8663.30974293663 +0.164257285148077,0.277250846249811,33605743163.1188,11812.5608068274 +0.139012789504243,0.302730202500653,24797039626.7561,9489.72983238277 +0.14462897769696,0.296015475790565,29498400919.3697,12045.0792430055 +0.159137851604808,0.298896171612515,26059320940.5395,8029.17811525644 +0.148295728840691,0.287067218534779,27240988731.0165,9922.52802031716 +0.148406718870034,0.283327796702623,25413529188.5484,8390.76638520678 +0.142503523945173,0.304980590139419,24570474312.7041,13739.0233900656 +0.142853726853747,0.295672473603494,31001135316.9312,10282.0094855662 +0.144322966397739,0.296182850058703,32703014732.5564,8338.37457697189 +0.15384245931867,0.312932303873594,35255303999.3495,8607.03565458002 +0.160832578094778,0.310545079962988,28563806631.4513,9436.9269732311 +0.161508794374703,0.305957007097081,24991878980.5193,9294.25681074514 +0.14262066600762,0.32143695821225,30631612335.2941,11506.6017690493 +0.162006930748886,0.32810998989029,23531919940.1406,17051.6979411276 +0.139807722913219,0.295136305369661,23660016943.8456,9221.19736837077 +0.154079159706849,0.31526790433393,32052638075.5987,13496.9037381418 +0.150587722696425,0.287248670206595,30789831195.7869,12465.345419553 +0.140059280758988,0.285692908382917,29765364082.3971,11045.3665942612 +0.134726803208553,0.313930447682043,32782269237.3186,11943.1190700103 +0.156001784657353,0.291310263810375,28814641901.8376,14870.7322986095 +0.152486267636273,0.302292243111617,28241143017.8744,8083.71819340317 +0.148427854839199,0.291789403962934,25490707457.738,8500.37700676848 +0.146949575031678,0.283139204953503,28789615881.7061,8528.51568142831 +0.141088618973449,0.288623202204042,28730556312.2739,7988.35944422175 +0.156574078653449,0.295198458333104,26496216450.5345,13197.5269821292 +0.148884296421218,0.320174164590526,33028627021.2738,7841.73869906627 +0.130654321046541,0.317413490897922,32433775191.3202,11200.9757594447 +0.152063000811867,0.275893500520871,24514677718.4596,10159.837069531 +0.147417666564491,0.326537106504607,26950943530.4809,6972.97174905202 +0.152419469921069,0.312969039436923,22362685456.53,10978.4417034758 +0.154778595316251,0.323378744821839,32468714422.3353,9377.81400039928 +0.154374080309165,0.277861905970155,24615234332.9469,10011.0403331212 +0.15067060409777,0.3057073993981,26615870243.2237,10055.8082135725 +0.141183051240506,0.278962770167345,30599901573.7915,9717.4520975498 +0.145308227738082,0.304158309259055,30047780281.0423,14336.7314441672 +0.134120789625503,0.27024410239022,24773257337.0596,8271.83531439237 +0.156864516636061,0.323751526133761,32924420222.9111,7949.6109349774 +0.163338165214429,0.289734155875244,29598217826.7513,9603.88582452165 +0.140829625682904,0.295435836001877,26146106692.5326,8688.15413286153 +0.162582098917174,0.275551610739853,36065560431.319,10052.8400631481 +0.157878130686594,0.317188697433945,32592122349.9688,8168.92671684849 +0.148183615981483,0.279594846803998,29129295775.4739,13103.3372477757 +0.147907534881314,0.300799112516381,25850639601.9887,7534.69611663268 +0.14968391654556,0.311943264020833,29480440226.6796,12252.5037378721 +0.146128501862651,0.278672212188287,33412676049.0758,10786.6771735502 +0.150103353225135,0.278253391541213,24220311877.1177,12327.5745833981 +0.150074684187344,0.287121828370324,28994892057.5504,8648.84148955468 +0.14683483875169,0.294120656802448,28905324934.8576,7082.10218897132 +0.165606784431945,0.269669624528237,34602526398.1594,10661.8965981548 +0.148689124733862,0.314561794247153,29634191486.8998,9346.85637807176 +0.151358631426128,0.284657428215728,23736666587.9132,7417.64418085737 +0.133331198031345,0.26176813774115,34314961524.532,11475.0897057398 +0.145567567942322,0.325689253788032,34331644204.9519,11788.3646682269 +0.146594186821587,0.299261717937374,37729301330.6679,11027.009442185 +0.147453433746717,0.298778920735219,36859786309.0759,8708.11792523267 +0.149102426206807,0.259373799461345,33547287919.1584,8783.9625111026 +0.151623898156857,0.301821448559606,28080646298.5216,9802.75521437258 +0.156122303656545,0.293433786255281,34745779710.566,10551.5413313478 +0.148847117008719,0.313502045001774,27097953213.1212,10118.5979104462 +0.14551670738104,0.280780861729708,29348709173.2143,12718.5730593904 +0.137010035448671,0.311436379937132,38123893321.935,8214.294242192 +0.145665233026947,0.292805539324621,27343710248.8336,9262.61847613033 +0.150279095200714,0.315097575343346,29619619189.2081,9739.18931448694 +0.151029928828406,0.313393717249974,33189379205.4694,9316.90756309644 +0.148501693605022,0.311754921035644,34515325311.996,11169.0269215547 +0.148063785052129,0.287428263586439,26322748885.2249,11008.7878580321 +0.149275593785824,0.303069290837567,25277777519.1231,7337.16075091357 +0.146498262871579,0.299215545299679,30593351482.3813,10098.0794550375 +0.139180987640651,0.298657900333775,20674535433.0245,8259.15901069209 +0.146201249082193,0.297831847103594,34435569762.3658,9419.67852071169 +0.153797342355889,0.296474030674405,23596313498.4242,8223.71111748972 +0.158811797760696,0.276303514404863,33132427757.7124,10023.5074399398 +0.166929847404766,0.281989332838504,29521300478.5762,12597.7130815782 +0.143387088836529,0.296748945871033,30706781604.8191,9026.48333675389 +0.160756947449849,0.288006237983678,27062817673.6522,8930.4307417607 +0.143738664441836,0.300678932364604,31867899399.147,10916.9639929661 +0.147332754816306,0.325354232786207,28695803479.1231,8119.22655678406 +0.158149587250985,0.29352118587437,38940884954.9024,11100.0143809838 +0.161072047392909,0.273054250446742,22080530156.9053,12913.8444077502 +0.147816076514506,0.307707739060996,38590282566.5248,9692.84110366063 +0.149711958206179,0.300526836042729,19553544041.08,7870.12578564509 +0.149443430191605,0.297563132987058,22525555894.3728,8473.72535925053 +0.152396395751927,0.304311743659207,25584755531.1056,8700.86688019806 +0.144726604203436,0.302481209961088,33017679994.4972,4545.28333487137 +0.139568114473001,0.276206484013425,29558831312.0409,9552.80196266229 +0.152904264879663,0.298568707594572,26000032849.5489,11629.6768976349 +0.146978312500106,0.291837298175202,30479214448.5094,9883.22969164853 +0.136001582916677,0.316969741482022,26976813727.1625,8635.93378446992 +0.144417038930145,0.311102941468614,37321966441.3028,10299.0494886845 +0.147691722940839,0.305408724706339,31185491624.5078,9309.06831016026 +0.144098686674543,0.299131203083666,31248484536.7037,10867.5992035113 +0.156889515057216,0.313763950451683,26570638260.0934,9442.21328529448 +0.153298326199933,0.287505166793124,36617009906.6631,7035.75061023748 +0.156265602582663,0.297180393839217,31205134136.7027,6905.68707875947 +0.154309486130716,0.300741010120398,30089460449.9721,7809.05899017276 +0.150207219780921,0.3437070791156,31084991235.4645,15749.8968580576 +0.141016274215968,0.301901171653476,31168558334.2551,9861.37013617544 +0.148461286200015,0.310382048405539,28154096542.2697,8467.998984442 +0.149621990983232,0.30973785395997,25236755904.8112,10813.3411645973 +0.142385203800476,0.307540651894799,27948622225.2949,9722.57450079029 +0.159888603909307,0.286791575642425,26174181825.6395,6315.41579104616 +0.154156568191422,0.313076573597957,29997139971.5014,12625.4358476183 +0.147880296511805,0.288902570963964,30131481321.2609,10949.9772439881 +0.152161298284141,0.282840936431729,35923471513.8102,11001.561565607 +0.149832428206666,0.301972450753568,33527849693.7337,7488.17793685663 +0.138099784049842,0.29795644306993,33114442659.6387,9517.57368620336 +0.139373351012065,0.289213986365913,27181256935.0142,8323.87381825588 +0.15748117507515,0.30433664700403,32510804900.1524,9600.31836974254 +0.15167943820917,0.312196289020486,28297141469.0314,8822.33341005447 +0.14398250721979,0.282804824303219,27818056023.2665,8304.22762337295 +0.147178122274735,0.289657016405575,31822448629.225,11728.2972333024 +0.138298090284907,0.321844482556272,33389676831.2039,10269.8701555552 +0.137461180420535,0.319476210909299,20042509953.3171,8748.92048803217 +0.127934082797514,0.278366449452792,25157596173.6116,9674.64297918472 +0.150778570016323,0.292394974766242,39593560939.6711,9970.2593353108 +0.156357978818677,0.292096183534138,27516589045.614,10465.9111129237 +0.149030059450824,0.292870338984461,30062927856.2886,13278.4232886593 +0.144007844493369,0.281119734092956,36479937999.978,7744.23904409752 +0.15578056304829,0.299955365771873,33206426054.7403,7073.91517410933 +0.146251424514169,0.297497749962731,25320229352.6032,10202.5450850356 +0.15353318907439,0.296999722726317,27494915704.6445,13760.522822452 +0.161170957975189,0.29503821111019,26297896362.7474,8138.45052258253 +0.150383177739087,0.285821422173983,35814736403.5761,6866.68984439712 +0.152574894409136,0.294035535693469,28072128583.9315,8319.0397914393 +0.168522038167896,0.321091157981203,31608595489.5325,9681.52920193895 +0.149172271143794,0.317932862033168,35228543073.6915,14683.6782188786 +0.148249231483185,0.298245624867422,23826675799.5549,9184.56824775748 +0.146602581015645,0.282422427382467,29664114163.8829,10125.8359334482 +0.154399791232818,0.282656028494526,36413596469.5173,7798.01415043298 +0.153132158835756,0.277673383179352,31506221868.7804,11586.1290096256 +0.152558163016165,0.298810517293613,26799822776.3494,12128.0243317589 +0.155293764779385,0.293009843285031,27743947292.3605,7923.8601934309 +0.157525335024752,0.322213886036221,31844694871.4807,10388.0617485759 +0.141361973527039,0.272609948263857,25127159284.3149,8617.25556008705 +0.155730079277904,0.291970217341516,30175393818.0924,10588.4888166648 +0.152801539540369,0.329944976034292,36771128201.5777,11270.195074517 +0.147255585997738,0.296678012083276,28390960238.3508,13606.637836398 +0.160335772920394,0.304088685866913,42413993752.0304,9667.86043288291 +0.154979845603637,0.286374612241093,33285925368.8294,12272.2377910996 +0.145346392398361,0.324445026846191,28503125537.9025,10895.0145340957 +0.142114599394599,0.310981240764226,33657998215.2752,15224.3181767936 +0.159529236509578,0.30136213867047,30531708801.6728,9988.45525809696 +0.144906202326738,0.30847626518161,26373755956.9803,5686.77507753211 +0.154602772678031,0.308709067651343,28984368380.612,8736.03600922617 +0.153714023977682,0.310227713254962,30741950604.4782,8739.78671957748 +0.147800474772948,0.303460141919249,25313996860.4584,8581.34176774076 +0.141468075779163,0.291463674687089,28389240997.3776,8999.44925778845 +0.15168799562776,0.30263104223955,35317961357.3667,9806.13466292437 +0.154457604098322,0.303915356862367,37558172445.8953,10020.3046357807 +0.15209369419696,0.317469120821843,38745779248.7506,7700.47517474236 +0.153019118794229,0.304935300993851,31109701063.9879,7821.13286380097 +0.143945755009935,0.28851109376238,32506543153.629,11429.1804981224 +0.141313252521479,0.276725754037583,28578422624.7262,8624.52355556162 +0.143808957995844,0.308149049490112,26537421870.3139,10063.8662571128 +0.138834328013808,0.298032085438411,33831871576.3839,11985.2212962614 +0.152998459762724,0.292649589485575,28612754652.7509,8444.78552670142 +0.136753352634907,0.268709369635377,28591177724.2902,10144.8076874096 +0.164782817701042,0.307668616179422,35657646056.3282,7293.94357828163 +0.149213937789951,0.304590150487266,32063453319.0017,9794.61058320691 +0.150918940458964,0.318080862158793,35094775542.8198,9086.10968937964 +0.137156948917142,0.288290331724406,29681625317.0269,8405.55604807675 +0.147081671191395,0.295292260454245,37046275380.5102,8877.49347718557 +0.143148504498187,0.272327184654124,27047650552.0192,12828.9058701963 +0.143091381199974,0.281364799887477,26216548154.5213,10375.6608929833 +0.153644258015067,0.2983711783601,36004958988.5469,9852.57584133203 +0.14907788276293,0.334982876263667,27430094592.1137,8092.57872285205 +0.138502143508071,0.294321945119696,25855354928.5782,7600.77141812539 +0.159067738472933,0.315834101436745,21648559148.0636,10349.5007273758 +0.151188402441721,0.289250702860474,29185070790.2437,9784.17664596919 +0.158305862058553,0.303621017969864,28005383084.5277,11648.0416088339 +0.168271709820287,0.316536864249261,24338598652.3236,9658.97734306882 +0.144063814398441,0.30583284386032,50641071405.0952,9082.06621908118 +0.145192692768152,0.299748265151407,29823874279.873,9302.88000710362 +0.153940292897684,0.311079546126552,27012940146.3964,13463.9779318598 +0.151483729495252,0.312721877386976,36272208054.076,11135.0667156116 +0.147380433698416,0.293929599723711,28437481607.7464,8524.47320367189 +0.162122614912126,0.294985451163715,31752673092.0134,10933.88144783 +0.152257001274927,0.294834183446277,23222604683.0117,14807.0342144437 +0.157933829264368,0.303563144311074,30412298124.5084,9772.29334828514 +0.144531146003574,0.290747859038516,29919094807.9357,10856.0036616043 +0.158659716630433,0.300323571930039,28721665235.0119,11122.2629065513 +0.153089063662168,0.264158484437419,30212100094.224,11883.7422611746 +0.138927618649444,0.322814510832831,26915009255.9415,11853.6483054323 +0.147229834430864,0.308622338388949,21170020543.6864,8596.50614344569 +0.133418507569758,0.304869498194058,29147282552.0832,11499.4473556866 +0.151420564636813,0.308507002998153,36203601492.4393,13303.1747837124 +0.149018319211979,0.299650871796079,35489721329.4256,9956.12267073045 +0.145822062228831,0.270563349462532,29041497752.2454,10981.4658658939 +0.154754385676768,0.309864931108516,26654718376.2452,8971.74845944146 +0.154224692610862,0.296906954370733,24494508070.9794,11533.3227848473 +0.148792283827022,0.288235975875554,24892155199.795,8403.27411073519 +0.152231358446055,0.299898677785938,31959797098.6765,13984.8435439766 +0.150640407977044,0.309138973572498,29257509935.6973,10093.1012814003 +0.144879092346924,0.282289250463014,27338634459.7564,11287.1941690693 +0.145062794614511,0.280884910622208,24438935689.1406,10321.4040939336 +0.142435852877008,0.283017444142725,28137015910.0454,14533.7123126232 +0.156138114272839,0.309615963103824,32371962444.9011,9908.63913260548 +0.150830935152853,0.315790267570476,26437566568.3913,7736.2708117426 +0.148042853082672,0.300179655288873,36529586156.5389,10695.477054769 +0.157609406997591,0.294525032898103,32115695985.8944,9463.33462546876 +0.145987669150502,0.293398264006699,35915469792.8416,12186.4043512371 +0.151244826107673,0.290933844950059,22823631876.1552,9341.29403772814 +0.157375323480448,0.294548203834106,21848534655.126,9282.92810524571 +0.151544690595986,0.306061561539238,25071798252.3265,6144.17563683288 +0.155570569405386,0.281843374868283,30422993729.6747,9192.49604706162 +0.135177511809392,0.3275263360972,29400623346.3649,9749.2133205955 +0.143891961515161,0.293742789854574,33441276893.7753,6585.20173068403 +0.154017506883496,0.302785155041972,33886553147.5078,8019.91531627141 +0.151573448358683,0.328571564171138,27667474331.8063,8354.60774238756 +0.151397599885125,0.293198640156257,26808266555.0777,7912.61314972827 +0.16219539552131,0.320346032114897,29099770341.5259,15123.964425265 +0.160421661671093,0.311535455644166,26336547192.0255,14490.6042575159 +0.15930985402496,0.279283711176277,27891543730.9575,12306.1531234628 +0.142152845458048,0.290120288311067,27769274000.8702,8956.98340316297 +0.140640652031542,0.283550540054299,26089442192.3276,9371.00115355881 +0.159696314145766,0.281282839499001,34894993049.5857,10189.4736994527 +0.154247594721958,0.332452402327918,25693009094.8722,9157.74925952182 +0.146765634547782,0.312299611842962,33226960799.8606,10547.0861501554 +0.150546535178386,0.310843802495607,23912308090.5509,10220.1958668665 +0.153435194481,0.284796192164171,26889930045.489,8051.77677121484 +0.144775818078854,0.320749790451691,32152227814.8391,7193.95701887044 +0.148574244804963,0.278058236645859,33788569810.8046,9844.30815584419 +0.160130411289767,0.288847052620634,22710878276.1777,6809.21183520192 +0.143266561401909,0.297765833264355,29538213569.3869,8073.52463991396 +0.151142828847483,0.292589443350414,31317390660.5679,7504.69875160773 +0.14529008170744,0.323269170275935,24652828240.1179,10496.700988042 +0.151761418792441,0.299583723199603,28189692875.6684,11077.8626818416 +0.145220409400849,0.330771738720484,30679807931.417,9247.94966633806 +0.153479054401101,0.291213637004116,29730622736.8425,9507.73849628225 +0.15110029250465,0.293277559892336,28753375848.9323,15828.3453066145 +0.164866272815925,0.3040566712001,25217477908.4129,11923.9856704286 +0.141604096317137,0.296128981865047,29324717581.0463,7543.84549698328 +0.142269706005752,0.293105057778799,35008741518.9392,7611.80943280602 +0.15666879186287,0.308768622843998,28358845757.3021,9817.87801048301 +0.144609422025287,0.314759177696342,32343240705.9386,12385.0813356203 +0.143549060510254,0.322570150228815,28545227573.0469,6566.24485612735 +0.143220182960968,0.30593734429988,27382980255.9738,10741.887730612 +0.158506003966431,0.281647714300108,32606606302.6475,11557.161739249 +0.155045233535355,0.273448412738736,25765148996.4945,10753.0714492957 +0.152642960256668,0.310180000151139,38456677718.1813,10702.1261946819 +0.134442378940421,0.306781891150097,28844345054.036,9893.74413761009 +0.14673454772039,0.271069845761203,27830996212.9927,8455.82449377057 +0.150997227684,0.302277769278801,31904216911.1582,12075.5453592402 +0.156497665033397,0.297271136472531,35365516119.4633,11670.4304476736 +0.163522550277898,0.296555482428988,29966974923.683,8011.41634897212 +0.138441659198344,0.296437182394639,24943406490.7135,11034.0261758343 +0.156980030685497,0.288386246441662,37996598485.0547,7259.76788701387 +0.146448585183699,0.326021068333078,28859576330.3974,6347.78446496704 +0.154480371291303,0.34059380219663,38246083609.0963,10365.0846156136 +0.146640325543983,0.28410368191154,29229733053.9203,8846.26625904077 +0.148081765633323,0.303953692560935,34150942417.7235,9733.34679818962 +0.144353482479687,0.302946713446696,30874239027.1629,8055.07531962335 +0.139341054736863,0.308363718339144,27000266143.2299,10038.1809759212 +0.137943864376295,0.329606346001542,29312418727.5003,8492.02575027124 +0.150355225230765,0.292350602785877,34698271171.2325,7238.0919665121 +0.139114935247758,0.290950560709462,27682089799.1468,11193.0063237236 +0.149763104893321,0.285220908036993,40899862195.0927,8905.15101172936 +0.151829817457749,0.318720194878174,30153134534.5921,7762.43778496707 +0.148963974980993,0.301481016867496,31452212322.1162,8671.49511742863 +0.148147417628754,0.307882725146699,40715116609.3341,10001.7274504014 +0.158085115114716,0.306844215039608,26488227716.7114,7672.20496117991 +0.157435414209682,0.317049981537393,33984837400.9298,11653.2200379032 +0.148339559315757,0.291597528973301,28341715219.8094,7004.32819019267 +0.154670278646553,0.290839719758839,43067997755.8632,10957.7956699207 +0.148674866901811,0.286475217914869,27552111473.3895,10796.7611544454 +0.150334042046705,0.31606265951875,27159627819.2843,8816.26731299458 +0.15131673597729,0.336124669614247,32857455411.3572,10316.899970278 +0.154116714268293,0.297403512395981,23401127176.2807,11797.7700178677 +0.148801464041723,0.291946490875356,25366453906.5981,8912.03370911009 +0.16095546118095,0.280313249427881,20847038253.2782,10138.5041418307 +0.144830286563319,0.287782389520942,33066904259.5015,12098.0284549783 +0.145619443540745,0.337571044376165,31392265663.2585,10335.7401104771 +0.152857012959213,0.314361511096435,29707241152.0273,13084.3830817813 diff --git a/tests/test_model/data/MCrefs_MeanStd.csv b/tests/test_model/data/MCrefs_MeanStd.csv new file mode 100644 index 0000000000000000000000000000000000000000..e9592bf45db032790f95259b8cedd7f961e70a81 --- /dev/null +++ b/tests/test_model/data/MCrefs_MeanStd.csv @@ -0,0 +1,12 @@ +x [m],mean,std +0,0,0 +0.1,-0.002623091088022,8.06E-04 +0.2,-0.004962749295994,0.001525818175278 +0.3,-0.006794367435948,0.002088956887598 +0.4,-0.007957511802197,0.002446570522429 +0.5,-0.008355922171325,0.002569063468612 +0.6,-0.007957511802197,0.002446570522429 +0.7,-0.006794367435948,0.002088956887598 +0.8,-0.004962749295994,0.001525818175278 +0.9,-0.002623091088022,8.06E-04 +1,0,0 diff --git a/tests/test_model/data/MeasuredData.csv b/tests/test_model/data/MeasuredData.csv new file mode 100644 index 0000000000000000000000000000000000000000..5774f51566a8dfc04976e30e56fbca293ac296e4 --- /dev/null +++ b/tests/test_model/data/MeasuredData.csv @@ -0,0 +1,12 @@ +x [m],Deflection [m] +0,0 +0.555555555555556,-0.002507972252554 +1.11111111111111,-0.004744950561407 +1.66666666666667,-0.006496185008909 +2.22222222222222,-0.007608282796739 +2.77777777777778,-0.007989208245903 +3.33333333333333,-0.007608282796739 +3.88888888888889,-0.006496185008909 +4.44444444444444,-0.004744950561407 +5,-0.002507972252554 +5.55555555555556,0 diff --git a/tests/test_model/data/MeasuredData_Valid.csv b/tests/test_model/data/MeasuredData_Valid.csv new file mode 100644 index 0000000000000000000000000000000000000000..426ba7ed46ff82621baadb3435f79c2a0f47810b --- /dev/null +++ b/tests/test_model/data/MeasuredData_Valid.csv @@ -0,0 +1,12 @@ +x [m],Deflection [m] +0,0 +0.555555555555556,-0.002623491033022 +1.11111111111111,-0.004962750295994 +1.66666666666667,-0.006794369935948 +2.22222222222222,-0.007956511802197 +2.77777777777778,-0.008355582171325 +3.33333333333333,-0.007957591802197 +3.88888888888889,-0.006794363675948 +4.44444444444444,-0.004962749995994 +5,-0.00262091088022 +5.55555555555556,0 diff --git a/tests/test_model/data/myBeam9points.cpp b/tests/test_model/data/myBeam9points.cpp new file mode 100644 index 0000000000000000000000000000000000000000..b78b641e05f5fdfd8caf6d9eff4bf8d1e9c790da --- /dev/null +++ b/tests/test_model/data/myBeam9points.cpp @@ -0,0 +1,131 @@ +#include <iostream> // for terminal output +#include <string> +#include <fstream> // for file operations +#include <cstdlib> // for exit() +#include <sstream> // for stringstream +#include <cstring> // for strlen() + +using namespace std; + +// C++ implementation of the simply supported beam example from UQLAB: uq_SimplySupportedBeam() +// +// UQ_SIMPLYSUPPORTEDBEAM computes the midspan deflection of a simply supported beam under uniform loading +//% Model with five input parameters X= [b h L E p] +//% b: beam width +//% h: beam height +//% L: beam span +//% E: Young's modulus +//% p: uniform load +//% +//% Output: V = (5/32)*pL^4/(E*b*h^3) +//% +//% See also: UQ_EXAMPLE_PCE_03_SIMPLYSUPPORTEDBEAM/ + + +int main(int argc, char* argv[]) { + + // If input filename not given on command line + if(argc < 2){ + cout << "Usage: " << argv[0] << " <input filename>" << endl; + cout << "Exiting..." << endl; + exit(EXIT_FAILURE); + } + + // Input filename given as a command line argument + char* inputfilename = argv[1]; + cout << "Input filename supplied on terminal: " << inputfilename << endl; + + int array_length = strlen(inputfilename); + if(array_length > 256){ // This is necessary because C++ doesn't allow variable-length arrays + cout << "Error: input filename too long! Choose a name with less than 256 characters." << endl; + exit(EXIT_FAILURE); + } + + // Variables to be read + double params[5]; + double beam_width; + double beam_height; + double beam_span; + double youngs_modulus; + double load; + + // Reading from input file + ifstream inputfile(inputfilename); + if(inputfile.is_open()){ + string line; + getline(inputfile, line); // skip first line + for(int p = 0; p < 5; ++p){ + getline(inputfile, line); + istringstream iss(line); + iss >> params[p]; + if(iss.fail()){ + cout << "Error while reading line " << p+1 << " from file " << inputfilename << "! Exiting..." << endl; + exit(EXIT_FAILURE); + } + } + beam_width = params[0]; + beam_height = params[1]; + beam_span = params[2]; + youngs_modulus = params[3]; + load = params[4]; + + inputfile.close(); + } else { + cout << "Error: Input file " << inputfilename << " not found! Exiting..." << endl; + exit(EXIT_FAILURE); + } + + cout << "Beam width = " << beam_width << endl; + cout << "Beam height = " << beam_height << endl; + cout << "Beam span = " << beam_span << endl; + cout << "Young's modulus = " << youngs_modulus << endl; + cout << "Uniform load = " << load << endl; + + // Compute midspan deflection +// double V = 5./32. * load * beam_span * beam_span * beam_span * beam_span / (youngs_modulus * beam_width * beam_height * beam_height * beam_height); +// cout << endl << "Midspan deflection = " << V << endl; + double I = beam_width * beam_height * beam_height * beam_height / 12; + cout << endl << "Moment of intertia = " << I << endl; + + double V [9] = {0}; + double X; + + for(int i=1; i<=9; i++){ + X = (i/10.)*beam_span; + V[i-1] = -load*X*(beam_span*beam_span*beam_span-2*X*X*beam_span + X*X*X)/(24*youngs_modulus*I); + + } + + // Extract the name of the input file by reading until the first dot + char outputfilename[260]; // input filename has maximal 256 characters, plus we need to append ".out" + istringstream s(inputfilename); + /*s.get(outputfilename, array_length+1, '.'); */// extract characters until the first '.' and store in outputfilename + for(int i = 0; i < array_length; ++i) + { + if (!((inputfilename[i] >= 'a' && inputfilename[i]<='z') || (inputfilename[i] >= 'A' && inputfilename[i]<='Z') || (inputfilename[i]=='_'))) + { + inputfilename[i] = '\0'; + } + } + + + // Converting to a string to make appending the file extension easier + std::string outputfilename_s("SSBeam_Deflection.out"); + cout << "Output filename: " << outputfilename_s << endl; + + // Writing to the output file + ofstream outputfile(outputfilename_s.c_str()); //re-converting to char-array necessary + if (outputfile.is_open()){ + for(int count = 0; count < 9; count ++){ + outputfile << V[count] << endl; + } + outputfile.close(); + } else { + cout << "Error while opening output file " << outputfilename << "! Exiting..." << endl; + exit(EXIT_FAILURE); + } + + + + return 0; +} diff --git a/tests/test_model/data/origPosterior.csv b/tests/test_model/data/origPosterior.csv new file mode 100644 index 0000000000000000000000000000000000000000..c5ac7661b1293e88b1d8f257c7bf183962be336f --- /dev/null +++ b/tests/test_model/data/origPosterior.csv @@ -0,0 +1,6458 @@ +Beam width,Beam height,Youngs modulus,Uniform load +0.15055984558676253,0.29525432449198297,30.76127334738532,9.723836401962199 +0.15172323185227535,0.3018864526755948,30.900386050140906,10.572937395098421 +0.14973682706047656,0.2978203129324041,36.32602379774441,11.755511440017944 +0.1517705925936338,0.305488518618717,34.50777554904536,12.185971698925812 +0.15122339466850782,0.2926128752190275,35.56672182303718,11.0301930879105 +0.14845810152750857,0.30211679811976233,29.835349622421052,10.024544145665512 +0.1489486486032762,0.2976793170334428,29.594984582798585,9.521736085316368 +0.15058053518912617,0.30333441137936284,27.27802142418919,9.342001468585726 +0.1507691624131821,0.2939876743771734,31.27163912090209,9.792688628012431 +0.1500870646038146,0.2985441999148553,39.81677531480247,12.987496647396311 +0.14898608605561217,0.30375423088389003,29.52705674493042,10.062549985258489 +0.14970824383703807,0.30315407503168046,35.2631265265265,11.99629791617248 +0.1498912371993728,0.3013950044398239,33.54132459098164,11.248721986783334 +0.14918575621696326,0.29880381550532065,34.150652209795595,11.118554528090979 +0.1489969356057506,0.300082398957258,31.002479481593078,10.219384641989384 +0.14963859664258394,0.2969265555129175,28.313546776132057,9.088993931185307 +0.14924423341105603,0.2961598248152436,34.8669105697025,11.066044927367999 +0.1488627318567911,0.30339555022808407,28.7659733754671,9.719728325570129 +0.14904620979099514,0.30205065043454093,27.36896794141427,9.15878555321657 +0.14886154272190172,0.297571249578671,33.98280136527889,10.993246687313722 +0.15046175526021985,0.3014252784837413,30.320866515147358,10.245770506771493 +0.14895131444063903,0.3006988921964416,37.02907995194387,12.254220550055356 +0.14822839215760572,0.2967015482530759,29.13063987848894,9.243997918545368 +0.15061583048688917,0.3023050340792065,26.381591123053003,9.039144523940172 +0.14933137568234386,0.2976303918077185,28.185860267431718,9.099539621429873 +0.15097333701125473,0.29884114856849325,32.448149132581875,10.725091737113342 +0.14861246193204933,0.2956301496342977,31.53137989477175,9.887819803283998 +0.15075147769579367,0.29426575882827677,32.81116563700903,10.356665887389468 +0.1488838808015214,0.30969592007109076,23.314425369188026,8.41259635215697 +0.15089032060024854,0.29975849822448203,28.330198030194403,9.395440278016995 +0.15171896932446038,0.29697069253763303,31.719864538400206,10.265446132573281 +0.1511638954444731,0.3064294498625754,30.16270383629635,10.712742355905162 +0.14970391336634295,0.2933263997782806,31.105997921156632,9.588629000761 +0.15173385801101136,0.3026504423355007,27.856008806744917,9.647971253145494 +0.14963903690066988,0.2992892791266329,25.62644199051723,8.41447349619034 +0.14786899863171046,0.29465218763471346,32.73828816801097,10.110488762340273 +0.14830043739463228,0.30179590466397616,33.33391843314495,11.074223059030498 +0.14972066572015155,0.29329923960466125,29.91942642817336,9.29929818095726 +0.14968180670910078,0.30368487275388706,30.888973401246478,10.545427119589773 +0.1518739419436568,0.3021836590473556,34.00577846722855,11.670888200124832 +0.1513373569201578,0.2992960113169822,29.659969447444713,9.860813347162992 +0.15160436704895,0.3010981673626241,36.64411401601438,12.449286997760847 +0.14870809657944523,0.29324066965704415,33.40093193356068,10.250535977092024 +0.150329666654505,0.3015776803893649,29.295545898925752,9.904251047292721 +0.15110408601686112,0.30238317785012736,33.19806246609083,11.353712675878493 +0.14911287190577996,0.2992352248448469,30.347226764990197,9.90312082340579 +0.1513478466633895,0.2962980407271981,35.68541092831026,11.460068110037875 +0.1503563256692775,0.30714086924433825,28.569871495685874,10.186432339695088 +0.14891257103394928,0.296688726025247,30.734192595943526,9.743439511560911 +0.151105303175229,0.29894996065185564,31.884589303779972,10.46387013660202 +0.14683980110850903,0.29302131628940636,37.91487937324246,11.521781589410088 +0.15005118664246028,0.29614219476553616,31.612243932956268,10.103649749107161 +0.1502371893551997,0.2944204279777004,28.55807190100987,8.953242542734515 +0.1516111490053176,0.3044040258957299,30.347403454026416,10.566693853101615 +0.14821312224234226,0.305553714812958,27.762839297622556,9.580249090441534 +0.15058036389882157,0.30120964748854995,23.304137265628846,7.880051394316492 +0.14751159516124104,0.3045117430978514,25.625863623354057,8.777248324422054 +0.14968171786301937,0.2979298363954319,30.265733028953793,9.809306867181538 +0.14902637994484685,0.29436900881321476,32.94978451310034,10.246990173014247 +0.14821532118475994,0.3061690727243609,31.682038781139664,11.007031013157192 +0.14926641068125943,0.30674418982891644,28.45440326279706,10.08300255254922 +0.14941809741096518,0.292584520491891,34.24498923168918,10.538070061953654 +0.1494371702021553,0.2986140517197328,33.90742531182021,11.050570051393581 +0.15061256206078197,0.30127244886893073,31.55060000864165,10.692445609275516 +0.15180893258345682,0.30914066357851544,29.549067783101776,10.790145838160383 +0.15068728655039282,0.30148840873794036,26.882296892997054,9.074449939020091 +0.14942716567458997,0.2923218917496673,34.26192248389427,10.496615929923584 +0.14980292323154265,0.30137721959111047,24.945347103870077,8.361949478660202 +0.1486372195220464,0.30348665546178627,30.825887911149117,10.463615818344296 +0.14937896477437884,0.2976727021751642,25.491255100968537,8.185568530092164 +0.1488265616723196,0.30297766723896785,30.641895492682583,10.385503058131476 +0.148838855994559,0.30068669479470905,30.19295051607365,10.034973817737873 +0.1506531831503386,0.2976345133477932,33.73310641425946,10.92219062603582 +0.14977990320362342,0.2982886259205805,32.732305316522464,10.625062422281657 +0.15000084994829443,0.3000301295153972,27.658024991021872,9.106955193691304 +0.15225710501013492,0.2978346445274063,29.91895901482293,9.818553925371916 +0.14817305361997635,0.30528908407897076,32.9734146523813,11.363147869847735 +0.1490344402055049,0.2943411804090603,33.9012644331582,10.513566096077135 +0.15025966169314448,0.3109671410224573,28.169493920086914,10.417199062512964 +0.148583316685014,0.3007806398250571,29.69795195646071,9.837671584721877 +0.1510825560762331,0.30232957350044304,28.50738709183433,9.748590869656413 +0.1495004260725029,0.30016803986102364,28.273580690642955,9.285662388512815 +0.14981439928459667,0.29881513808789495,34.50392392360294,11.289112459374614 +0.15091068054381374,0.302467459505437,28.311260389325504,9.613980971017389 +0.14909997719166432,0.30479042137133283,35.65438926788075,12.276695718506792 +0.15130616156420285,0.3038436201604296,28.970942637849586,10.04549883005259 +0.15186843568301658,0.29225167822589815,29.877997715611002,9.265560868188839 +0.14977494259410137,0.30192895562495725,27.66737404766756,9.346035286973285 +0.15189383237894763,0.30119200504941274,30.92548692793698,10.429113557842532 +0.1493896872256712,0.3020106084226828,27.244612736455554,9.177666015264949 +0.15036568554485277,0.3006719966701882,36.73988935552735,12.302849181812002 +0.15050728093898388,0.2994238110413449,27.82675162060344,9.187549196960479 +0.1499824925468035,0.3104885096845966,29.408171042714557,10.834360112828678 +0.14927979151865797,0.2963020864286519,29.33177505167398,9.308447373692195 +0.14949314255982643,0.2992559712577732,33.515172505333155,10.956492945956864 +0.15223538030184647,0.30371694105146685,34.38740887209568,12.04509030468316 +0.1513333785359546,0.29673535517331967,33.63053320690034,10.901160508591673 +0.1486884767803919,0.29960827874237556,35.66544646652888,11.653871377930248 +0.15022785417528656,0.29892598811010074,34.255202806799495,11.155145100083288 +0.1500446847038556,0.2947741300092464,30.883318926874477,9.693701333386489 +0.149530729694222,0.29793313186228654,26.34257337687657,8.56280273496689 +0.14785240398769836,0.3038824613025239,34.384275000045875,11.638938769404774 +0.14978234736190676,0.30247484130040897,32.49578111835835,10.998645782608914 +0.15081562716849634,0.29502756823272464,37.39273141591937,11.807808752137325 +0.1516947658363905,0.30214832436982675,32.48047556943996,11.055921988750107 +0.15128828263897434,0.2979108800648392,28.943963217364768,9.480860622511818 +0.15068116283040608,0.29975875562671955,27.34583784453978,9.075480460016735 +0.1495663750815079,0.2954199845583222,26.52315469716406,8.362502810976341 +0.153404983193812,0.3005152233901543,28.312684516574297,9.61342418466401 +0.15197700649943188,0.2991297553322459,32.30142569149332,10.71322644139777 +0.14915503460944793,0.2906435524385892,28.217206656216238,8.435126234651827 +0.14992032971143876,0.3073871144233205,25.838767024280966,9.182180630220786 +0.1538480867673471,0.3010074574157471,29.633520381070642,10.222685034618264 +0.15088176598636063,0.2916312967389822,25.446640477176196,7.790483619271734 +0.14993612643293172,0.2945369963866243,31.322249860359193,9.825497546378267 +0.15064391203039237,0.30539121155865867,27.972462898445155,9.903605107768124 +0.15136632172546702,0.30629825593407006,33.205609563444206,11.787452889288033 +0.15002053542401364,0.3098112267373979,33.94061708235345,12.389304462581826 +0.1501655527227246,0.309075792573876,28.20474154794161,10.204701229195155 +0.14966392433192938,0.3033427640110384,28.37661073485141,9.732244863392218 +0.14895087593485662,0.3029541125038597,25.708971329380212,8.715270367914593 +0.14874171289070937,0.30384815081731836,27.403406001063047,9.395321061579356 +0.1498689145466191,0.30151414645490554,33.204065929342306,11.091474911329973 +0.1511065664332087,0.3054692362131533,34.88252203197452,12.206359291083874 +0.14876906418405475,0.29695451593481553,29.522162582340016,9.364710359504773 +0.14988303524504276,0.30688639886867203,29.42119617813994,10.40581014806049 +0.1480558555254069,0.30247020489426407,32.477701714570614,10.798638566645648 +0.15021712656855019,0.29881511348141326,30.641069040579335,10.009811818444462 +0.1482840007392455,0.3046378237755229,28.496742184427145,9.755129123427965 +0.15232874591163678,0.29680254757082936,39.16262584770895,12.753504758885263 +0.14949931774512287,0.3041063151441979,27.05540339215973,9.293668741165693 +0.1505928479246886,0.2964959715990655,28.223548558035123,9.02754806727615 +0.15012427175262796,0.3010637927773365,27.220561179809124,9.094992859787487 +0.14801980301660816,0.3036543801001375,31.34849857487015,10.629067506812659 +0.1500867385067023,0.30634465152224427,23.51097156734263,8.290304883724216 +0.14877077745974351,0.3015486014242194,30.90770151335038,10.291509070092474 +0.15024106836095674,0.29596599786352074,33.61079380343045,10.681497984693236 +0.1489978193892505,0.3014684736226687,31.58319671240412,10.563937986715448 +0.14926634027697147,0.3015404725512661,31.484248598815753,10.557864061225922 +0.1491314705637946,0.3069001461105756,26.807949439174564,9.431211274268472 +0.1520519079767036,0.30258511857102466,28.57537466305894,9.83818394033662 +0.15007774098039034,0.29643262551590216,30.899661724287945,9.87659072027582 +0.15068963222309179,0.29919820648602014,27.239551741754372,8.992518582194263 +0.15051526087122283,0.30287684769117834,32.626001750187605,11.17536875883694 +0.1494887500861804,0.298894867175155,27.586617439801273,8.985403322166203 +0.1503604979685574,0.30747438885938255,37.92815139196196,13.452723763873648 +0.14853069376702444,0.305234906947794,28.5007342542425,9.818475212315807 +0.15133925171115922,0.29795144165275245,34.9696604115056,11.427903172401512 +0.1512476979870864,0.3019411896931407,32.369960748916185,11.030947701774968 +0.1515489465579641,0.30263343046831487,31.43855479165138,10.911714911031918 +0.15160879200171345,0.29802657744652544,23.88976491776734,7.848603688134473 +0.149064300181178,0.3029967164715359,29.72992939615525,10.060173788200132 +0.14965437424001926,0.31225350973842314,25.051638508321034,9.297753868406645 +0.1514650269457611,0.2968004738364224,30.502684118498053,9.88155165779316 +0.14876051230969034,0.3004418943053964,27.693585003297645,9.125791293416185 +0.1484086853098675,0.30727801960447515,29.599580050110685,10.440832193932605 +0.15033697768411095,0.30628613330376037,27.52341505419809,9.737181128446311 +0.14919815372860634,0.30082176769673474,33.09660787485743,10.971005632337823 +0.14959564600833866,0.29916945393343425,34.84748979206722,11.429990101950287 +0.14718780610125706,0.299746528495256,31.503390935029834,10.21067366823202 +0.1498602266062501,0.30366289062787777,28.208889038388122,9.682978747576996 +0.1510453374964302,0.29910330631973603,32.03089859340307,10.557506445205682 +0.14900887560237508,0.29680965930551667,36.457299493717784,11.619969420759853 +0.15039549818449718,0.2994452707681189,28.287579715121574,9.335720051423205 +0.14939070683862868,0.2886794580577476,33.22018309609472,9.766110255396727 +0.148745055432814,0.29476802012579584,31.11828480696371,9.738225304456279 +0.1496362985449041,0.297811595134583,32.606545583712006,10.512848919471093 +0.14874344070048112,0.2921575314186452,36.02116458874868,10.863341878743029 +0.14958800944836867,0.2999392233979651,31.750309703064552,10.508558858775233 +0.15010271603800662,0.3045069303719998,34.89886877563877,12.09929985480022 +0.15020652805386578,0.2935117521867393,31.57812545069551,9.78426577606543 +0.14920701740869194,0.3001947499199989,29.678186056046982,9.800266460890446 +0.14899500681853833,0.2941874702544053,30.813099330757144,9.6032661765239 +0.15178785364962707,0.29247576997089647,30.51755213502337,9.477760519482972 +0.15304507858941244,0.2966447293812387,28.708114319920096,9.368012020511118 +0.14946869732953577,0.3071440256512768,28.11179637204363,9.949527533422806 +0.1530573452385186,0.30180656296999936,28.91485367004659,9.998635210408647 +0.1480007668899303,0.30186207882588795,24.757988252563564,8.276430018547003 +0.14946782803360084,0.2900758996746606,28.501833153308965,8.51406386951207 +0.14934116320600377,0.3045398715336866,31.59290918469803,10.930060035663235 +0.1499416032166091,0.2986041561880714,28.275555738606226,9.261641945464493 +0.15092343377430512,0.29742545996956865,32.03950272152434,10.419242730653812 +0.15011435224950923,0.297729464370605,24.206251889985758,7.784485957001749 +0.1510189582361033,0.30134913051182177,34.68690784951749,11.684729057230019 +0.15036452875263903,0.30929920914101355,30.730634237710785,11.221971379980342 +0.14671348716270663,0.2889661015626476,33.48283722005661,9.691192978316995 +0.14961660568352309,0.296050785135825,33.074152561554236,10.525844112121085 +0.1507554977678148,0.29992742103317116,25.54387833737656,8.510250852233998 +0.15128676226610152,0.3018045195674189,24.62547278601421,8.399027286145987 +0.15181300527395006,0.2979184440695008,29.662935740240332,9.775382699188885 +0.15119513917883112,0.2993542950592609,22.21256873434029,7.322151521038533 +0.15048454614953574,0.29562220266994793,34.07762493642974,10.857519763126543 +0.14838119669507693,0.3007689462543949,30.222945004218083,9.927756375813932 +0.14975207226870937,0.3026094606167818,26.208738117259756,8.872185977374953 +0.14980298071873221,0.2928263537860688,31.73733771187316,9.796836930870741 +0.14934388404680854,0.3063250921874342,30.288841287547353,10.613296273639772 +0.14976059027164404,0.3031422716446645,31.349065262371838,10.67021978030094 +0.1498408020680534,0.29938262590939285,27.693501980662774,9.101994062971542 +0.15111803648108216,0.30239546012294555,31.963111378008435,10.926273173384027 +0.14826792205709147,0.29570549045065386,31.574053309669193,9.934626331339368 +0.14981537320978033,0.2939572749649994,27.80629596627346,8.640943729490157 +0.1489882112504195,0.29729029691614267,30.116691944523907,9.628761736466783 +0.1500822648362782,0.2975041871410536,25.6710269666928,8.277387193085927 +0.14902162945262012,0.29774104031568455,34.26601713491265,10.991386403253186 +0.1491555766469372,0.30804030666564103,24.54502636768644,8.724187497092355 +0.15124352599211235,0.2991613674665899,30.40932275500175,10.12268590171712 +0.14798054712407785,0.3000148354952253,29.796658153465096,9.717482174257155 +0.15189067191738573,0.3071158127333312,23.101406636568107,8.2476121734044 +0.15007457761277063,0.3031497910318296,31.976451966360592,10.926146372894532 +0.15057017834231676,0.31152396925547704,28.460199226450925,10.640886574589103 +0.1522771346084892,0.2937341692041088,37.34304918444231,11.787290522101543 +0.14966661869806655,0.2958412345828857,30.063880656371857,9.497455277604528 +0.14861441625704627,0.29427590666408693,33.997918533450004,10.546788135325198 +0.1487343280709861,0.3017060403401639,27.148412018563384,9.048234341365424 +0.15098348299066197,0.30788668857656515,31.27945197684635,11.219983159844665 +0.14884479304777434,0.29907538810286705,27.824669078320497,9.083786797540489 +0.15012063325482902,0.2940519375442823,40.307544332204984,12.550150923263567 +0.15016120127610302,0.30485551492262464,34.04475709440887,11.822907898487575 +0.15241561156454103,0.29851553362206984,29.65544387404923,9.818649632343295 +0.14872019875655726,0.3001373881311435,26.70775812539404,8.795795418043781 +0.15080751353239563,0.3018408190451544,31.248543171355955,10.594128404991215 +0.15053090276943745,0.2973438798313409,34.85215403382923,11.232099118267381 +0.15099519532945224,0.3019916426618645,25.544022330622436,8.654280482632828 +0.15028120443040704,0.2964859666951222,27.057394018131877,8.622360099926349 +0.14915747375071,0.3005050680682623,30.35122825547351,10.061680601319015 +0.14877204033028296,0.302220433380282,27.420400355962098,9.212411840896046 +0.15125736642174265,0.30494762703113415,30.490686066132223,10.595563761749547 +0.14779924267005687,0.29529259089737864,27.687571639439938,8.609169339070927 +0.1499047754788092,0.2988239139274257,28.21315986844262,9.24990874476866 +0.1507002517005334,0.2954894725319827,27.078293163019588,8.65474727577832 +0.15035010113194794,0.3006207407169748,31.725648601472805,10.668851834764412 +0.15210012943902212,0.30513578301430266,22.414443652835157,7.905746571014915 +0.15006272035414744,0.30026826591762,32.57035201011891,10.769869474907654 +0.15041136876320343,0.30864212509992994,37.34079542493906,13.538068585495218 +0.14891732063086624,0.30704187573636904,34.20339318192538,12.062451326402229 +0.15111217168437657,0.2993555076833791,29.457546528185986,9.821653735808562 +0.14917712053834456,0.30038848720815337,25.93335017691198,8.56332638090726 +0.1519067084382722,0.3002300567356726,37.879395995683794,12.749477546207281 +0.14991865193986956,0.29759815855392724,32.04001327414488,10.306694295047105 +0.14930927885154074,0.293815522367974,35.33715845537655,10.971039696202741 +0.15181732211865637,0.3083551922732411,31.163211865239596,11.384245340728938 +0.15106522092731342,0.3033723746923159,29.981836299054144,10.382599743915275 +0.14905748447314163,0.30608950112816885,31.39794477527777,10.91489306651549 +0.15054844712532803,0.305463122112815,24.592175109918685,8.675892956928802 +0.15145316666266082,0.29946493814942404,27.283163094262555,9.07810812874611 +0.15116523474612856,0.300186610675573,33.362499449421364,11.177987781886637 +0.15014961909292454,0.2987830643019073,29.088164396446643,9.51967825978883 +0.14932682799309635,0.2985993780906179,30.589803283378075,9.96360303287355 +0.14852161179841675,0.3011011855220957,34.17713495644102,11.321126112070724 +0.15030319553731605,0.30187309700110304,25.69774310443523,8.693373906623659 +0.1488139570568861,0.3049209403992994,32.16769920134675,11.12080943485244 +0.14968163375635532,0.2995028699525601,28.951090875858345,9.533006700412372 +0.15148903319553794,0.2978283506038287,35.317495232372536,11.548913267808015 +0.14952445572832593,0.29543915530033765,29.372789464059636,9.222772248084631 +0.15173723335907577,0.30463868041947784,30.668067903425513,10.82127275943284 +0.14901534408032557,0.2982539028110938,28.52014536603087,9.193357643249687 +0.14934273246529872,0.29782943175822,32.46199888695863,10.445512314468221 +0.14826889688375675,0.29862210307294773,33.4147063173458,10.779068980989635 +0.1496143672327263,0.29423556424387903,25.447224040321657,7.893732604936797 +0.14913730896802493,0.30290985526267095,21.561731606026772,7.359102655064715 +0.15224699088217344,0.3060106786744574,28.876127385822628,10.357077816738874 +0.1493391670192003,0.29446357326361217,22.496972665757877,7.0119100705839355 +0.1506718108031533,0.29901133649391853,25.37104500644519,8.383767996304819 +0.14934194154934383,0.29789396058464024,30.57898148770403,9.849258252801745 +0.1494174425084412,0.29822077232257127,27.69708221741343,8.965681141777214 +0.15093135042266742,0.3035134095605013,24.449887000227463,8.431536657354064 +0.14964430847329654,0.3015546040920544,20.72212018377121,6.978487633759805 +0.14872643532651258,0.30053621656949303,34.45644867243379,11.432834464697807 +0.150123054463629,0.30519471981423374,30.84635117215684,10.769084721575103 +0.14919200289735668,0.29983949883065997,30.897753634012368,10.192561651850477 +0.1495162100841066,0.2961158372832322,28.467440884960737,9.050137006275445 +0.15078473020398495,0.2990270188857155,37.91378398897915,12.529395238569068 +0.14969058172767438,0.308008496751349,29.30860619379051,10.479201117055737 +0.1510504859294013,0.2984806751033729,29.3546867228218,9.640972871650584 +0.15153967472433752,0.2984665595130986,24.35546897620516,7.976415961785806 +0.1497479209101268,0.2992339095114881,36.31438862346043,11.890170797630965 +0.1491550025093411,0.29874944528384734,28.98366387427587,9.437334775330685 +0.14937846502552232,0.29303768919036993,30.834425333541148,9.426162570071122 +0.1499411772569658,0.30174826685135164,28.052118734501285,9.451001782195622 +0.14913885249490463,0.29267557265693445,35.29226962828841,10.720818264289933 +0.15206863236952384,0.2943459802650546,27.346282470696906,8.655096792824835 +0.14741902827912312,0.29466001096771066,27.252111333103972,8.430739015143114 +0.15062899511190472,0.3059288616103764,37.57116039034379,13.245955305137027 +0.14965071326135765,0.2958868066823978,40.740150610546564,12.914951637617886 +0.14878459712332862,0.2985736878467162,35.51078564383348,11.511270604378174 +0.14882212577625686,0.2984291628646143,32.073483325258806,10.305828728383872 +0.1502318848565183,0.2974292659438344,29.650317628151097,9.597903672856555 +0.14986867492965752,0.30135721882409255,26.582726667838383,8.910962172831352 +0.1491184456465211,0.2977737383469291,29.65025856307935,9.518980844607546 +0.1491680241277339,0.304134180238478,26.851651292513374,9.252248304156252 +0.1526142775522997,0.29818513346284836,30.308407683078457,10.026969845626711 +0.15059088867869366,0.29819217053634134,30.630290355358714,9.9794575644142 +0.15009187620219455,0.3008266229099315,30.4040240532869,10.18170319900686 +0.14935386202143278,0.307054697551981,31.751073388988626,11.20852657629564 +0.1514100197594207,0.304683573207516,35.80845144910144,12.567714463158097 +0.14792157102981773,0.29932326547740074,30.050731501029667,9.740789651873008 +0.14891498502411013,0.30337695011451493,35.48956479727424,12.063245659457644 +0.14953512067721256,0.2987205511252022,31.9799021300304,10.410718809710039 +0.15026732637128806,0.3024764519098979,20.02631857077032,6.797353958567772 +0.14948461911518465,0.3023996433128415,30.42976475416596,10.273605365122691 +0.14943160746722328,0.3024572955973802,28.33359613500148,9.632119282797328 +0.14846812089397998,0.29724758337215185,18.239624704413714,5.827787194746103 +0.15033033271472904,0.2917858511918958,28.099272690302982,8.607096992066781 +0.1485933156025488,0.3022578992282033,26.976147859636832,9.05863765717649 +0.1508963978324125,0.30159972845868205,29.067314494349894,9.853371604547197 +0.14902978936605013,0.3027927143470135,31.61811090252395,10.678425824240387 +0.15061374871072847,0.3060400195364271,30.10342581618345,10.633131710057091 +0.15168041856401326,0.3061970422030104,32.10759927220783,11.457897918920988 +0.1495398017624066,0.30725530944279966,34.06986848973423,12.039571358100124 +0.14944862272628653,0.2956877155847981,28.091980366671436,8.867766856657994 +0.15140503109450387,0.2986243008203451,32.94402825156279,10.872903661466523 +0.14910983325724517,0.29473158536277266,30.6132270130783,9.522054047375676 +0.15037861529507426,0.29881760697218346,23.378469585620216,7.693075736528165 +0.15055730754782531,0.3042420886748917,29.357877683535204,10.181571399849737 +0.1510837562296279,0.298489560346636,31.355134877912594,10.283737971914226 +0.1489896218530212,0.30262237707933665,23.97414770016584,8.117670478941406 +0.1498910881898534,0.3044507915902215,29.926712123749343,10.372938640964005 +0.1512493516153254,0.2979938173342998,35.24637438512325,11.556546704821441 +0.14929214659486115,0.29937239018888406,37.20692476580979,12.162148166705705 +0.14949771906518347,0.3055240602760612,29.280459015672626,10.209407420367528 +0.14770507450592274,0.29566272755314443,30.089720704363607,9.446256325236508 +0.1484629395829242,0.2937218437660126,26.030297062810067,8.042927966050712 +0.1499321795067112,0.30825102034506013,30.144815010237142,10.79751735508709 +0.14870552122501857,0.301193121801619,26.781605833201326,8.898743078468081 +0.14995894393256742,0.3006943619948541,29.09227584256573,9.689425174433975 +0.1499825205899331,0.3111641199060322,32.42375804921548,11.959910064016746 +0.15280073763367996,0.2918516728755794,33.292340440537615,10.363926505181457 +0.14846324772003752,0.3000832288898834,29.721405083090747,9.790143221951945 +0.15219466500952536,0.298215694556894,27.580702979511823,9.118715274192626 +0.1495760856861593,0.29844028610242396,34.33763617593761,11.217122882805375 +0.15077491601056386,0.2980002928006384,30.31006048596984,9.848811451199015 +0.15024930113536691,0.30659212456914403,24.473943273487233,8.612155169590151 +0.15091111452622977,0.29856326137619554,30.575979103093083,10.006834549549453 +0.14949413367772957,0.3037564049190828,31.055608707327167,10.679861131081061 +0.14961243357695084,0.29699156984127745,29.259473117195245,9.406889564784223 +0.14956123785977174,0.2990791260322669,29.953812657377032,9.809920006537999 +0.14984588805523216,0.2959574540621208,30.330033123128562,9.616295051859154 +0.14996460917313495,0.3037619039747305,25.87190815111976,8.887914909907565 +0.1480257226408688,0.29385236444999624,24.00491625871529,7.415584558314747 +0.14900984546133592,0.29800626550157033,35.69235646754341,11.521813088324128 +0.1494021709385801,0.3023794252143484,30.42660570646331,10.274389403325698 +0.15060645497097538,0.301877040623659,29.824376968668904,10.153621324925327 +0.1500333845176352,0.3021376433141179,32.25554093796441,10.938356263939855 +0.15167483488864333,0.2925411138020343,32.17187165264918,9.996099838332814 +0.1505035609895622,0.2986022095508008,21.401029673867733,6.998351391913655 +0.1504630614711269,0.3009463757737091,29.257174788807294,9.740726188762508 +0.1508469667290671,0.2986421453982684,26.00328767243224,8.534305013218301 +0.15050580807899866,0.29848158760409776,26.2332959744437,8.599843394054588 +0.14819342984621311,0.2959305276821364,31.372916161864048,9.897302049634238 +0.14923711764130698,0.29710309339786817,33.56729558896696,10.76325692915899 +0.1508952694753759,0.29712352356594807,35.055410206468096,11.328192535465035 +0.151522160751871,0.30334513951335157,25.141754541624874,8.696047862727795 +0.14925329228104184,0.2961764024729039,35.715031791752466,11.35200407045951 +0.14973974418744754,0.298978595700762,28.043057005833383,9.139958254405876 +0.15023758211142899,0.3022507770094781,30.975777031548677,10.496513410291604 +0.14880739425700093,0.30502143697116757,27.6534174759722,9.513739440459156 +0.15112056388830875,0.3036886941997729,33.85986311104277,11.763074187258438 +0.15095956839461552,0.28889461662062166,21.88276594484709,6.483880193817931 +0.1491411861949391,0.30179026653359614,28.858060377684417,9.667857777598877 +0.14894232459511672,0.2970496864357128,28.947319559444473,9.25484681608827 +0.15007139455496743,0.2965730288945393,30.569270166147284,9.806350879228807 +0.14863071320713872,0.30332823336037995,34.39406575198916,11.723983358112505 +0.15136454603303562,0.3001751794679093,29.29771986241849,9.774527864482451 +0.15063310632553145,0.29133171003791986,32.30145991918147,9.876231515337192 +0.15011578767695663,0.3035215597482106,34.29635454950055,11.706214023226632 +0.14902585656006004,0.30727658485627457,29.884417114082254,10.58010315277547 +0.1511807797862923,0.30221150457180285,30.578604042619222,10.507037268538841 +0.15103309222731956,0.29742666060974593,25.780143457298323,8.317782512238757 +0.1487766502627119,0.2974799815709442,31.68383776557351,10.139737290818656 +0.15020146113030744,0.2975177317045459,30.14319274708062,9.75511898560725 +0.152317168972062,0.2926761640111467,36.56952219702545,11.46868343395447 +0.15053964222814784,0.29411314626134966,30.606088336027955,9.564511965510913 +0.148657087766761,0.2953316094116469,23.427092556508025,7.325509934784851 +0.15147658134832234,0.3068649635521136,31.809090876376626,11.360821824150685 +0.14912085623290092,0.2987958193875473,26.981602799647035,8.760638358877987 +0.1501541028443787,0.30275459731998444,23.642033314238596,8.065961928589967 +0.14959500185109015,0.2955250428501214,29.180394836448098,9.205813058897137 +0.14706547668521716,0.3000506205074221,28.081517221189266,9.07193571899043 +0.1508736824734018,0.295908273214061,29.77115332366316,9.52108115479004 +0.1504328905640732,0.29593712526660354,29.521182732288754,9.39356213537008 +0.14889539951215452,0.3011636321707227,27.677772344076658,9.181755128766273 +0.14941291996802777,0.2969178488774501,27.573572563488018,8.78258749128284 +0.15091003632256547,0.29425518539651413,28.879406355779295,9.145857017026126 +0.15093014660374854,0.29436256542809197,36.59760388764741,11.508237335362212 +0.15314235412938362,0.3025767233615449,30.763775481842938,10.639112802096825 +0.1491860566358692,0.3014357579409271,31.85368511969487,10.627168772567037 +0.1479654673843062,0.3032025069485427,23.838078261946126,8.037821980226834 +0.15013646231780012,0.30627808176638033,28.94712852981048,10.271280946263486 +0.15057275733173497,0.2994687477111681,30.725182171807766,10.18749396083978 +0.1486631600440337,0.2990068915734763,33.912813237301705,11.05059292346624 +0.14831358041657317,0.29959784640181936,33.878947032437935,11.059998283026594 +0.14959711565627537,0.29166189984092095,34.92904124863464,10.658420025752694 +0.1504850305374941,0.3008023096533805,30.91907585083221,10.39955661726275 +0.15071673126441568,0.29969573484042045,38.48745411640155,12.823262320225282 +0.1490817370964279,0.3005769226406982,32.546549512462796,10.741141059481908 +0.15069765785810676,0.2962327925809819,29.622421026046688,9.537547945886256 +0.14940853170996088,0.3037750260222448,20.19769880029473,6.907064932654375 +0.1500889423589155,0.3040224035042571,27.111136145436575,9.353013453253306 +0.14985153750717023,0.29358988385770146,34.75857625868212,10.812163817031175 +0.15008319695786607,0.3048731311403147,29.16658887817879,10.08673917843446 +0.1473448269199635,0.2974835746764654,32.15790461243691,10.18023406788845 +0.15024995757551493,0.29465180530783974,35.13635609269776,11.020823513617792 +0.1514009158094101,0.31201066714675757,29.181765185523577,10.981333795770183 +0.15017511879388318,0.3088041533053905,33.28177073163513,12.023419738642426 +0.1506245980777018,0.30229730706826186,31.63300376582034,10.74856519577247 +0.15054588656794113,0.29958432268703267,33.46144915011455,11.061581833270576 +0.1494253575703012,0.29772286701727885,27.378969809749464,8.78585423749199 +0.1488826986037764,0.2951293045090014,31.460052188678024,9.8435007205761 +0.14832753433515963,0.29776911176525855,32.30373151561594,10.362796339271949 +0.15244139655013833,0.29101153767070737,31.705575337664804,9.749157121433942 +0.15113871611006288,0.3082620345483787,24.98903162659579,9.035058408148565 +0.14912871208304712,0.30338038861064126,20.673369466080196,7.0327655600006675 +0.15087605845629665,0.29528222667164605,25.712482831149664,8.169583444536414 +0.15079648579812518,0.2930724256876402,27.708584278050722,8.641395921689426 +0.1496842365272227,0.30031561163310366,29.80179945743069,9.885905400332975 +0.15012704237797095,0.29546164446314843,30.435123429679255,9.675608860448063 +0.1510471063891252,0.2977451824681645,34.07302272607536,11.044179985502755 +0.15042802422379306,0.29895953805998265,23.636043992404847,7.784709115758189 +0.14957730261412397,0.29921405271643947,36.20652593590794,11.900878961846212 +0.14958827594953497,0.29706355864168743,29.25448534609478,9.378265331268556 +0.15101170997086635,0.2954596939890875,32.908254887106615,10.512042294174059 +0.15004250919707388,0.2976803069341217,32.05099894376916,10.376912532811142 +0.14943332680260898,0.30445324948208435,30.889270733194333,10.682079329109298 +0.15011083666320588,0.30367878013126787,27.95835232728612,9.586266955600143 +0.15055857587259602,0.3037181268166476,35.829868260686105,12.389115077395378 +0.15002500348034503,0.2994472135167083,33.421807212453096,11.032914216680252 +0.151172183605408,0.29590377959527125,30.497127325020635,9.76814854112289 +0.14980215496747631,0.30394557981993836,32.37559356615698,11.158970656905538 +0.14938680091411766,0.3040392188557711,29.20489579870351,9.992998723509032 +0.15144908122872064,0.3004888416488506,30.173632072819874,10.172499584769295 +0.15015522013623153,0.2992264484814328,31.826596316776577,10.436126293638983 +0.1487235724979198,0.30594527866482285,30.901846846146338,10.766635971485945 +0.15114150267704476,0.2951937898172113,34.23035736931596,10.9062916771717 +0.15263008505194842,0.29879298483757144,27.49577246839852,9.182744212439308 +0.14956070555998957,0.2999028577469079,27.816587337166602,9.195553385147829 +0.14628987801419369,0.3008235800083747,25.760663681403585,8.440275159970756 +0.15131629576342273,0.3043090330461232,26.749649317237225,9.341605228160908 +0.15055694943616213,0.2993897808226218,28.059973432311708,9.231172254406035 +0.15030134331258493,0.29523974356408683,27.72863610132116,8.807791273520943 +0.1506482480350617,0.29745414956130284,32.4346750832933,10.573867924516044 +0.15015996592716005,0.30482774357149217,26.13844936707493,9.065677143856897 +0.15040790795574058,0.30235731385047004,30.786762424786104,10.44977551741484 +0.15018221526750766,0.2981139215649245,33.239790761861244,10.814262122132225 +0.15084612908226816,0.2957314662753635,41.18691454207346,13.19610062411596 +0.1508618433434742,0.29414888924432814,28.11608010492822,8.802138422941963 +0.1501638866594775,0.300956801882725,37.14699436076744,12.534696548081417 +0.15199659310103322,0.30214792532120055,27.457894785971572,9.430136104022711 +0.1489126868335239,0.3082248649666756,30.769056618968435,10.958500121854772 +0.14931884975740572,0.29829181594638016,31.635118977869656,10.265020575848503 +0.15061053250801895,0.30284575228017746,25.55624561666887,8.787108028269742 +0.15065574351334124,0.29132464170810674,24.637644450834582,7.539816644230832 +0.1521226488656385,0.2909646066180605,27.909269033376283,8.606127479874944 +0.15124498148719523,0.30038695249616404,35.13783090830752,11.735238059783017 +0.15057546667566343,0.3007133745793283,35.91930998412292,11.998821977580768 +0.1483483478332004,0.29812827315188495,27.09329317981287,8.76047841696497 +0.15080683139852316,0.3046533076584855,33.0546139097074,11.450228411959804 +0.14980104156385424,0.30428481109386835,28.2506036735804,9.731414844627569 +0.14989746328919257,0.2913562061620193,29.47370780996163,8.939785339540418 +0.14970939665498822,0.2970251233707702,34.41395623221377,11.101697136997947 +0.15076883127244167,0.2951979963362588,29.386287256492455,9.289375416166767 +0.14853842728837263,0.29947966249568336,30.45116052671035,9.903815695044626 +0.15057972337474673,0.2985250795860804,30.34771774602401,9.953481023588102 +0.15032038443840787,0.3066071266342161,32.36922741576723,11.370664028063732 +0.15180633579267314,0.2967117981028808,32.54220873329364,10.52069433660834 +0.15168470117675253,0.29524836742563065,24.9596907643182,8.023620699830184 +0.14939997679593267,0.3052174163621483,29.688804830706548,10.384364221528307 +0.14916467040675715,0.3007245281133914,29.47800866583047,9.739895008910658 +0.150566044336451,0.3026503772101429,29.37235646138533,10.022059446577844 +0.14980009582685144,0.3022529903969485,33.57016150213883,11.417437254249764 +0.14992039301308016,0.3050828090644713,28.468975414279384,9.86226938654436 +0.1476527317941712,0.30062561910482544,23.765492918450065,7.826075144728294 +0.14941857058131866,0.2977262266462387,30.238810484398766,9.726015111403239 +0.14855683389992813,0.29873507632913965,25.84039648437522,8.344340028976996 +0.14810264386090102,0.3042927299912458,30.2199464535226,10.358834271377336 +0.1511094939380544,0.3007998087013436,29.931399252602592,10.03701639131078 +0.14722525574169346,0.30367005258464774,30.860086907563538,10.413280479121998 +0.14955314209641557,0.29764310479379447,35.553772921988724,11.426727815972447 +0.15176751571932093,0.29929660610998754,28.9840118709319,9.676856194272592 +0.15087155552818132,0.29265134410996285,32.45800271439821,10.026473318465804 +0.1510855894482687,0.30293760312065166,20.901500511140448,7.169998420390856 +0.15005196298765647,0.290476789204969,35.9302329380256,10.801627495973657 +0.14870390374457443,0.2978288937717562,31.8684962591826,10.179359155734396 +0.14966252541239375,0.30302896233042365,29.15384327224427,9.876596288486652 +0.1472035620393613,0.29899824785596213,29.841621629273455,9.584896427595018 +0.14996599717516457,0.30311274881141964,26.980930763608367,9.180509095132143 +0.14957184558310052,0.30415697181340573,25.190650455187598,8.662578101237925 +0.15003665683749276,0.3029787159884705,29.685526312221597,10.148576379261256 +0.14976739759364474,0.3033526282613485,25.516565266335064,8.708699345824051 +0.14794725347352286,0.30032360304196953,28.986409570754283,9.551024511387988 +0.1499666602165532,0.3018195418980935,28.036874087064156,9.405690861402993 +0.1474775787305305,0.29672115583084,27.658479121619706,8.682374836645792 +0.14993737997204828,0.3039694056182393,37.13499755626592,12.828156849036896 +0.15109509444741573,0.3001093079148672,35.23163457331781,11.718012484841388 +0.14854756181138218,0.2969396111160809,25.091954319497205,7.99315413224884 +0.1500305599206379,0.30239451343982476,22.818754849077756,7.746134062288748 +0.14950385712362932,0.2963036307395636,26.128493994085,8.28044971173436 +0.14994341822860704,0.3045222682041515,31.944484830609962,11.089443155602213 +0.14846089652132405,0.30605454060258036,32.03756911486029,11.163707870354832 +0.15013582762606253,0.2979242693917266,32.6443773967764,10.557717486643783 +0.150073640426966,0.30045786602202773,30.08824633270982,10.014064099056451 +0.14924265913784782,0.30122265743213067,33.1833480245727,11.077366576478926 +0.15306071327887236,0.30137582316823136,26.53096916375681,9.12123078597179 +0.1502635258312966,0.2994928676272812,28.474058984861305,9.414666022234911 +0.15042865352859366,0.2980716876143727,25.060268722712173,8.13978952610261 +0.1496763557885887,0.29262643048568276,28.801651063351926,8.810061554268703 +0.14913100945226004,0.297286549384086,32.50185103304084,10.373430415689647 +0.14912467149398978,0.303293717596043,32.748982877309295,11.132291493363024 +0.15057184966083811,0.30098882026312995,21.267482900950327,7.1376220297120705 +0.15013968399150748,0.3061523075386729,27.99139872398668,9.859997568401987 +0.1509283303366912,0.2913948417195026,34.51116356802715,10.570560507046144 +0.14946427579851523,0.30227731823298837,26.465356796198755,8.90259797513959 +0.15000890839687844,0.3015260387834789,28.01769285295905,9.412289673692824 +0.1484751773742092,0.2965327007853438,32.58903987299041,10.305487811523875 +0.15069022419785016,0.3060168574399029,30.571684465460493,10.86635766505315 +0.14863070209114726,0.29796176325082624,29.614474143318354,9.51939709476121 +0.15134573068152657,0.30296748922748945,25.716564524016828,8.88041763763647 +0.15081879854970412,0.2980248027004772,21.45897078512217,7.008624273145392 +0.14745810274036042,0.30565473039503105,29.270526769420933,10.107834652199767 +0.1492534601774889,0.300340726535067,34.75757302907004,11.520208070806323 +0.15038512347484084,0.3071842592054775,34.78384004643853,12.418125751327405 +0.15009517618229423,0.30722125221172786,30.01603945854036,10.737540515611103 +0.1491584818993425,0.30259805875650236,25.46298862027588,8.626127273931255 +0.1501647686491723,0.2997257327982886,32.29144891703004,10.611319302503315 +0.1489336323780241,0.3155795829477371,34.66961660590635,13.236959074190834 +0.14996350967311728,0.3027033555027251,33.81836684474702,11.554677502353607 +0.15112955891742694,0.30309442726779917,34.01332968362189,11.714805275988551 +0.15219118695246783,0.3020163159513072,33.75205334989588,11.601421771496407 +0.1485457625904523,0.3031700017658926,31.78596923317772,10.734410405076558 +0.14897020617834567,0.29973533719833795,30.042880751329278,9.863484992982864 +0.14977308097777525,0.3019816948884039,32.2139907335767,10.807347469480353 +0.15045636885364788,0.2995860174721442,37.60566898747301,12.464992413490094 +0.150746055398752,0.30380127091404485,34.33567829258946,11.873973421370222 +0.15022077136517206,0.30031611946971976,30.991533498776487,10.334896662161105 +0.15077153213875627,0.2976190971054179,29.0122894122261,9.466032978370418 +0.15105249361168355,0.29808747598513285,34.2425267091802,11.197425555735082 +0.15161145439299778,0.3006577605054715,32.68765919586306,11.01197550196764 +0.15188246937005692,0.2935780471978487,30.524231681372164,9.621491408921452 +0.1496177063128402,0.3113549986867437,34.55945620840114,12.716709065290036 +0.15203825954803898,0.2990851367011101,28.689016072634466,9.589192928063232 +0.1501132920554986,0.29827261634767427,27.11624105022958,8.793264760150128 +0.15107333512271764,0.2999440188287876,30.43366465845303,10.135254733212292 +0.14883239381575752,0.29910592076133674,33.17814200449787,10.832138075818952 +0.15082079014483563,0.3025748579319745,32.04393329942213,10.926989694088672 +0.15158905459358193,0.30372207881662044,28.445977778595086,9.94356723101183 +0.14854983351440168,0.2943482485577552,39.38210694863326,12.232911113266107 +0.14959287090778747,0.29622455699568023,27.891238901710906,8.867273668436425 +0.15201855218065352,0.2965889175489323,28.133932991927345,9.089261874341682 +0.15118004268405702,0.2993794819326196,32.5428106843994,10.755657105615102 +0.14778426753028703,0.2951734136975467,25.139465738920386,7.818542503756957 +0.14913526925205906,0.30377772734870706,28.083810151578398,9.584111353408977 +0.15191090497118898,0.3056415303811612,28.230921483641982,10.000511803908706 +0.1484882381934001,0.29834349810727484,34.08079886068081,10.98020721217452 +0.15144392003909588,0.2958014986386183,34.801756157506695,11.183311899284156 +0.15179417815286658,0.3029046075723229,26.580097149946457,9.16004191931725 +0.1490163691509792,0.2942320733756115,32.927358053237946,10.184598869083835 +0.1504005356697204,0.3062613537677499,32.34103392753811,11.463703678336824 +0.1499454383361951,0.2967875959928261,29.884751441340264,9.547117387896137 +0.15008284321975793,0.2949731203385351,29.18292820426911,9.202326694424457 +0.14998152285076788,0.3021350981194945,26.812082213265782,9.068899784557134 +0.1514147962140816,0.3035962804042345,32.669549267810936,11.306267716770495 +0.14955044799956427,0.29967360184776265,36.25293251815223,11.857131258695443 +0.14904952153265036,0.29712006169290817,33.48440250184578,10.724476342124195 +0.14927468504520522,0.29891405095118756,29.953655661651503,9.78871451920998 +0.14970372939823806,0.299951622211213,31.544194862184526,10.416317092554406 +0.15003837275228746,0.3009753448903261,29.66932372261937,9.900288724121902 +0.15117930885910108,0.30253476139717533,27.198360489589458,9.306077999402962 +0.14943439884521453,0.3063443981116435,32.371644067217886,11.354976014563086 +0.15096206837455728,0.29694287002711467,30.911510598638195,9.987266038670288 +0.15057071096251276,0.2998736596096519,30.138501639638044,9.984851313745082 +0.1521511652746639,0.3136535350669949,24.473416208619845,9.372502552337172 +0.14918293569206503,0.3002909893396902,24.090056906405607,7.963650060648746 +0.14869176461237843,0.2985078551904009,30.85817181055191,10.017965362410457 +0.15064097768326065,0.2960873180013139,28.024547343869575,8.953083720396604 +0.14903830908548032,0.2922688421920057,33.80623318154196,10.37170590405411 +0.15067996868282763,0.30677890560119964,28.94008397817612,10.343294006273222 +0.1508622625233087,0.2977239714760468,29.60533856460739,9.589497519852197 +0.15054603386921428,0.29953199052155666,30.983311551589942,10.266697097923975 +0.15014118403924334,0.2970138150147447,22.40729883228875,7.252336139878895 +0.1491896187403479,0.30249838164138027,30.58234177404367,10.408895272836867 +0.14867165244158445,0.29747047324023795,27.94895152663642,8.947632861344427 +0.14992040937909334,0.2980122926736729,27.67940096341664,8.94934535229599 +0.1500352403911064,0.2988069520196299,29.615573069329805,9.719548934280118 +0.14943711959818654,0.2976103722904502,28.28099601050286,9.086498956540684 +0.15019435108910922,0.2909989076250412,30.934535532833934,9.321381679692436 +0.1503600421890092,0.3052445147305015,27.895349313964008,9.700407240719326 +0.14986509838638232,0.30558970013441106,24.68925334320747,8.603159069132515 +0.15023401709645937,0.2983807222859906,28.807330025501308,9.39707862273289 +0.14966799215222226,0.3050919291880867,30.6631701647629,10.682235645882818 +0.14916729070947932,0.30059023033293086,32.532988994480895,10.805782554929683 +0.1503419277358287,0.30361188752647805,30.882569568967984,10.631038380173122 +0.15000742068592474,0.30031159974690363,31.70209460265815,10.547643571755966 +0.14759163497996114,0.30158337157236526,29.053953769255784,9.60530097237676 +0.14943493461042975,0.3083449916056496,34.64658161591563,12.415832015529665 +0.148332035166729,0.31087880950915986,30.004433713542724,10.906900385391978 +0.15018174651514707,0.29918427303062306,29.215654425144557,9.578866820415161 +0.1505515598030791,0.2974783857487953,36.01371334198877,11.647381580787403 +0.1472243151921999,0.30187097186747247,29.877090332460966,9.90953557892298 +0.1509764430142271,0.2978500286507289,33.254593388240245,10.811902487036933 +0.15007104554383793,0.2988103832328719,33.33453682436079,10.92493632256222 +0.15171423933431796,0.28992539661433386,33.55896636733532,10.14617373438563 +0.15002041908932967,0.29438768248416936,35.18438762205645,10.992046353505572 +0.15102371253752425,0.29919103083491455,35.994316192947196,11.907642966938072 +0.150975979761627,0.30155564822659336,25.586057637103053,8.647764351732922 +0.15044713783439256,0.29492824314511434,31.93235560642705,10.115140054891818 +0.14910783115117807,0.30134013876079585,29.826330957698985,9.93928495407546 +0.14916418281448665,0.30661062383191606,32.77420870203761,11.535937359074534 +0.1492361638486164,0.29952901297656764,30.39260472061772,9.985416267853433 +0.14964311425997281,0.2887615572035871,31.557904422456364,9.293398839381808 +0.15080878499498981,0.3007564212367959,29.53404880159411,9.911769263345175 +0.15039532032426242,0.3002519526742686,31.206398982283474,10.44450326435303 +0.14951941156332618,0.3030135557230122,28.95321479383778,9.881260644838484 +0.15093892075135332,0.2949528871014366,30.787956178541613,9.727494528056024 +0.14959203237478452,0.2890559105886098,33.36971667580648,9.8471510372342 +0.1510865295268145,0.30231912122093174,26.181786440441766,8.910579687232959 +0.15042754923519816,0.3066997112838843,31.601079427386342,11.245122204068208 +0.15089986773229647,0.2967813363732004,26.990216111743102,8.675319517589742 +0.14994742251585894,0.2967319705361209,35.61679070607965,11.384987253210745 +0.15007661762487792,0.29810355709728553,36.774733992528915,11.962312104593959 +0.1489555438804885,0.3034596237617873,25.276383082204177,8.689817036477416 +0.15012156279922848,0.30382376737691325,29.251035523229497,10.118787964229277 +0.15020128428018065,0.3075236309433366,27.503831698642973,9.830632375974282 +0.1518968277101748,0.30099570347035004,33.09463123563412,11.255434572772375 +0.1505220179511371,0.30840618181896073,27.926440134872475,10.126554936598634 +0.14917079578803963,0.2976443055445046,36.4768941894277,11.686936068887887 +0.15010183354736495,0.29584527685641443,30.406764058166644,9.65535669266472 +0.15146083102084873,0.2990042547753686,26.507031900679625,8.755355532917452 +0.14844790570911642,0.30168563298975876,28.604238571209667,9.525699548852334 +0.15041959478235617,0.29876199201186104,26.275435229790627,8.654845615331617 +0.15102067722451376,0.29386276078371765,34.859238266791614,10.909591032071848 +0.1508903961321277,0.30592425037814924,31.32658794107276,11.073505400353701 +0.15089621643339085,0.3049656090954614,30.030124468392806,10.514052194537669 +0.1486759585632364,0.3033752797350535,30.23175728656776,10.28012622590159 +0.1512089507081679,0.2997224666186917,32.69447095110937,10.912320059791286 +0.1479012482028148,0.30083731884778026,30.198048605048555,9.932086590228412 +0.15004621669698878,0.29726992927520307,33.90252735538629,10.9432229209386 +0.15125363877539771,0.2991262169696003,33.684105830677304,11.200578680142696 +0.1493133505340897,0.306454890869998,31.94497841434481,11.275377395751395 +0.14959653853332922,0.29635415446660185,27.497138762894977,8.754877296179078 +0.1516761726849361,0.29232536184763913,26.29787266170922,8.145683779245939 +0.1500182161250967,0.3020051817684498,26.647311533739476,9.013308295170773 +0.1515555760263168,0.30115353927703054,24.792947623666453,8.362768030390988 +0.1503585859583759,0.3042008453784902,33.334910084153975,11.514050695322037 +0.15164100202458983,0.29821042838998046,31.541694335424253,10.371304373101331 +0.14961429177170424,0.29512496088587803,33.07581824478645,10.300522494336839 +0.14906569544125917,0.302117304060041,26.80638458041723,9.016949277208552 +0.15136274592076865,0.3103068406487046,33.45337196505887,12.341544368326504 +0.15022148150287437,0.2969756412245621,29.537155909670485,9.51504177296019 +0.15061734068504387,0.29486445324380706,36.33454015938793,11.432107590553436 +0.15209201989229942,0.2950568704582408,30.007091123542278,9.618003762062296 +0.14995391569450298,0.29751240623780995,33.72709163633462,10.868429173316313 +0.15001232846768753,0.3100498631462953,32.76120992816861,11.993922209924849 +0.14956417805435032,0.3082617209326906,24.390216145981533,8.761462569536612 +0.1515512340923047,0.29074130869517856,34.07196729044985,10.37124171841425 +0.14986512582542383,0.2981185557034098,30.503918557880855,9.887966250743041 +0.15031351540815138,0.2990718816375098,30.820754667874645,10.127442855299872 +0.14875686679557423,0.29876326933235875,29.14734723081554,9.47861035895895 +0.15144393522640356,0.30049910927381374,24.220341108407986,8.223661474053092 +0.1517884305917953,0.3029764292453884,29.835269567406794,10.28434564601362 +0.15065828000363055,0.3091059997854844,35.14365303798337,12.843567518912135 +0.15174705020107535,0.2996082725871279,34.90978609568744,11.688791673180365 +0.14752651872607567,0.30404144339678213,35.757803232794,12.086293182024043 +0.1500723962964581,0.30246138487295454,33.70362057925719,11.420213962297472 +0.15151089587674116,0.30391619725626223,31.869005180163583,11.036278589614488 +0.14927048902474813,0.2959658707852493,27.480487601135344,8.718227364847314 +0.14833527660374377,0.2975873287520703,24.98524387373731,7.991621062633815 +0.14786848226719276,0.3080072241923758,24.811535458773157,8.8160567499912 +0.150506646656927,0.29647442348783204,34.61349571149491,11.065289581348381 +0.15090685821297814,0.303860271280687,39.088282406870434,13.574863297628612 +0.1489806346706394,0.2937527850611376,32.72485575533845,10.102024794694211 +0.1492963502074725,0.30225881918690223,29.191203891211742,9.82925207424227 +0.14998752797332093,0.2909312738681106,31.390876833924434,9.472523071756394 +0.14919570697799767,0.30694103684562385,26.44413493935842,9.397383337588453 +0.15019979172213924,0.3064976494948885,32.41986960162854,11.498743462299078 +0.15070191722530388,0.2974119535448898,36.38499488385061,11.73474583611893 +0.1515253233022824,0.3000622615161986,24.45424623152199,8.189796243175874 +0.15167379332329306,0.2989281671568408,33.21827039904709,11.027822257167879 +0.15111264893935544,0.30507577322379714,30.823639530704362,10.719481302681633 +0.14804538264343914,0.29944720586318907,29.008339722399636,9.399540947510559 +0.15273192648133851,0.2968573641464815,33.18474580550856,10.878678828792545 +0.1505495687010902,0.2974536456002474,27.306612591906877,8.861518376437777 +0.14996117368913603,0.2943457514387063,35.686865237600195,11.16463545101459 +0.1475940328139064,0.29834883903691045,34.67596878841765,11.118971246325726 +0.15060888135729866,0.30406808368525134,28.030466239149604,9.774668534624748 +0.1508187350465357,0.307070638566268,36.61210071266109,13.092178565225643 +0.14902666604402295,0.29705163868634593,30.915902866734964,9.868227482453312 +0.15012334242456427,0.30752902235383534,25.920674821990442,9.25477493007857 +0.15116237374829572,0.29938869012121233,29.673880167060165,9.879190837205744 +0.14716669600687643,0.30807047053391473,32.88413452372613,11.535730748825241 +0.1502396993464982,0.300901219435161,28.330886732478387,9.409962887919335 +0.14935949561729153,0.29885931208494704,33.42914925659725,10.883604346647843 +0.1498440094405153,0.29723352366356764,36.22424768476266,11.62321517780871 +0.14895696689901308,0.30607183664782056,26.84162553919353,9.390602833106348 +0.1494042553484704,0.3078667061400821,27.342189765964218,9.718086242706823 +0.14933451168040124,0.3071986697527515,31.015401040501324,10.938539136248405 +0.1503265867426408,0.2961685114688979,32.92513330907774,10.465515549156134 +0.14983936494187003,0.3046654805738976,30.019670920133677,10.359175286166733 +0.15041909813120238,0.31018911572537117,28.487906738596376,10.432961017783782 +0.15159549480395862,0.3007637043939719,25.937445231074356,8.759648303542587 +0.14886355716351088,0.309483757566457,21.01328659927175,7.572320555264039 +0.150752179617311,0.29575768894664584,27.26880463879626,8.719753665640413 +0.1494785282785803,0.3059351253855607,33.18062324596161,11.598035483358354 +0.14925948206658404,0.30524688333395006,30.422475672900255,10.5516014012209 +0.1502916022854355,0.3030516106124504,31.319240722130882,10.705018347911835 +0.1490001330539206,0.31067510111771596,22.464126270461325,8.165204239959966 +0.14773925560537485,0.30703790883666626,21.25498823421914,7.457092926797787 +0.150101489344986,0.30164678044175813,29.487458590896818,9.92325900721363 +0.14911128131729248,0.29718588888321185,27.344918149030306,8.740985937257328 +0.14854489822900424,0.2973088042702456,31.98185317871807,10.19286851016151 +0.14941205889865936,0.2947727683570191,33.9851953740705,10.592158746628847 +0.14936122018958825,0.30578116057325305,29.038745522719278,10.158905289745494 +0.15114673880032367,0.30354247476455887,23.03103946302629,7.966053285317991 +0.1503411567799113,0.30697768183803,39.30724317566079,13.999021405533757 +0.15105472347613266,0.2996169735686692,38.28576639084284,12.704090116037023 +0.15139299745135593,0.2993389008629265,26.753676182640206,8.90336794582846 +0.15064191761943474,0.29852829960359395,32.12431742154824,10.476811111770122 +0.150197633049568,0.3083968720733971,30.787752325326714,11.13493650583415 +0.14774176279401943,0.3101977946859031,31.09475803372817,11.199526092857411 +0.14918767653233858,0.31177204956357163,34.22412317294143,12.58746662147834 +0.15112114512198097,0.29774515144350916,31.93965075660989,10.419866981343336 +0.14996536161638632,0.3019389060169935,28.7566761397452,9.66817398744774 +0.1493737277557658,0.30630772492771874,31.80368597242567,11.193124481926235 +0.14898905411074992,0.3045018692455646,28.61740562597859,9.821272999556651 +0.1523105432518779,0.3004644849817676,30.849351458857964,10.391404312528827 +0.14742204971815365,0.3072980603502881,28.97316470845142,10.118796059011451 +0.15012005019941654,0.3025333299930898,29.62378846967718,10.127140156347744 +0.15076360306880962,0.30055083378714126,30.083219704306433,10.002413449282237 +0.14774774114745037,0.29898294848869233,33.78830051934181,10.919477108804744 +0.1506255164089052,0.30362441569749465,26.158884809403993,8.997229656877021 +0.1500618669117975,0.30020400988387547,29.626278405169778,9.867866113356468 +0.14954372592491003,0.2966790313883309,32.132166684814074,10.203563611295376 +0.15279879538783248,0.28950762209123,33.304262851385694,10.084542940985497 +0.14915975701230422,0.3015906280625015,25.219548581385574,8.452826943368901 +0.14907740456840957,0.3058956773908288,31.662208626378415,11.069475555889884 +0.1489009670635744,0.3015476389547356,26.316141495337536,8.768691722112353 +0.15040775864109587,0.30259821344478927,27.558312881520706,9.327111796184514 +0.1472243227403273,0.30869198579910934,30.908374594522183,10.990654043197056 +0.15090870367118617,0.29401446781053797,32.86923582238348,10.342511408378508 +0.14814522457565546,0.305030735273677,27.68221484796239,9.453099057528014 +0.14963490644660526,0.303098955165886,29.368255265861013,10.059032648787689 +0.151198210097055,0.29885761828823654,28.099624767184594,9.234811336990399 +0.14921554706381188,0.3042906161593349,28.404083008365745,9.778174573962293 +0.15024641531527302,0.30240570232616365,30.44438440359634,10.359745547714281 +0.1498863076019546,0.2987851771117795,35.201171123178746,11.526576855118341 +0.14895581148511014,0.2967824435287926,25.893127168653038,8.225779906122595 +0.1537241241984455,0.30106378664925243,26.217628215120595,9.025076076037978 +0.14908445413709384,0.2913703993026949,34.307075712228496,10.335820924120384 +0.1509934550848374,0.2983794884386259,36.56295130699237,12.054583166590827 +0.14917704466826798,0.2952221615332231,32.308253192878134,10.190490974334367 +0.15063222912051033,0.2995406424695869,30.865623545864416,10.238329688328337 +0.14967489866518946,0.3023697373527036,25.516564069912352,8.652796368270076 +0.14876565383842355,0.3004506053537208,28.643684424144805,9.4815817817979 +0.14979491768061212,0.30097130396038835,27.60908258410998,9.267209030389456 +0.14876016120012941,0.2969464568816164,28.05311601667463,8.981781656933007 +0.14981367925523403,0.2948764050859755,33.50601731386008,10.5259107866057 +0.1506896178007023,0.30572012753160677,30.23584021949554,10.609316750593381 +0.15243986858610808,0.2986552197329972,35.34078198375197,11.736751766408467 +0.1498514574067397,0.3023145182321984,28.65989123655709,9.73219336617965 +0.14973794353484146,0.29862127547049544,33.27937301592313,10.875510798083441 +0.15126033317833118,0.28749122809418715,33.23996007039621,9.786585667731352 +0.1495446565313801,0.29780169482300906,35.53338534264499,11.45485176378322 +0.15082617573720739,0.3000783988592799,33.25006834924283,11.05097604400453 +0.15219647905155434,0.2912563529734065,34.34418015829418,10.583791025068024 +0.14940148959775865,0.29888806435424126,27.509264354132803,9.001649636106386 +0.15025757847894855,0.2968105824482904,30.362226267862052,9.755931540914572 +0.15124259655991376,0.29895477114759395,28.301614393414965,9.359063839191375 +0.15088626447582212,0.30181320392816074,33.94099900689517,11.541376335371519 +0.1512271258648696,0.29897430397573205,36.162024667086555,11.964604484514128 +0.14875836642235374,0.29953924198234677,34.206212951652226,11.200155751707443 +0.1505515177388149,0.30130761226627917,36.018209130536405,12.162356777824936 +0.14795098411128757,0.3028690982786083,32.80147135711972,10.990146056424466 +0.15066345212577262,0.3061379543985671,28.02494372437358,9.889004455209392 +0.1498688962588884,0.3042747364614315,33.224407253142374,11.495620249157781 +0.1511908009081899,0.2997119484121435,34.5040748991875,11.49854148226733 +0.14919401817083952,0.29727460265851247,23.739706063501185,7.601257163175144 +0.1509529340180886,0.30220949312090245,26.12639548000782,8.87752857154905 +0.14948772752465933,0.2999259547186016,33.20767191967741,11.026274545958309 +0.1486349591752679,0.3019949446284335,30.288848401727194,10.152838919818876 +0.1513446849177707,0.29572488890443854,31.659834523778716,10.11892961624331 +0.1473960161818882,0.2947598941578979,30.365672926920215,9.358843952207401 +0.14996077667413607,0.3066571493666906,25.826770918212866,9.056745791449355 +0.15265793617868526,0.2972681847910318,31.29720286764956,10.288777374335583 +0.1492417604472084,0.2929765238306304,26.568839275631195,8.174729966008721 +0.15040357946763352,0.30288980065095356,34.38165836565564,11.702575606891573 +0.14819780466011748,0.3004385530453564,25.32901571279708,8.308012546876899 +0.1507633882125035,0.30557604703980307,24.548169860747183,8.639131048626412 +0.15017079959565952,0.29973940164178825,29.264580213916858,9.680246198517418 +0.14906147535145028,0.2985336340308801,30.496984891246974,9.861557937375366 +0.15050813269843497,0.30031900599836253,32.48606318767466,10.855383436502802 +0.15103612967224717,0.2936868417789775,28.280217907050833,8.876878754452761 +0.15186241427217048,0.3031455275130496,33.8208469929001,11.735049997698075 +0.15185864139833055,0.2956259167608082,37.00160653606174,11.896547625643425 +0.14984246723274167,0.2942681503173357,27.889506808309005,8.70943786300349 +0.1499817950147458,0.30222777973895426,32.05413720934781,10.805688658976253 +0.14848862546753486,0.3055455989847807,29.510163520632677,10.23612894459919 +0.15129089105523078,0.2964009144118516,30.64690884422028,9.911214582317172 +0.15040455379407988,0.30251356444144684,34.949941309274216,11.93079236809867 +0.15014539021924947,0.29892605956173735,36.201172727639914,11.850676134200187 +0.14985837848624214,0.2989250734398376,33.97974748136045,11.04679203801169 +0.15123664103371148,0.2988085881169198,27.314991958444338,9.025691063999346 +0.1514385698313616,0.29616711055042066,27.000425462110858,8.700577618454252 +0.150267348453317,0.29491865363633535,33.372342767494494,10.53105418543387 +0.15008848097186303,0.29969842950694203,35.086746468448865,11.60756674581252 +0.14953789540591875,0.2930842029498012,26.649832577915348,8.18506729121734 +0.15106920111916455,0.2983571357871916,23.28175487057035,7.65758519752106 +0.1509359656941498,0.29990195574388184,29.538083864061438,9.878268321512692 +0.15115501788335736,0.2980387243640346,34.37355300136416,11.2454802129667 +0.1505231310168393,0.2979311562446744,32.4785844680121,10.60033422492411 +0.15137772342566688,0.30124057081884653,30.2694338013806,10.236358786609049 +0.14972691366984903,0.3070264418021966,36.61960663193208,13.010086407743469 +0.15091062143095388,0.2971720230219162,25.000255681661884,8.052370871774297 +0.1511386478466319,0.29634513047331695,26.883437323659237,8.62531195527594 +0.15008462387368607,0.29651094361759306,34.56075023876316,11.07303865179044 +0.14701966409788644,0.3004392741081591,33.85560273829859,11.065562242837624 +0.14867707252776366,0.29723642372954745,39.49476324505095,12.591713864017942 +0.15107986791962177,0.29721859649007704,30.489438377757608,9.89766687599394 +0.15011488875084042,0.30014570682499936,33.7499967787005,11.156958993709052 +0.15221870502758336,0.3084343484274188,27.447044466709684,9.985065883991153 +0.1512509814163417,0.29433003118657125,29.806366898757023,9.41122900682281 +0.15117878805416265,0.29598544432854423,29.061255736555676,9.301509760706526 +0.1500922285589333,0.29706068102798594,33.80006191736862,10.891773547770033 +0.1518879600629523,0.29898065163019705,33.422499113401045,11.091479233322527 +0.15095834497757024,0.30274686697180875,28.426696521684317,9.711058084079626 +0.15079567460919238,0.30515158180402874,30.699130204358138,10.729159162383857 +0.14934075784324496,0.3025310345383543,26.919502673802885,9.153838865481607 +0.1500543144124589,0.2995253449491973,31.62000707458597,10.449382640055624 +0.15155623435919083,0.29961136489622225,32.90123233672207,10.966204958456649 +0.14951995645406604,0.3082201687319642,19.95868440511743,7.097090864042583 +0.14760201438693782,0.3004724537206517,28.232841888116216,9.255904926006599 +0.14779092977810623,0.29071731929837574,32.76202912254371,9.730413085707433 +0.1491623740716588,0.2962389197420503,32.45636496243322,10.250880536508221 +0.14946164117152957,0.29653950548537084,30.464043580216412,9.667011995390464 +0.14949773523804236,0.2969774260578205,23.8620439741878,7.6490579390220415 +0.149960556907964,0.3064415435482632,24.82347834972292,8.77780495740306 +0.1514203322833583,0.29968259716087353,31.42029881437975,10.488567799689747 +0.15055737803637645,0.30630462073295767,33.51689271347229,11.846716321497944 +0.15120864997725922,0.3009440647172057,29.963168545855037,10.085357473220913 +0.14899279212480038,0.29330904312988176,25.62921549120118,7.8817479504385215 +0.15105935335217813,0.3012438082787404,32.960604658232484,11.164264342094928 +0.14784941879844132,0.3079957179141506,29.764299694931147,10.517175839285597 +0.15065036688154718,0.2927757309021103,27.45874628147905,8.46930595825136 +0.14914601331280725,0.2901538908663763,31.888982048951405,9.484488927811588 +0.14893743050870345,0.29711627768431,30.188025048763954,9.658608480162505 +0.15079155143260545,0.29825336392257296,30.654580469025245,9.960743385521946 +0.15121704845259587,0.3044421964303313,27.242633864535705,9.531203494700447 +0.15063654499200305,0.30185562906989977,34.695123633187706,11.817022857853162 +0.14968482659355914,0.3037162050386218,27.555679387581794,9.555450040306123 +0.1496819792395299,0.2989840204308278,27.64664756369102,9.03123425370152 +0.1496333077311794,0.2993908040706199,28.69326418137503,9.424091993197747 +0.14954703288332746,0.3006311534960641,25.34343053950323,8.412849625644617 +0.15003787976313512,0.29660482848075914,34.43554535598618,11.03963931295674 +0.15020503250049713,0.2993006758049192,30.751481624571802,10.123347817565215 +0.15054684233309967,0.3041475918761166,26.76849761760211,9.322336730576316 +0.151176409992443,0.3038507714782511,25.481840204403333,8.85817453451678 +0.15058133634980106,0.29839647203227515,31.410843424644213,10.281842888273818 +0.1501164003578849,0.30290971684315116,34.95081516104412,11.926671744473673 +0.14870870628412772,0.29911373277126313,26.146484303095402,8.534145026886769 +0.15075055057909711,0.30616848674486086,26.923112459475867,9.568316019808073 +0.15074525683937098,0.2918553579684512,31.658167661932637,9.708151450711034 +0.14954554711946627,0.30116243967153034,30.28292408927563,10.161641143407072 +0.14990041386936065,0.30228712199449453,34.272923709166434,11.65939842965061 +0.15045106612158363,0.2990953001137047,28.114167755882715,9.275493092853393 +0.1503863929155109,0.2976212255477522,30.246764388281537,9.751199157027244 +0.15019797827023715,0.3000106448129475,30.88799329891091,10.267543985226247 +0.14966411091296064,0.29763115557517794,36.927849229833825,11.942374095866713 +0.1492068479172189,0.30201974847622787,31.217571536174788,10.498276268257325 +0.1518907073550811,0.2956484448389705,30.43353251824483,9.777252585442957 +0.14955247225066448,0.29815156557390265,27.314507629261982,8.821677053473447 +0.1502436650151414,0.3037466620280247,29.7164154870646,10.231666570937726 +0.14976210244170166,0.2985474226428221,26.70977182661979,8.707835024759937 +0.1512168525523791,0.29655703704774067,33.53122401347239,10.862009990992181 +0.15124997148606492,0.30145148209894385,30.10706251711293,10.215341718284254 +0.15102039477316617,0.3011362668999081,34.2183596729988,11.555388393960992 +0.14927384960338666,0.3000266800372907,28.930875346601717,9.532615066721558 +0.14897381524113582,0.30170070233536067,33.882115245137264,11.331929609037445 +0.14995349467904134,0.30219865676720364,25.209011062506388,8.503995153045514 +0.1488645394878935,0.30362749117716326,31.095209893227157,10.592924690355332 +0.15063115312071765,0.30502852930017016,29.115290844646427,10.198355252383108 +0.14890165875497113,0.2942254254935604,28.82116200352384,8.915033812382127 +0.14893890083967098,0.3041066876767933,26.36411300198654,9.002289613964603 +0.1508052335942665,0.298925637532032,27.16186411164882,8.962375611443761 +0.14842648865049934,0.29962788401843704,30.21863875895262,9.844861017007982 +0.15051416687547736,0.29428404091626553,34.725772830851504,10.87594121439406 +0.1509575144045163,0.2955371444183768,33.07492726899305,10.469402776617589 +0.15176814512964398,0.3026930539329611,30.79893851660414,10.576263476743435 +0.15030164456712505,0.30284831815079044,34.765223990312094,11.826541996156827 +0.15027921642337938,0.30683599634790293,32.51005329560275,11.58230884120171 +0.14728138425921644,0.2926434958218858,31.64923584663656,9.54349678239735 +0.1507575284044046,0.29210042730555524,24.849058613723656,7.684507021154809 +0.1500049250616565,0.3031062058111396,27.194323553502247,9.332150431765799 +0.1487168849670676,0.2964163804595073,32.21573088731027,10.209686191547206 +0.15075699133854817,0.3034139750626313,29.01431882051022,9.989719410597978 +0.14834700891791752,0.29963856881203704,35.08200228687244,11.450391648799496 +0.15182451040441056,0.30392998085130135,35.91982115755415,12.42735166201002 +0.14889302864109205,0.2948418329228591,37.86348995957854,11.824041444916647 +0.1503711211854792,0.2975105405793958,26.840376992498186,8.694657683105342 +0.15125413677062022,0.2921259315315851,34.260986352712834,10.54735717166166 +0.1519646946306437,0.2996683439804958,21.42197425749427,7.17313939741468 +0.1484600934854459,0.2991377244063529,23.710963458079764,7.697749791715194 +0.14891410632892274,0.2988098380563203,31.743169415855345,10.256761434163158 +0.15066958563408175,0.2951500528344038,29.969531644365887,9.53878630645548 +0.15054966845771045,0.3022017488787465,30.747535506480485,10.527917237009378 +0.14806272196892042,0.29465372012727564,34.435503601961685,10.710265284843393 +0.14997172913770979,0.30651510213206745,32.47431075342442,11.417037889899817 +0.15117117131752694,0.2917292272518141,27.764525272700183,8.500357642467375 +0.15159874956945657,0.30115157175264834,29.51188427479089,10.062734759882941 +0.15043374973978196,0.29660831932668114,27.047671261162318,8.706239007600306 +0.1498057484815538,0.30121785119025507,33.89142789793691,11.367397727684121 +0.14789567691673852,0.30196473516278916,31.148834787039068,10.448674031225941 +0.1488294866750703,0.29256419767629227,33.91688094566335,10.34174434433083 +0.15085697837387252,0.2987449175042957,32.92262687052016,10.830422013537566 +0.14920199188867211,0.3008471194837781,29.77245789341505,9.925668151517995 +0.15052748038362745,0.30095241276052387,35.59227534524553,11.940957419512525 +0.15076325794371298,0.29357480346153286,29.340350689559806,9.130312442363135 +0.1501764690265589,0.2995196023313363,24.365027140691573,8.09936415044696 +0.14966904009886267,0.3052383842940481,24.206903430325134,8.445472845994399 +0.14868761060530106,0.2973455630128658,32.29125182245676,10.322375935045311 +0.15063362817850906,0.307037400258243,25.98411130267952,9.292888381135977 +0.14893327816488533,0.29528791586084013,33.565934687041846,10.550531955321762 +0.15017370993630055,0.29823479661294,37.957742666959916,12.436546845933393 +0.15070160401760851,0.30339393884344934,34.812467822573694,11.97663251933992 +0.150832258891719,0.299543367830413,28.108345672654828,9.318232357885304 +0.1495652178989082,0.30892162251966204,29.75510102125093,10.758924632664922 +0.1490765561033728,0.2936808755010839,33.50120921681035,10.357682603202344 +0.1507180329854221,0.30354436302789806,27.86521878224896,9.64179106792109 +0.1497967552535799,0.30216213544523557,35.958024479518684,12.107584721499737 +0.1503944591532032,0.29952990150772413,30.867847503731902,10.16323250350204 +0.14957929628929098,0.30146029662921797,22.82043823563545,7.640989320914041 +0.1502356353774901,0.3056037396018075,26.995701954372365,9.526998896734046 +0.1503338214091052,0.3055681512190886,30.38999455302239,10.708257468749096 +0.1504410029693449,0.2948036468702991,34.35347582213354,10.834846131345344 +0.14856311746568523,0.29654993115068257,28.31349539089163,8.97390091269914 +0.15146680372352042,0.301732767837017,32.497306124371924,11.026076815835575 +0.15042569312934767,0.3005818497522339,35.444084693209554,11.917507516956862 +0.1505274006263153,0.30369060984544877,36.81698494232931,12.64791808385251 +0.15011000129068966,0.3030368117390581,30.093816878650752,10.261939540528456 +0.1515239624134868,0.2980517982761791,31.441045046718862,10.300464234523826 +0.15124208627284313,0.2933373424284313,33.65331225024641,10.497051006788578 +0.14985998052949054,0.3005785195306973,34.28967923656887,11.39011396080651 +0.15021188931656335,0.30171125427496914,28.753124501034144,9.689699131610409 +0.14911313882918142,0.3012528369082108,32.52422251029407,10.890077489548956 +0.15032240581357864,0.3029229043309101,33.70839983360081,11.443637035451347 +0.15085208346857668,0.2989352158071677,36.85363275739923,12.118241764951293 +0.15031841203212024,0.29327163649696353,33.65359890694176,10.435361855360695 +0.14787356351293823,0.30277710444816797,29.265373825893057,9.789588980600792 +0.147614225701062,0.3004627640812067,26.171588071358748,8.602406014502876 +0.14898958289252526,0.3047821475108864,30.778340475410154,10.617208072680864 +0.15152818736152615,0.3018856573123969,34.02404261996352,11.591377767253263 +0.15003499208965257,0.3028292605271953,27.41406625965335,9.379812783330312 +0.15136377013832333,0.2968016101960674,38.35328806281334,12.431948082944324 +0.1498827157796835,0.30843931356550974,36.46909986933902,13.119947155532632 +0.14871337441654672,0.30384476999128057,32.173003035957244,10.945690197405327 +0.15014917077940734,0.2937468278021895,33.408281565499706,10.418815119066625 +0.15302948609505895,0.29789564451548634,27.347464774697546,9.033439218908681 +0.15031386357921248,0.3066368888142671,31.860685450800645,11.323987120272413 +0.15016886402867483,0.30465543523082483,27.771821775415372,9.678442198374116 +0.1502505033534802,0.30017686285155093,31.453346884174376,10.418743623976825 +0.1512462608600947,0.30362550742386146,30.832776602706044,10.64017509880815 +0.1503295284047975,0.2966764728275484,25.960002410448894,8.316749262922574 +0.14952117372988893,0.30165794611401653,25.193815819174393,8.448657346085543 +0.14944276187311584,0.30409938659928093,29.479639548649242,10.130651168787438 +0.1484519765435036,0.2986560450144415,39.04871935204383,12.624017391488406 +0.14871945578709161,0.29947358736515217,34.05779498935618,11.241285095454518 +0.15114992891463538,0.2920878614281889,24.62669395402656,7.5710802071877445 +0.1500224819224408,0.2959402374441665,30.488445405644175,9.648711918238675 +0.1502392934332353,0.3009577572317961,32.36014928630358,10.830675189699303 +0.14974285552240094,0.301591505528705,24.20785628222651,8.101815756774375 +0.15013061630773614,0.29808108589706656,25.150809845683703,8.196801270555618 +0.14967298990034558,0.2997450366378831,38.004137347578585,12.512629895642338 +0.14992919064645452,0.3052126130268347,31.982966766096474,11.244107736229351 +0.1502090834939124,0.304976188279243,30.155283630009816,10.548261420645598 +0.15026848432272913,0.2932701131096796,27.217240708839576,8.450028124342944 +0.14944652947931283,0.3032959770027709,23.6678188520576,8.046422121762305 +0.15040461896191407,0.30206528762025553,27.109039252678162,9.155663379839762 +0.1504922919693039,0.29054118025907455,24.61732150895415,7.447804977599117 +0.14910210523182174,0.2993956696583617,31.589401136626837,10.333482539075487 +0.1508220633365633,0.2988573645562054,31.44945168896795,10.356595799235773 +0.15058994247338892,0.2909510310489874,28.322267752414632,8.623093618504152 +0.14900871860030934,0.29951312054656976,32.533177602715355,10.644224312825305 +0.14929337686013366,0.3029452725227361,29.625730978659696,10.043413877830407 +0.15018649847838705,0.29359053573809824,26.944428272429917,8.355572922789456 +0.15007827273545463,0.30420799629240264,31.910309545382535,10.969322171268509 +0.14993901866203935,0.30066466820325627,36.3791801618848,12.07420164414293 +0.14885856858200075,0.29536921004670624,32.523786928977465,10.198408610603558 +0.14957152920716602,0.2995349861547087,32.33065240642796,10.562178372045615 +0.15051753082043925,0.29992540417637825,33.329345172107686,11.104997219388034 +0.15030228817895827,0.3029717325051204,31.040964576080814,10.615308494931815 +0.1484624525422483,0.2988307561975425,30.05498706841398,9.718551973038558 +0.14888276043656964,0.2969522089042105,28.08023262483907,8.955993133171685 +0.1496719995486927,0.2919109873933123,35.79845797122066,10.965005905284617 +0.15029311495094014,0.3094287001399119,23.45836653918558,8.50727727624241 +0.15091964884714623,0.299963218337733,36.160923779999635,11.957776418657852 +0.15109598329800666,0.3005024472545272,30.993687905045608,10.392037123506576 +0.14965631932309167,0.3019141239628933,30.225162432576266,10.18183570199313 +0.15131396676829342,0.30147361398136524,30.28433077441294,10.329994260638832 +0.15048637978133342,0.2993597464660071,31.84737518883069,10.510559456755301 +0.15016673737018899,0.28999659716589626,35.50364612751036,10.610693607550473 +0.14738591128104175,0.2947372581857313,29.01277831480424,8.935773213567476 +0.1488093878551757,0.30743356580620107,36.335616238205695,12.889863504494825 +0.1517813246349319,0.30324181713326953,32.99783754133938,11.38537009284713 +0.150758728380869,0.2970595202012445,29.24568675497889,9.45656563771629 +0.15131989912749075,0.304031710543142,28.5189431623976,9.908293098869532 +0.15175563571148867,0.2976515901505717,31.920847087078297,10.417592749936498 +0.14824076772755188,0.2968697300776827,34.35004275069388,10.925628780770584 +0.15089729837535842,0.30365925859072807,29.59194908431159,10.274826181125984 +0.15106308040215577,0.3075729492798916,32.37900260840095,11.672886249129787 +0.1517354087338235,0.29025654663565253,29.200397294606937,8.885552830450896 +0.14823542116693725,0.29815827778438286,28.938213478273955,9.264698314041423 +0.15154834876713924,0.29792698181185195,24.008755509333046,7.871932990162026 +0.14959729750167125,0.2994374379576436,32.06393736344493,10.570597731619692 +0.14792977909299737,0.3000417773393517,40.82540593972179,13.351537175515492 +0.15196658111533673,0.2946385411084125,26.09044580106551,8.338997530510644 +0.1510220850504848,0.299738917510093,33.62464381268533,11.196876026008894 +0.15056967118126055,0.2966678130030911,33.61173312173384,10.817619185272502 +0.1517707078250806,0.29349498596725687,31.882869494672228,10.025699943662003 +0.15147506942053213,0.29528351740341396,32.89982952511258,10.474005574162053 +0.1500181040440888,0.29196888047046937,31.410076436487728,9.559782205306137 +0.14868623831084904,0.30016010663540793,32.31530281600955,10.692330174987362 +0.14843661537867275,0.3048619819544252,29.57267827491789,10.147097648772029 +0.14935356041469383,0.3024077044842959,31.254387416036455,10.590472317259344 +0.14929278593165152,0.30429970700145087,32.23894762213105,11.070031787510883 +0.1505337093469242,0.2988069632001269,34.89624555335462,11.493628400831524 +0.15121260121649183,0.3027581628195519,35.08942019399526,12.07934788460749 +0.1489193568264593,0.3033530927076887,24.11312630231134,8.169468146429 +0.15076703786156756,0.29502217255024893,34.08919193457311,10.791119172536847 +0.15054218163325714,0.2967558147490412,31.987682855829018,10.294399367637991 +0.14953055967520004,0.30351860341069214,29.219941031778212,10.002680820875133 +0.14959700788475358,0.3018123199685266,26.10714103576688,8.783203738271029 +0.15117570090083168,0.3040979425724393,24.623430462113262,8.53983093089476 +0.1512568769373476,0.30390501004466275,30.111676917649863,10.43036557237571 +0.14949131369551366,0.29987303894252987,31.667631187325675,10.44095240733032 +0.14900671696079928,0.301513168462388,28.853242167467812,9.602355947064813 +0.14978756623540754,0.2988137179429864,28.60090207585285,9.317503573509804 +0.15036270974495508,0.29006643415678907,27.15392991993081,8.128656074280554 +0.1512837415211956,0.3015567688667979,23.532941899761802,7.975692610765678 +0.1495591644592673,0.3074223300869523,29.786339068072085,10.499009713761371 +0.14828298397720358,0.30549806350968883,26.478325886992987,9.153302662687553 +0.1492822729373184,0.2970438996280207,28.20429896393201,9.095263548669958 +0.14990051644596777,0.30548572048317885,33.42444394001757,11.628652355062053 +0.15005055835352255,0.3031442339835692,30.382556293090627,10.391817052730225 +0.1486067758124017,0.29891551444119185,28.821375362481557,9.343403549793875 +0.1506437316020271,0.30016200232361956,35.844887460099834,11.830060559519445 +0.1490859544222344,0.30457317076830714,31.80362578352571,10.945371769361744 +0.15006509001935886,0.306770807981222,29.232113196279876,10.395637032015946 +0.14932782227031074,0.30045598380072996,31.9918718057975,10.53974966636883 +0.15123907282744287,0.3015247222918784,25.922987946446916,8.796781837609016 +0.1496552659910478,0.29453060569342243,29.463981544514642,9.19744859453254 +0.14875250708547624,0.30144723058369227,25.832422763660407,8.622386789576131 +0.14996107573470427,0.30423699251532155,29.425285949656672,10.219843839859747 +0.15093899029653995,0.28960054393113316,34.13228569972372,10.221225991677711 +0.14955452097681618,0.3013937963023212,26.309347712901648,8.817941914816643 +0.14978146621559815,0.3061178492764605,34.98293931381591,12.24444682965456 +0.15024256964746727,0.3064390527095013,33.191150532791916,11.819635003489598 +0.14882859329938236,0.29936129573981846,32.156847864253315,10.471735546901114 +0.15013074415945168,0.29368661934606727,31.258682223608737,9.711805391483326 +0.1499962394192698,0.30618458846575763,30.75082349140601,10.860163841485003 +0.1483661712219665,0.29489089587624445,25.897643911205627,8.072150279870213 +0.15016909795222208,0.2940812748740644,27.210657771842737,8.53777380221041 +0.14770905240245816,0.2988029679742595,33.04682593592117,10.74821040028409 +0.1504706001374261,0.29360471835183233,29.783580443639046,9.269498121430289 +0.15106720100056262,0.29401558610509215,25.094609778352396,7.943548361001013 +0.15093940259993072,0.2922969940609524,28.880885318437358,8.986781444225661 +0.15175233897053178,0.3038750891284353,27.14456420767266,9.408639459663577 +0.14957513232572367,0.294119013402869,31.947348594894486,9.928199991299774 +0.15039435534057494,0.29539384762894944,32.02003746263402,10.125494170494 +0.15056360878977945,0.30332954606846935,25.313174972292884,8.743527321176554 +0.14939001505792693,0.3077775812330945,32.2496776316018,11.549140382334972 +0.14948332710852158,0.29939340366713824,23.50504751207855,7.674796198835257 +0.14892432182206336,0.2963109690562844,28.98611479585104,9.225921188053903 +0.15005619968168907,0.2971092224727821,31.42829248609925,10.054136377946058 +0.1482419158748991,0.3009716413880165,28.962002423342803,9.617265544013971 +0.15012840183811435,0.2919312229530458,32.36518937033421,9.861727026409891 +0.15020654460440572,0.3059886333848216,25.80801920413371,9.102426706867877 +0.15121393587244067,0.29785226204632986,30.917558037647137,10.122876297971871 +0.14996563010225417,0.30134540552396566,35.12137391320328,11.771037468377854 +0.15029830029940242,0.2949710079177352,31.23133364423206,9.88133328668207 +0.1511119111883414,0.3015865882728825,31.329649884742775,10.62367150512918 +0.14924692296059347,0.2987733718958023,30.27513086974693,9.8587082285617 +0.15127436537312827,0.30154839363563585,28.711165501277677,9.796495236037586 +0.14847706777775357,0.2966056616147545,33.93109741304513,10.726537641138675 +0.14946214455930718,0.28984494673266153,28.212494421228403,8.380500038175887 +0.1506825926411751,0.3064262925111831,31.009909882591167,10.945446748874495 +0.15099243380503366,0.30340702212937015,28.58124642359956,9.801112721573395 +0.1504494182286553,0.3047830913829803,38.47640322115666,13.36450576347629 +0.15106487824036255,0.3005892952081447,24.919222219033635,8.344135055723386 +0.15196836674126585,0.2923502393382312,29.63010102781788,9.19344493910101 +0.14926247152236263,0.2994402272515033,35.52990400329769,11.6920420335638 +0.14976467681821243,0.29670154156693357,38.051075396857776,12.178321145054468 +0.15029593867639982,0.30420229052743125,33.38294066262675,11.523936486991012 +0.14857528292565486,0.3021919233109612,32.19633576988187,10.763034301563895 +0.1510594679886518,0.29973720389448055,36.60107852580917,12.185170673321384 +0.15246804262893324,0.2998333618128473,34.20083288308479,11.500285352995697 +0.1535709971024537,0.30959122838707526,31.668862939015582,11.853204420432208 +0.15123094478754415,0.30549275800011766,30.99913726547713,10.918482367078374 +0.15014861880458383,0.2933854513532002,36.88113647741596,11.481509761423878 +0.15042934534432115,0.3038639078507019,31.91667634402292,10.996945049389945 +0.1495930405242381,0.30331042623897003,34.29334553983028,11.666747088793155 +0.14979711836621537,0.29802794755613404,26.994616966403477,8.769529047466268 +0.14984532953417853,0.29556387253697286,27.0498643164782,8.559434718148317 +0.14869799101823036,0.30434497072303573,26.21586079150661,8.993305473093198 +0.14836285038374317,0.30517211624538715,37.26622461243694,12.852664984418093 +0.14943159371727405,0.28969698619514245,30.66998910233591,9.066638096358144 +0.149940932235718,0.2975049294999836,27.1245990680857,8.762096258382288 +0.14922791883559514,0.2977634618880283,31.13517718691211,9.96238658775658 +0.14926952451310155,0.30083614805899594,31.851987221588303,10.586985105437451 +0.1495666051874417,0.3009023040516559,28.230462642555405,9.443281823166174 +0.15123404167979212,0.3036907729071329,33.631049019883726,11.65065908415119 +0.1506915748929467,0.31007286603300815,28.791522579345035,10.522978193073877 +0.149236094491469,0.2952837526413964,32.337132937049894,10.137734662811628 +0.15027005273435337,0.3033658700023189,26.480970893509884,9.114870928114595 +0.14844500558979445,0.3010653223761643,32.107848308819634,10.681984767554077 +0.14985653448034897,0.30064514440767826,30.196704481438143,10.050163651391866 +0.14953464697694818,0.29900325269412065,34.242284739469646,11.140426989003949 +0.15024043507619017,0.2985587045258194,30.206342209120415,9.83436491844351 +0.15245607917602663,0.30142395567712105,34.34573805931154,11.710476207827014 +0.15007613950607337,0.29951428809644365,25.93698385831209,8.547068560236008 +0.14948567046068434,0.29459933683133566,37.57067084720336,11.799902421384306 +0.14972077488181865,0.3002441567088723,31.9496906294171,10.533847068473596 +0.15032282142747763,0.29885684637501947,34.10185615697111,11.163145758980717 +0.15011087593107025,0.30151323260757185,30.58147659411447,10.299610896279773 +0.15164252198537173,0.29501365807090807,24.532006072465236,7.852103144213662 +0.1496703332648168,0.29424596699080013,32.848038158588324,10.228364741019794 +0.14999798393376856,0.29706567508528287,35.60582101979719,11.435674622125283 +0.15060374276638175,0.29856610266922673,31.134019552887885,10.269183100433752 +0.14995430489691716,0.3018683241406865,24.042705088855634,8.117618952649552 +0.14819069856063,0.30329389305647303,38.994361543850715,13.238693523485017 +0.1510184485200127,0.30247508614175417,32.048296414670524,11.017520555522488 +0.15119218971675003,0.30332837393149786,22.9323035971646,7.923357557494507 +0.15060577459757615,0.29566289570867216,30.654435948931607,9.700718817872058 +0.15033794215104931,0.3042312182154079,30.323577133895128,10.487081761688454 +0.14916663760403992,0.30164730140562657,31.236148612720857,10.511949237930395 +0.1493016947289959,0.3030567651314524,29.057893570185445,9.864812295436248 +0.15172826084290864,0.30051688073430777,26.586032564923496,8.981273370883144 +0.14966676113287605,0.30039227827431575,29.254795160924676,9.6943680767718 +0.1498135767028827,0.2997613639297315,31.03551690024411,10.226351567804484 +0.1503949636328519,0.30230270361168105,29.892999501677544,10.211885598278212 +0.151573802597699,0.2982939553198602,29.42107167630469,9.6998484769277 +0.14831131917804652,0.30058640293349087,31.51515950761884,10.342440708473132 +0.15034405785893276,0.29973775830680177,28.36103096251965,9.379845345378182 +0.14903190317417805,0.3079035700240502,28.3025330722287,10.063550524782102 +0.1478080524964651,0.30955457859831015,30.35901745271205,10.871103933055402 +0.15029019841852218,0.30130550729433697,33.32374829294493,11.203764573589691 +0.14962738778213355,0.2995570057864302,32.16595164112327,10.584775403022231 +0.15078993494856646,0.2984270466767336,31.97557096547065,10.52222327495193 +0.15034022260438115,0.29713208877591196,30.829875770429066,9.901457272457298 +0.1491323979084778,0.3043204588885452,29.74965779562403,10.223674046426117 +0.15040581658257285,0.3005155497833545,29.43965251756935,9.79157941400253 +0.1478512612441709,0.2990195686566001,29.232743188963198,9.470235808418142 +0.1500735641391952,0.29483498293008925,38.76464139601996,12.223634242143937 +0.1487289227115036,0.30412407481335674,29.853001069863858,10.301775850103581 +0.1495354880629886,0.3009103635681213,27.087591140382877,9.092106475576859 +0.14898115608072893,0.305723515109334,24.387767483343488,8.474497798906455 +0.14897699488692448,0.29472217413551693,31.166275609724604,9.766383056288335 +0.1507806833786336,0.2937987107105424,34.40202924008551,10.753586591427483 +0.14946882543439236,0.30557679927484255,31.613262427974693,10.990715626912099 +0.15007446744233974,0.2970966476571149,29.88335297755974,9.577581598329585 +0.14961627985765372,0.29809507390120726,34.31154924430163,11.147886141284527 +0.14889122692542872,0.30256451279338104,31.32402980905584,10.56346332959485 +0.15050269454145407,0.30578553339113806,32.76557981421831,11.567576331988679 +0.15229505271838192,0.2980766828179947,36.38319789957793,11.977440920532379 +0.14886430027943778,0.30531143580287384,34.52110714936033,11.968323603263034 +0.14963434211851567,0.295459189244937,30.302662211960662,9.590708169856164 +0.15016411639580113,0.29662514339495627,32.13514236479925,10.36706838300313 +0.14964471737828816,0.30623342441099,32.11797966513122,11.228588715183676 +0.15089495471534464,0.28669953358657735,32.47598717431585,9.367748841935402 +0.14901439932110488,0.3015817295623231,35.67924275387125,11.9129333301493 +0.15065699854073972,0.3036763041655656,28.312507967551436,9.776709790950727 +0.14922245746610346,0.29832700490896075,31.390042997097453,10.157804154899141 +0.15037367287703232,0.2925690515548204,30.453856114618482,9.403168602634725 +0.15030175150196196,0.30214945370991697,32.583894056423894,11.07201588224418 +0.14976302423069693,0.29803403215069535,34.664996394579084,11.23770611052974 +0.15066174317294365,0.2951221344713463,32.66855482390812,10.304461667937773 +0.15101810601617244,0.29293100172253594,27.392627361136483,8.536144622209695 +0.14872508626990102,0.3008814647672245,21.7817644231091,7.239791857943913 +0.15201803723889057,0.2990632269986326,35.19298258317643,11.613395717018953 +0.15105365960056866,0.29858451747018555,30.197380640425393,9.935498483852733 +0.14904539584416507,0.30301646208662014,24.323889331651962,8.21539122734183 +0.15163033690423086,0.2980432363822574,33.799329180240534,11.093831322356856 +0.14946963993916157,0.29529602543010225,36.78909615567422,11.629944984474523 +0.14918988852785864,0.2940231863042375,30.339571206401775,9.398481960191425 +0.1502965418038214,0.30007676671221867,28.269440520536108,9.414317439700133 +0.1515097059027011,0.304775227234421,28.736069170635616,10.092638780269711 +0.1495828253110589,0.2976348466213151,31.809280218843178,10.285626850498998 +0.14856869286061794,0.30442414789867916,32.283064691468155,11.082020360157571 +0.15073573708215263,0.3018972187753007,30.088391425553613,10.2233142496659 +0.15097968602277714,0.30211186095026205,32.3789178452419,11.019646265377682 +0.15017706037985587,0.30082009425988304,35.36351103601454,11.7893024482316 +0.14828818168020752,0.3042725082702825,30.51656866831515,10.478334292167034 +0.1508488591509756,0.29640717039690057,34.43829542286709,11.085449918410864 +0.14854289556534664,0.2949858792728813,30.643407873853164,9.534437088132208 +0.14944846974729745,0.3001512360637616,29.035524535697657,9.592619040110659 +0.1511193358234461,0.3038840255882353,31.829802691828533,11.065056206478213 +0.15061035143255283,0.30992663218675276,27.13739800766237,9.973450528576388 +0.1472259356960803,0.292873821948525,34.31355818885529,10.333688074200808 +0.1504820054957166,0.29293663947218546,34.12244446399096,10.564758347789594 +0.15002957211115853,0.29204054146181213,32.14621384199188,9.839772179501209 +0.15029129991205636,0.302926946931672,34.88576424559817,11.940177710442759 +0.1490519184371965,0.3092208137824031,30.62775414360587,11.059733703748124 +0.1506192360434431,0.29686306554164565,35.46433093979432,11.445665241656465 +0.1498211913893357,0.3059710905475735,33.17537498227907,11.589815088297865 +0.1499106202647163,0.3052391878799995,29.881247905119114,10.44192793551343 +0.15075946157762252,0.3006716139764046,30.21222067813192,10.14562553060421 +0.14941864819702555,0.3087688492290572,31.011346489877816,11.13137159103197 +0.1503504048849847,0.29452409465573315,32.984415981968674,10.30157179164134 +0.15231336686595584,0.2995847855557831,28.38042668717172,9.498120390580539 +0.14992876770553593,0.2955073007104968,33.84688927454856,10.73014356345847 +0.14778828328970486,0.29554175998218146,35.16309051594405,10.983385609846408 +0.14958180397078402,0.29657019518738886,30.10413394012286,9.639808547729109 +0.14941658735708052,0.3023224618429213,26.458471021112604,8.90399985788873 +0.15054670517225383,0.2938443238772191,28.94806312253282,9.01305642020253 +0.14809105406044193,0.2970556779062674,21.25541490431505,6.754265743507642 +0.14975263655850765,0.2986276239949644,31.757312797393606,10.362837008645783 +0.15108228767347873,0.3031198105675986,26.6938975269629,9.153639858044976 +0.15046852541727404,0.29856093598532274,30.113350600386852,9.874983761990242 +0.1499646622645416,0.2984918196481945,27.807100940766905,9.085050972306021 +0.14733646705132958,0.31225589919720237,26.590665574647876,9.74772233508828 +0.14963801794465154,0.2983725877691983,28.73595081512813,9.369558332461953 +0.15029511066647305,0.300656239004975,32.41485125903267,10.85475495497344 +0.14934110313127025,0.2987606527276248,32.71309643106109,10.631147733042798 +0.15131856242565542,0.29263084290026437,32.93764133478025,10.244594818604536 +0.1508542142177066,0.304585265305606,32.568582245568486,11.310028656859561 +0.1485668797319397,0.3003702945950658,29.60388428417201,9.74775419488824 +0.14808798214606864,0.2982771136447815,32.701877246416544,10.493636595635381 +0.1493555857522384,0.2975563751582676,33.25637625626635,10.729876307909315 +0.14859885165940132,0.29399196516054826,29.43950784204871,9.092754542383354 +0.150117852417438,0.2969059059879977,25.17812588547092,8.115761535597482 +0.1492549549927877,0.2968873683733181,30.45891359866831,9.709929147084168 +0.1509124025985545,0.3020541990916436,31.19217937353768,10.576428810011462 +0.15095647001605247,0.29678947856126414,30.644626116918328,9.849203465645411 +0.15033459171458652,0.3039113140573403,36.71239704942944,12.678631101730714 +0.15003159638163854,0.29579140394140996,26.322359247086776,8.3703114758238 +0.15176791840016493,0.2961909557875221,31.329578367121808,10.13759706794733 +0.14931951086371675,0.2934774643747336,31.792920803079483,9.811213739690254 +0.1494385903976748,0.29849983884466985,32.509333364174175,10.500417985956386 +0.15013535290322963,0.29690211973554687,30.682877330032014,9.83888579036708 +0.1494966940861589,0.3063392998965729,29.813754603674667,10.43408466613716 +0.14871431505560823,0.29883952549613074,30.46311029746167,9.886617007900796 +0.15010738890910708,0.29980573055499643,27.988413693902142,9.252874923285688 +0.15013729898998576,0.2949371164945765,31.267862807104134,9.89156921549504 +0.15050723855780088,0.30575978792356356,31.69148958442447,11.191980545240975 +0.14917028554866266,0.29356131933529805,30.92366236779113,9.548200664643998 +0.14959592960264056,0.3015747576588524,33.60207127262726,11.267490647299379 +0.14964456379453495,0.2959273484550434,29.58575794140641,9.399535250816895 +0.1486305125339834,0.29859172881813506,32.57814235468342,10.494987427389566 +0.15061575573809474,0.30502510243361153,29.741684106244534,10.375878115296894 +0.15078819242972993,0.3079330594219004,36.046347090419154,12.98750247978473 +0.15068822489676814,0.29452844976720544,28.65206436408655,9.040349125542393 +0.150100205720832,0.304509086627755,24.252033702721626,8.444714889250852 +0.15081262193741332,0.2961390177730878,30.68930936578938,9.806830528903488 +0.14951171083907255,0.2989018343235903,28.34341878063096,9.300037648670584 +0.15020592737654595,0.30209872699909185,20.987840718305012,7.104071652179904 +0.14928230993739955,0.305178815499527,36.0740460284905,12.558577348073449 +0.15243122250609972,0.29381058933884696,32.279542284411654,10.21490130593091 +0.14975608415790917,0.3063226007890185,29.929617974990546,10.522990641522846 +0.1519518583900202,0.29549269134844863,29.944448117881727,9.589269820652271 +0.14960138010307075,0.30532195911617377,36.714359798264226,12.783908540477002 +0.1513381247597114,0.3022938272203957,29.57256193317909,10.122499451084863 +0.14742016348772174,0.29804230392400116,23.63076029280212,7.569159768259938 +0.1508788811122436,0.3011513359756591,34.258198291073626,11.495345687046036 +0.14982899787560972,0.30426351790674216,26.863863967461793,9.271968754730683 +0.14895592765773213,0.3023338566832721,34.8640475078041,11.767710338921695 +0.149843441908338,0.29652904148122844,27.470034993196233,8.753383686623492 +0.14869118243343335,0.2914906569034201,32.01754049016726,9.662068460424026 +0.1509533326293663,0.29975110314446235,30.16075104800443,9.99968279622062 +0.15026872128239935,0.3023964658584561,36.1076775035646,12.261560079970298 +0.1495059089558059,0.30203468751484064,33.31421069649369,11.204005475947948 +0.1519729677135393,0.2942390858448879,32.50053461200382,10.316062366557073 +0.1515429988109793,0.29708373018058,31.7577227023881,10.280050704021493 +0.14984015623346994,0.2960191995189967,29.79093951261108,9.50120573611485 +0.15048278654682248,0.29971951315679507,43.15796985567222,14.345835824214141 +0.14911620835477837,0.3098668835671274,34.96104214258803,12.744220199982907 +0.15103311134872527,0.2951589355436554,33.40339822022466,10.670596447363733 +0.1492233648542176,0.2960727504881542,31.853147323984075,10.066029300027772 +0.1511541388364954,0.2966932929987935,36.5113600245607,11.72903458435206 +0.14964890800610836,0.299857433894381,36.17836540547994,11.911300105722779 +0.15084502003737044,0.29427183305578547,31.325843587924354,9.873487873494733 +0.14904632774553786,0.2959303895093903,31.684781236463667,10.03877126080379 +0.14999810677918615,0.308426089727294,28.559957044353816,10.271658734686921 +0.1507735720416544,0.309166400040474,30.04504269330427,10.930716991086125 +0.15213799002347245,0.29195566992334054,31.301913779388027,9.631064954003104 +0.14869342784536285,0.2996925800217488,27.81558077382281,9.059161184667918 +0.14915296529765265,0.30642472330906834,26.794105376723447,9.439291920703685 +0.14951281678534806,0.30602602954701524,33.31097509346966,11.629653940583477 +0.15075171030373752,0.3012043569631422,23.457598493428446,7.9058633835171195 +0.15187371865228705,0.30030071548429366,35.64200335918134,11.96167435980993 +0.1504544588142319,0.29791568586975425,25.955040278615925,8.457068800658156 +0.14904556158487178,0.2967581548584196,26.194804073676437,8.346954160042396 +0.14916263809925406,0.3036509324695845,31.733824884311062,10.846689848884797 +0.1504166952807725,0.30511141515137763,27.38645497690966,9.50517583552963 +0.1518237638743997,0.3084608656971661,34.28351424830444,12.469752280235998 +0.15064377755156577,0.2973977655590622,36.189217947818264,11.75646413668318 +0.14945107990281783,0.30627024178346196,30.895784673755525,10.82479657307176 +0.153075874546962,0.3092038452926638,31.535427149929074,11.64609017306598 +0.1513758310865408,0.29796745075172565,29.58250322883334,9.784147633569248 +0.15008791511188366,0.30016707729214637,30.799763157196203,10.206706850413692 +0.15001836294100462,0.3036653433983236,28.895397736623313,9.991917279607225 +0.1512481417535386,0.3023305880295679,27.784666763475805,9.51674969382431 +0.15045956972581254,0.30311193233225125,36.241726502506715,12.441263093586565 +0.15066670354739203,0.29610240557688217,25.246665377414995,8.045166945388212 +0.1485124729592786,0.3078366436068957,33.97296019928375,12.034676659955453 +0.14747711670244437,0.2957194073946381,24.86512940396093,7.742988269418023 +0.15066759578666813,0.29325299046274683,31.69386342963977,9.885622870390296 +0.1510563186427632,0.28659422675156304,29.297910875298918,8.555689870244734 +0.1494516644647774,0.29993644022008065,28.336291387886178,9.351267581619718 +0.15161683409139717,0.30476336327825854,27.00817101705429,9.470053255235632 +0.14905831750824247,0.3048375834712021,35.224072693551406,12.180733342182513 +0.14919702684568104,0.30071899462840973,24.06725966308412,8.002998014920365 +0.1501634716617056,0.2992221921292285,28.456756380824277,9.354801478498974 +0.14937402607434902,0.29370344802889503,27.1202761540699,8.385355117812852 +0.1484541200649279,0.3020458330149224,30.58205299409174,10.23179323543316 +0.15053540625857081,0.2993223556034504,32.6091123500656,10.776209868568673 +0.15170611011296084,0.29872150499570205,31.50899076345738,10.48362077972494 +0.15173985836955198,0.29525594043788284,28.242838107915517,9.015935753342319 +0.14960984837269484,0.30366258612904545,30.101142830587538,10.363299882677344 +0.15000457230940906,0.2965000521689666,22.590547101866964,7.1911995823474495 +0.15011315700527475,0.2972897651913754,30.217548607899534,9.736742552831384 +0.14997957768805562,0.3039057426701143,26.255442742622826,9.083875774807812 +0.1503612245478511,0.3044532475314712,27.35241093026144,9.54130601317228 +0.15093556892867563,0.2967437162497005,34.026827774689956,10.970173598053728 +0.14953949211170903,0.30029118423471424,27.154113270776367,9.0063410960184 +0.14927420523361445,0.3032515412473108,33.67407410311267,11.442398547796618 +0.14992434108261984,0.30581258866327254,30.8283280426243,10.780464464507357 +0.15132514898323324,0.2983025018542108,33.54658898355271,11.03021673331369 +0.1501750408730218,0.30777668269071,26.9338448798883,9.660872464121367 +0.14969279718448447,0.29905207194077776,28.206741271589348,9.229951078017539 +0.15081262465969886,0.2998605738071204,24.589425604804447,8.170059528272745 +0.14987440005148303,0.299851071765085,27.646879040866317,9.139547944725521 +0.15010238290509204,0.305270414561371,24.903950596280445,8.667927501076225 +0.14931621805311734,0.2990457426194622,23.33260895453758,7.67003201756318 +0.15089689823743374,0.29907932999156545,32.61234053618648,10.78379598447001 +0.15005971835135076,0.29859252528081814,31.314764550285684,10.26099273787217 +0.15012458172767382,0.3012886800514294,27.726753040706154,9.314631200784303 +0.1509276992209322,0.3052936403471904,28.7955295539655,10.133286095200772 +0.1484870517847549,0.2987182338552571,32.4736200066089,10.494782050802531 +0.14886355709859406,0.2962919278560709,33.35827426252522,10.584660725361864 +0.14946046123391016,0.2947879377998004,31.20831621654397,9.776026894226016 +0.14927941501121655,0.3028050797394077,33.28993175604032,11.234396245951933 +0.14820632419588226,0.30255987618440666,36.0969584009121,12.149612076356181 +0.15097068686847293,0.29906105548622136,24.852844349265617,8.23308181086641 +0.14959766787098228,0.30421692933899763,28.53145865689232,9.859100156940547 +0.14814246510283585,0.30519534797132236,35.34362741458607,12.145767913069598 +0.1503396379495941,0.2994137530228159,25.124745245024265,8.288531227142137 +0.14876849980845197,0.3055094092366561,31.094718860237087,10.765890533753064 +0.14832598475870568,0.29689044757437894,35.314182030403614,11.226308235410269 +0.1501055712244124,0.2991027685833126,29.152605158320704,9.562833106142326 +0.14939295098022665,0.2941057608541519,26.130524424285383,8.124635861840357 +0.14961163782095463,0.2940407620988173,24.449323660793834,7.6103776692125855 +0.14907099439580684,0.30097398847461937,27.92472632132697,9.312621993097085 +0.14870034247231154,0.3032182276196772,29.329823789177542,9.926527229636216 +0.1506444429753799,0.29929975077346505,32.57738390070241,10.745552788724952 +0.1521097792871288,0.3018077089978286,32.37398434717708,11.043942759220549 +0.15016203928122765,0.2994893049649995,32.89360255521494,10.888203086153178 +0.14986563126152788,0.3049948198437638,30.429884126822156,10.612359982137727 +0.14861899918167323,0.29863531377985236,29.43082574766197,9.562215464497807 +0.15050136142802928,0.3073271652131244,27.600999490777813,9.857508844443903 +0.14962246410879737,0.30988645253718156,31.053819770304347,11.25597572004028 +0.14947471344233074,0.3071442403773207,27.582968552717084,9.738973582542345 +0.1498440821016301,0.2987496216035186,32.22513447809433,10.586296225390313 +0.1499268635234685,0.30288194081805814,30.099850253408977,10.249635033092394 +0.15171316928084494,0.3067129653452541,31.210970462315636,11.145942602780746 +0.15164523369807315,0.2944032177562788,30.79193545673952,9.719013065466735 +0.14987583957460263,0.2994496095800449,30.214773178069866,9.984043388348637 +0.14663071182531714,0.2984929612524825,25.333830906177102,8.051425076146966 +0.15246909747413637,0.30445389349434687,30.48853162225655,10.682034129970992 +0.14861014412197052,0.298821268347214,37.32471701831951,12.12446954848558 +0.14920583149787542,0.29154072869720454,28.403793469693152,8.636116245319595 +0.14858696037630476,0.2975735846844447,35.58840056036075,11.326177857921678 +0.14969317537721558,0.29496814553357215,26.50084356031137,8.343467900712099 +0.15029768343807112,0.30294768458982974,36.18942176570336,12.341280376804363 +0.15030073026647925,0.29486465352662034,26.346669426871145,8.287884327175115 +0.14993004118851874,0.2887958882281781,33.36712735453716,9.78662803799943 +0.1508832985087737,0.30077881275111623,24.021174521113167,8.05784417088163 +0.1489815478225288,0.3086396075968591,30.00620398349348,10.744233634333584 +0.14887968845402888,0.30128429029644804,36.482724143331026,12.128763260266824 +0.1504453180429995,0.2926372286344371,32.73166493232795,10.06625290657978 +0.1518133898699506,0.2962539698681256,34.28672486172306,11.026579121387872 +0.15116726142309506,0.30787750324104585,30.005710557831847,10.787535414361736 +0.1515489432282429,0.30581690714454446,30.42873479880812,10.82902037533006 +0.15021260437217349,0.30548050607280813,28.524570740752594,9.990589160565722 +0.14880486558318182,0.30897610103228845,34.26344920079479,12.279001319530819 +0.1513317244359161,0.29863947018525894,30.06671109657763,9.892334366131431 +0.1492256156372346,0.2977022266722479,27.6853783280012,8.920452444034263 +0.14892242074846582,0.3035800312670985,27.515039377519376,9.342308600781793 +0.14897720134123674,0.30118078579724133,35.53576077988817,11.848238679077173 +0.15016396775645566,0.29766418827806496,29.097078294606412,9.461986458168386 +0.15080214692665955,0.2996186135273665,33.337915234459814,11.009269945826961 +0.14986425664011815,0.30344246635191197,26.85036834264724,9.203031609581263 +0.15008513686450298,0.30366807337595436,23.054077817014587,7.916443346233995 +0.15035247485473233,0.3097382698789907,30.230629640938687,10.990226332347433 +0.14993975495667525,0.30156100523344975,26.569436428937504,8.968196901362846 +0.1492824903873171,0.3071380903716087,22.918935473945368,8.161907928147203 +0.14912138608553782,0.2989795279623632,26.638574317332573,8.694810440058315 +0.15032983406418024,0.30007686106296866,28.880025656703946,9.591397865155713 +0.1489657558377843,0.29860845883228965,29.664630932760748,9.646077328107333 +0.15014198290068437,0.3109940684028399,36.008073617134954,13.322188716444744 +0.1504234994954692,0.29854896658979196,33.53797891001062,10.982736702673218 +0.15022426968564986,0.2941970353005605,30.29658148022922,9.491879156798033 +0.15025936114329622,0.2960629588989855,29.44034243796433,9.430371934171337 +0.15035027362381653,0.3088554203576547,26.344513675708445,9.57293705265558 +0.14795386377574954,0.2983851438683293,31.220914071465245,10.063321432517037 +0.14817054272801297,0.30040568319095906,29.12824471131692,9.55654719392729 +0.15028692774255398,0.3055680161258741,29.25069580726783,10.290009717191406 +0.1471917474249395,0.3056258982812352,31.789733280525155,10.933399391464249 +0.14998474733790376,0.29541941829728957,23.429808045859275,7.412261431506177 +0.14974700568094074,0.3038961083391735,22.532428738794955,7.761597124682928 +0.1516573156811515,0.29887358133507297,34.534840020700194,11.434363355105779 +0.1497848289528665,0.30348734524816984,30.50376779189494,10.491403983963078 +0.14935389643060595,0.29116085505877193,27.938264356223723,8.453324107028266 +0.1497962332265091,0.3057189392116326,30.591846831922407,10.771275806806422 +0.14883233391858025,0.3014440557517702,27.92725393565536,9.323389903410234 +0.1502987927776795,0.30640715763224224,31.289942878498323,11.162928523196191 +0.1493564927133489,0.29767917270895616,28.45320897970447,9.142101619843656 +0.1495636679391326,0.30136448008653977,29.927657466882856,10.000105701061807 +0.1507716830061682,0.29703543604668897,31.994644557010847,10.370505977415664 +0.14953318138440327,0.2924780049867702,26.696327598434713,8.163167954938936 +0.15273327877786508,0.3069680354185403,26.274204782234246,9.503922861080087 +0.149460073778059,0.2997991240644723,31.910763120238684,10.504848299144314 +0.15190166848841216,0.2944370791811293,37.23451743402805,11.791024987376224 +0.14832790420812103,0.3000894470622935,35.25054624641852,11.572621510330517 +0.15062572050925305,0.2919136307054266,34.81351675585643,10.640147641871081 +0.15083379227707017,0.3044651026508134,28.234280082169626,9.81013764142995 +0.14799698206587733,0.2968838136931571,32.36040447466012,10.264206261446903 +0.15100837724787755,0.30068229231360666,25.199342277051066,8.487124000782067 +0.15099941829846164,0.30127591223860933,34.72240083657862,11.736273969761225 +0.14984442356548883,0.297055313543995,26.909876393808936,8.672201600590805 +0.1507286387504953,0.30246688454220744,30.599288543618908,10.439740753720368 +0.15194001326536918,0.3025651311604872,31.398592478753564,10.877394408662397 +0.1511329684326075,0.3029225548996437,18.63028876719688,6.399280988399067 +0.15082043002824927,0.3024660880921182,30.83527604654443,10.501461233673636 +0.1498710815761281,0.2982346016671458,29.34285346411498,9.50718232216921 +0.14922090669392862,0.2949087215851879,36.28843644144635,11.399013356003572 +0.15222817225288973,0.3036616449152189,34.04223912184769,11.867120110256263 +0.15044844326905948,0.30269794413724727,29.99367347018559,10.25400213878802 +0.14998689612923893,0.30102680834412787,30.42049734096397,10.132641947899327 +0.1493168355279846,0.2961373095731936,36.75377337734255,11.653213166293177 +0.1494493699993605,0.3055435004942096,28.283111120113738,9.86763628494505 +0.14759824884842485,0.30210194149606096,34.31081503762213,11.408485978842984 +0.14925521411450493,0.2955263079249816,26.412378181549588,8.28110303655824 +0.15005669241599576,0.30293548377489604,22.218189603590776,7.592960602807637 +0.15000032143292505,0.302242111442588,27.98017051728654,9.41502567348656 +0.1505351514129424,0.3054099203111593,25.35960004082907,8.971413298557007 +0.15013734647169885,0.30096649722767127,29.990015823689372,10.040379990146308 +0.1502625862492857,0.2990800135028794,30.906641903475926,10.175520011964606 +0.14999719597716835,0.294830119417112,28.45165867543718,8.916207529404184 +0.14981252992282418,0.3012505852448972,29.686187644489006,9.938652206429651 +0.15154124327947815,0.2956352124036493,32.281381857499824,10.324268210721472 +0.1512085130908872,0.29333230773669305,27.701616213725597,8.643185845257056 +0.149424905863411,0.2997989824329277,36.890016628679355,12.139129439631578 +0.1504961555241621,0.31425977970598257,30.28817655112293,11.589553854706661 +0.1488124492744967,0.30099534013674123,32.93900797339819,10.851695251450124 +0.15097337922854182,0.2946251180516484,33.369284187735566,10.530517286859917 +0.15014830810333665,0.29584768089466706,32.418606698001426,10.350687633120097 +0.14886139771325121,0.3018387572180834,26.994048272197166,9.018615540157882 +0.15130061334759667,0.3000243308556417,28.345990679735248,9.4463388147431 +0.15122296095065246,0.29868384484432,27.002942884505075,8.950347972052402 +0.14795985550263768,0.3070089208659452,29.726754230977424,10.412686028188142 +0.1496892070155126,0.29898376284992434,34.06221941581788,11.167611286171132 +0.14929415093360437,0.29780398268037894,31.4827007546207,10.115640678617156 +0.1496916131781584,0.2988147352267663,29.324938515199484,9.580019558073756 +0.1513281016803208,0.295524342993566,33.187172316700085,10.617996166898994 +0.15027967601647976,0.29784412703166996,21.967615203140014,7.170575347190038 +0.15009363822277527,0.30253971187594975,30.20402360032784,10.27984762078738 +0.1505420394411433,0.29667937671914274,27.69172137882578,8.896400222375107 +0.1500331293955744,0.30017839620556186,21.684323036719274,7.204939801831008 +0.14963284219315826,0.29744687779705653,26.28113385616158,8.532972392180621 +0.15068194594943823,0.3061343847286944,26.111733562462867,9.225333583165794 +0.14967599722875413,0.3076800200326965,28.9198519969263,10.324829902129007 +0.14807046998939422,0.2985121199592824,30.76469508803264,9.840437239228107 +0.15100444612208455,0.29745180587405246,24.783041108232602,8.09269156516452 +0.15213935231981682,0.30383307547149085,31.313509736470884,10.952211686505029 +0.14867943043382373,0.3080792655005318,29.106116895941735,10.41933587148494 +0.14930830930698036,0.30585801217711517,28.453975037328487,9.962307414014262 +0.14950856937213125,0.2994301775387612,34.52390648652692,11.268239362409037 +0.15008270299801532,0.3025183373804114,30.753203667349844,10.443333620830515 +0.147888807249661,0.29868405559404365,34.14457109645893,11.039737717620632 +0.15094160846206317,0.29568782076552874,35.772687753485116,11.395273631646193 +0.1509645232189185,0.2985781385934332,29.18280361261936,9.558891816224238 +0.15018806864629933,0.3005184695111801,33.83596761879269,11.3496473461145 +0.14928223410393035,0.29296084046862153,28.250427690968497,8.67941696928371 +0.1501770650248331,0.30818201030567,28.754934083523843,10.35104587990094 +0.1502947979904603,0.2963559000694448,26.694058698378807,8.480370273657583 +0.151131744594772,0.3020070182057061,21.284744901397218,7.244068682612943 +0.14785968642775515,0.30675814450689126,33.27586567851387,11.586668086610228 +0.14900525516544852,0.29696597975616607,30.98592024075515,9.961114817318288 +0.1492805847571378,0.2945825676398438,33.1109052854763,10.352557344103186 +0.15078148296071447,0.29969182290860963,32.96864743573734,10.945011388789153 +0.14851282651401146,0.2916183132153612,30.317250254829336,9.127801371234128 +0.14921877423587698,0.2982639173881653,28.925381995278748,9.36956560043565 +0.15039187606448987,0.29965398441538194,36.01493475976781,11.919092862454317 +0.1481083719775558,0.30051659235748523,25.239066320562923,8.252680218698172 +0.1497863122897759,0.3066948593634432,28.976416587603467,10.230954490672747 +0.14904462241644817,0.30406452476782814,27.21010080318012,9.330363888567346 +0.1489743786483905,0.30382263904150364,27.211541019359412,9.334226473837157 +0.1522280929653971,0.3020264419724161,32.391436329804236,11.095853050158833 +0.15026191428785246,0.2965040354653548,29.056194879822808,9.327388612919918 +0.15087264750373813,0.29826400520776253,31.443131630884434,10.319966865109471 +0.15160047350774802,0.30098844631851057,27.444229343416996,9.245294147609494 +0.14768046274732916,0.2930667749682501,35.273117719153284,10.736042877916672 +0.14990618913307924,0.30127799689737733,24.946552609417438,8.372501808149291 +0.15221840948289866,0.30076299464612216,32.75908648507973,11.087331051491075 +0.15106311356405405,0.30121567658568266,34.0731439216661,11.523747567783262 +0.14911926318439517,0.302321607974659,28.724646739990263,9.69480946935736 +0.1507811028782618,0.2970439092898332,28.62793101162397,9.228297286821583 +0.1493955559484204,0.2988140009918291,27.530626642740025,9.008257231446489 +0.14938779341207323,0.30162462227115816,32.19235303336165,10.799353399620571 +0.15005270405843463,0.29515449394378435,28.036024115388763,8.847496727765508 +0.15043516559510217,0.3020608701856593,33.68921821015433,11.434755287912203 +0.15091623835329154,0.29770312678712785,33.87806857242446,11.050626318243125 +0.15031249012781303,0.2954579124760183,32.02057914739803,10.101605244845528 +0.14949497678899462,0.2984802116314504,30.038440953397195,9.757376696721813 +0.15004301795035344,0.30023018131299134,30.474288331639023,10.11582873526878 +0.15114008108028526,0.30469896553215164,31.136681833626135,10.887815229204415 +0.1488512653493385,0.29856863947108403,33.133648689564275,10.764402495199855 +0.14938064756831884,0.30152732293416945,24.95510809129861,8.356301134165864 +0.15048404276960559,0.29742101862246234,25.5027773133755,8.257472278037609 +0.14972249723558562,0.29513247602660114,36.11891538246461,11.337419716718461 +0.15161875167345293,0.30329994668146504,27.348447368520027,9.450244064427064 +0.15119720345593593,0.29665997579834286,28.187670507731482,9.095387431467882 +0.15012227160020167,0.30277843842606816,25.57051048761817,8.73876602595269 +0.1495970939757347,0.2991464600910206,29.057506719758102,9.545118326559917 +0.1520025955067428,0.30815761185766893,28.701960712750196,10.472143450195059 +0.15056832211425786,0.2995227606784546,36.15805828845385,11.933263142671715 +0.15012785108486718,0.3022570496423323,27.843114886914968,9.481378769334265 +0.14925558949778267,0.29231474294004556,28.36559429058258,8.69239097435106 +0.15137408498196286,0.2988283812154281,24.74927717954377,8.15272647390634 +0.1512526532967986,0.2985003348612405,33.87808964643939,11.152711361712377 +0.1516911560722677,0.30625805760190095,28.96122702649597,10.32784504809697 +0.1509256826604494,0.3067917740647256,30.113577081091744,10.731659594533635 +0.14980057526624577,0.29870593811637913,23.839521436984935,7.763621997331694 +0.15180591688754339,0.28650438799784295,35.006985227903414,10.233984052533854 +0.15011178788595128,0.2962880056798331,37.01079156174243,11.768988543018033 +0.1524013452739238,0.30307322269628706,25.170108472695148,8.752717470516735 +0.14920317241792408,0.30880921562963204,32.879510550644596,11.798266775696696 +0.14880573907496633,0.29927557047780134,29.182586766667278,9.50161739099512 +0.1492125130808436,0.2986644924006054,33.70357641612851,10.939000720689258 +0.14953509791460057,0.2987035017842563,29.440418381217004,9.547129393648273 +0.15207493129631042,0.2943047548166318,27.528801337634228,8.721904798137794 +0.15057456633203323,0.29756614036243345,34.33468153099778,11.164134848358058 +0.150325409543768,0.30036337795198736,28.975500175955442,9.665645465585635 +0.15083696863532708,0.3002733447080845,28.137366354213867,9.359473229034837 +0.14970942519355748,0.3012026555781548,31.809916554047398,10.665514164009986 +0.14896255693408708,0.2983520504582475,27.777092296611553,8.957628181167639 +0.15242307700908211,0.30149223418022153,24.84109159210363,8.479830672597435 +0.15060518830192698,0.29208996040478746,31.888033837975026,9.775207563578924 +0.14998477742896943,0.29964400550504244,34.43155665311746,11.360763680770313 +0.1496866401093059,0.29740447149343696,25.305492835857542,8.142198229250324 +0.1516470146851721,0.30817558160421493,35.117442644466,12.739881437847396 +0.15213351977665077,0.3038491374015874,33.050112553307706,11.50968921156396 +0.14992337437511977,0.29818859037373374,26.701707574280864,8.673109840488346 +0.14864475091623253,0.3025514146274038,36.675428690863704,12.378143495695717 +0.15244074361726803,0.30621651704180547,29.340080406005715,10.461885454655702 +0.1486079386836727,0.3018141498054468,36.112119313324776,12.04943586848042 +0.14819897543526173,0.30355615047733936,32.80081175627869,11.075969099798698 +0.14972386171915308,0.304893640427319,29.790610733601014,10.368572233589623 +0.15025086365921134,0.30228864508977543,26.186279588191688,8.874698120201586 +0.15026688525289283,0.3029337811258193,34.31371417781755,11.702102277862826 +0.1501108112692139,0.2964282232779521,27.317631534558206,8.812731229226713 +0.1498126910398424,0.30417965369645966,32.794245592531006,11.301153705163792 +0.1506974817299632,0.3057821290686507,33.095277678147774,11.552390146256661 +0.14874000475726776,0.2946865500101859,31.326796110624407,9.742173253876137 +0.15052951718889349,0.30082342701116127,25.108513612496743,8.420516371458469 +0.14927104685597978,0.30351183497162193,28.955424616351017,9.85774231850985 +0.14963589069838443,0.2983635373496512,32.93027612148988,10.705746866218806 +0.15053576460028387,0.2946008767435972,24.096850557348674,7.6024963558647904 +0.15062436205024293,0.3013811401181963,31.86341339759568,10.766264206785959 +0.14818169576140142,0.30487275484520227,23.55419782865253,8.091190056422553 +0.1499886751492536,0.30490495084035724,31.771846906437236,11.078823104413505 +0.1507872537419261,0.3035926943644544,34.34574833423175,11.884700678150502 +0.14898145274124017,0.28964097887176354,34.23528904794512,10.126891512483269 +0.14874895985633999,0.2976126211819138,34.77458299307136,11.145460762200292 +0.14948496670293507,0.2959176508114824,32.102081824024545,10.204114009955665 +0.14965217780678805,0.3015933975591987,31.18284449295596,10.468901572260194 +0.14956063368442515,0.3052319520572469,28.890135002136745,10.075331433173286 +0.14893964723123035,0.3022558761126296,32.48206937918695,10.94734995003074 +0.14688478414868428,0.3003855880588913,31.91741543695538,10.380437269012702 +0.15035508586388577,0.30179899749173505,31.140185816582335,10.502961420521187 +0.15091743655556328,0.2939973340503097,32.18386599420609,10.042790060729416 +0.14894560291367834,0.2964818044191132,26.86246237219971,8.542372348201889 +0.14854483313359437,0.30262354291192006,33.39081513788139,11.20643585341734 +0.14962821886708766,0.29731769383173867,26.874271350235034,8.640945394153619 +0.14875514702599849,0.29361653234527835,34.18374290472517,10.43289850608173 +0.14912718817295736,0.2961903636604162,34.12504782251649,10.794049999123548 +0.15181958553483785,0.29860408436378805,29.843128786054194,9.88729749399836 +0.15041845521703084,0.30273525883877533,32.9504853214347,11.186832885564238 +0.15205457474950093,0.3028559302322407,24.865536730262377,8.590437969420222 +0.15041557335435843,0.30268601856826227,30.72241255622563,10.506441093209613 +0.150808313478075,0.3005789226196844,31.38192298166672,10.512310663038805 +0.15034538871716369,0.2986673547739355,35.001483995257615,11.528725114587587 +0.1508814704322279,0.30168125574370275,28.766625677962907,9.74131985961107 +0.1490158166320131,0.2977036058931768,22.665424296448478,7.283357009979763 +0.14979666442266168,0.3023696677764737,31.509743491044965,10.71934821375528 +0.1505171255710441,0.29068190638234,32.15246556597357,9.761765191599748 +0.15013340358829838,0.30740038186083607,33.45087513184034,11.935442883759565 +0.1519787297717845,0.2981165882529669,27.15415962718962,8.924304940325015 +0.14988054934426712,0.30302773822581286,32.704010215853195,11.1248487306371 +0.1495360987924365,0.2969310868400165,31.293193531069303,10.021680319702707 +0.15057718884452106,0.2976580082784839,33.10996067963713,10.7330546610531 +0.1487228304330534,0.30319849788062236,29.1771699099803,9.87336269197575 +0.14905567420144228,0.29959229497339585,28.82540907897291,9.425245181089505 +0.14868281256354016,0.30162546059520795,32.428563478227595,10.808530063364158 +0.1494260884958777,0.2977460684182924,25.112935003887753,8.14363075663654 +0.15133947023668376,0.2998543835987088,37.592191489767956,12.50555865286203 +0.15092000583608917,0.3008955056406372,27.86092727105118,9.41830837021123 +0.1507389074779785,0.29423703350582253,21.67519187825925,6.798172407264784 +0.14843623419335586,0.3041632904485749,34.16295352845209,11.72661037951953 +0.15073957016584297,0.3031615459961292,29.61786423071759,10.144256083228525 +0.15140578191113055,0.3026983774368958,33.25910669226422,11.380231570478895 +0.15039040440742454,0.2958982323868579,29.23422002194563,9.301403258814073 +0.14981423766816268,0.2974147931652726,30.602260616829728,9.858173870411612 +0.1502370150962687,0.29366677041489425,28.670841779042348,8.95038654762077 +0.14854596223139882,0.2993546591986097,30.481005781059572,9.894597873478839 +0.15015093810573926,0.30827334671908574,39.541210183051874,14.204719299208374 +0.14919882203145157,0.300277848773034,32.26306811390193,10.643248672044342 +0.14907910581386952,0.2967624803224476,35.13967609716077,11.182041471950901 +0.1502606484475079,0.29900150747158055,32.06443728488079,10.493890824667554 +0.14933446222009128,0.2989022237158591,30.37209021895631,9.978807042600481 +0.15024074017308872,0.2925352908679993,29.97315922427273,9.244565507764525 +0.14999118987874524,0.2922532353038687,35.2496605571391,10.759938635280989 +0.1485914866981715,0.3087040890872049,32.83673645538393,11.825493709824274 +0.14895914538233693,0.3010829233816725,33.35022956933008,11.076158608665526 +0.14903948682847723,0.29416477437503247,33.98862651702106,10.54423115330366 +0.14830904145437324,0.30636900476862977,31.76259189173235,11.053745410921715 +0.14992175446621292,0.2935526204274009,31.89899967186903,9.90523893260138 +0.1505127021450571,0.30038629388056615,33.35902232235886,11.143127713554062 +0.1493911814223313,0.30527275630775885,29.123289663260532,10.108494518300258 +0.15077551245921803,0.2959661269467682,29.9478264662559,9.594593460372373 +0.15048334142967915,0.3035201547362843,30.1045813996062,10.342143804805152 +0.14954218885044496,0.3032719975516333,36.753363912518466,12.464360820670006 +0.14995557387272285,0.2949728621735323,35.77194822337479,11.17866561095538 +0.15010397167640352,0.3029141122170916,29.755680607867593,10.124794162555025 +0.1509633469090302,0.2997935772809878,36.92148788018323,12.284076654300842 +0.14962446385733896,0.3011647704929971,27.428855691695485,9.164989627809618 +0.14998663957924588,0.2911912177678153,32.25693807185051,9.687922214739755 +0.1518683747642769,0.298858945103879,29.872822611319773,9.888616762439133 +0.15225959401162578,0.2985468134695267,31.706712905546294,10.483080250571932 +0.15047245450993887,0.29492921594632276,33.368831093712416,10.489479199238955 +0.14984687532024996,0.30090596518292445,28.30715371793389,9.451482988248781 +0.15243581817553165,0.2968625600840603,22.536531549513676,7.371573715857619 +0.15187376601470845,0.2983711305207364,31.664041150606266,10.452818724802956 +0.15111741068534718,0.297440508865088,32.46207374753361,10.54723698754527 +0.14981772972620855,0.30108720466417777,34.78965040759686,11.677204407725677 +0.14826348778023474,0.30146727684783875,32.767285175178706,10.895482148978816 +0.1513766289367511,0.29572060346576773,30.76942989854546,9.822019739986208 +0.15135014506248118,0.3021741270526886,31.603354609243972,10.755675896199723 +0.1486383440875989,0.29722273858919357,29.96394681262076,9.529230924042128 +0.15189866667649038,0.29785271713249717,29.76801433636954,9.73625227497407 +0.15031687526101448,0.2936701632163496,28.060600102469888,8.704546157890038 +0.15035834677434534,0.30994681126795987,32.691262120545424,11.90153300453965 +0.15027019587758644,0.29894798838651543,33.62309096177642,11.038233067655451 +0.15020374256526747,0.2980894291003046,33.87042773952535,11.029121150207176 +0.1474740522254742,0.30332729960474014,30.364271246706828,10.229618148421276 +0.14959699146109007,0.2986334024857134,36.61030329007141,11.946214749544279 +0.15053011300252067,0.2918649678858111,26.80323112543837,8.217188107771332 +0.15035752891563312,0.2956455239999933,28.99612589991693,9.213784398692582 +0.14967691438823194,0.3000727884522262,30.774799934422443,10.164447244215495 +0.15082194173870858,0.29809176748277355,32.85084521786257,10.750671445915277 +0.1499383803488793,0.304107145927933,25.380411319154078,8.752910108488743 +0.15068555576073825,0.2966042008050907,30.601448672888083,9.874377579430755 +0.1514367571409839,0.2981518028145486,26.372580392289027,8.669837517039095 +0.14834098525580833,0.3027777751156708,36.58898656043898,12.287030495901982 +0.14977628097229392,0.2997052104469754,26.240760300001313,8.65925686594563 +0.150643100947925,0.302288271728923,28.281631931544872,9.61822124916888 +0.14898356485586034,0.3079496818587827,35.66933459332304,12.681634353035731 +0.14951053591730526,0.29978987583836425,31.447615920488047,10.347293799941689 +0.1505627024938917,0.29466891866021677,37.94228245290978,11.91199196066982 +0.14989560873063623,0.29969860316037855,37.078228812534384,12.308836723721328 +0.15190362265333873,0.3016199295312082,30.52011479320811,10.35382192080045 +0.15051690616188634,0.29498059433075907,30.464121540940344,9.676866880704647 +0.14994678244497345,0.2977087015284275,35.01784118531437,11.287145033043405 +0.15156698267641203,0.30262712754343374,35.136985756897616,12.08467957477632 +0.14945043435615676,0.2995632332255712,30.905255264879482,10.101374706824439 +0.15018947066619628,0.30234784507004114,36.71236511604527,12.405903138988842 +0.14822956302683712,0.30570911123023803,30.054760454375625,10.414024755433557 +0.1495296269998208,0.3058501636576577,34.8282115009899,12.170158773014872 +0.14924355491648109,0.30582183807197055,32.454611952421644,11.267361734579971 +0.15094024428219932,0.3004432513101937,30.01068157321523,10.077152461057176 +0.15112634086391144,0.3036609828958633,31.346497931586047,10.889596973853287 +0.14967421626033448,0.3000955256395234,33.22706719556286,10.978414733736054 +0.15139795459378583,0.3028322081918244,30.07799228373364,10.4089336987374 +0.15003066651132227,0.3014667759668776,28.33673153957974,9.469629921484088 +0.1510828814651715,0.2964010035291382,29.214172116439403,9.414397112763027 +0.15032601732625392,0.30354094372600665,30.965630419758675,10.58093791110108 +0.1515891672649942,0.29529387363277376,30.32259482349002,9.6656130529125 +0.15016903562676973,0.30377587143681445,26.973757329744313,9.214255594645321 +0.14832542185236428,0.2972143535554744,37.98391426195752,12.096884867541313 +0.14904975911375615,0.30051888879180627,23.585822884672993,7.810308005796969 +0.15033547489582336,0.3093301851853609,31.92586290048714,11.625898577532325 +0.1521731811672535,0.2982771781154603,30.822286853263,10.216994542825283 +0.1489718548210939,0.3026478527962207,22.027517984647478,7.456751834977917 +0.14953516681740536,0.2935369689195258,35.19610210508812,10.87603681264883 +0.1489228190179259,0.29950726111170733,25.76557692631601,8.426232597555902 +0.1478966444142877,0.297890814029667,34.6369113780826,11.062427456510699 +0.14941494795930088,0.292707226649036,25.482868046918266,7.814336521145477 +0.14894124066952769,0.30097493272912906,30.519418994165925,10.175104713344705 +0.148255898366642,0.2981466590148759,32.432301192709104,10.395759148289969 +0.1491221958347865,0.2952332935983251,28.399007659301187,8.932168098313609 +0.15173668602886603,0.3032318315191781,32.86117318742091,11.412157127368344 +0.15155745390097639,0.2928468324545638,33.99518923056355,10.564307854390917 +0.1505342492797515,0.2989127297191076,26.150535419349477,8.647319427417088 +0.1486535623398866,0.3056236869496995,22.177181903558292,7.681015120851905 +0.15131870672002226,0.29633802764698236,33.07405751670692,10.626570376397916 +0.1497012045820449,0.29839091040652693,28.605646563782667,9.284460468673855 +0.14968908514563126,0.2959262944660851,28.407098537743458,9.04850036818359 +0.15150892933055,0.2938491524296571,31.39705578306925,9.812686789579217 +0.1498383213345217,0.3003687351574979,36.66966873274587,12.164549441625999 +0.1493262384102258,0.29838443611844784,30.179307977625474,9.80094568260822 +0.15133018305928017,0.2994736763771403,28.443375915027666,9.450862405057096 +0.14812724114631057,0.3013400350963725,31.503811623849572,10.48759803839701 +0.149102508150125,0.29597422578351024,35.38654614132557,11.168538588521699 +0.14920028547970546,0.30248712583082865,27.99970882664968,9.51503416840568 +0.1500121850413416,0.30601152086361355,20.641804469953325,7.243760988122401 +0.15057626152206843,0.29735070699882515,33.92986187827747,10.999087385002486 +0.15029434606220002,0.2995230643351861,29.018779531873673,9.577835817955815 +0.15026058839465115,0.29566600614662647,30.884592681279926,9.775147566357493 +0.14923054593951401,0.30500014363477146,34.6205765896816,11.9519026268492 +0.1503751182258582,0.30724397851783636,36.82974258808557,13.136329518255415 +0.14736539667172774,0.29295985830391935,32.31414686175476,9.766788134743045 +0.151436666735034,0.3029031852182668,33.734978571721605,11.66342262438646 +0.14999580781187805,0.30253235627113617,25.24618749626313,8.586963240176617 +0.1497855262381143,0.2974763045756337,22.80422479015791,7.332009937150737 +0.15000913605364022,0.3012970395266194,30.07177376426583,10.049747486979495 +0.1502697517442431,0.30372832571076847,35.01389516538243,11.983889359421985 +0.15009548489417443,0.296236732954601,30.713681791677583,9.780406638274213 +0.15050356834797207,0.29505399065504406,32.04455660781237,10.1918904804869 +0.15022570537396598,0.2955751127534145,32.59555437240464,10.364451579743173 +0.1541253544048846,0.3004515748836325,30.356597337777888,10.377847975842611 +0.14909308227950266,0.3108749915738339,32.65794601044207,11.955397616999566 +0.15075031662406957,0.29410718145052794,32.98148975378295,10.341071696570483 +0.15027640388126415,0.30271297222803584,35.8673575079377,12.258373509441494 +0.15012699323718334,0.30396773242785124,29.605231536088525,10.173169642879389 +0.14847893873819612,0.2978856755764521,29.03176852609575,9.298996727797807 +0.14932208868156813,0.29682994155084913,37.931109558774196,12.121541960357423 +0.1484760176088163,0.29323082779311155,30.58232519199428,9.344385668123754 +0.14955007006584428,0.30428150510949575,28.539893795676832,9.876179139846768 +0.14875930381496902,0.297063314758587,27.66309360547066,8.772014397997182 +0.14804469175991514,0.3063638129261576,34.930603032211316,12.084066090442631 +0.15049015806552257,0.30290816321999897,31.89697299390119,10.88324944178865 +0.1491134500042469,0.30204026296487946,27.349176736700393,9.180196510289905 +0.15011277287212096,0.29324960594050575,37.824564519376565,11.723865303409909 +0.15008027665698848,0.29899392841126576,28.69117537459435,9.379253045386427 +0.15007647871159227,0.30030529597488287,25.757918629692323,8.524865702555907 +0.15115936149630305,0.2957195802393353,35.9906338767519,11.5118336189257 +0.15064831024824618,0.3046260458722657,30.06259569307638,10.424443933595269 +0.15061854061738042,0.298651842685468,30.06563900185221,9.877213710634713 +0.1472410114633279,0.3046053679469337,29.365277940573637,9.961421188773118 +0.14885271575033618,0.2929230177866814,33.27832795625487,10.144988988669086 +0.14763158385478267,0.30016643013789956,33.95751607022685,11.1688710491121 +0.1481331227520816,0.3056443320514526,33.20105326079599,11.51808569209138 +0.15059581778922207,0.2987190835351159,27.739652984504797,9.098552323255127 +0.15096322172102536,0.29620597936477244,28.152337846860718,9.069890936191646 +0.14796236694144,0.29540086953130834,26.003689366961517,8.120686990122989 +0.14852248281736602,0.30301847232268253,31.120503951316074,10.55749495439212 +0.15199501900506654,0.29834275943558053,31.90023003122476,10.566760530851038 +0.15151692292434182,0.29808091482146903,28.790855202768014,9.462445543245378 +0.1498160108603793,0.2995151857952507,27.29833029162393,8.997101616007386 +0.14829429777762995,0.3010163145079291,31.424286638247416,10.427643958937841 +0.14769255667161754,0.3034204733095527,28.19757013946703,9.532978217694039 +0.14898896817657564,0.2990338791200653,25.809761326170367,8.41263004540696 +0.15074153807620777,0.29655949037315066,28.001490157797264,9.024752047221845 +0.1493168277589642,0.3027254519479955,23.284140620146275,7.914455012435694 +0.1503611186602556,0.2926156562218475,30.736034028612934,9.521811403857292 +0.15293179652456165,0.3010022951070993,28.782444286325596,9.800103166743373 +0.15087276622315324,0.29779155412550723,29.29994431511974,9.566762735038978 +0.15099772625666125,0.2990477316028815,32.094884719567936,10.586004424647749 +0.1510039740031792,0.3048556433323015,25.84446807859412,9.057696379014065 +0.14984147589714847,0.3020788842734044,33.49062803443666,11.402008529541865 +0.1491864374768795,0.296324292505538,31.158599294004592,9.90043845529374 +0.15018982046007234,0.29787068226744956,31.47530671378272,10.238081568873996 +0.14966174932865067,0.30403623490480475,32.28499886121257,11.088480395553287 +0.1478033462397156,0.305319467022185,29.966428201006128,10.280193519546396 +0.15063383620037016,0.2978734472046847,29.618379387831137,9.68047930873138 +0.15130208967867814,0.3004945108738517,28.30268091560731,9.561907316102051 +0.1506814775098273,0.30180755907834167,27.880083461224373,9.366857234422884 +0.1511572348280962,0.29979050077150404,31.038376166518272,10.360140877006076 +0.14866869753909778,0.2926709201661216,32.88745158662809,10.009305914272359 +0.15226691699987518,0.2937388887104163,34.95530929760862,11.0096746429252 +0.14934006534291994,0.29310247245463866,30.27405786892086,9.316492146428859 +0.14936805154714156,0.29359338176888433,23.918886405768276,7.387981622739293 +0.15005757084794466,0.3020044903894831,31.330718671532377,10.600543462985913 +0.14851388340801255,0.2953337556609643,34.87777080389785,10.950662194226238 +0.15009109692993175,0.29799788272338024,31.882547685634517,10.282570526416867 +0.151085086752437,0.29797857387418974,25.168008518328755,8.220848236698597 +0.1500094072603394,0.2968654789132185,32.58699250740536,10.488327722177884 +0.1516036468440127,0.29806408418627883,38.49098255722489,12.632209192201381 +0.15063048670489304,0.2880238754315832,33.22747928071147,9.73041491135319 +0.15219536853327797,0.295088082986279,31.14419732748949,10.007163006350808 +0.1518362714714353,0.30573901702423795,32.73018437466706,11.578871377212147 +0.14990365919096119,0.289869061110288,35.27973947432988,10.508634421777819 +0.14885078497388307,0.29913259202099884,38.280275028124976,12.510183824812295 +0.1500465318909749,0.30095792543855765,35.16279112465505,11.705435000874463 +0.15084583043640223,0.2932465747424362,33.85954000166095,10.549285365796267 +0.15063091187643252,0.3026180578043312,30.134962218085207,10.294715467750898 +0.15072915811492968,0.29506268733874186,32.73815725806781,10.388533999765423 +0.15086560649258787,0.30181879568734565,27.65584021249451,9.389382614327396 +0.14893432591318886,0.3007101712127336,28.048323892048117,9.300555531458098 +0.14934633656986754,0.30082631782538016,30.10128497124913,9.9827520039988 +0.15058346830024935,0.29682860520845117,31.884864277758993,10.281198846924365 +0.14994273821151236,0.2989563573587353,28.364413772967644,9.345919607953862 +0.15046381671226747,0.3009938504914261,30.024701639162753,10.064183109961856 +0.1481107263873777,0.3106386507421088,31.500454428379335,11.402214536797219 +0.1522505684958246,0.29913747085798403,28.003161494645294,9.277244563468384 +0.14969038052892794,0.29641869520628367,24.250115175925863,7.779955055511824 +0.15021846496702582,0.2950626207440858,34.49071448013288,10.872584559701343 +0.1496622898512506,0.2961421327800227,28.560521219905844,9.0327199960694 +0.15111307091653686,0.3063462819345197,32.09247145107929,11.403729931050297 +0.15147229652945604,0.29924370233646647,32.40231042428168,10.727319280927055 +0.14931289322021388,0.3014478817018315,27.542440212213013,9.220504517908674 +0.1506799074971242,0.30051954428720556,26.23776865396159,8.727972167286268 +0.15022615587462393,0.29312475834557883,37.4106389960629,11.54473073316374 +0.1504079496538665,0.30017375463371293,34.52954170915029,11.480378500856457 +0.1504346870265654,0.302949244717278,39.79024715832648,13.564020694553422 +0.1497704180402627,0.3014060622463955,35.68777566068148,11.982445409830543 +0.148830586548473,0.2981893944101862,30.139032442716097,9.700975719940493 +0.1498133356169675,0.2971894475072934,36.15541910062582,11.66058415988126 +0.14934627471315728,0.2986112300270741,32.9730824649199,10.726389611560371 +0.15013194998655394,0.2973389539899595,31.53572770683821,10.127925173972598 +0.1504956745283661,0.2995677114014686,30.97322649672768,10.276708450475148 +0.14935023906071948,0.3010877991019005,30.915131094911388,10.282805375579395 +0.14812241357389902,0.30475855087982257,29.95201686315676,10.24123720097579 +0.14989669811128958,0.298461373196468,33.09700324799643,10.744100919658022 +0.1492561659217553,0.30327440436437786,36.303340172485264,12.400366943248542 +0.14861332050276532,0.30663652575002853,31.697723233930066,11.082901234306297 +0.14802988450220764,0.29465175364442936,36.7316098408919,11.399667714265444 +0.14808982819166042,0.29819576526769315,35.38188412573766,11.44965389920476 +0.15110079294968418,0.29813795048313524,30.209822424408816,9.921130617775239 +0.14860174946799598,0.2996874790399959,28.975966700244093,9.433671311768398 +0.1519268003305498,0.30259144873814214,32.14781077467938,11.046969291115612 +0.14884350482969838,0.30617372380367774,32.204948185321996,11.26158747795014 +0.1504164928599217,0.30005962127732644,29.848425658530587,9.920749853573188 +0.15018789476123962,0.3004224858254894,33.00674236009305,11.018850819662257 +0.14989464923363205,0.30344596557262643,26.214870284490807,8.956724033868175 +0.14898227844873121,0.3132645358180188,28.108834132766663,10.551836441551044 +0.14974728228462691,0.3022633765423788,28.07888026698464,9.467948600832127 +0.1523054714012482,0.2971129000915304,36.29044532214442,11.823021112413187 +0.1495608733225599,0.2917387152760334,33.02095387898269,10.032267876599438 +0.15022830637641693,0.30025239867977005,31.66147781026031,10.560162304860485 +0.1511251602278049,0.29830688012048223,26.293626988146933,8.623960905439844 +0.14859821078475055,0.2948076983961369,29.623880310023214,9.172949198030988 +0.15060779333658947,0.2948601130379905,30.04808116876368,9.519607543522763 +0.15225786250725795,0.3031859355821476,32.94167394413386,11.411783496390042 +0.15084560136804875,0.3058825595741398,35.08423134472492,12.337344496166878 +0.14906769286433283,0.3037442358444106,34.22823983176138,11.712661282028284 +0.15019023858742317,0.30852169543721936,31.72471498798709,11.347519824454352 +0.15214655950602984,0.3045918874699029,27.39729923676181,9.660427536653797 +0.1494396910553607,0.2999942935879489,32.75525706242243,10.826369523752588 +0.14966725637120973,0.3057204094279874,26.218304354032995,9.125035875219087 +0.14846685105564017,0.291805880053344,25.813355422725905,7.791538141358105 +0.1489397926141716,0.2984140877050535,30.156884011046824,9.75630555258237 +0.149294217538122,0.3114123090671663,35.69749033730956,13.117261533941036 +0.14919096631247186,0.29820338218289383,36.127863871944726,11.695763584782329 +0.1497126466264272,0.30257572664234644,32.40779528517657,11.022718274035775 +0.15122992187880355,0.2944124652446419,27.764984326158224,8.758252768327848 +0.15101154289755866,0.3009151077640613,31.115682338068872,10.4537324881121 +0.15005176329466977,0.3019602629327272,31.52397285499096,10.613874924364499 +0.15120698377981412,0.30130586504744034,28.489327578015487,9.61334981044518 +0.15002669293883,0.3006834850556554,29.649186330177386,9.876739463228597 +0.1505652096586512,0.30134604653327723,25.09934580064816,8.47754809376351 +0.15029425731807475,0.3040257183343747,29.820254089447925,10.317144568404991 +0.14754226060636277,0.295373441009842,38.41431242985151,11.877181332337956 +0.1493858122890561,0.2958833198427828,33.82930616283398,10.68290199077261 +0.14986449688394698,0.29957046280098615,29.821992445587224,9.770760639111494 +0.1496367540079199,0.3002724208142547,30.69765363934773,10.16058117723614 +0.1489719573974355,0.30260524473037365,22.005483270771357,7.482772959608084 +0.15089198638756454,0.3022787685205133,25.58102899361957,8.756225333836186 +0.15190337414508878,0.30178780224239304,30.454234865060403,10.449089921509202 +0.15053105342290185,0.30644323179590416,26.418917028438685,9.422455120751719 +0.1492466377192569,0.30122371217719435,32.00922903523707,10.704367210336057 +0.15150227241498618,0.289205335809165,33.97706275463741,10.186864461243795 +0.1497251606159094,0.30082872857891746,26.630621379953197,8.881426185824573 +0.1521442762197517,0.3058244860946295,32.10218377687763,11.524860244093162 +0.1510610867889601,0.30474779291952486,30.252421794452076,10.571288238035349 +0.15113640307603035,0.29674573091382633,36.02377841698766,11.6470087552758 +0.14954285733444406,0.3068643682615875,27.19871334816883,9.600354192765712 +0.1489305318306452,0.30063984548988654,28.21553103825766,9.379663588253973 +0.15102257906447664,0.30038933694176717,24.731427101611565,8.26554090478089 +0.14977734341497934,0.29963063232018555,24.02740914838079,7.907705235749013 +0.15136062020006774,0.2985463466605579,27.468347540156387,9.065545047123626 +0.15160505418070755,0.2944455122834969,22.198497229012176,7.047818248732284 +0.15142169418789814,0.2998678515096012,30.389223322759502,10.133264743071111 +0.15124235621566215,0.3001343894934945,37.133010498358786,12.455808923133633 +0.15322419643205012,0.29625866497199543,28.286926014356634,9.245588466871451 +0.15182002799044503,0.31313553867361654,28.06361196107925,10.679060364378989 +0.14895866669005625,0.3015752702256339,29.059504664438307,9.702656208372137 +0.14965264472088438,0.3008599472111389,35.37087390405713,11.842693341287399 +0.14904772487506102,0.30543244202842695,28.492334688827185,9.881478787621433 +0.14926271553756862,0.301336232359347,26.341280732068192,8.849011147729058 +0.14823410521307318,0.30617905633684794,32.691322942859834,11.383213314099596 +0.14900561998996026,0.3036881231762268,24.33115911683444,8.292501816497323 +0.15143854744628196,0.2958779812321583,25.129058342172236,8.066105606583164 +0.14989297196548387,0.31007492595056785,25.66650949355442,9.392550856256872 +0.15085176574867082,0.30321210854245556,31.28464734775251,10.739376159245959 +0.14861823649256442,0.30294499716514567,33.129519747684796,11.111786944053247 +0.1510948574668594,0.2909132333519007,25.108503358711562,7.643009249650786 +0.14874447595416243,0.30001806900747424,27.517948605910433,9.018044971214799 +0.14990617425815922,0.2962007482390801,28.67453517084541,9.147810939910197 +0.14941922601634963,0.30219102378555474,35.579296143591925,11.95819258110935 +0.15092340675121352,0.29941264484115837,28.760134933461693,9.564020605591743 +0.15098478335341817,0.30112322661412466,33.15040852296728,11.162146744754397 +0.15169710791057792,0.30435413477724266,29.113324949625284,10.155092572894294 +0.15079847170199706,0.29293909677534474,37.09023087116677,11.564023918337094 +0.15127050907939035,0.30566304279433704,31.187007847405106,10.925097167927861 +0.14932354432414074,0.2951760086454565,26.20140117994901,8.243983301479993 +0.1495345774688778,0.3031471043674174,35.87318147045349,12.187311163105646 +0.15020680260867653,0.2987871224042107,23.64620522346327,7.765457237006853 +0.14933175612877905,0.2959127904806434,35.34437988362145,11.1875385728892 +0.14964744773590982,0.3012767617295626,26.978608141682614,9.021664508189168 +0.151145371777391,0.30051029398959794,27.11569227431594,9.106186671732084 +0.15111955167466576,0.29295694306018033,35.488265569215145,11.066496313314644 +0.14971940502963643,0.29818482164800797,36.225830863171026,11.751852630894621 +0.14844470660531048,0.2981811702953357,31.431417900754628,10.152141175623852 +0.14939225383637997,0.29563432727383315,27.208364011550376,8.568257630636538 +0.15017198536653975,0.2951166341953343,35.11423429089011,11.08040484706066 +0.15011315158496144,0.30271600345618455,32.43881885057949,11.036882359738408 +0.14992216664467153,0.2990871181528048,27.118617657836957,8.86366722133734 +0.15175406886338114,0.29670504087922767,32.474843472313694,10.47386135973643 +0.150127933206049,0.2936240137629463,28.007121095296352,8.701485835911893 +0.15036849881143918,0.3035837196838063,31.09839903842599,10.717982896647312 +0.14941907541743543,0.30109077129859835,27.8014635226147,9.23392852879676 +0.14906286469676874,0.3109754999834244,29.21009422167637,10.724307807887305 +0.1504970875809081,0.30291645025656566,33.21441327446024,11.340373445618006 +0.14896210366945206,0.30203667872603285,25.89583835748918,8.690948022677132 +0.15128921703570983,0.29846953166160833,24.617717808822785,8.131978501014634 +0.1488725249346793,0.30148616462831496,29.252164038388667,9.74820577783682 +0.15117242370617887,0.2995695301273475,28.962572808333153,9.62962219798294 +0.15022239163387566,0.30434209506533694,31.543667279743396,10.967257943284338 +0.14957530807736327,0.30093737586358743,32.348605481583235,10.794051141420857 +0.14912582179311112,0.3049678947152007,30.76968555228279,10.613918426805496 +0.1496386797517009,0.3072106658179281,25.85457676891932,9.198425578542896 +0.1515675993171849,0.2978501224463362,29.469686803241498,9.652752847318808 +0.1500297924694628,0.30138410209185634,29.724173335132342,9.957973209466008 +0.15041352228833896,0.2979384023138176,38.68980179184523,12.604852751008584 +0.14918815200313923,0.29183427495423425,33.458283947861496,10.140648608083001 +0.15071152894797057,0.29832892972832353,38.387858462146355,12.601504026459208 +0.14986652747449822,0.3066474503327988,25.651208947296563,9.059638940159171 +0.151561693967517,0.2927568654541119,33.295312503291754,10.341066129705744 +0.15086294999832375,0.29763717654564004,21.744149338192965,7.048884840944611 +0.15256479599414996,0.29415933695187657,27.962854041051393,8.902834396999987 +0.1512074376777576,0.29659193776537884,26.329704675953167,8.489946238385286 +0.15075946854027344,0.2963422943240921,39.60367759354076,12.697384159384901 +0.15091058474286814,0.29625006798650644,25.12926605902006,8.088442363062612 +0.1521340700130335,0.303414844263604,33.55805825268406,11.688944607548681 +0.15056411287505123,0.2980821551571164,34.85711830668656,11.403214969134735 +0.15055837156094368,0.29737321282557255,36.02893198369916,11.69868036242822 +0.14995617149883886,0.29787116232945976,31.08820042039598,10.055997490359635 +0.15023082391935225,0.2966363398033971,33.09250364731737,10.64315935280745 +0.1494726904573847,0.29964771064536977,27.174538708162476,8.965135396486836 +0.14920072834562562,0.3064964410402077,22.778640032474637,8.031898358089402 +0.15147178868725927,0.3047472274174656,40.93979616455492,14.271121717263156 +0.15132870536557433,0.2998870104596311,27.87978606331332,9.284929045384395 +0.14981101103111522,0.29761004567993304,31.076909101720428,10.089171783479022 +0.14927347022090487,0.30520977169901803,26.916700514251357,9.30385142084077 +0.1478053152370585,0.29381871293393946,33.77511051100764,10.405804969249724 +0.15203011339355585,0.2979734266429518,33.427208213918,10.957501805474324 +0.14952889971886757,0.29797681069983173,31.716868079212063,10.271564353479542 +0.1493101122266086,0.2937132681251049,35.7528257981979,11.093519480421532 +0.15081589742144147,0.29713834350148005,29.446001575331437,9.492752464592886 +0.15101117697387964,0.292397404298454,30.701605434161163,9.46361387862647 +0.1491520864309564,0.30547216654865955,26.166749444370666,9.1455255227331 +0.15059247080512933,0.29768760284348883,31.176957197773817,10.125909202310742 +0.15133852724258548,0.3014394760106775,32.582137157495815,11.01871966749891 +0.15094814853062322,0.3071505506165795,28.325168913752357,10.163478449827538 +0.1493840112107584,0.29489207138094714,30.46932622774596,9.525443529513161 +0.14880854376055452,0.2977761789325469,34.50303285411248,11.114008517527502 +0.15223426719742603,0.3054890888998048,32.38573643326654,11.480336320832942 +0.1501488958172099,0.30386209462866426,27.295798831660232,9.363534482697851 +0.1497384878839139,0.29263416121062436,28.60287090020875,8.788433165366559 +0.14866834602223822,0.3051387761227575,31.25323272516459,10.764370733721872 +0.14888610625422405,0.30183085480543775,30.266480886667647,10.135247680042836 +0.14974090982936505,0.3020660096594753,32.544570471828855,10.97218986969217 +0.1521298637222844,0.2993844078537772,27.324380455095028,9.137778967575036 +0.15043668583169326,0.2916470504709213,32.28562412235744,9.857861000927526 +0.1503224116176071,0.296749151256866,26.726582823233322,8.544967889621184 +0.15018367744359695,0.2994759326535422,33.74031154881786,11.133827018471907 +0.14931394600667658,0.3010354208235388,32.021040696786436,10.710487059446583 +0.14998424910574618,0.28754859802615323,33.68595141255073,9.791898334294954 +0.14961392165771523,0.3015330409384611,25.217375803164902,8.493563802153865 +0.15053486931035737,0.29888191085825133,35.20737012181189,11.486302712368355 +0.151142586219533,0.29778372305645195,27.03883686627093,8.823299133649241 +0.14894826676660325,0.2918400317845817,34.141419407230565,10.32387492883728 +0.15018379273216284,0.2960231801001271,33.75459338646803,10.811651928335586 +0.1506718259056363,0.2989787978138815,30.178258842110296,9.928258137909094 +0.15014415150861565,0.290915497153799,29.944102709680642,9.022925002584005 +0.1480310157137127,0.3028215192862707,31.89268952213591,10.694691272908768 +0.14996134204222694,0.2974932247769126,32.26728830357885,10.487942996793732 +0.15034071134023674,0.2979739878101016,30.008760392673665,9.860086600171636 +0.14909155066244903,0.30156871707891,30.782905181615323,10.304133052165374 +0.14852178867457222,0.3067924998968724,34.21845453470047,11.966155296267727 +0.1512506814955317,0.30213155838835193,28.82714246112647,9.830896485709994 +0.1495571476787501,0.3005010150069177,30.787242705571426,10.162159194800498 +0.14949883834791064,0.2980819377813016,19.6258908978537,6.397772198785832 +0.15084007937242583,0.2961632241753646,25.952239710678967,8.28730874771679 +0.1506545264657286,0.29656219397990546,35.7965638060532,11.536390672964867 +0.1516477684486405,0.30075570777629484,29.402510400154082,9.909401372167569 +0.1496047314538365,0.3016821358845868,32.6351573917845,10.92338220146636 +0.14888934930908235,0.2952514109433,30.047070401267252,9.388801729904365 +0.14861533212939357,0.3005917926606154,34.90578674998347,11.529410543901207 +0.14922286098631735,0.29866994812324027,32.57027551713953,10.61792734206064 +0.15065703720230675,0.298943170846755,29.377173456210226,9.71039984744528 +0.1502155017551837,0.3016186214100062,28.63154783804462,9.643395259747725 +0.1491486372197899,0.29944895380753417,26.706146263385428,8.778457814857441 +0.15086808975830185,0.3080825928796563,29.529543909566176,10.647273703153807 +0.14934790055401306,0.29962122900531424,30.983280585215127,10.245545568601331 +0.1515831586600561,0.3026301976868861,36.4562194944923,12.547735637778032 +0.14910593781848044,0.2948255540853559,31.24849391843507,9.827977117224076 +0.15103257492283975,0.2991321740705448,30.083590960673412,9.910015801452266 +0.15166254789709696,0.29455929920605767,27.830511240464887,8.873359474051721 +0.15074327180274424,0.3017558614717207,34.59588783921133,11.682467177715024 +0.1510608713235501,0.29896309740494736,28.820325772372662,9.498277388967354 +0.14777732884950742,0.30000172492927263,27.68298074483772,9.049637951007414 +0.14979211952961013,0.29339258200200713,32.95323455338379,10.259793187733061 +0.15095525933221648,0.29474443866357813,28.602314532354846,9.008429806042852 +0.15035433986595811,0.2988222829879352,32.01360599093954,10.542340322790563 +0.14750188812901335,0.30364006141156796,34.30074730639062,11.595623388092449 +0.1504791539812429,0.30204651126913884,32.77281454600361,11.148147845681782 +0.1492416485679526,0.29709710286880975,31.12619777780687,9.947950416856036 +0.15017366299012835,0.3041146862391496,28.27865264321392,9.824269248310651 +0.14839609954423916,0.29995316359199725,28.74228086073487,9.400082102196803 +0.1492446337581718,0.2962007342539894,31.144262743131087,9.898108080112248 +0.15140404301143381,0.30053941556347147,30.417202505995732,10.264103906179074 +0.150442949910232,0.29339147656246206,33.481859265304166,10.402088021535837 +0.14953665119713627,0.30009377341384075,31.310048372875727,10.37342296677762 +0.1488861425588887,0.29919176370096817,30.63692014990333,9.963704582919277 +0.14950247892925136,0.30370134831252193,25.188874401915577,8.62972413882716 +0.15220577924821688,0.30529913582169177,28.41838377578928,10.13501805247569 +0.14979055224481774,0.2975311008612549,23.058283298558667,7.471389513606323 +0.15070262307354995,0.3017957559481223,33.603330063451125,11.362312493987947 +0.15202844963798107,0.307598262964139,28.31409712817746,10.273603230781486 +0.1511315711701656,0.2942840776145417,30.500411218717208,9.634320831173573 +0.14908571755591962,0.293805979587032,26.792266049604052,8.251382679744808 +0.14990871542608614,0.2994830878797163,33.756139837226904,11.110804754760034 +0.14955308892528868,0.3049899705269227,25.16086034680267,8.761036080197803 +0.15055353447564473,0.2982317943488366,29.134731378819858,9.456379970033511 +0.15089446491319494,0.2995502491022185,27.999742866030946,9.268509450422663 +0.14961168227650315,0.29747741934696964,33.25837885141998,10.67293191854527 +0.15173476422385293,0.3058457713873027,32.546363179702524,11.488558520973434 +0.14899129336804925,0.3085183296164596,29.462853474235914,10.508219363752321 +0.14880087583163304,0.30078599143067003,31.312820759347503,10.344466244148961 +0.15185280753832014,0.301097799432167,34.08964958414464,11.571705746281204 +0.15149786666976914,0.29750639973516857,32.820818800950036,10.699817752184854 +0.14951829097215283,0.3022263242869996,36.65908855590047,12.331709429953394 +0.15150307452008413,0.3007483184923705,35.317748904629795,11.967028847366075 +0.15093507337281828,0.2923859682610989,28.227785735261786,8.652626441499697 +0.14871082347643194,0.29822038096405024,30.282944197321953,9.703823815943897 +0.14975117624955195,0.30078366796927136,29.44162765625469,9.776070308947899 +0.14953845579139444,0.2992642658157021,29.490424576603434,9.627338942129208 +0.14968005104502005,0.29652347913511706,36.848887909614376,11.75124491580683 +0.1503928045995043,0.3057638308924176,35.22296066512316,12.412338113581262 +0.1510290761450909,0.30176757038235696,33.44946674370856,11.386359809265437 +0.14967251523433858,0.2975295584201429,35.53523220957442,11.506425548838877 +0.15174707403638224,0.2965522213707628,28.851603917384136,9.394251107211947 +0.15104598098775351,0.29547170730558664,29.648837853554642,9.430004343976206 +0.15029232141111662,0.2953800550655445,26.366623541425675,8.428977806155663 +0.15051548994963002,0.30434660820759446,31.370205778147625,10.828580780602662 +0.149809091704635,0.30244855913974156,26.08814004309508,8.865835620982448 +0.14898567174917257,0.3035883558151573,30.201274317898058,10.322624598287563 +0.14887104084292638,0.29419070474778297,28.703957801023364,8.929079470385005 +0.15052001383088737,0.2971864947401284,29.127662769294613,9.402419299681794 +0.15151567902251742,0.295795539261503,29.740264041164995,9.547748548255436 +0.1505796857389685,0.29946214850449815,31.008913265929074,10.215326004523678 +0.15143304649420267,0.3040776968131699,39.92561655358517,13.862457004382225 +0.1497195448311107,0.2972571200862042,28.32587027990827,9.093486229302009 +0.15119790714136097,0.29681228191937464,26.04978670814032,8.404798095039222 +0.14987354402325684,0.2900341734434252,26.530923795304602,7.9185370812721665 +0.14952876177248123,0.29895970188307947,32.900135256727815,10.804866704973763 +0.15000533438179742,0.30108848785158343,26.20527835290352,8.778910160423719 +0.14897510910960718,0.2969570626750955,32.135284310739934,10.212086571470058 +0.15077275989119177,0.30692324397186743,31.647578858898683,11.308856584866088 +0.15041264595985135,0.2979900298950135,27.451462481800363,8.973301605247967 +0.1510344149399867,0.3005652675399589,31.50016163446022,10.567032474837383 +0.14852155070840928,0.3122976006149431,26.784356697344702,9.883214134179356 +0.14916463478027822,0.29819907021399306,28.273823761094597,9.150887552458656 +0.1513765609507791,0.29405142155869907,33.899093257815565,10.649806100646774 +0.15009394595042144,0.30737037958901614,26.607599435579694,9.499680749009011 +0.14943807510159646,0.2955714186034058,34.679680629203894,11.011560035676531 +0.15065666978335784,0.2961919776732675,32.361305175736675,10.44153231603996 +0.1503573423874384,0.30630699116151533,28.42476004751399,10.061499441009095 +0.1485305666734166,0.3076325030141995,27.00556497102724,9.585118379103307 +0.1498645987871358,0.31130995990397176,30.12235734934505,11.104001385389955 +0.149613547462557,0.30136674962510906,25.395497076052735,8.489969402228283 +0.1508462590124835,0.2995741362538597,26.4012322294235,8.76599343545489 +0.15184264642439255,0.29157404108685947,31.175073513407856,9.602563300719648 +0.14902708025334177,0.29920606144446443,30.10617091353026,9.820289591814513 +0.15067925143318403,0.30021348348902127,28.419533771472825,9.526138506174336 +0.1491333230639334,0.3036205244871966,27.97583055503591,9.566800422520473 +0.15011938192646496,0.2992628248156925,29.56845844602312,9.682032608720256 +0.15010133842038284,0.3086003223287547,28.309488888131042,10.199500932842986 +0.14823542770895357,0.2994313915598302,28.04282202719333,9.122037185348661 +0.1496992930364272,0.30541445290457114,26.611269414647463,9.29961820624645 +0.15104270107094583,0.29755254980832435,33.02016206502069,10.79678255209703 +0.15047958742121037,0.29825871539913207,28.72303669756765,9.321673550143162 +0.1505266803275588,0.29929573229495027,32.10690764117034,10.54981803794392 +0.1507756720093018,0.2979962710538632,33.43703938201512,10.872928476276089 +0.1502191945541916,0.3047626420083809,32.347995577292586,11.267130753810077 +0.15079658249355812,0.30406515022357794,33.71607050255752,11.693614598629372 +0.14800605909233314,0.3051980238187954,27.841508262129892,9.617138948591503 +0.14956072434879308,0.30106041627566793,28.234560637016806,9.428547387987035 +0.14974056096969024,0.3063803684999037,28.011662585021984,9.859588998656694 +0.149748465585612,0.29554550797923884,27.869790916554003,8.886555579997898 +0.14968690340760352,0.29500297270217196,24.679872733312475,7.7256666619817 +0.14946937122029516,0.2961629380540845,38.74878436190127,12.250217548053737 +0.1515344500512161,0.2944219919265016,34.73872011294477,10.981216205738567 +0.1497758646224404,0.3015951844868561,33.01143945917801,11.085392527731745 +0.14968482461378135,0.29482269263604205,33.40750485413376,10.50125961595117 +0.15017562679644741,0.3004621131945901,35.22726688321199,11.7467347403298 +0.1510504598635516,0.29840205477334897,34.17635408335288,11.257622298446048 +0.149343492370526,0.3064716726792262,29.904360240296075,10.584249256027228 +0.14933207032546078,0.3037492864274846,22.77859756334208,7.76264002862742 +0.14936464104755526,0.29785777313010764,31.96978923889302,10.331561288589917 +0.1518412771895563,0.2994739605102518,30.201337330420078,10.123159621927957 +0.15186406232421334,0.3063044089776712,33.452334349509364,11.918410430123709 +0.15063330584912726,0.29208438208066906,39.99279445217967,12.26058834675306 +0.15016536003182393,0.2984169796198786,27.615038222475047,9.01478188715027 +0.1501870338592334,0.2964432680071716,28.69189501184259,9.242616141283198 +0.15087485633157044,0.30223832971972997,27.307615420325725,9.371387621303093 +0.15001022248898382,0.290054268613154,41.82188749997335,12.597111291659678 +0.1509229912489039,0.29282053531408725,28.985317309374118,8.969141727805312 +0.15229196140962825,0.2993102554101151,26.4344045043552,8.805186100314476 +0.15111742383059157,0.3114372136531628,27.38210080286549,10.176549939157905 +0.1503161130804667,0.30172310527093477,27.428194281679417,9.271952657699885 +0.15088942587935258,0.30293962172235944,34.55649754746703,11.82732179983293 +0.14968347004817967,0.2963681507678417,31.6686442713841,10.071909610944154 +0.15121548300945423,0.29935537318548283,30.764580687190946,10.268309031748062 +0.1496712805259904,0.30268975871505416,36.14961770685619,12.295691464811078 +0.14988978664065455,0.30104385035006287,29.49680977930108,9.916412745526547 +0.1507718846600001,0.296087914366192,29.201373658513827,9.34899272291679 +0.14998810080052064,0.29906604484174776,28.172674329139873,9.229284528048545 +0.15036948988425683,0.29647951671551354,32.559920287163486,10.414828944459021 +0.14994258538276717,0.2945250821124289,28.046889308522328,8.808079298686172 +0.15065895017558212,0.2995442437423178,38.1196634358324,12.586851288226853 +0.14910340508092693,0.30597460652679903,29.378356860378403,10.279660903076387 +0.15021687872998443,0.30243021178272517,31.64099182658393,10.746730881013708 +0.15029389176663036,0.3073254360362671,31.49963100818114,11.209109847829364 +0.15098178955569894,0.3015026429644915,29.381772942858035,10.011548144629886 +0.14998407323899132,0.3033420623055259,34.73047774847678,11.89325845068741 +0.14911413997671102,0.29513167956418984,33.82609652006528,10.640128675183343 +0.15021296747843083,0.29362966531270995,35.95831394020289,11.167250573333277 +0.14987248062936742,0.3002577710729399,24.098789340422023,8.000105268791062 +0.15135232283735608,0.30157132984740626,29.315174399759858,9.977251418957046 +0.14885805625036697,0.29417866078243804,31.917689450149755,9.879495051140061 +0.15039569861527252,0.3037316621056822,23.825414358736644,8.26254613412473 +0.1503412335326959,0.2953960426019914,26.520821103336996,8.413805602380233 +0.15184348060687908,0.3035138456633141,33.12726576611029,11.506401747558224 +0.14930499604914743,0.3015342195214826,33.66274701094979,11.272261034140675 +0.1493676515996755,0.30551357611837265,23.666249913295722,8.275274925329487 +0.1494298072647658,0.3025664247428508,27.563567553961484,9.367600114146345 +0.15007814088649948,0.3000549342854823,34.09165457913022,11.332599341822851 +0.1494891405939133,0.304940521099979,25.5188981534343,8.841653147115647 +0.1520684367029533,0.30333074619473405,26.263149334026245,9.118743523335933 +0.14927726563185265,0.3017961691331789,29.287114938756815,9.785472991324657 +0.1480269603074748,0.2965944756056452,31.87575975821562,10.107630019042514 +0.1518193094698921,0.30294483925519994,27.958077471475075,9.642311244121093 +0.15097303675808948,0.307196442565776,22.12392205821388,7.93656320522342 +0.1519735606108645,0.30841532883341555,27.89363843770941,10.164819134198458 +0.14996791377911878,0.29582664441056306,28.081467166050544,8.884566517679108 +0.1531689991449198,0.29433693707958725,29.549678155116666,9.446568279792606 +0.15123880820516833,0.30377784793593926,27.549991752148834,9.529123599289019 +0.1500749316737607,0.3041549480576537,34.11535572262504,11.770923466036407 +0.1502942310389208,0.30185117304749415,30.081066402119315,10.183267013302787 +0.14932002409181153,0.30089938882158723,31.91108532321774,10.608848081143748 +0.14903441523397976,0.29467251606634565,29.031538714306475,9.10003613525027 +0.14919764360713542,0.3015096936019632,29.649247987895897,9.920648330026053 +0.1504178720967435,0.30167584867698904,25.204712060578686,8.472776777918977 +0.14937428632792824,0.2954677970000206,29.201837100627788,9.210474370105015 +0.14923659850703425,0.30384504232515536,30.632543996385866,10.458092930323943 +0.15168119400094357,0.3032390531296838,29.90878482000189,10.405293610530896 +0.15104520883768593,0.30909414245148314,23.27815042665581,8.479006516768493 +0.15096693220556273,0.30583673014123547,28.732627440425958,10.135677913412426 +0.15260862447714585,0.30248374768612657,34.18650288453313,11.838722770648536 +0.15179227721233832,0.3045880136891935,27.639786003554775,9.665437249008212 +0.15022802182759984,0.30523732169773543,29.3574639188076,10.243633006787688 +0.14969412482666858,0.3022224370478047,31.274326669159144,10.611566293486629 +0.1486690385772201,0.2985767400811006,25.270347501749338,8.158969082500693 +0.1506723929492869,0.29874290483693544,29.86431806301067,9.784359472470458 +0.1490988213219637,0.301807980469396,37.012204771860986,12.381478724596835 +0.15165348101340928,0.29542307905843057,31.796588923763906,10.14508242851292 +0.14924108140551937,0.30937697248255797,30.29057818174489,10.922984186189638 +0.15067285073314496,0.30008675738002444,23.94532772351791,7.965912387155629 +0.1525580814659607,0.29608549021037606,27.13980955828739,8.798245675546216 +0.1488520047043616,0.2938426557564193,36.26600887791395,11.161192830944437 +0.14854610757163458,0.29746645963126167,33.061016509568844,10.589611368351761 +0.1503403163716151,0.30304841201678334,24.652837787619198,8.455667527047247 +0.1491654630906485,0.298159298536353,31.992245699835102,10.333431470014016 +0.14874977844241816,0.3005474113701993,35.16661275448858,11.641876831380314 +0.14982798489329338,0.2975900516824233,30.92905084326061,9.953034698933799 +0.1502784968557064,0.3010514805195591,25.7901368657444,8.740547268320514 +0.14872629376831528,0.3047199337580296,25.765062555081542,8.86842327286035 +0.1499447015755763,0.3078349636338116,31.28391105076725,11.140847784853893 +0.1499804679737111,0.2908019844851951,30.167974328875005,9.107846992720729 +0.1500712367313619,0.29543334863141096,30.31430523862297,9.552872401198497 +0.15191481088892564,0.3025726775450782,29.90973595829352,10.292087817382015 +0.14966547007599815,0.2997420801022403,34.373567255400424,11.353208562141775 +0.1518013590364544,0.29540493294027537,31.72180445494497,10.182001083148872 +0.1487280216495855,0.2911403045553556,31.50306957958248,9.471416107454315 +0.14944237471776173,0.30892328801401375,34.88899396921994,12.540344894459622 +0.1511286811310313,0.3030573071722334,31.067358551571452,10.69783314868141 +0.15099472297777933,0.3061067800941891,27.527539529535467,9.705992018742105 +0.15077150788550756,0.2940615128990289,30.118299828754527,9.376212489706758 +0.14999115056648413,0.3061321324250115,29.916347750418005,10.476553940631478 +0.1487375524605342,0.30231389238414536,30.841355684601066,10.373484579760536 +0.15069986825794535,0.30048525301507906,36.26397486944406,12.090702059402926 +0.14870475167174868,0.29807045850494357,28.56265873841055,9.169442020910662 +0.1523782134317165,0.30576346710508756,32.1821512187119,11.431026081304616 +0.1504590293608006,0.29670122119319164,36.48025074863726,11.709446244654666 +0.15101358843513132,0.30960752722614965,26.87718189221372,9.873518327348648 +0.14925675864194418,0.30449861870596395,34.15268368801648,11.758455161207806 +0.15032526865802828,0.2994120051766088,31.634118034225843,10.388692619478775 +0.14897868392468921,0.30347987840336516,37.870246469894525,12.882938727156004 +0.15033547315302165,0.29424555820972587,35.36830686428407,11.056759620587576 +0.14961787032965754,0.30502439582941426,27.610174174348963,9.625944976827414 +0.15090436643043184,0.3018468564086428,29.881265904641808,10.107684413867466 +0.14990028378740047,0.2941607298435432,28.259158055442075,8.779197772945894 +0.1505822056785037,0.29770832089490573,27.99663516690238,9.135687449225397 +0.14968624223845758,0.28751959886636175,30.564632886228885,8.845362358018036 +0.14967474554887353,0.30188488937383756,34.49988748256376,11.588681363609691 +0.14954807707502596,0.30498880298153697,34.96952327862831,12.14518303032861 +0.14950125468570355,0.3007746170106346,27.455615810509208,9.146313683986227 +0.1514378921196374,0.30281247944731726,25.92234356830935,8.940960277737116 +0.15014300421380464,0.3058694756975804,29.014745948967583,10.19000508001916 +0.14884711706718887,0.2922822147255014,30.030813477359064,9.114208557338348 +0.15028306986615797,0.3041773500103569,31.697902555516077,11.006777935958013 +0.14967562457293263,0.29384700645155193,22.953836430368085,7.145231709855658 +0.14916196598130044,0.299986672144408,30.3838394732929,9.995705418271783 +0.15053444544225805,0.29778573770123695,32.559939942109025,10.545910701263361 +0.15031606768746014,0.3049145962833051,30.866558394995412,10.768989206723667 +0.1498781448851506,0.3014155997121122,28.09299886904244,9.43872349700542 +0.15045520316462554,0.313148763552408,26.503646353085053,10.028786455323218 +0.1504399148819768,0.29903316922606626,25.490417733822856,8.392393403052093 +0.14951578875272567,0.3083124021224467,28.381332384299416,10.14422925273544 +0.15139838673974115,0.3037531366058669,33.16189789898312,11.501398125230772 +0.1492815558818799,0.30687509895790427,35.405547826753896,12.530772699271555 +0.14973598468331248,0.3011453420856062,27.606940782416117,9.19685412157689 +0.14896151183545464,0.2960874454788772,36.32292505781397,11.542395925038445 +0.15056321735472536,0.29914837871775,36.41021646373123,12.044131753496337 +0.15296797459352632,0.2919507076384568,33.39068463728705,10.47569640503674 +0.15032417050023703,0.2964351288527715,37.44123425062528,12.076377250171044 +0.14904507900004393,0.2883954189827876,33.78670937856983,9.998770239140066 +0.15001202552660098,0.29779136354324315,36.003361330421754,11.714174979184413 +0.15121147892312442,0.30161169758941203,30.072420235168583,10.222361554779464 +0.1496038235068478,0.3046264063155847,37.82297004630484,13.059081646345078 +0.14914555536520616,0.30090670894524585,31.197693088438985,10.394491363436074 +0.14928554421418372,0.29035239167155596,33.84413781939642,10.152140447471535 +0.14968623820751964,0.30290973347162664,30.017677555152538,10.259614582990839 +0.1491260791798458,0.3009399504381811,22.837430232415365,7.615550958266082 +0.14914175041791794,0.30076892395672417,28.968396295594044,9.622023124198686 +0.1490601038627124,0.29513226861150027,31.651325718703674,9.933809202227467 +0.14995519582918143,0.29111166263195537,31.107272299735293,9.423152984380092 +0.1503410464134173,0.305144163295508,27.55138247398326,9.673437258886295 +0.15187647335887333,0.3038126713712855,24.651444305739997,8.53909479786559 +0.15040008845925257,0.3064480925294294,28.92500119499235,10.225069431056108 +0.14865675980464615,0.2961931208749516,25.267364417395093,7.979684766167419 +0.148566642762258,0.30453020189864455,27.702585285768023,9.5116311346866 +0.14907216388017433,0.29904046917584787,31.242391181107653,10.177893540648709 +0.15117921775206944,0.2975342948486884,27.69026504180015,9.010669753420958 +0.14793771412018225,0.2988544155021851,29.228167838592967,9.450703942620626 +0.15079386272291634,0.2934540573712781,31.16353439422895,9.656296131605744 +0.151443257605908,0.29306308548585636,30.564737843053436,9.601889358323264 +0.1507446436800092,0.29113005372052925,33.07769823178932,10.084995104896159 +0.15076942603169716,0.3031282452239175,29.733884584233934,10.171399398928182 +0.14912899257408707,0.2926021152993033,34.42249456964207,10.541868802850217 +0.15172983994009073,0.3000049525744535,30.720474040224023,10.244211913507186 +0.1500499029535393,0.2909995381754903,31.741298640037765,9.580042045838699 +0.15001186943085146,0.3021939752133033,29.82831868456542,10.154689053399647 +0.14901290698822747,0.2960383191453897,33.31296401382358,10.582114886109114 +0.15044446124998886,0.29516374327006506,32.036840751720206,10.125727438979784 +0.14841518785321603,0.29678104806595673,30.70317215609433,9.712041678070014 +0.15259206154516802,0.300713110947691,33.16345133207845,11.254919764886633 +0.14826082943366248,0.2990522655217091,26.97827797372749,8.740926605459839 +0.1506957158051959,0.30002230035774907,32.753506359667156,10.942788972259141 +0.15111929860086884,0.29406988123356326,29.834841289004398,9.401731512647478 +0.14923129005118269,0.3064189954738967,31.224410377978334,10.898516171571666 +0.14936746117538355,0.30107915492503967,31.980563490303304,10.683527290079416 +0.15007267744010963,0.3010756712630488,28.212293691129105,9.455335086870447 +0.15001599014911476,0.3007428862547265,33.1514906027294,11.011608616097684 +0.1490438554696667,0.2981857707661694,30.12944667092234,9.75157693896294 +0.14891986814402838,0.3111664211887233,29.56900990106741,10.816237694838591 +0.15019489307633668,0.30686416083205487,28.228689109657243,9.973974418319408 +0.15190817727262215,0.2953403955946364,26.67066728334512,8.558884096042 +0.1490750432663226,0.2967320122016201,31.697075894639053,10.100015720670571 +0.15254311422472636,0.3039746732007331,27.671599357048205,9.733741866144252 +0.15202838324927517,0.3025673771141059,33.006563723722465,11.385826110575797 +0.1479133515889009,0.30181748275262815,36.19878088452278,12.00378849701912 +0.15064950375908343,0.3022749747527126,32.23039997457845,10.981496753648385 +0.1482269444347546,0.30164399223972177,21.542968565409463,7.168069279305016 +0.1496966319949425,0.30008155357827265,27.70174779880516,9.184572322531057 +0.14851425441389077,0.30381236227683783,33.140264637078836,11.334335455768969 +0.1501793878783565,0.2945422894065405,23.620522305220625,7.39065118091739 +0.14687643843287412,0.300172497923128,34.6772242562673,11.346224253892323 +0.15193554191175593,0.3033933693083523,34.839639605013176,12.123589158060131 +0.15151647428032047,0.2887964747830914,27.355891845168905,8.196571576818044 +0.1487212339636145,0.2991792774613197,36.63529510329732,11.915546050010652 +0.14978708297678134,0.3031019438405156,28.79596373957083,9.803591889184975 +0.15083023531082104,0.2928457876986027,33.476388023897115,10.401803846471305 +0.14988336582394982,0.29636674749804903,37.997155909348535,12.125290644324119 +0.14849041002974703,0.3063039275841574,30.69531522743358,10.66311357818529 +0.15132972004336623,0.3001837677873126,27.14982375813077,9.042910251919869 +0.15009290220780028,0.2980083777527282,35.16384480378739,11.396998288590748 +0.1498063119729323,0.30518494012629854,26.810820220302045,9.284140289991559 +0.15067086870520985,0.3032117544269888,34.24061741796382,11.722440823129627 +0.14949328834325437,0.3024362874109427,32.983768312712805,11.19022715214461 +0.14803025969739506,0.3015453578534581,31.942518519907605,10.575419077784721 +0.15125996375758358,0.29666134307019476,26.894499688439637,8.680600586161708 +0.14943739735978567,0.2983644396538379,33.98664487114587,10.979041490721045 +0.14712420871666174,0.306824215698437,33.38818870811331,11.568067780213337 +0.15142388475908272,0.29626213584856176,30.662003811891033,9.86979978178947 +0.15191876619105962,0.29988783231489413,33.16059898435999,11.068151616648308 +0.14923520320873646,0.3062771403457535,36.26637449851822,12.677572622629109 +0.15081317473431097,0.3101126421478605,25.38020319416251,9.351881586650173 +0.14967498521505296,0.3038691236564812,25.760522773499808,8.810976780658896 +0.1514269415274487,0.29890785216937454,29.560122898590325,9.781688485555557 +0.1496177949552043,0.30820085946801606,29.170086365967812,10.457617478660818 +0.15217851313380848,0.3002341808673266,32.317151759651125,10.937958472048853 +0.14913527710966742,0.30032152357554226,30.95298200834668,10.283122500916537 +0.14781530241790922,0.29720990423556864,25.47809441623854,8.047605199659406 +0.14768392690432494,0.30219089153579826,23.349513471078474,7.795303995334805 +0.1516470881500991,0.3026994134043551,29.912032070698938,10.26878500372278 +0.15112759633838316,0.3073827646888915,25.367161313974247,9.07937675622594 +0.15019197898037318,0.29900557404328276,29.101399706769698,9.579177735000156 +0.1492989013436578,0.30421783867046376,26.11690395093281,9.018554278397536 +0.14923331602360343,0.2992482910862512,29.234392508161324,9.59815268841428 +0.1516379596968497,0.2952039234771228,29.48949623792357,9.429713632627797 +0.1497548725328338,0.30137005325513,25.16724516789366,8.426133038861806 +0.15152821936260927,0.3049139033313775,31.430778230300096,11.05530172985707 +0.1514639785493207,0.2989582947554092,29.611514911092154,9.757406543866452 +0.1513318427424335,0.30285533471077225,31.952693607554473,10.965975369976833 +0.15070551001769397,0.30398377802945076,29.103839415193104,10.014841192400509 +0.1496236397523721,0.30452791863284706,32.57719491731183,11.250851620814151 +0.15012779097509615,0.2974404626733659,27.143878581210437,8.785930710244072 +0.1493968878630916,0.29893346351244193,34.52630695117597,11.244469223830427 +0.15005470726414177,0.2978718315043907,30.715982419704215,9.93702590036286 +0.15028390201115416,0.30137955981887227,29.185094661795276,9.813616392444246 +0.14925333677705585,0.2984380390587616,24.963728523283265,8.110095305701833 +0.14939994266866383,0.30170874650032814,27.768718684076198,9.277728246719393 +0.1500131414429461,0.3077399397728205,37.904990351961416,13.560332181353605 +0.15216845108546445,0.2985042466722253,27.170359644732912,9.074245178861938 +0.15192874519610167,0.30271904093103225,30.12461555929723,10.447564556257861 +0.150046147977674,0.29715865324442453,31.17273033957152,10.055101719008173 +0.15102597438813092,0.29770404423573416,29.084898004521573,9.46731905600441 +0.15080555419358868,0.2966666747646737,23.972398631185307,7.727248718447187 +0.1490651219533254,0.297534485053295,29.20125265285949,9.371644686208448 +0.1497890119185867,0.3000925065668469,29.39856064384749,9.726778674909841 +0.15037912600948014,0.30293089054279365,28.63629343158419,9.801808780044402 +0.1507372384113627,0.30028250156083275,32.693933548156316,10.887193074868533 +0.1491882824828134,0.29659773622832664,34.198311587951196,10.889788769108629 +0.15060354978183577,0.301526538411565,36.11841615740967,12.16724095125079 +0.1503923149503815,0.30495113989355055,28.454856251643264,9.884123194908263 +0.15078187421309006,0.30472614068745857,32.15973779939213,11.249811336659917 +0.15098209140326854,0.30007842907636234,22.738708123998073,7.6170916658274095 +0.15249624438069645,0.3034411534645371,29.07861238548314,10.129934754392632 +0.15059998675778805,0.3038196546952482,36.38692437115568,12.618675125873223 +0.15055756334563944,0.30345815413883387,36.65189453732317,12.61078639080324 +0.14982906115850447,0.30388369245634944,30.48122816906691,10.455102150890458 +0.14996173352217984,0.30231690101123715,31.09844360203634,10.524918820727468 +0.14941673407246125,0.300194648073742,32.06471809867783,10.605987786620709 +0.1505001967057278,0.3035897769720734,38.17531173233613,13.167932049080964 +0.14998101408242645,0.3041665277993631,32.80892813557876,11.302663239245323 +0.15176569942084592,0.29431073279385533,35.442054504366325,11.232764257708174 +0.15217949051609225,0.29450305003675303,31.966266464203624,10.153633170082692 +0.1492130682627556,0.3020040688732654,38.37923798312481,12.855964653840998 +0.1492579107357715,0.2976413761312364,36.50938572214635,11.700824698968303 +0.1493850842767463,0.30157502239520345,31.162226525603316,10.430262637757362 +0.14956527966246802,0.30228128790993275,29.95192915579808,10.142499523184968 +0.15034379421598784,0.2970538378764963,38.80567465058844,12.55686573051348 +0.1485951343083641,0.3002167178882183,28.050994286370887,9.270612683685165 +0.15130457116778478,0.2950884775818384,28.085233659761702,8.980908285906622 +0.1514358012694854,0.3003983283318158,32.206568235994794,10.80131060163404 +0.15124997277180627,0.2994081006126801,25.670124442904587,8.563589360643979 +0.15139584078591997,0.2999163308969949,33.71422013411371,11.293140057772767 +0.14826156873230895,0.29600846699681227,25.413225682037435,7.999103223820981 +0.15046330326399301,0.305115053364588,29.479572833622196,10.297053594355999 +0.1521228418232238,0.2990336438102852,38.213593173129944,12.752124866583381 +0.14897180134702614,0.3089619859553204,28.108127601833807,10.05793232733896 +0.14968953206904412,0.3019798261312883,25.34214132988688,8.541194416440742 +0.1513895899853502,0.3032969211838139,28.796946966001112,9.979926467852028 +0.14940373739804896,0.3016987483835339,28.417672766175794,9.545918692832808 +0.1505002631713607,0.29744794487254056,37.04787498433575,11.997952238267803 +0.15167133602108435,0.3008264875259064,27.015646557148155,9.089407925797602 +0.15073915765555146,0.30264086639658383,33.514583645084166,11.477113047253614 +0.14913732717427605,0.303070989716599,33.16497207181506,11.284786315366716 +0.15201316363911738,0.29982907448348367,25.640680147947826,8.557867525470312 +0.14929412083175617,0.29840810998723954,26.944182266555764,8.726442456768709 +0.15002568689345946,0.29571755995269733,33.02223675031753,10.435500734458932 +0.14861770536660227,0.302392847808127,30.196368638703436,10.141204132806491 +0.14884003470622845,0.30458444936649115,26.57520145052348,9.173139119387987 +0.15035053869578321,0.3005143885297653,27.403112745979424,9.123548347038396 +0.15196124917288942,0.3010712429521651,35.20020112284193,11.885601877311707 +0.1495384508454159,0.2984376685849325,30.97202961561825,10.099607360317783 +0.15011905654379945,0.3026673929226585,33.32511929442392,11.432971230618032 +0.15013696417851205,0.302942043823826,29.712475807642335,10.136431289815329 +0.1503640640290826,0.30020911927699995,29.586651191426895,9.81717622755239 +0.1504183728934049,0.30225496292595494,33.059602407904,11.25648097406072 +0.15034959956524607,0.2949377704465128,32.736020146838676,10.361347645471636 +0.14947707350247275,0.30517266359743744,32.63599534077347,11.36195600308782 +0.14971888222859253,0.3099126865234497,24.050054450145716,8.801073848526782 +0.14947792672382457,0.3107106473956141,31.943060119010855,11.745544440165457 +0.15231113174713887,0.30104313965659796,31.890737406135493,10.825260544259079 +0.151391643587782,0.29614992700460163,31.671573301639413,10.175362844369854 +0.14860162055193404,0.3030121632821078,31.397717273289466,10.606545647426717 +0.14925529695210338,0.30764101546254985,32.311705810769574,11.485004605866376 +0.14791376667732695,0.2892918063831737,33.04321532788703,9.651499251093403 +0.15091819215659405,0.29947527612334024,30.38949671236414,10.083067058708856 +0.14887376855704412,0.30416558825375434,35.748298045724106,12.22126963338494 +0.1504961686456,0.29708085036984144,30.002391569725003,9.646781734799763 +0.1469263265903933,0.3070120118819256,33.12923595672171,11.517100103173632 +0.1482529951310335,0.2990589485217361,30.026301368011396,9.733599275482511 +0.14990895570920063,0.3074206973729467,31.084642287589748,11.061467965388768 +0.14888640119995158,0.2955471045490833,32.092158649653,10.102796006670047 +0.15161174655513768,0.3101609054399772,30.063459425779183,11.154523394549395 +0.15060689284132314,0.29402099596449977,31.178450316885176,9.710197587624995 +0.15095865050371923,0.2988620636023181,35.698341750189186,11.73377481921148 +0.1492890388818151,0.30215713023269963,32.417517223562626,10.829347441017475 +0.14985687122635838,0.30518305192588835,30.79281272811263,10.71486189639164 +0.14906143934155944,0.3018387446160004,29.546686373755065,9.868461228016198 +0.14921516149806432,0.29897856745156615,34.59116426634562,11.304922174192294 +0.14944412176107702,0.3048379050780518,22.717310627725894,7.859214628032586 +0.15037571129115443,0.2980963191400674,34.523555144107206,11.282425400309384 +0.14892986048644763,0.29704062169211043,30.50421632300667,9.721071305915471 +0.1498755542954255,0.29933927080655476,27.441465934521965,8.940740581087605 +0.1484415643764022,0.3028336983317804,35.60806955587981,12.054488514130618 +0.15133863968604896,0.2968513380409904,28.78027922173128,9.3346376231897 +0.15028039324301537,0.2946015458486449,34.282690862979514,10.78504880965671 +0.14977819193217629,0.2945966859423778,31.32042277011551,9.763787513369579 +0.15136016399864735,0.29825681660272957,21.72064015901489,7.1590874799728095 +0.149845733056684,0.2953664144027013,31.953823069572202,10.092023614180897 +0.1494612746360977,0.2928339567575342,34.8611271787322,10.634688046449225 +0.15002671464157444,0.30200174290598036,29.752881883070284,10.00653776386124 +0.14921303013360696,0.30144611304071106,28.262957720967943,9.46525368083433 +0.15192999045790093,0.29581110575133324,28.384545867622606,9.130645681620159 +0.14945754777246434,0.302393366826936,35.9771636837808,12.129650948372202 +0.14891488455297958,0.29538227201861983,32.135761515223244,10.084360741109455 +0.14843706247995214,0.29978349551768746,32.65018882690158,10.75380063969143 +0.14917970822336932,0.3067610132549685,25.754854989496458,9.062308917125474 +0.15086485749355869,0.29402436724568637,34.11593797467817,10.717472148593192 +0.1517776679112957,0.2975883744837424,34.044913814442204,11.155878409179282 +0.1497825355572467,0.2990585273096529,29.116470075175968,9.584954307085214 +0.15127482963959688,0.2950493367530104,32.3286066562779,10.247723225630262 +0.1505436460144164,0.29860119974717264,30.940260598811644,10.136200623506221 +0.15131992558222607,0.29635349669246513,34.32613602727081,11.10418299787992 +0.15160111433766657,0.3012913237307157,30.141159103522643,10.253807680158248 +0.15054303849002112,0.3010440833962114,25.73638843295387,8.633974933056189 +0.15164812471813746,0.29442981770628934,28.140761216148483,8.892958681814964 +0.15262061161858842,0.2960933218772424,32.78117879908843,10.667906004903564 +0.14935479429458515,0.3007600181532845,27.084466178814655,8.975580986852533 +0.15028790657349997,0.31060488961696175,26.467193036319394,9.724393258437562 +0.15116933726055998,0.3030480163782465,30.65983042860432,10.551596369823113 +0.1503201323615433,0.29827585542984814,30.53372632537816,9.888652417349284 +0.149562780413183,0.3052800164555544,35.06503863228523,12.179134302949285 +0.14916735459475433,0.30349770231181444,27.948736906504827,9.500849047896608 +0.15163915345022314,0.3041651165434515,31.54610653192802,11.046401316647664 +0.14930466591672995,0.3006487717538172,35.103701249726,11.701890460792615 +0.1500138676696879,0.2999785518309521,30.872927919686624,10.235184812982457 +0.15109582870085728,0.30656815184551095,32.13109346722105,11.428343459860208 +0.1499405190797085,0.30020191835578414,32.433392348936806,10.763840403789889 +0.15015209100568827,0.30453927335064845,30.964183008404337,10.736196119709573 +0.1503464017148804,0.29930525383395973,35.7240180659116,11.811457762444281 +0.1523155747769102,0.3016266391566455,24.08008893168883,8.257899936365678 +0.1500808669544526,0.2991370113877244,34.02882898632075,11.171579231256947 +0.15243773008043984,0.30086029239033163,22.5726705843173,7.656812511178764 +0.14640385469092712,0.29411099644128597,42.60651276283195,13.037652779165677 +0.14967112752200207,0.2973865126864653,26.392873000140042,8.529107027421674 +0.15091537961193402,0.29478454316226055,34.66874742085817,10.991111766264552 +0.15003720641810614,0.30117776071679964,29.855442611360616,9.976572630776142 +0.14976989541266042,0.30010661832795305,33.01569916415856,10.91062561797314 +0.14899637603241536,0.29935695043775584,25.493946030742986,8.304565831043181 +0.15148026560024344,0.294857185291016,31.36998686861471,9.968129360497972 +0.15135371540500644,0.30544498366050604,30.841022421617907,10.898277625058746 +0.15096231706105742,0.3010502557019304,20.51026826451455,6.888863637449898 +0.15051724310943038,0.3078078705198324,30.070243438485175,10.826875295737654 +0.15075211453704232,0.3047503740143827,30.36602345300454,10.585042574095601 +0.1506636646368206,0.2985187887133845,25.530021198102773,8.374384061036382 +0.14977728341337698,0.3012266873690849,33.098832012906,11.140078975977016 +0.1509487149897625,0.29163577321456824,30.13911652818915,9.186474049524076 +0.1501715414250172,0.30603087804974216,27.024448312204754,9.502502545113709 +0.1510408822895049,0.30084602708648006,27.598998452688356,9.282463964683611 +0.1497465006672607,0.29718543145827253,35.11920938058179,11.262386806389603 +0.1493090812645483,0.29635044468748056,26.77048007306443,8.495053579314526 +0.15060364604977572,0.30097341986201387,32.044116865180676,10.79425032694535 +0.15184487419969514,0.30089035952608867,29.310148352585422,9.904501384462309 +0.14717596185900003,0.3007356501732257,30.161140851714116,9.907321704268458 +0.1492467631336167,0.2969791747670931,32.34483478804846,10.377568451411218 +0.152053232822031,0.2983811990108403,25.31967784569931,8.38793577477569 +0.14904968784270392,0.29723987001777114,34.36313907162602,10.971545415890294 +0.15148603905170138,0.2997173443298445,27.088331644148575,9.01483938097891 +0.1506668468721423,0.30221297346982956,31.424154202447884,10.702368958197741 +0.14840841409958214,0.30798324757521706,28.26524544985586,10.038187438387139 +0.1507432554813399,0.2947889016030538,26.27780656397841,8.270072025558676 +0.14955094139774325,0.29997706516428846,32.35245522647768,10.71803306443025 +0.1501425887010411,0.30593997990755695,33.43873560271986,11.83751923594647 +0.1497314033603708,0.3028855048244029,22.165982694599677,7.570957243099782 +0.15094488945153453,0.29787537113381884,35.137616321271416,11.457149663357278 +0.15264469703359304,0.29969479437353924,24.805196361989175,8.344077842255949 +0.1492161709901235,0.296861116756426,28.7026364846107,9.15783034038603 +0.15056301873468894,0.3033520252378034,30.126990262174,10.376316368554317 +0.15146302743704865,0.3026024476679413,28.807865994052747,9.897306757631688 +0.15025128304983146,0.3010891129835965,30.477215055447992,10.204766297759269 +0.14977054794398087,0.2973887530282773,34.44564925839204,11.088388340969319 +0.15035501146911828,0.29326817610480677,33.96785605565053,10.458220524619293 +0.15212270932137134,0.29848755761785206,29.643898897707658,9.827782134641872 +0.14947036829529348,0.3065463195608687,33.50551252749616,11.813114213467209 +0.1501155361334738,0.3001766607647801,37.61476487834727,12.535294096349704 +0.14814562531251002,0.29336941500612834,32.44365116573127,9.943876593870678 +0.14917743166564368,0.3009025521910665,30.538678613272705,10.11015234247907 +0.14962298106315555,0.3060807462000656,31.16376410397238,10.915458911975 +0.15067751608773602,0.29792048835440466,29.299876671860506,9.546247811893974 +0.15010498299466873,0.30124563129596504,35.87372190846971,12.023797297232022 +0.15001957192714968,0.30205025058779594,26.008098714361886,8.80478661320749 +0.14933759318664291,0.3008790818767488,26.191736274776936,8.727212723867828 +0.15070886692700458,0.2992621507302316,32.427011861604754,10.772753391551262 +0.15012325433754412,0.2958153654089091,32.02284223478399,10.223101024014179 +0.15075394148584115,0.2936838929969213,32.916408143983446,10.287193528654251 +0.14835175297687955,0.2988658964236221,31.430099837837584,10.136652627719 +0.15119750669530663,0.3025585684740702,28.96615497527928,9.927715184201048 +0.1506077842833826,0.2901873366864283,28.1504332796466,8.47713388446175 +0.15235411388812584,0.29848914193881076,23.008609095842832,7.647887353634898 +0.14696431613479077,0.3033953674571166,29.486847492352545,9.858633864548334 +0.1530734013973854,0.29529384970079187,34.55351908400977,11.082459241901802 +0.1503333362688662,0.29953016244568714,30.601281040028248,10.142547223705439 +0.14956195182507637,0.3025964597546039,33.08021056856159,11.195032656387303 +0.15241789859856839,0.2953455736605998,36.18646373706774,11.612171559536556 +0.14844049909993584,0.30258804430565306,30.97306861845997,10.45337731478702 +0.15006284545367687,0.2990285039629638,29.400332683108502,9.636277341383055 +0.15129994488283904,0.29998980344880277,34.237309081560056,11.46359669364862 +0.15005264435754795,0.30062863371559045,31.61466327619749,10.559082117870673 +0.15024754972477425,0.30030026054633113,32.054646690677544,10.655393177813204 +0.15021336810774263,0.3059942470506242,29.848313072677122,10.498861432951504 +0.150977788992247,0.3031512154606973,28.890888415105067,9.904537632021311 +0.15183313255154154,0.29760092713630426,30.716496430606597,10.10166671939118 +0.1504110456161813,0.2924581016692708,29.821792386951802,9.185716410898426 +0.14858563010802447,0.30796294872662205,23.49419781132876,8.368653603801045 +0.15005840654190203,0.3015090160072002,31.222287161734936,10.477120861652606 +0.14918978379704492,0.30273918976841335,28.828253659792892,9.799401910126678 +0.14976149319308787,0.3042193628572581,26.43371261111924,9.08460512344191 +0.14710670439099674,0.30250540222439565,30.97926814092399,10.38162431311321 +0.1516372291580266,0.30484401069199685,28.264801864300328,9.882052774173982 +0.15024443218753772,0.30514390856316714,32.00029563447177,11.164388620085603 +0.14842279777590653,0.29903168956166476,30.65434022339509,9.934407879512179 +0.14992842764792497,0.30015429946528854,32.937217596478625,10.980411186822003 +0.14931957208250202,0.30503012793166023,33.38464391262266,11.578901509022394 +0.14810711805608992,0.30409928874919084,28.63256498242467,9.779010328625377 +0.1501040369661922,0.3087308018329468,29.50880900080927,10.699831713647466 +0.15187583287734058,0.301436079952307,36.06549836433489,12.27252118924845 +0.1472950004741637,0.29765935520042774,36.68763045813521,11.682994082634181 +0.15054572994455756,0.3041182509597554,28.42389463372921,9.831678742643463 +0.15037367338738172,0.29442919068479906,27.25108319359063,8.530974604721157 +0.15088347389913434,0.3040002482656745,28.85633748593484,10.045572806511872 +0.15031725840817742,0.29850062957490725,30.335113745144767,9.85790705315956 +0.1500895655985786,0.30499386406794765,28.674507380613743,9.973386481855508 +0.14898864128800937,0.29174418309267347,26.553143210754428,8.060604389305993 +0.15024520803189936,0.3060389078992302,25.802497694737628,9.081244787834347 +0.15114815372683482,0.29178808656237354,34.46514186386355,10.627957080207684 +0.15055425927648716,0.29351751503904877,34.66079097159373,10.815481486469102 +0.1475919599292886,0.3096583092425613,30.771850105804724,11.012299268394788 +0.15112607541470477,0.30229513480081227,33.545646821558925,11.468737570031251 +0.1489602683076575,0.2992348894874152,36.48016659058428,11.819829516152165 +0.1500783569864268,0.3005407377756637,31.400847368125,10.449708904810512 +0.14887161196511686,0.3054017542434593,33.07833881399068,11.476175229037233 +0.1500824071931335,0.3032980639410305,28.38362669683266,9.662329994401198 +0.1507747151799427,0.2995097756829107,30.318056866097816,10.006105616158987 +0.15013186046990099,0.30340043410991824,22.044989788310637,7.5516106174054904 +0.14736443033320748,0.30276727349594806,30.059463379812644,10.068394447238738 +0.15034648595443936,0.29592758412430403,25.732618999645283,8.200143205588606 +0.15143625735135105,0.30352773041293846,32.45925729704859,11.241606249247146 +0.14763112208486298,0.30262161765777934,32.80534995440052,11.026054688978697 +0.14697993022284828,0.2991442743730576,27.32065675082318,8.81130769976259 +0.15038412726328262,0.2979575880968836,30.81998852204656,10.02606288574631 +0.14917748387343258,0.30114780536225055,31.00924136667265,10.3279736419106 +0.14833020214733048,0.29788065201054575,28.976343588554922,9.291433599085668 +0.14744686115806477,0.3018605693883467,26.409855615042645,8.740532600169475 +0.15163432486121547,0.3018665167643657,31.489897954344134,10.716904073607125 +0.15056794978923452,0.29811089566870835,34.8922774660059,11.324902860873596 +0.14952558077306027,0.30290005986087826,29.32094118969261,9.934533216659197 +0.14967166825675776,0.3042286436261707,30.304435669131312,10.43049967468529 +0.14922910213866605,0.30072301245577227,36.550645046061916,12.149594814252403 +0.14883622485537695,0.29995594657131336,32.464940336170066,10.675790055347568 +0.15086535081063543,0.2943740920726484,31.737821218816592,9.981316873675087 +0.14944684415213688,0.301472219976935,23.725642142941595,7.9648064721225005 +0.1486924403021516,0.3032135686511745,27.989046400611233,9.529383186158102 +0.14934101333818864,0.3046984418127398,30.968612030474453,10.73797796316355 +0.1526615967072547,0.2961613465393479,38.583915617323804,12.501097194468944 +0.1496030334691639,0.3068391860388616,29.21663013109385,10.302812971259222 +0.14829822720071317,0.2965188148916003,30.273086486896133,9.642994520148386 +0.15145484611521406,0.29946417209492554,29.199617782408012,9.69092905768839 +0.15038426902483948,0.2976762790246592,34.57390088715837,11.218834018832593 +0.15061570827463214,0.2946970359547593,28.74873981968714,9.123872360015703 +0.14842029844985835,0.2981188356810185,35.39437561439172,11.400321555131368 +0.14948447304444823,0.2903791626055825,23.935228132926355,7.178595645038508 +0.15053621252782468,0.2985547383606632,30.142439524779167,9.938090553190921 +0.1484192751608765,0.294205286973151,29.701488510246097,9.166979853228057 +0.1488423842870384,0.3040728978485254,31.657061251967896,10.775994501198669 +0.14876666631748436,0.29341498641976416,24.21117534255397,7.396539436923691 +0.15059890754231617,0.30225284925027457,26.592527447572003,9.055552159271585 +0.1497023661111011,0.30095002886190597,30.898791241251832,10.315881820593214 +0.15139632445252843,0.3018957360350153,30.571618037024788,10.40699668039149 +0.1497741026850853,0.296192647495289,31.998372882448802,10.165588371784068 +0.15121027817856092,0.30276573631553266,24.719615945934816,8.494617130936504 +0.1504612482049946,0.3024047985646427,24.04616950760311,8.199566612170614 +0.14901422967782407,0.3029981547440798,29.018734014554468,9.867685470804004 +0.14929382405399885,0.3027527204287797,34.63124782895191,11.735324006920541 +0.14859959511382925,0.29987954699092784,31.965532281299524,10.450328047777441 +0.1507123407760944,0.2965442692539055,27.25351713435549,8.765655337978 +0.15061787870144314,0.30001242254006555,24.625261632617804,8.212106336674728 +0.14869042318142658,0.30313178854800965,27.34424358689166,9.313848403751008 +0.14995701064364939,0.3016435670506769,26.228468252807875,8.818234669685223 +0.15057715660546558,0.30166233007565907,29.616562960629075,10.086897944495645 +0.14898381283738243,0.3001513234119247,31.122657867243166,10.193004231173829 +0.14751921301544546,0.30085848510752655,29.45937407326413,9.747153259425923 +0.14805740693901312,0.3042844621084076,32.35806622079182,11.05693688268902 +0.1492978966368991,0.30621744721234156,28.106837318799332,9.833287434778535 +0.15026990857995193,0.29824490045710433,27.536957445790623,9.00677628426733 +0.15130556940790504,0.2898321977226333,34.230504637292974,10.31071970424607 +0.15056077533458948,0.3000385857944367,31.50910838340417,10.496010023957385 +0.14689632558588017,0.3021748398051718,28.119434228736978,9.346828786956694 +0.1495239046763199,0.3002144803378804,31.103944690015897,10.335316125464564 +0.14866174109032046,0.30072316893474293,33.16052246291774,10.953567143154654 +0.1509676545561624,0.2989264991271055,29.592923105568595,9.792705189456873 +0.15091608827097097,0.30210964476539676,29.546603651723906,10.1029386951781 +0.14948773123929954,0.30008503385533086,32.54221333336309,10.79743627504119 +0.14978320313201457,0.29063855708461717,32.40535703761503,9.724696042642625 +0.14850565344692662,0.3059250937837985,29.38480566374315,10.161202271496405 +0.1510610636263801,0.29878855701839774,31.36931434954963,10.331802059715496 +0.15108880471839312,0.30074905169248645,33.67882090604154,11.3544659592462 +0.14971464856440642,0.30033359742344934,25.78540605689962,8.543811940657509 +0.15000734184206635,0.30520289451598925,35.02846846492514,12.191050179813658 +0.14917133192260076,0.29857785815109666,28.255349243410237,9.111967750914951 +0.1497633312230556,0.29825509371409065,31.423318804953166,10.177610149277102 +0.1474781306542059,0.30859091191346744,27.151656863403446,9.619581664077087 +0.15007923736673015,0.30092108136955714,31.32023464708737,10.490634898918474 +0.15210174626980896,0.30121892598394223,27.467053684389565,9.336478452711644 +0.14950162748928805,0.29948022118959433,28.95217812708163,9.525253108493066 +0.14860190480106442,0.30574942233828184,27.3635493330965,9.465123130986855 +0.1484033834850222,0.2974273607560903,27.8465556810614,8.876416956474003 +0.15030743286959977,0.29776062131677455,35.41894228133557,11.449320469790454 +0.1493857031939053,0.30529275652659005,33.85061980169296,11.799809688247446 +0.15056522534420938,0.29423885173469555,20.4061866706715,6.442529089979428 +0.1496502244747218,0.30063171980512265,30.27893979271538,10.06178628483616 +0.14974754507551713,0.29932904007932354,29.92070963197893,9.823498675150564 +0.150176642328073,0.30471235030117544,28.784610769653064,10.066782161874022 +0.14838842748828587,0.305528603814064,25.346153938250858,8.778104524625592 +0.1511385422527532,0.30575699045323673,28.18790613137957,10.004946119029565 +0.15156883548579528,0.30434990175830245,24.307817641966672,8.471457510520171 +0.15063904487837296,0.3028891818693188,30.010062424868178,10.28979966241607 +0.1498296466945018,0.3047690529871518,36.02148989120478,12.4915754339683 +0.1485024283807383,0.30384259052430884,26.44060766605961,8.980669396800101 +0.14769319511339865,0.2967547222446457,28.505135830986713,8.995520239163834 +0.14937106034385644,0.2981341352496086,31.300896578489787,10.195981978409277 +0.1510799574976736,0.2979039325741071,32.32026100030609,10.565480815261978 +0.1505444737510929,0.29865751482945824,31.815307127132577,10.435142956670347 +0.1477035230691269,0.30350857887771143,32.09157982676877,10.830877686416041 +0.15094490302926694,0.29572304358739526,27.570727876509054,8.791837836955315 +0.1497127244974088,0.29982778192206366,34.87604252866591,11.520465006087234 +0.14872853052427518,0.3081125296020819,28.135071763552787,10.079511617316031 +0.15095702922989288,0.29813652532973517,41.90662928283387,13.659813351678073 +0.14914064173173897,0.30823902882862614,34.87664842325537,12.443083929427672 +0.14941410137260297,0.30520188406157045,33.817120262075846,11.732695805087461 +0.15010314584386433,0.3044555922757267,26.74318677240506,9.220189043920044 +0.15193379266306706,0.2989389583614642,32.497930603126875,10.789845297574233 +0.14889298542148374,0.30186966626774686,31.90019852871584,10.640252199697843 +0.15113798640491885,0.29597545557071014,31.179835088288694,9.986181751656352 +0.14956105368336237,0.29184883366412295,23.39414209781873,7.145592191049254 +0.14869873401367248,0.2991027497078632,27.93189685163424,9.092363103578244 +0.14995692750090733,0.2967164751845955,30.519284275282867,9.73387103401675 +0.14931912679002265,0.3021304171274075,30.49075621720164,10.290515515519534 +0.1498527364480125,0.3054207674106911,20.542870238903213,7.16125034506927 +0.15021630026492885,0.2934898502763073,27.860068534238664,8.627087272008225 +0.15077400818363815,0.2951906391772996,25.132388635655204,7.942860511349548 +0.1510555955684775,0.2975904528606819,38.849984744662706,12.595153374876448 +0.15025135325640127,0.29632694273817844,32.67323340894848,10.439536349377098 +0.15042801613987383,0.30183293960592694,25.90950667582245,8.766041025138097 +0.14793055451319442,0.3040863727600646,31.825812614968683,10.780476316731464 +0.15154189206577365,0.29911811927434107,29.11174487254573,9.689740404294053 +0.14999861955820196,0.30311274579266806,34.318716465685256,11.71882934150541 +0.15033892986813954,0.3028504714430225,23.452304483414544,7.9882943090238285 +0.14902371258910163,0.2945654670423399,25.136389932243745,7.791813888345468 +0.15147894706200019,0.28791829452899526,30.37461000719967,8.95957478724769 +0.1492867741248367,0.28843169727682527,29.682713173662464,8.757405206676955 +0.15106549522389137,0.2978617170731287,31.854053753897396,10.337171415966418 +0.148531720345562,0.3067434880617907,41.20963341131617,14.44349349652321 +0.1489788094669434,0.30465203247593825,30.857383638498042,10.665529181550694 +0.15038515221413853,0.3018322691184811,28.803490727395797,9.711943420544303 +0.1504974617745137,0.30624145628996025,28.041534386670836,9.91116666428447 +0.1507577178485505,0.3006375362694962,32.010918819541715,10.718292965118264 +0.1501177437185653,0.30684556454540296,32.13912452893557,11.319470420634433 +0.15017047876431402,0.3079641106639827,31.37021892240959,11.195432350470156 +0.14834398742747132,0.2989634082338377,33.52603565884525,10.854872091072748 +0.15023745156542534,0.2944064468845404,31.69058348352274,9.962756539533675 +0.1491157701192888,0.30275602539772056,28.14244107841479,9.554416311161827 +0.1503758468792976,0.306209915519742,31.21676149762719,11.004203732148522 +0.1486436355063401,0.2989723058239245,31.92597105819175,10.408284139350538 +0.15086621078367796,0.29628911425525906,27.75931010463462,8.935466442817654 +0.15147614965477685,0.2955895261322013,26.93092783989931,8.584455959076601 +0.14911645292352924,0.2932898686853384,33.39508362988866,10.303340704258723 +0.1496364404516829,0.29059502103527374,29.641098571670216,8.952760091309923 +0.147027880469636,0.30426296136518277,29.801032148954743,10.049430990299074 +0.14891394772524785,0.2993645993549251,32.90339619825229,10.714566765728428 +0.15093476827313276,0.30105413098270045,29.599066125930907,9.933562782586959 +0.14987255683066023,0.29915994953656205,32.266097215902526,10.608919263769295 +0.14958996541149946,0.2937147750508535,30.89607940326249,9.565032040499025 +0.14908015764903865,0.3123194112796737,26.241019155018165,9.742891505599353 +0.15061641045358817,0.3018475100855154,33.593009803779495,11.446832946311023 +0.14955235387118204,0.2979489338832176,33.753228185209785,10.88724653210664 +0.15069185865854257,0.2972239429026966,27.038760519893163,8.669531267710287 +0.15201113616355771,0.3020737955276874,32.47770706277574,11.152282823725312 +0.14984943080534283,0.3024527317174001,29.04332043492169,9.809413488297954 +0.15074713395667957,0.3047980584891643,33.1377280170321,11.600436522166875 +0.1495353546912578,0.29639332010638203,36.29265597820508,11.593974081361084 +0.15003240893680975,0.29528280025050624,37.542827427435505,11.812480728264276 +0.14972956807196575,0.30196324690690896,35.10289201996529,11.833278042288827 +0.14828873957124014,0.29609750304904686,32.39848631402207,10.257902456148958 +0.14865330300456137,0.2967246627381232,33.16465779687901,10.497824471048437 +0.14966155024437983,0.29509791935006924,31.78234682567392,10.03031742578582 +0.14986962017335587,0.306445224168253,33.23556732277841,11.696795324115964 +0.15248603682877335,0.2958177335131541,29.6471976145796,9.65473484414891 +0.1509516927299662,0.2999398802331043,28.134374769302642,9.352455972118888 +0.150601172316588,0.2982589373643165,29.379068581697133,9.58293309791269 +0.1486354299821071,0.29619895559445897,28.488409925071366,9.035590230178444 +0.1498139001266759,0.30534561297644186,30.25924493191094,10.521001492012033 +0.15133382519341687,0.2949798505339,34.30215787554859,10.876184008478875 +0.15066446991281843,0.29747496894532827,30.49016302762538,9.866065044035206 +0.1499595285592916,0.2989798272322519,33.867723782272066,11.133908715551929 +0.15200939424137963,0.3007485357947868,32.73792765751691,11.016623339398691 +0.14889693230485843,0.30140840817214776,24.471058131876163,8.169232797372462 +0.1508982764902275,0.30475751712732163,29.89548201011301,10.418827109022752 +0.14783928150981948,0.2921040297645299,24.87025387254415,7.483716791744612 +0.14907567334800537,0.302350358511202,34.38013228970431,11.623025731288394 +0.15133844571039054,0.3008619062794803,29.89305346142908,10.10617276011796 +0.14929314296257,0.2968827993422997,35.35026807115244,11.282653458928486 +0.14813596120952782,0.2979922806167811,35.20472358467265,11.279985719170408 +0.15005390479111397,0.2965385417849527,24.62148847964554,7.918866765943692 +0.15068343689947436,0.3044086232805141,34.744846500123,12.124180680847747 +0.1498513410007534,0.29322079190506695,28.09204780253396,8.662976425568651 +0.14745575673690478,0.31268775255476083,32.92224265913776,12.166210664401307 +0.1513479919656076,0.30043985217740765,27.662236763321044,9.264113064409889 +0.15143383298654425,0.3009504299764782,30.79719270409832,10.41018096105287 +0.14876699646244088,0.30676889974576954,33.754950604783296,11.83287839513116 +0.1516315811165425,0.3016680131830352,31.39564100369263,10.710912863562335 +0.1490057003780634,0.3092700239095858,35.10942011194418,12.66482129049237 +0.15060835957084753,0.2979620432300075,33.6640250542346,10.974764350232665 +0.14892611356338223,0.300768253764401,31.313351850261267,10.385692240101458 +0.1517325902101329,0.3015768966548038,31.252762608041966,10.644124808841818 +0.14884705060460707,0.2978934468933973,37.756639950645706,12.168881111564541 +0.15002329828815494,0.30105364031056925,27.64832525576019,9.259015863430092 +0.14756071409743723,0.29774179180400445,38.86831832991771,12.417341302544871 +0.14866113293925226,0.30424783785102477,21.628239665556592,7.414595009507637 +0.149400426143059,0.3040905756639259,33.91351360878527,11.654908629576997 +0.1484964148667106,0.2943864542273601,31.08431468823938,9.667774154836364 +0.1496063480702611,0.306803415290516,30.442656829151456,10.778234442035632 +0.14914052386412308,0.2923920067119457,32.403306224552395,9.890620346908236 +0.14850321473480638,0.30347532399569677,30.486372016562964,10.332742012049552 +0.14867682243197294,0.30595780866447514,29.54352445003212,10.290888512884337 +0.15024416171172378,0.2959528883389809,31.081633335298164,9.857284245961031 +0.14892024001791684,0.3010605646336227,33.31348781538232,11.065809169638026 +0.1526789236522256,0.3003791188758125,30.547419987587833,10.349329541461284 +0.14966565515219457,0.30702092254817775,26.112026351908668,9.262508978424657 +0.15036091753305236,0.3011573498364422,29.26060023961026,9.923449418619397 +0.1475328752047374,0.2912418866814865,38.61806249080919,11.527317142768783 +0.1500385690491146,0.2930459082665301,28.96228481600575,8.899493768954494 +0.14938656387008437,0.29898999766249434,33.710406901571304,11.008120739629298 +0.14855194857906362,0.29626334714779945,33.435679613472644,10.554715355849323 +0.1486377711383267,0.29905412515417934,29.921955582476514,9.747913889923602 +0.15131163553991003,0.301785710532218,27.521733771244286,9.380494334003952 +0.15104825117308043,0.2945770096690725,33.24877956806304,10.558381377976941 +0.15021611329003545,0.2969820390474484,30.830758987707362,9.9038570870767 +0.14859218863394177,0.30111412817146593,34.85228672650996,11.503795709903258 +0.15104633031587195,0.30207148317130444,35.42090060762947,12.055750280215952 +0.14968425294319265,0.30736591900426624,30.825869046453438,10.972581651714485 +0.1500201333471858,0.29593611067626774,26.486957482682417,8.467113545647635 +0.15102157410792352,0.30046635290433393,31.284865856274017,10.440594791642908 +0.14919875005967556,0.28825147171016213,35.513428430710846,10.391810464731298 +0.15225057274401743,0.3033207532145998,32.16361078535137,11.122859298684405 +0.147694711318148,0.3048778391845451,30.991128315444556,10.646324423625675 +0.15100001033873028,0.2906515323694613,32.61487495095011,9.948636886988593 +0.15034935509772523,0.3003623073179973,30.919449246039886,10.296953095023298 +0.15114712549994277,0.3108131566849106,29.691626122926913,11.066118974691303 +0.15066687761599692,0.297585400726578,30.163695700101986,9.744450602571586 +0.1499451895341623,0.30753857395005635,27.985679103816473,10.00538037576907 +0.15142994375269495,0.305965022216757,26.99268991865117,9.532812546087971 +0.1505154309125753,0.29720735831532324,34.120974249215294,11.024984573327362 +0.14925362239430248,0.30320294760359084,28.403725103024968,9.63765860370307 +0.14790559757825153,0.2986773223720424,37.88549593673652,12.222720380731182 +0.14950177127760841,0.30476630482615624,32.459896616309855,11.288507331747471 +0.15050035787656818,0.2954690220626269,26.81885631832578,8.570378798618712 +0.1518875245524575,0.2938740074520695,28.296241974347275,8.937943368511764 +0.15095157301693407,0.2986984145480129,29.458488936940096,9.711815386825974 +0.14967651191384718,0.30571073308834873,25.763663168961983,9.008668238682874 +0.1517356853088471,0.3022296333376397,21.067432776428063,7.207643039187311 +0.14933303617411167,0.3019478557598254,35.23142692469331,11.865048754461524 +0.15128662753621003,0.30352331284716405,30.94328482466505,10.745606940453609 +0.14899521264575968,0.30250098992452273,25.540784681838275,8.654278811324899 +0.15216498888677782,0.298400071527448,33.80849295120059,11.27515587275705 +0.15116088482321902,0.29587134115652686,32.11892223928817,10.299166096963441 +0.1512954111236403,0.29721931148611314,35.7571963374887,11.544162927649978 +0.14900347427345392,0.29942051996758723,30.204537451615803,9.822656820012886 +0.14990983092292853,0.3028075573691384,24.241504190223566,8.250518445528655 +0.15135986482486394,0.3029332745164925,39.52872108187138,13.585858492617241 +0.15042756489865045,0.29820321118647114,27.2973369873048,8.93536700512366 +0.15032523596308323,0.30215505233666357,32.484388649827885,10.946395806503599 +0.1495341285889984,0.2953633100367463,30.8122123132379,9.7388391537973 +0.1497027275997581,0.2929339924658949,27.261116389756086,8.399479046770693 +0.15111975644882808,0.2960802837473879,31.435329371780703,10.134146308350891 +0.15108088053241245,0.29720549745917113,29.915650816074397,9.707651472927314 +0.15137742630147097,0.3045550849613984,29.645213725760748,10.405598410809006 +0.15058669315261605,0.3074079823435643,30.96856506454106,11.065409866090807 +0.15139277705663012,0.30079136307653137,28.449521720971802,9.595149172049206 +0.14904416344803467,0.30540633760012414,28.17955097641573,9.776509834884653 +0.1483234746211784,0.2981721712404344,26.605183165732406,8.626057431608004 +0.1495791400421314,0.2949781256311675,34.0320749388703,10.739013575765988 +0.15105785228065638,0.30103745743693344,28.216571945601196,9.528867846298487 +0.1496451198515781,0.30340364424066174,30.470266969080043,10.471269098037697 +0.1496350830757834,0.2946919415936463,31.629717111183766,9.912779976532434 +0.1500973201246035,0.3017557188937894,28.73559312351281,9.632477537550406 +0.1517140166821574,0.29969840293501954,25.39010651932489,8.508112420148114 +0.15092186593265286,0.2976860264898121,34.229824384156295,11.155078727350393 +0.15171104818027298,0.2968287315398702,32.359279520751045,10.491698855686199 +0.14903762177538651,0.28660731929739425,37.18749445206692,10.669049928401865 +0.14919425112590068,0.3043827485531474,27.707641216395075,9.521010834025883 +0.15052137709030916,0.3007353088062307,27.92845310714174,9.308095275222351 +0.15037027493139934,0.2938112793792112,29.528911072783824,9.191160241967621 +0.14900938890978385,0.3004379586191235,32.952653533516184,10.954918309211678 +0.15020304095740417,0.3013010222127743,30.3624649378055,10.151260849023762 +0.15029413181847814,0.29988995468765495,21.803540007513732,7.2058040251558255 +0.15091212341638396,0.2994838823148906,34.07255576382622,11.35710864774199 +0.1501450573043919,0.3044616738085073,32.424173154330695,11.285571359008625 +0.15006098542641516,0.2921775603115543,32.90784379969928,10.03170270791135 +0.1497290832193732,0.3042614942098094,24.546688321137022,8.459227859421897 +0.15107676706778977,0.3026185889495377,24.439431878606946,8.39133778278312 +0.1491179984985929,0.29846770175029314,34.80978944056957,11.31980128958988 +0.14911935325714581,0.30400009714258147,29.232441840616925,10.033255734840553 +0.14930287865230873,0.30064612913957645,26.226601357775834,8.726463412734041 +0.14983121372356484,0.29993231413202415,35.83656744817248,11.890337723297675 +0.14919053899627654,0.3108527121655232,29.210498659517356,10.703553044896431 +0.14949658909761324,0.29886887015979446,32.48377604081301,10.600511276983271 +0.14964669362977298,0.2997944045028376,39.08623179639169,12.87156447787363 +0.1488975043092358,0.3097350701335145,29.155874963247825,10.549315096189261 +0.1518260962969777,0.2975291761171754,38.28841339225859,12.479870700378484 +0.14973976105491346,0.2967518858021264,34.853679951718135,11.16001692336541 +0.14894303540829373,0.2939096002875871,30.43732315761615,9.414787369906993 +0.15043085126732866,0.2993480677666867,33.09315292283303,10.868402347096172 +0.1490973552938733,0.296728194571988,33.33457801059657,10.655172916451008 +0.1482047104902539,0.2988691892828034,35.14865120309461,11.324036464556894 +0.15093305574206697,0.29611981156706024,31.80011663530029,10.196824360833546 +0.1494306594973502,0.30480871418843924,30.55491421732481,10.624806804794925 +0.15033980613735276,0.3004418646637459,30.659014803608464,10.253958123906225 +0.15028341270753642,0.29996525601060076,34.86924997194588,11.538124080150258 +0.14925406114078615,0.3037124384124956,30.842014763806592,10.521383822293503 +0.14949878834220506,0.30032888783955036,34.722897587304715,11.490030107761388 +0.15006296906898087,0.30369156432953837,34.055462551461616,11.746988854654496 +0.1493608172470925,0.30025502739069365,35.44142254007624,11.648826917870487 +0.15205979477833187,0.29920190624048193,30.757116463803733,10.252210707651328 +0.15018555097229083,0.29715920544078506,36.96435324791557,12.008713656825348 +0.1496059326932456,0.30444200993603093,34.634726731639724,11.893727414798349 +0.15393987515099855,0.3027254191334045,29.276313568249297,10.188045564264758 +0.148823920852141,0.29637841369448026,29.23145458925325,9.289976026693521 +0.14987823609870252,0.3066220414549402,32.89972477879181,11.711580930733373 +0.14852604047365553,0.30239796323047036,27.67210910680731,9.33336864902933 +0.14940425259588058,0.30211920476421994,28.18005348022371,9.515713459787298 +0.14818353446176097,0.3004353639800979,28.816055734004788,9.473595926016463 +0.14847470997562703,0.30029028114402173,31.67007438881051,10.411527170137521 +0.15136327549844208,0.30009219390743325,27.01961588776916,9.038442478054105 +0.15248355570626684,0.301499272419576,33.04707749096501,11.282406825106197 +0.15199760361348585,0.3031456318462413,26.450605549384488,9.155150524741584 +0.15042077808481877,0.2972116997254887,31.516993094298478,10.158602969644054 +0.14985182549516174,0.29494313934881294,32.42361332165663,10.15460830711343 +0.15003006376276273,0.3040652634127746,30.917704075643734,10.674338213355442 +0.15100806705578995,0.3027883976724576,32.198293087340105,11.062040747767856 +0.1513154159244092,0.2967723912671493,29.208721763298392,9.47561539727457 +0.1510724884759975,0.30057996958891714,28.39935595697831,9.49461536818756 +0.15039471659303968,0.3021519660273604,32.94402864842117,11.201092394962956 +0.1507043428134657,0.30027443575282325,30.504657345476957,10.185005887703207 +0.15007504274168298,0.3015630006797986,25.028393256071475,8.404317683280748 +0.14972210630372232,0.30881027925171284,28.873533938254095,10.439178224961367 +0.14995656465616677,0.2969364521972715,30.14588666279061,9.653211846836694 +0.15133380159445756,0.30172572896062283,28.155038801533713,9.518673917430363 +0.14970735764074597,0.30182122963061697,31.27022315578836,10.480761333843954 +0.14987669028579548,0.29876595213634655,33.77156902249107,11.066239933620832 +0.15066621227237553,0.2965026523069077,33.82277279630746,10.86494660042369 +0.15064444273377195,0.29846446956809086,34.68813725035511,11.424405845451437 +0.1509240754414,0.2926298380774245,31.10762981448265,9.633555128567396 +0.15015543254805233,0.3102951868016629,26.198627183730682,9.547648448295675 +0.151187887036382,0.30392602769001636,35.54158900012908,12.357404683857702 +0.15096124138461778,0.30116808667878175,27.528886872450713,9.27762581252288 +0.15074469633372353,0.30357631347616165,31.434568640306654,10.888885137740026 +0.15231728083015414,0.2950433901735654,30.49784223852318,9.772775452148615 +0.15261278857034563,0.2976769971244754,31.521346610488735,10.361597220273207 +0.1491201771452977,0.3033897092134494,25.352366174146475,8.60507361117999 +0.15117968918016764,0.297063922532459,29.650298595542957,9.639535258536151 +0.14984471178615577,0.3039418984840158,25.198007417434606,8.671031915885104 +0.15127434032431572,0.2967269953441405,30.26242415102831,9.80020777430459 +0.15057252779787725,0.2921318364077078,30.074049208303528,9.21428596990824 +0.14918391934935213,0.29247787217776766,27.72054315309689,8.436040570672082 +0.14907462628923807,0.30153932148941814,32.27860760807237,10.804137399952669 +0.15054167314435105,0.2945817195406632,27.233589007951593,8.574582546912406 +0.15205903487835912,0.2954107984478039,33.5815530184291,10.796468826096957 +0.14907184604396997,0.3028846647897951,28.153514119167276,9.570593357401277 +0.14855915814164752,0.2976866623413082,27.643788487118528,8.885300843148757 +0.14962334888610582,0.2962308774534972,28.238008908866753,8.963907909006995 +0.15034081806608715,0.2988082471690899,34.36624249805943,11.26218078745 +0.15131397181464104,0.29965878561969256,25.551394559305198,8.518828835550021 +0.14957568335056004,0.29819074549633967,32.4460635261558,10.50901252598136 +0.14941386420823394,0.3036087425515535,29.41560914135012,10.078804414703177 +0.14930908210663293,0.29904205540046913,31.46034002469062,10.319727805694665 +0.15014416150018647,0.2983216662498582,33.91817074643053,11.045831606177728 +0.14843420529325052,0.29584218639320503,26.427630420759638,8.288935143872928 +0.14935162685215703,0.30258003530406663,31.709785881067106,10.779365553312896 +0.1484003934954019,0.2957778172077712,31.239248423721946,9.808467492517146 +0.15126517499981362,0.3065223598905063,31.82135409922331,11.406286117479507 +0.1501159027936589,0.30676538788915125,31.096004531909788,11.009485622588134 +0.1502300340358268,0.30650648795697294,27.82515685495974,9.846980163415775 +0.150733083678099,0.29478925458307453,35.13115861226888,11.120631251079207 +0.15012103078327424,0.30259408318590536,31.82108630012362,10.864029911724364 +0.1495535482827588,0.3056839141080761,27.782103177203627,9.728978818072942 +0.14892485040545458,0.29468936012551117,34.597633606295666,10.790975334092131 +0.14996277874799566,0.29717205170731187,28.55278660495845,9.131355142452048 +0.1491170945405512,0.2954801486526267,30.86321737947841,9.72906827289226 +0.1504737544383924,0.29657549717619036,27.580781440857557,8.84869312686575 +0.1506268826706176,0.29945553671630337,29.948330283472895,9.9243027706091 +0.14948382025700868,0.29888876378448676,29.938674371650208,9.824021907382772 +0.1515632676058128,0.3024108173244632,32.04212660735104,11.044982849409127 +0.15030804420445695,0.30975795362533026,30.701691801681175,11.214475464366036 +0.15011097131749862,0.301567456135062,34.99205210234097,11.804452530965325 +0.1495995475207416,0.2995346286759122,29.49127606326851,9.737538504466146 +0.1489380037404065,0.3075371180379913,29.128929968151244,10.390478132436426 +0.1461371616546646,0.30017893361050646,33.12539687839055,10.708828494439661 +0.1498404465152227,0.30811031323360766,23.221254678849252,8.370715138489697 +0.1485247689715927,0.302528065397603,34.401385208341516,11.589669362671525 +0.14845342850709162,0.29634331842577005,38.41954657661079,12.115240906248179 +0.15091825458156335,0.29952979519137674,25.875348900280727,8.60908646947146 +0.14955109782407647,0.2956367489421641,29.43251611526833,9.221358620406383 +0.1501771065615232,0.293456880759401,37.90896859119581,11.821650457168007 +0.1503635018578888,0.30484194752221594,33.273665410957776,11.513016857175039 +0.149810512529218,0.30368550031556435,28.177412289786616,9.684504367002942 +0.148527868907781,0.3002801812581374,30.015811521555527,9.865075261940797 +0.14815347224927553,0.29427902862812755,29.582489361367315,9.15202012191882 +0.1485415441601237,0.3072222336327934,23.597641006242057,8.3656519933588 +0.14927068930355938,0.2951046054581521,24.06353820771672,7.531267301583464 +0.15103769218436275,0.3015965899359185,30.645307458800655,10.351115501051677 +0.14887768434369197,0.3065870789992836,29.095640008050868,10.202334159542612 +0.15073766923747908,0.301433766933661,24.515113382499344,8.292801341056801 +0.15340947646511838,0.30227038125255407,29.8181751745794,10.337843080820736 +0.1506495839907466,0.300783370070874,28.140787823005173,9.46817577300456 +0.1512376417989485,0.29983775563939147,33.57245732829386,11.201090790895941 +0.15053981882125825,0.29751989615459584,29.25003643000913,9.449101664590913 +0.15221728196702,0.3087235816482445,30.24560456569879,11.104355253736912 +0.14933414036706344,0.2984513942174392,33.998821903656996,11.05731246680475 +0.14925196503487678,0.3039332036290466,32.36084230920982,11.05954101031912 +0.1508171431271309,0.2960509621595055,35.18004165632749,11.263583596334051 +0.1514012625695033,0.3025305525863239,20.835507479840576,7.163041881983164 +0.15040320915965236,0.2938396973575154,31.610475275489456,9.850663181898154 +0.14903549572723307,0.2920007721639386,25.747566419348058,7.810978030142471 +0.14956443374274261,0.2913411127971414,32.86782977506564,9.906599480362251 +0.1505874978435055,0.29978848402518365,28.010683407739158,9.316856019325835 +0.15010684600470395,0.2906780064911754,32.635711786596495,9.839350799436527 +0.14865150166713487,0.310147401093875,29.650146103310405,10.690635175163155 +0.15068683388723486,0.2966218117647218,32.72433430090361,10.486190016159235 +0.14939332647676357,0.29670510164521424,28.834027409304156,9.2174046236861 +0.15147545989811723,0.2956011731907298,28.01110245698955,8.98287545028052 +0.15007989923997067,0.30707357370461635,30.999336454628207,10.978922669434603 +0.14968885836801518,0.2983704404171525,29.774092460635142,9.698236943256742 +0.15105738333145605,0.3027371807164543,32.88381563979346,11.27352169644442 +0.1504482853811945,0.3076565354312947,28.565851171996716,10.19422806858283 +0.14940886740933051,0.3045242555096369,34.810683242030144,12.017463932904382 +0.14951476317830154,0.29722996628883486,35.77505804186834,11.503950325058447 +0.14974142129556475,0.31236033841830235,25.127267981652512,9.292416444331025 +0.1514741554422508,0.30193224924474,28.06663221585369,9.60363480807595 +0.14884541716622232,0.3002726634428214,31.003341562012054,10.222929233023898 +0.15008731819245644,0.3046886525892817,27.540694959026613,9.55466465059206 +0.15035192037690884,0.2973916158113025,30.292086876375066,9.821702126469011 +0.15007624961232682,0.295181472678694,31.67276697671139,9.954465393918783 +0.14943236130265353,0.302520465909543,28.964405728326426,9.859260910331562 +0.15096069803315135,0.3122985581187566,22.997293452177516,8.64166803339203 +0.149905934199855,0.29796058964846933,29.83516937671395,9.69934831511868 +0.15206562676466753,0.29987396453434845,30.756572071565948,10.352713098352725 +0.15181482660968426,0.2954205969277141,33.674906128238696,10.819049050552058 +0.15066022642385013,0.29809668059152167,32.23285459912112,10.523908461745721 +0.14872420820316457,0.295677014828812,35.28447902022936,11.058509779922593 +0.14919267630002434,0.3079929253310883,27.301499075719914,9.72982278319373 +0.151195740484313,0.29828017460936185,31.90239306021451,10.508921132838367 +0.14847051818328738,0.2959028040123085,32.54816143769567,10.19319127713054 +0.14891540096107067,0.30301189131472295,28.39883225788003,9.676500568756666 +0.14856067853097182,0.29866720792816903,34.483110597998305,11.19132741859297 +0.15099640109158308,0.3013257346369828,32.43162926033125,10.947577794737045 +0.14992386548862122,0.2973825213488473,26.039516772577166,8.337966411987656 +0.14979567699585092,0.3007711814565209,22.178515588978303,7.377255834725323 +0.1488834595412765,0.2967296213854131,32.237864863043065,10.251718975290927 +0.15105080210916697,0.3078235919147671,29.010719602377964,10.497214447027353 +0.14962052607059487,0.29887597461329063,35.532733029664605,11.51818092712987 +0.15051176468864985,0.3008317780945194,34.087530306342984,11.45422501795107 +0.1496638410538255,0.29739106329268156,30.497409646600982,9.893251282421687 +0.1475283190098092,0.30001262416344165,25.889311270080093,8.414107776792289 +0.15141939138396118,0.30346333934903325,28.568445480728503,9.89671852602635 +0.14953579991479152,0.3054416156843027,19.62948447266443,6.836154309855296 +0.15160925473286974,0.3023545137651828,31.677690790499565,10.899448428621973 +0.15170259489562538,0.3056002152221959,32.20742536978436,11.43153218458201 +0.15029126855475228,0.3018769883595856,34.008303724772475,11.512195015153056 +0.14875397098944085,0.297915996598035,28.521959588948153,9.211149379174298 +0.15022581388341094,0.2972302384595297,31.89538545145334,10.301146079781304 +0.1518343877468685,0.2995550930844325,34.45993343964761,11.534108191580327 +0.1504985210036231,0.30852764177166064,30.67564751794201,11.120825946639169 +0.14718803997714522,0.3013294637723279,33.31960179586998,11.02063408504256 +0.15136290375834152,0.30340779914978555,32.71855708531034,11.312251548344655 +0.15041896033364155,0.30370343616700973,27.497926852813684,9.474610345812014 +0.1501266869264382,0.29923367166592735,29.981285892846213,9.876816944419174 +0.150504650882017,0.302961379053167,30.31010623939813,10.377305125459655 +0.14904380219696375,0.29962239684420006,29.401414231678654,9.634073011175083 +0.14984238689970963,0.29548506585853157,35.42920295184827,11.200533253125592 +0.1495299289710056,0.3042044842718961,35.473885641967925,12.20125939568891 +0.1509853238099516,0.2992233647088931,33.63135876908111,11.098272715970781 +0.149699528339886,0.30033334362869946,27.800949494704888,9.18081840186161 +0.15195169486875026,0.29759968872265463,27.29560128531306,8.960661191413271 +0.14846568665068594,0.2971448638182939,25.05884725507444,7.999762288754454 +0.14969925191152958,0.29560660830042723,31.831185898923472,10.172847405611444 +0.15092000924039667,0.3058486589859063,32.41285369264857,11.473198295499948 +0.15117333748727002,0.299903491643092,26.880660460927004,8.933877083316148 +0.1500115098337956,0.2954244669706926,28.405340777371308,8.990188906338961 +0.1507038370900229,0.2999608310203366,25.956220028865225,8.619141542627144 +0.15000729172305646,0.2985834165615822,31.76886949724714,10.394573558387023 +0.15008371182533833,0.304759449519094,32.404221506053375,11.286860365641454 +0.14954647040832605,0.29193265475580726,32.180279621011366,9.800569548909865 +0.15026352713039168,0.30667054864627613,32.563500703799775,11.567457976025736 +0.1512197796864721,0.2978932626815887,32.28903622368725,10.577577702107725 +0.15238247548005923,0.299727798873198,30.020973312479917,10.085291318219184 +0.14963471274357273,0.30833490631991184,31.763680628541575,11.399222356347066 +0.15069096267976723,0.29555559725305225,21.945145281526106,6.999783217315004 +0.14906332119602608,0.30078907541737004,31.82857201780256,10.53608151630675 +0.15096897077479235,0.3061998790380042,33.725308133346694,11.883238164180336 +0.15303905981895968,0.29652596958464833,26.763467153734265,8.765633790462555 +0.1478600663223602,0.2983808573383068,33.48915353562495,10.775677750584816 +0.14935287474535486,0.30778356482222485,29.78557936862807,10.604893054996161 +0.15030597013935515,0.297368154159861,29.634432661699464,9.559298425641812 +0.15014882924433626,0.29793900652451377,32.10173908971657,10.455855136243636 +0.15029126155730482,0.29499503179725545,32.36240420224954,10.21511932852995 +0.1493695735451285,0.29456297925207664,25.26744910964684,7.853210368946722 +0.1506264799985951,0.3004012712167485,30.984337748161245,10.380640499437291 +0.1504959960745103,0.2985506096318322,30.701727969817608,9.99587664425099 +0.14730420545928904,0.3054293425249275,21.498694617507013,7.3931630438348765 +0.15011991927676532,0.2917606772406839,31.871302363247022,9.698514560408283 +0.15049152874605512,0.2998635834152635,28.939804453484097,9.60875685738399 +0.14861715853069818,0.29377150168966115,33.88056885263483,10.484055433097371 +0.14954170603195424,0.29958826700348123,34.26125126580131,11.266765295293034 +0.15028540137036217,0.29957248149268023,36.31808622681673,11.98250341076789 +0.14980149075370627,0.2982014204622819,29.943244965357902,9.67781938523417 +0.14974101220961694,0.3007720743652712,31.87129192687078,10.630076291671175 +0.15043448161946263,0.29911860754168434,31.682542497939846,10.367434946230235 +0.14965365927148866,0.3064274278270651,26.481989849436903,9.356588330705788 +0.14916242581306716,0.30284602153686674,31.814429648367987,10.836784700722232 +0.14840511580669916,0.2966374439664789,27.72986329394353,8.799276236294478 +0.15066665111234054,0.3035633042806067,32.87731108273644,11.331720676715786 +0.1499988547439509,0.29375838860089315,37.73029297237324,11.705213345516691 +0.1503946768808426,0.303027305948094,29.556884163357076,10.101801134219794 +0.15033336328330446,0.28712042826616097,29.716418208527145,8.64581471342467 +0.1499164639143507,0.3076644812970313,32.80319812415531,11.709399981196864 +0.1494875838175278,0.2982945145400079,22.9859717335433,7.475518835242214 +0.14834483880313576,0.3041760036664769,33.42119127948036,11.399047511107959 +0.1495707537962058,0.2976638855266377,28.08836454516386,9.050376525600512 +0.15105016406805605,0.2935114807535733,35.43199709641456,11.086920087173864 +0.14964186997612972,0.29677675073120896,34.00123824114151,10.877933731766037 +0.15004654409814153,0.290443587333257,29.793474865237595,8.979665820895963 +0.14987645049698783,0.3035345959006752,29.808577046027487,10.17054853869589 +0.15042934365167723,0.30142370738832797,39.976397530094786,13.42119402116996 +0.15165518319027266,0.29876929702375304,31.975515652581407,10.592778032707871 +0.1484127397037552,0.29804497549077325,28.792305511977894,9.220972500236284 +0.1513425003292779,0.2952631576344503,28.8979471336642,9.271742967769683 +0.1523495143231631,0.29269848264865816,37.98575401231982,11.85860090783325 +0.14823832975520698,0.2945966802602164,29.01959759382838,9.039989711102104 +0.15008833608400537,0.3065103556252731,25.464078710841417,8.93603369783883 +0.14934975588118252,0.3023978391848593,39.753869781398514,13.428670244510142 +0.14954780991863534,0.3038794416198502,26.457671084031077,9.108902820086826 +0.15021074147750382,0.2961490991789463,31.797238023379204,10.16003922418946 +0.15150800144780566,0.30510130821426296,23.320998384663305,8.189843909502367 +0.14972060151039338,0.305334552387785,31.08238777574914,10.825131286613994 +0.15071350718856238,0.2956339529582213,27.91910441878462,8.915701397303552 +0.14776207428935823,0.30376010941986387,38.50080070979914,13.01534503532434 +0.15021858676240835,0.2995165761693487,29.994361106315086,9.922274880468667 +0.1499842563313311,0.30457434082795765,29.960509895617236,10.353678260894942 +0.15158037569352312,0.3025840503227385,23.132742678746716,7.97613992075369 +0.1486824228909639,0.3068064689316353,23.736287842289165,8.287659076765763 +0.15089448642168105,0.29843970677396375,31.65316319904052,10.370024134291691 +0.15059994197774715,0.29948226295030317,27.41278032311454,9.070320486661851 +0.1495451723666315,0.293580115948483,31.522491875118227,9.77092998648504 +0.14905393495525013,0.30064066694401764,28.403398476387025,9.408616695095459 +0.14956962527673787,0.29372033511292045,31.47469096913138,9.749553360024645 +0.15152768132541225,0.29113162239141893,31.78687483032784,9.719632719084078 +0.14992172772480417,0.30500415591407054,26.73841147498423,9.324908945459596 +0.15007908096987654,0.3083259257435715,31.23474537152478,11.343425018475052 +0.1484305587004544,0.29813185858543145,27.059824391240227,8.719741770749515 +0.15013260666003247,0.30164777037467105,31.781739027043514,10.69477834862357 +0.1501221982910582,0.30290767363185667,30.570537473007754,10.451262925132175 +0.14955971240174162,0.30553827273064804,23.85797314083792,8.349455279996283 +0.14742182802714707,0.3100328616077529,27.790669203603244,10.044960508486021 +0.14951348265486752,0.3033070403297169,36.05189617904461,12.312945166099151 +0.1505636977409086,0.3042202724158908,29.240706772621632,10.118053347532847 +0.15050767174632826,0.30330023060599,31.09619405423005,10.650680934389129 +0.1505112975587273,0.29183596971304504,29.64542956132206,9.053422002746295 +0.14983940968367063,0.29894693571588526,26.031936503313894,8.534260677387074 +0.15018905952930703,0.29503432917093486,28.740719573980122,9.032415838068875 +0.1503119575775075,0.30209702561396656,30.365409852605808,10.27668837460015 +0.14866657432968375,0.2927697726054152,32.71434272170407,10.025319848439704 +0.15001747373076518,0.29838438322272837,33.85380739533931,11.055148091131448 +0.1504638281689992,0.29614539750735314,34.186010612699484,10.984530623517518 +0.15279144421815125,0.3073850187591904,25.50058817011695,9.254127866120534 +0.1497246281155596,0.3000550888447516,32.90106588818892,10.926628781542133 +0.149532221988721,0.30577487257077623,29.869371113794045,10.40676638581266 +0.1503799554939536,0.3077174270811872,31.27022627602555,11.23318370517471 +0.14839452045728455,0.3052216820170324,25.80853981986696,8.847452087759237 +0.1484434196857105,0.3018665564593739,30.646244619704138,10.225902255311492 +0.15035689143378028,0.30011845925638003,30.3848829220658,10.108905853593402 +0.15122960273799693,0.30268262933442686,40.49249158382302,13.880386308108509 +0.15064270393178764,0.30263491515115437,30.54757882174107,10.454551939237284 +0.15062402479608974,0.29995483114727906,30.728901520323927,10.228294240364802 +0.15034643523032404,0.30033205536040075,32.824714826771604,10.975320193004437 +0.15039922107687734,0.3064911790888299,24.894688772644646,8.846928525618587 +0.1478402767022365,0.29981478069867007,36.22687384124418,11.823883598756138 +0.15096228609533102,0.30821683883793266,29.30332431612397,10.560829159960232 +0.14896398145417414,0.3004601101378839,32.60066976580299,10.766665895824332 +0.149090849738353,0.3035190654809991,32.076224730559595,11.011745702239166 +0.1502191750915234,0.2962532824496803,28.891242664861668,9.237864058261346 +0.14819990219259774,0.30125358118360623,30.275358761646324,10.054876375065364 +0.15059831075819485,0.30353670278921374,30.107687869021095,10.368896517807734 +0.15007460001560333,0.301496773945415,29.439087156744865,9.849206317571326 +0.14978654122823423,0.29618968164510245,26.363362767234698,8.403383801839116 +0.14942175328983148,0.29974530428604645,34.963496403498,11.479617185169529 +0.1495800200467064,0.2989566584881638,30.16552138725714,9.8333982804796 +0.14824832904209867,0.2926886824299055,34.57094013841479,10.425896459076101 +0.15040418941157982,0.30542904401624577,29.7286005960694,10.443534634179846 +0.14960445935515512,0.2989117121470337,28.17913401077612,9.259022161948035 +0.15049645787541147,0.30010925330796495,35.526072435488615,11.746207886775757 +0.1502920127812123,0.3007627596036902,28.473182835553807,9.51538333509737 +0.15003616108911877,0.2969102160840476,35.75321225542645,11.461235151570149 +0.14900859288325075,0.29576760203975627,32.55653477844018,10.218122203601302 +0.15148816840431745,0.29786024753366647,24.659049637283324,8.075870221609039 +0.14899160509870846,0.2954923111437254,31.24562402174696,9.811439749492953 +0.15031236931034347,0.30405442071201094,28.089355465920075,9.752970570284168 +0.15099063631508525,0.30337788271759314,30.46422373850013,10.535862105604362 +0.1498711814749599,0.3000310492113073,32.11500345041348,10.589514986439589 +0.1510578354971278,0.300767868355497,26.72592038578928,9.050197784202208 +0.15026126362638156,0.3087833938604004,30.37093206481986,10.998813748036719 +0.14925594063539818,0.3064601308690526,31.27988008386527,10.972079926892425 +0.14999340817149734,0.30215454800392216,30.12425778047354,10.196886168619903 +0.15124014370398545,0.3112408869390791,35.54231657976504,13.231842108889946 +0.14939070796989323,0.2983126075137707,31.76266676052733,10.355483494323897 +0.15105315595733473,0.30110076762567856,27.733921080069788,9.363282553373928 +0.1522675063738427,0.30243731685207836,35.998029256830854,12.336205787525653 +0.15137718826335542,0.3030631839194479,26.71540075844504,9.257688655494318 +0.1505129796217725,0.30442757403259013,31.95205628553071,11.069838506409985 +0.15083321732790148,0.3075938363319539,29.3075055138151,10.482356095495415 +0.15076199380864716,0.30501111161853534,28.301471306319755,9.83157229505239 +0.15164840825144268,0.2979900337404267,29.702201602242653,9.770348266742376 +0.1506159382088891,0.3047478746692576,25.667898813944042,8.936966424058694 +0.14781427069899347,0.3002791178092623,30.561090821483425,10.017085521134605 +0.14991150817041568,0.30167764433770966,27.51190087550193,9.19326484296544 +0.14860335106142353,0.2969871025806413,30.633142224439514,9.794576140360453 +0.15047529242251503,0.3071077680038786,28.351841342603908,10.13869981976002 +0.15048738101856848,0.2979406085048884,31.579346059972963,10.308691751907041 +0.15081732624385974,0.3017368960001518,30.739268419839615,10.395962207409895 +0.15047582078668134,0.3009112486806818,25.165386383635436,8.456140137549104 +0.14698154008586975,0.3019701359347489,30.37259097833686,10.055104719710538 +0.15055912155285428,0.3042619346488645,37.99439001126802,13.128286332968244 +0.15245386743130163,0.3031803182659711,26.725139008648917,9.299197705046604 +0.14933421759586793,0.30390566855274315,24.75051873483075,8.49797773720767 +0.15098035540313015,0.2975437725131452,28.26419207614187,9.236316334401748 +0.14974296280644311,0.2970443131178998,30.350469208350393,9.744256832612125 +0.14959654933529112,0.30045108314702534,30.635669640334832,10.122762011736121 +0.15300285703403874,0.30814188209171656,35.58379491486449,13.103471627329599 +0.15174809129180103,0.2995560920240514,25.338925781979036,8.469018894113725 +0.15134705289674905,0.3026412134811962,36.93951648627321,12.685565269309706 +0.14972044974670232,0.3010014365734588,30.721217070806638,10.28142533975891 +0.15076663399113646,0.29906105489095497,30.187364942475934,9.951993674601098 +0.14946082362281138,0.3017221657863229,25.901307831328705,8.703314322305722 +0.14814378987189988,0.29989537016431295,31.597855838156626,10.274303415528205 +0.15071527787518674,0.30307148420688046,31.865722787252437,10.962048633789829 +0.14887233348452286,0.3063798821311468,28.901091711505533,10.084527175717751 +0.15006651012737268,0.2999572089739547,22.439234529744688,7.406452049007694 +0.15143126530568893,0.29978260793972933,32.43894508645403,10.7851596840271 +0.14929619676265496,0.2949699790324807,28.681329534044835,8.959908550534198 +0.14921911080818756,0.30772368829437746,28.897637104650155,10.236593359726196 +0.1514704486937403,0.30534657080917466,31.080560067525877,11.042920363139318 +0.1492268347760353,0.3015024345446527,28.454293992855412,9.52362538799083 +0.14889163951984524,0.30456309213111904,32.12152952681251,11.027074311002497 +0.14994437825104304,0.2973577290319032,35.80449280436012,11.599314819558693 +0.15029620712668457,0.2995920134642264,30.21350965393811,9.997212926593829 +0.15075921607986922,0.3054426849363509,32.521528883256615,11.377384042037555 +0.15277998645686627,0.3015691401763589,33.04996296131755,11.304308003870812 +0.1495530241254761,0.29775488710425874,30.77479637504087,9.952836314683168 +0.1496246783293217,0.3035442807640575,30.977065386234912,10.549032626692393 +0.1477338961065218,0.3045376877099549,23.29782432211352,7.947893151678534 +0.14987008971825747,0.299361973595382,34.04464745498466,11.219273039029504 +0.15034416790606064,0.3017173506852343,29.983845702056662,10.188387707307122 +0.15183477297391265,0.3011125936500516,35.75884652094452,12.03530685853131 +0.1494646340263628,0.30133067547886755,27.72414127393786,9.286971608347129 +0.15014855786359685,0.2987012080549104,27.54947087388112,9.013052564479484 +0.15011097596219167,0.30321879832728243,28.892222680326256,9.846611016479129 +0.14891517326006778,0.306973628951811,33.77368696149364,11.987799864929343 +0.15158964099473385,0.2932741429834015,37.439121550044995,11.72438926298804 +0.15043739752561508,0.3013977044368349,25.251892991924773,8.48374367460529 +0.15177473551447093,0.29377130655543576,33.098028762263276,10.431363174568787 +0.14971500833053702,0.3006475980205889,26.261018577315586,8.723228674784597 +0.15037619221653864,0.3056806014568973,33.438140829680854,11.720684015115708 +0.15050063343719752,0.30132439999456323,31.361889141667476,10.617293179792238 +0.15195044855286752,0.2964530142533747,31.697719622603724,10.267709605438295 +0.1509997213897438,0.30083947594422683,34.09507487977175,11.401923442310917 +0.1493936764103301,0.30430481260768383,25.774607536991198,8.904072801620746 +0.150285399861357,0.2964984653829919,33.333150582465386,10.666566954439423 +0.15170574955173022,0.2970335429289505,32.177326573572145,10.45407799972523 +0.14885982144042306,0.2959821573859365,35.68042547999434,11.214783694733185 +0.14963654069873492,0.2960877995114982,28.334346227304643,9.009632266933693 +0.14942410194698472,0.2969217052895385,29.92328867245512,9.541373205304504 +0.15201042833132936,0.29504970596595764,34.53445348444968,10.993666085874604 +0.14920552591838968,0.30350980567207086,26.479334224920702,9.013117692876488 +0.15095095269613323,0.29544407770972037,26.88632572350824,8.5584802110092 +0.14974533012061716,0.3008155268082256,30.07740895007837,9.974391308613784 +0.150452457299708,0.3006608856929653,30.098359297776593,10.054876658776728 +0.1499609393462675,0.29455573706014,33.1733116952727,10.459643208154443 +0.15003011356997148,0.3053249254863244,29.42136433484925,10.260414308245997 +0.15152231299088925,0.30654515879498717,24.19232463470094,8.630481869250877 +0.15007709548049963,0.299248943478987,36.132354776899014,11.870758700641085 +0.14972172906559045,0.3024270914068886,34.303454829047894,11.69199328622275 +0.14744932482940104,0.2983158890015547,36.06856264978344,11.554236227541642 +0.14930939184521574,0.29879160926849035,33.14200523290236,10.791490227885047 +0.14827792815752758,0.3001635411907756,26.009004826963697,8.527776435172644 +0.15030824774095938,0.2922818159280644,34.201404745980135,10.50500327007261 +0.1497687721925196,0.29393469784213433,34.96823323688797,10.86253957046205 +0.1504772255297223,0.3004851501880599,32.83204543843338,11.016377517399015 +0.1502123969560286,0.2975156392132613,31.119483775158223,10.031620281646772 +0.14881370878314598,0.29783617794752804,36.074226143035,11.580741003247546 +0.14811228883959004,0.2950584001931784,30.64119640983703,9.555861576747883 +0.1502709833778278,0.3074470083930091,30.856364290109493,10.999227860793168 +0.14971501197611034,0.29894233419685406,31.693648376861088,10.351507042053706 +0.15188943229338664,0.29262729869688475,32.33857929478733,10.118144931254232 +0.1505881762532277,0.29449515151212036,28.248264632413925,8.868049781529843 +0.14962957772965027,0.2948321224579357,33.68736455003864,10.509070086709325 +0.15022714289313405,0.3022334853240312,29.989349146264622,10.181014058481725 +0.1492676522531901,0.30288338330402054,23.79621560742798,8.040845989477088 +0.15016352417594228,0.2970415834968029,32.9576105072256,10.613939569728256 +0.15087663369708124,0.29489192630298183,29.25899261762829,9.228823984818831 +0.15066494068946434,0.30182956154672885,34.06356524567266,11.463028189783495 +0.15052450373897486,0.30024126704606485,35.32144724147946,11.764968400074517 +0.15097920524485783,0.29396442709290305,37.089111340193085,11.649364587669771 +0.14999559420243685,0.30769915219071736,35.335171770534394,12.63161130950466 +0.15129324950342174,0.2937844570746633,36.70103830424468,11.597319945160516 +0.148624439964103,0.2988571735172921,24.856336096672255,8.037254678883912 +0.14874680760987471,0.2956017910400362,31.274621031742267,9.830912721012163 +0.15031138112595765,0.2954051999378654,31.95477246420269,10.143882284023913 +0.1486725534277802,0.3087354948558257,25.338350710035044,9.088399881132492 +0.1508691106951796,0.3028155838955236,28.531232510868513,9.816610026276138 +0.14991884952395507,0.29986560250204414,31.456794501035947,10.354143443443194 +0.15101650314377255,0.30191944872083354,20.40968351284777,6.982569134070589 +0.1489028003432585,0.29997051830655425,34.100386314718314,11.19029447207648 +0.14947179840744554,0.29625233713796184,32.860406695548804,10.460020527478997 +0.1513007882547658,0.2989673078819293,32.124337207384016,10.61666910497183 +0.14962303075309719,0.30927241968968566,30.535196841300163,11.050710375498394 +0.150203749062056,0.3049514772792416,30.06495799788686,10.440823888173659 +0.1496738183366613,0.2951282732393422,29.55485122655795,9.292735249675323 +0.1504656092519898,0.3006836244173087,37.447899265188596,12.422564096345393 +0.1518391511286107,0.2964608972811456,25.64094296610233,8.299438132919102 +0.14894480784825112,0.3030274015230403,25.769206702664324,8.699532759918915 +0.14994401647591324,0.2997704649080038,34.09713282642293,11.295414429330572 +0.15091996732170812,0.29557947527129574,37.60097742129681,12.00239116066689 +0.15103487382031225,0.3073007208211147,29.69758553534111,10.595283549231368 +0.14921500535935,0.29734873693425,34.48501218774419,11.013155843024803 +0.15004647816833308,0.2946441868146561,27.349080486092458,8.626672425272654 +0.14910192844557915,0.29476182654477634,32.13774967170808,10.030829060707859 +0.15009325272174182,0.3050202227194285,25.007573130584486,8.715864486565915 +0.14843846459316606,0.29865306151804866,25.771060691150485,8.364694120741532 +0.1484996434749374,0.2992491357834512,28.065852423673288,9.101224747816511 +0.1491896776163524,0.2996091248299141,33.31395174252376,10.887811024138056 +0.15074385633224033,0.29708282304709194,25.431023931637572,8.204435182378214 +0.14878130361092867,0.30264604389771826,28.389835573750435,9.564040350750982 +0.14888400896336834,0.2989951046517956,27.090582107793278,8.798165246892236 +0.1493752734527502,0.29828436317592455,27.961389338307384,9.026890574536429 +0.15053799719618718,0.30375644286700915,28.313153164677956,9.750139592724032 +0.15249660566769366,0.3002438790638846,31.688193436766415,10.730175910986688 +0.14969918970051768,0.2987399323172421,30.384309404212097,9.92899122147034 +0.1513120822823098,0.29659918266115154,25.184492714373697,8.14250776455921 +0.15154488196851798,0.2985429025933996,31.358667050327256,10.337324153650313 +0.15131848544270254,0.2959657930493102,28.664921673514364,9.219661339532506 +0.14859534537554872,0.2936794054400765,34.32001612654417,10.588318488388532 +0.1522497694023173,0.30037128625233805,32.43932501916078,10.985415618753228 +0.14980485133133742,0.29790326912660825,27.062161960583545,8.750691917664522 +0.14957444922451812,0.2993558016529249,34.280166893025395,11.260952528563772 +0.15027385175027963,0.3035097829498189,30.956424252729455,10.592577698939682 +0.1514279621110235,0.30660352122469786,26.099703976103896,9.322835797400263 +0.14959602165188984,0.3044426164971176,39.77227981854566,13.734431086846826 +0.14861179930026663,0.2998820979558367,28.87051054580255,9.468094262018537 +0.14964599253960809,0.3004610212867709,32.305175447111424,10.755759998955668 +0.15133651739280576,0.29713909904633373,30.20642569048708,9.805925977855937 +0.1492581928668257,0.29209745008257665,31.446993517617766,9.547307518470944 +0.15062405788799085,0.29905272637925995,28.058865741919167,9.237860141711348 +0.1512562871754747,0.302389185983912,33.990716318977896,11.62005921535147 +0.15072381839786142,0.3034413328169774,39.34995285574176,13.591755739853848 +0.14974983617989948,0.2971032982544519,27.11347089204517,8.717130239887624 +0.1504737484616696,0.2939773577737072,31.13119378296351,9.739478772326397 +0.1496896355338431,0.3031460470104097,39.345161482398126,13.469768379443533 +0.1510377242085587,0.30224289772970575,32.79810438361782,11.227797358814206 +0.14901467148599062,0.29931957167310436,35.23773011246068,11.578175976031568 +0.14926121483946952,0.2906023540514064,29.119571892836518,8.700806879754595 +0.1495532551560739,0.2963871541816736,31.60866283541361,10.099248959494352 +0.15038384487200787,0.29902463980447497,29.04668693086314,9.522465278158487 +0.15085109265056304,0.30301544127535474,24.43433268935008,8.399926493783124 +0.1480664595781356,0.30543285605636705,32.60082666849543,11.275406571382439 +0.15257487130087916,0.30698747159079737,28.201896126169157,10.179603900481647 +0.15224863381155257,0.30256819231350973,30.430132672961225,10.49948051472565 +0.15045785555504043,0.30984028234629385,29.441347729028482,10.752984580326572 +0.1522877936963579,0.2908553666671632,28.409603492895528,8.686411118460873 +0.15186537244884848,0.29915944457918997,33.92499026237375,11.29244757400555 +0.14919784547863216,0.3013066141916268,29.432221275585977,9.802422207263307 +0.14921066691129106,0.29277757068958643,34.25178827731303,10.459856718439683 +0.15124509827722338,0.30183565327126216,30.793706877728013,10.503426439953618 +0.14903661685904163,0.2991914343551967,30.590796914631078,9.9834496325653 +0.14943060234616568,0.29779374040997203,30.762084850999777,9.951735699653582 +0.14964014364821807,0.2999442320728595,28.659571886198783,9.50032127633544 +0.14949332945039434,0.29460291068000016,31.730665495422503,9.93142751278643 +0.14854455283695037,0.29218923402697283,29.710739865969142,9.051012908502521 +0.14967608524476597,0.30632864315673075,27.976653442243553,9.8494887637866 +0.14972582632731116,0.2984468030073468,33.56047995953689,10.916803751009283 +0.149751460907365,0.3021773297632562,35.26275222635192,11.998781159840615 +0.15050409321221306,0.3038144933442783,23.027530153505833,7.93404139983004 +0.1501191437584678,0.30406095969897096,28.18141589205536,9.690260927054194 +0.15089790497606143,0.2989960356931945,33.99914763437158,11.306191675367797 +0.14960146688877243,0.29775216677859206,30.62478070876906,9.886604940453712 +0.15163203244888238,0.3054986711957548,30.209428793936617,10.705526300695931 +0.14934680492695457,0.29649645625954457,27.114338550981365,8.63116263936718 +0.15089652035708273,0.2966231247965731,25.818925420968647,8.367892389359435 +0.14837996327825118,0.2984946479712351,33.72275523380344,10.917236727552558 +0.15152946976073273,0.29838689259869755,38.864371605531325,12.828100633395344 +0.1511116291593096,0.29971131427462855,34.2713176726586,11.419489383955074 +0.14868831084143888,0.3068465825304793,26.453326720667544,9.269484257594735 +0.14875579465956834,0.30351986751218535,34.795189805153534,11.86223885654985 +0.15147483108100215,0.29214762444785625,33.99225877571399,10.515682171482293 +0.14963429638610848,0.2969359500965749,29.09017897984522,9.357430017376188 +0.15056708076387043,0.3006227331485528,35.10333901659912,11.71273419992228 +0.14962517059327002,0.30116558432034074,27.474476199176703,9.201314957613148 +0.1515117925177827,0.30451597442400974,26.999702780557392,9.425967795580993 +0.1500345949445627,0.3017236514057741,30.889584790849135,10.417839043095919 +0.14889852755646008,0.3058318091270072,25.101943500285554,8.811297393169474 +0.14971766350864477,0.30439287544683835,30.54882256666543,10.517984737129993 +0.15122084278678719,0.30204995549403396,29.944888013580634,10.16937153687168 +0.14909322799124655,0.300941119131474,28.324501216630008,9.39504185153295 +0.1500725448558092,0.3096008486823499,25.391980985957222,9.321465191122105 +0.14971028784801857,0.30356569981722054,30.99365467372147,10.634823331313976 +0.15023174062551567,0.30454114114792497,28.128764574412855,9.741460456470882 +0.1502068080676623,0.3036793432364135,27.237656834001864,9.358788041323383 +0.15141021391591103,0.2943595567637614,35.27662833369138,11.168360010761585 +0.1526981810448354,0.2947877665544794,30.2348810951829,9.647044158201139 +0.1511407747033369,0.29871737485312405,27.150666795757402,8.911503008741384 +0.15011753896402796,0.3028871384522722,33.32597728648213,11.385042381439787 +0.14911829989374217,0.3072879622849187,27.075606986936002,9.603672362390835 +0.15255675883892658,0.29805192026486005,23.83736991701679,7.878819703093543 +0.15024860486393266,0.30504214282182956,29.12901997218977,10.153791204030993 +0.15111279030780286,0.3027341702584137,27.182425929361983,9.382552995399879 +0.1512480470367665,0.30264364547957856,26.522525379378422,9.112812713702818 +0.1517961422721186,0.2957009025390981,30.42304470500082,9.79726231754013 +0.14940113082552847,0.29767671391993544,28.79527819370619,9.248355401321312 +0.1501012916943746,0.2986534021382506,30.981523033901016,10.120321230856375 +0.1508669667945632,0.2999391267464977,29.71653616457537,9.91916152523609 +0.1493572435382864,0.3031229860175865,30.802334439611702,10.500890212175937 +0.14936382467269696,0.29533109378215294,35.97257223871332,11.367100386495729 +0.14868204856148268,0.3026410738262118,27.388579022796847,9.344308031798583 +0.1507757559647749,0.30896992147857316,35.20127201948401,12.79459964521298 +0.14867606017861779,0.30074110836926754,33.80690123265691,11.148275970033982 +0.15035599841723,0.3067037755588122,35.49157290416888,12.584072680336586 +0.14936590777902642,0.29856866773362256,32.23459040899341,10.445437206914516 +0.15160155864749766,0.3069906561219389,30.588771982146703,11.022571519591997 +0.15077573840768896,0.30096158146498636,30.153183532608733,10.184847497895715 +0.14952257273686848,0.3049881563575047,27.685655866833862,9.575673393509062 +0.15066244435702095,0.2980896929035425,32.597183134861055,10.6500381402429 +0.15018181984119144,0.29132043090444776,31.864313731137578,9.710426126815037 +0.15131924512021863,0.3013108160856183,30.28846216867025,10.165747061499001 +0.14948675443128087,0.2995042902902087,30.44995724802021,9.960873586451429 +0.15007195674472956,0.29865176682203753,34.44974101410525,11.265736922646948 +0.1516668150220137,0.30300155127775896,31.645318701701317,10.945690909291267 +0.1504938818973473,0.3011284014824035,33.10085830675867,11.086551250829578 +0.14904939577798532,0.2944106833000758,25.015848812035827,7.8101687444922305 +0.1512109515355217,0.30538926367640656,28.88719945851428,10.18147076110747 +0.15128811395753677,0.30774522490505796,33.44875493081932,12.007657378060625 +0.15086873098346731,0.29470157550590775,29.442979531694768,9.261595734855659 +0.14755773027331617,0.3004357717345492,31.931021303460554,10.496689126994152 +0.15077839658777725,0.3022925308101452,30.57250358763958,10.355346705434448 +0.14866263592410509,0.30643249806851647,32.06308989754519,11.215140441372798 +0.14853518646960184,0.3023805334484592,31.96834181640001,10.757903757427387 +0.15106050539512483,0.3022691007087235,32.720564467999864,11.1728216048679 +0.1488518366283142,0.30259313765116763,35.06563095616793,11.854954235533114 +0.14986852133437634,0.3040957305799187,23.621177453582643,8.208047149499038 +0.15032972852704402,0.29948039384010755,31.723641597608943,10.495622541031254 +0.15002980084767795,0.29798333108680475,25.32922730793718,8.219170070840118 +0.15098373502963386,0.3026884378271235,32.35475210222846,11.102326892626891 +0.15060975015751246,0.2974388511062278,25.109243469825657,8.086523323021016 +0.15179463063999346,0.2897613675037335,31.324064558434202,9.465224000111336 +0.1475961803121066,0.2979036582746021,33.61905158431908,10.776275932597883 +0.15037363591454309,0.29948384732395555,33.17916340428305,10.985304317931758 +0.15189461732029347,0.30013331174790503,30.492071372787567,10.271155752239066 +0.14875209056050612,0.2996225199226073,33.93836723736836,11.156497603670742 +0.14971162433921525,0.2972451855470223,28.06482987458691,9.005660829732 +0.14881177752559402,0.3023604016866651,31.794493610876486,10.68216281623272 +0.1511639107557923,0.29538741317105105,33.155228117856836,10.572002817024417 +0.15042382906838347,0.30994214674868875,31.81543148881401,11.666658845816443 +0.14875610336571182,0.3053870851238211,27.80800458155309,9.662523378155399 +0.15077300574940825,0.30744404274476694,33.05553788429799,11.781191410737039 +0.15222711908605477,0.3043380120005267,30.244464622267262,10.591456273563175 +0.14941757140610196,0.29789414693009436,28.47259907076954,9.20462515657633 +0.14911951422666206,0.29855402847033097,24.97967885690278,8.12947097331001 +0.14853592833785773,0.30333476023739997,27.879967411598162,9.466990522565773 +0.15010225072791747,0.3058703265116351,33.103852360849835,11.678342255840498 +0.15060315995420367,0.2969139745991651,28.80613717409047,9.275515289369668 +0.15095259074221296,0.2963460142765915,32.14728745160446,10.322976200574312 +0.1500986667640763,0.2994607327949401,31.482321335234694,10.353982153972376 +0.14927050053953125,0.2961516123828877,31.624694001895783,10.048398841758873 +0.15019962808412976,0.301342131715061,30.73723535140479,10.37324094277632 +0.1521049460892921,0.2976848250851517,28.600743490185835,9.371785884287366 +0.15160986941429458,0.30325015991713183,26.86751314394502,9.313633169347288 +0.14879176759986468,0.3065982624437267,35.72521043997491,12.504480051295715 +0.1503633686542998,0.30233459785123007,28.239554609108975,9.644307206547206 +0.1502467034394644,0.3015126049021954,30.10906453564904,10.146217773713333 +0.14795497671269872,0.30274671874061715,36.20083737102175,12.107179806003458 +0.14942085652317363,0.30244964056303575,28.17884100955623,9.489458032616566 +0.1499321863750081,0.3092977163752517,30.863355167854706,11.185835895916568 +0.14894813955756647,0.3039556781224703,28.739259641663757,9.891173469247008 +0.15037338034232833,0.29832669997186584,29.438871425663972,9.640407649789305 +0.14928196949946518,0.30299775065062057,31.51584555859477,10.707583041052825 +0.15015944216572516,0.29604416142045864,34.433464823289476,10.942976715660155 +0.14994983881146187,0.29698796511307485,33.46268926798564,10.779506708640216 +0.1489998073965514,0.30316367943920636,27.71086197829281,9.416602437600098 +0.1493740236367495,0.28834310710702155,36.78603145767693,10.78628661401749 +0.15027278247539458,0.29793283512375757,32.453093109958935,10.506287687700915 +0.14716155962591726,0.30420267199040785,23.17396406926514,7.837974576127341 +0.15006601948464496,0.3057051239120304,26.096207561390724,9.140850325352282 +0.15050295787144727,0.30203551740486084,39.42446965638594,13.363759800688827 +0.14891127912237007,0.3050661313054745,29.44774999446891,10.142948253944429 +0.14954175460645588,0.29195368015525447,29.023608739554287,8.830830415377447 +0.15040552897069795,0.3030355803400293,35.12180017393751,12.038902470576502 +0.14986088564187877,0.30084396843032774,34.18479290320459,11.415068666883869 +0.1493816450440643,0.3069230753311129,27.066005776719944,9.51972754332856 +0.14862886581284707,0.3026675631078573,26.9571194179287,9.098948748548148 +0.15024883005594214,0.30087829271742444,27.24221441950601,9.127873152308092 +0.14879640702553681,0.30448197791299897,25.958264320489327,8.904661957869646 +0.1506688614307936,0.3069330865389922,35.65216178965902,12.668533728557058 +0.14865695618488445,0.2996825316624834,36.44149859273257,11.89451639715007 +0.14998352330112344,0.30458266619333835,28.108489501800484,9.738853379036234 +0.15124269261856874,0.2949966522515439,34.98781571628529,11.100619945090358 +0.14963698034529632,0.296810846424187,34.210619218857445,10.910248214699676 +0.149570405494151,0.3069378075770276,34.26203241830685,12.070764405798634 +0.15192144245897035,0.2978243305379515,29.469752015329718,9.700543293353013 +0.14980309769487335,0.2998840229117691,35.90737865557827,11.907968642777318 +0.1476947374071023,0.3040380876528218,25.203326943600263,8.558160391651223 +0.15019913317363365,0.2983290109917805,28.580128931098113,9.376421305997205 +0.15065088947818234,0.2952808301257198,34.760887469507175,10.976317410574794 +0.14991429073071938,0.30256065444713215,27.92763707097879,9.468257628465777 +0.14908551911487652,0.2999616472702972,30.756786847825662,10.148590479613263 +0.14952241390306947,0.2992318114559588,28.42637909867104,9.344981761844082 +0.1508230019306415,0.3081910829639969,37.930212515719674,13.582645450411306 +0.14833361174082507,0.2963278893443571,33.322479383314295,10.524350691429188 +0.15030895652556073,0.3047439259632357,31.118367911359208,10.8613392403731 +0.14992554181734735,0.2997130574969072,29.31257040474037,9.626406830907014 +0.1475790227581228,0.296858802352097,31.00260307652868,9.805904070235139 +0.15015557446484623,0.2988966979500642,30.20761981401578,9.925559860387866 +0.15017746682914498,0.3034171434553139,29.547355206261948,10.133644105275591 +0.1520075429559238,0.30724282650354395,30.637865380048034,11.056137697391799 +0.1507671662045852,0.30571992304155593,30.359204416834903,10.686748638318134 +0.15203027963795226,0.29263124384101086,34.81325836507224,10.85628241038444 +0.14887416256991456,0.2989394662654653,30.207323346277658,9.83620912031533 +0.14913628480801333,0.29710095477366694,27.633380470011986,8.852086805357546 +0.1517182434722385,0.3009707802920664,30.25979907271415,10.206055928012152 +0.15053141765612635,0.29821763397976314,27.319932392308797,8.958056354281076 +0.14841832335630978,0.29846429196926744,29.180327807361493,9.420305148340038 +0.15165536360236312,0.30128397085023867,31.09351871481871,10.578104300707668 +0.15098910219823153,0.2999933188965368,26.815786768504037,8.994467283502395 +0.15009583872222962,0.30663467053815696,25.409299742618686,8.993825175922384 +0.14913435235167535,0.29333160315946005,29.362735725805628,9.00663938681733 +0.14982865493246916,0.30183931607687514,31.82999515734605,10.764210714555109 +0.14973506725302016,0.30094804600245834,28.984229334787745,9.644660099926218 +0.1513514103866163,0.30574818982095475,28.147078223079355,9.979373764038153 +0.15014341561122121,0.29690666886536804,29.534696678137216,9.531603579425342 +0.15126380331953496,0.30236918063079293,30.879494275215205,10.542940783942615 +0.14937439524391094,0.30259299763469916,26.494984198007685,8.953792474880377 +0.1490593873716119,0.30352637194954746,24.290386783876393,8.293776557288819 +0.1513601679763086,0.29718639628159516,29.60473879377047,9.639171029238986 +0.15097485196231697,0.3001823380278837,32.451936625168834,10.796142869243326 +0.15046776917145274,0.29781403511915966,31.3315614031916,10.225781990952306 +0.14883666300274906,0.2952449881387239,29.576944825155103,9.32194290360819 +0.15066354684624875,0.29572349597227554,24.901188207274753,7.935699203450763 +0.1515789921874879,0.3010661757038723,17.077719061584705,5.729529855616555 +0.1492356866205183,0.30423780835066155,30.034261918641796,10.216993199536482 +0.1509844111898398,0.300234234163882,29.452527938398383,9.78157922194245 +0.15088873226643115,0.3057499100030522,32.164334388320576,11.381270941134245 +0.1508248307879321,0.2996504979967204,23.146414020011974,7.686255908408043 +0.15073614624480536,0.3037231889609596,30.71867380464822,10.633158666299103 +0.14881574777206436,0.2935747103263872,29.264144515479163,9.00956906242753 +0.14901109871549897,0.30463717822811326,31.495026967031365,10.90977148337577 +0.15038193467003627,0.2949751727458213,28.643610811516563,9.006677471251905 +0.15004558832304157,0.3079579720404774,28.055408221550096,10.09934653950414 +0.1493789148154548,0.30277837099241667,28.41656359683177,9.630569981835235 +0.1497860516979651,0.30327597165614356,32.53562972697548,11.136002510219312 +0.15110200443717184,0.2900209425872197,39.80316979543555,12.014392732161491 +0.1495642240631646,0.3024917837443141,25.69225036944193,8.734039532154105 +0.148405836622192,0.2922860641235475,27.050731545811075,8.253613470226615 +0.1514004024446554,0.2972899433843857,40.45103533664401,13.248977092631131 +0.15055276138784465,0.2933509408502407,25.754475926253473,8.04702498162911 +0.1510100978189771,0.29801790461719546,29.89343336847201,9.814839562452919 +0.15024813960404648,0.30581318417990083,33.264488663157344,11.715992948633215 +0.15077672716966917,0.3055674983288447,29.113230742435473,10.186807394331254 +0.15101760741836642,0.3045132639514066,26.34739164283007,9.194576199538865 +0.14967965253321014,0.3020931230860692,36.7484705191902,12.382010183692497 +0.14965794604023056,0.295045331281845,28.406306720822506,8.918873207022653 +0.1504114195995648,0.3042960647800742,29.497803145364706,10.238474238995106 +0.14927921351220244,0.2917411293265404,30.80639663146129,9.335155589739738 +0.15073978039012884,0.30189381688961836,30.27134639851194,10.29361873800645 +0.15128900351495328,0.30605723115483247,32.78995996114908,11.637412129967414 +0.14972005930993432,0.2892525082132915,36.94027328642144,10.997972760999673 +0.1504626287701357,0.29883000929604103,26.676230956741822,8.728364631241067 +0.14967815188267694,0.3075763371455385,21.368063514150197,7.621294239914396 +0.15077631111800863,0.3021181354041155,22.105491737454777,7.543142323396401 +0.14866287112208848,0.2961182128219566,28.401607654404444,8.953967628499244 +0.15193527916093685,0.3000042938533572,32.80646936440046,10.987508827543984 +0.15035551635925323,0.30468341611581945,31.535633551273467,10.96386002320138 +0.14827470859022593,0.299799959542347,34.99962382245651,11.385351171365514 +0.14777750142767757,0.30292673562423317,38.119265910439495,12.820325314397216 +0.15256472528364867,0.29101983625859146,31.17275704424588,9.615035135788188 +0.1487029719304728,0.3039734660915847,33.389711086849545,11.399779294773367 +0.15249023089846864,0.30393524056871896,29.32214676597838,10.251415185540514 +0.1489973971373786,0.29951943487887567,23.59628233637533,7.714320291066112 +0.15117098571098167,0.2947276929023416,29.724126899453296,9.391297507327778 +0.1511137722835984,0.2905139119319532,32.5801944258856,9.87121633975025 +0.1492740274422806,0.29473325505255127,33.387826136394565,10.439174935050133 +0.14892855761812382,0.3015406848925036,29.586250231172823,9.919088373937782 +0.15113793121441482,0.3057777232202852,26.13057414848542,9.226036750272996 +0.15174223906316872,0.3039353187824259,32.42537584853134,11.356532535591851 +0.14934234476290992,0.2949468793665314,29.549272426012294,9.27393685745701 +0.1490402277512992,0.2987238267373555,29.53181646536327,9.582268534183985 +0.14826882362825816,0.2975812051557993,33.81175296456962,10.79286922185885 +0.1493435503171579,0.29330883912175737,40.482933491346984,12.438105651757319 +0.1504008149472993,0.30492821567488654,33.502042682893205,11.637790690402568 +0.15036960109991435,0.2994998107716525,29.244172693717218,9.635854259745244 +0.14950713748751568,0.30339810790871724,34.53868613842913,11.759251426290856 +0.14997597785427608,0.29789857553084537,29.772285080732278,9.668963887258249 +0.14992968319716451,0.2900621699470339,25.100786840808166,7.507257230111522 +0.14980570422228298,0.30215075075416126,31.663753087921275,10.664714739239262 +0.15018339292841276,0.29610064012688897,32.8740038024459,10.465373787975686 +0.15125849698164043,0.2986652750197369,37.598022285909714,12.380331649976458 +0.14923136735863332,0.30098058274842565,26.78618233676297,8.934081854792115 +0.14951226229122133,0.3011719689163863,29.926419783690857,9.990576843155981 +0.15036417749696465,0.30574639229446116,35.30241838748062,12.42704241422639 +0.14949892092330513,0.3016650925230108,31.03109936835361,10.403943747808786 +0.1481451506648985,0.29554496162330907,20.60403224450084,6.471993744518181 +0.14913306698858445,0.29755963443017347,29.267674291203296,9.414774412208873 +0.15052278672540734,0.3128443852116192,30.43756706504981,11.465555296608722 +0.1494418573448038,0.29888737140909455,24.90339111278916,8.114624167320823 +0.15048991656259456,0.30165236028217673,35.71927823405465,12.071572404427727 +0.15065372244140615,0.30312900389009306,31.91200972152223,10.937538027492506 +0.14956377265167994,0.29586671558155664,28.39759828351739,8.962725100186917 +0.15104313747804582,0.3081095189770851,26.40663142711467,9.582075108431361 +0.1500841177576905,0.29861517490490813,27.995250503595148,9.151584088356588 +0.14977792437246584,0.30651978433027205,31.376375708782653,11.087878305787639 +0.1481742410430165,0.2948878839842837,25.86223004562825,8.061502129812864 +0.15171343433961257,0.30374886634851295,23.40476194373009,8.181340291175696 +0.152316287807448,0.3053740447725618,36.34825318802376,12.945707788574076 +0.1508471475379125,0.29839823851193265,29.30651605503477,9.609692803343718 +0.1519945641559389,0.29675668378925335,28.768069642233424,9.321966266688987 +0.15064688565650722,0.30433464782224917,32.47007909077459,11.27985566439424 +0.1503111245075296,0.2890249960943951,34.30271576230506,10.158646334479373 +0.15079574146765137,0.29722769144658484,29.58517044412024,9.55551301030745 +0.15026785736780493,0.29268389873754425,25.07831762712695,7.73689469628687 +0.14975465727268486,0.29492804102266773,29.497382677529657,9.197214737269766 +0.14932869959308986,0.3042472594989322,34.466656700604865,11.83368224772098 +0.1485804522453124,0.3060047943819215,34.30907279995165,12.011934310338338 +0.15152494582558068,0.29397748210495045,29.954332099137957,9.448352559242176 +0.1498005628197167,0.30154443187253793,28.719225421554807,9.675287162414955 +0.15070141719931232,0.2972414653208322,31.529222474433134,10.23426361350408 +0.1489608235421418,0.2946971039504677,35.648598673779006,11.103765925905943 +0.1493874160719063,0.3037950168691799,26.586786335903454,9.094962041600828 +0.1508410635531712,0.29484738517817355,39.60353184166207,12.561584458023875 +0.14881284035934886,0.3079822432673712,28.704397430348692,10.167250506422404 +0.1528387613234047,0.3063751092678785,29.09402581518462,10.471787509200173 +0.14952969846445832,0.294502470802227,27.898547897179533,8.678143879581258 +0.149056219355559,0.3022218142215038,35.70599521075651,11.987365261432995 +0.15191427451211212,0.3009767473429413,35.5769006135537,12.056062822066362 +0.1513963580213853,0.29903956671175413,24.897857018214125,8.252207071833368 +0.14813547087625997,0.3002181839148556,28.976694011533038,9.489243695656176 +0.15146127426488862,0.3018138430468053,25.705269725292347,8.738901661848878 +0.15134501823795732,0.3008753327937054,27.676378232895665,9.35873628268931 +0.15097089037466074,0.3025228831331733,27.16911740238612,9.272959756667545 +0.14985889758599388,0.2954662584846817,27.457028602416127,8.715813174003278 +0.15183669663296862,0.295712975642533,30.25401769576005,9.687116997731646 +0.14930935536329765,0.2948829038519649,34.74999969647181,10.889625600499508 +0.1504244573544395,0.2971309773308677,30.57368004346955,9.89573112164375 +0.1485169014716955,0.3036672037493647,21.74230782875913,7.391586008643754 +0.15033605229412086,0.3038163739094664,32.856173746241865,11.312007681491497 +0.15261950093438661,0.2872252632380152,36.27874290540974,10.730080975176921 +0.14860912787948738,0.30269192378626847,32.681088950627185,11.021514563069651 +0.15025124504295637,0.3074169225799592,28.314607374696603,10.054749508600077 +0.15001029042633415,0.3073216384669239,34.01335828205734,12.104175552962841 +0.15066684372984945,0.30375017635911844,30.22921830077118,10.44821304693802 +0.1497703398512665,0.30451628445433787,35.95635247491908,12.466390598077057 +0.14991987670607854,0.28939918973213075,30.323061076651012,9.006000060372507 +0.14919217579848312,0.30616083703453717,32.3544071933298,11.238447211704964 +0.14907276943481274,0.2935437327872171,32.30531955288704,9.987832450049028 +0.1498086676408268,0.3023829007521592,34.13886707964923,11.552560059666908 +0.15126894432004367,0.300879605225048,28.297738293002432,9.474913920387873 +0.14894363244180778,0.30217063453178344,23.633910143855015,7.999237844698484 +0.1487327457187228,0.29854683261629134,28.663098239411184,9.280473294713168 +0.1506283627669213,0.29448934251807407,33.54798804909986,10.539772807384237 +0.1490892564270037,0.30420741814880975,26.480542986896374,9.109584516151852 +0.14877206178422148,0.2907517246801888,37.2971723503208,11.129624458168127 +0.15101402126085436,0.30645105835004827,22.061476803777282,7.8425793187469965 +0.15204509400000107,0.30281466157980635,38.07831238068781,13.120697857520362 +0.1484978265967712,0.30658970153177945,32.41219250400278,11.36192057944851 +0.1496176100625182,0.2995609200711106,25.556455744389133,8.419556700325225 +0.14881016790900303,0.2962940510562634,34.75399616780125,10.987315339568639 +0.147868608381278,0.3037849651990767,27.237112825496755,9.205234220460005 +0.15142193927417727,0.29463710925892744,35.50968416419404,11.224402453220597 +0.1505235312133665,0.2941319719876135,25.58516122571984,8.016371214258852 +0.14975031481029155,0.3019165607789426,31.204717605836795,10.510988454351587 +0.14998930285840187,0.3055161968283803,29.885444705502547,10.462110407521566 +0.14999910443279338,0.2995004223782685,30.65117813445528,10.115448046445643 +0.1507369572789277,0.30485289722653086,29.080611566150978,10.172214379402504 +0.14902592891480126,0.30018971272243894,33.71235683952253,11.118601573874297 +0.15129168135643017,0.29391648240204726,28.015019163570688,8.80799964932115 +0.15027372896681773,0.2961566617957027,34.143804799472264,10.945524899440793 +0.149484634852183,0.30136740699489656,29.714207233516376,9.898727420742283 +0.1487457211756787,0.30151931069925036,26.207686976724908,8.785458769758652 +0.15143265275767312,0.2964376059483856,25.276854994768357,8.188542756588697 +0.15139086751668163,0.2905510634820422,27.049741580810668,8.226908752301313 +0.1497281341484409,0.3010681608177375,30.739059929485013,10.265480097968426 +0.148352965304989,0.29957797847043555,29.880649175918133,9.802509589516466 +0.14997124129794312,0.29729443473426626,23.21583032839016,7.496022126619774 +0.1511582831988996,0.29622011316383673,27.596499706340694,8.89809041337201 +0.14934784490295788,0.30388910542971476,28.527906462637898,9.829411053166867 +0.14890186355726986,0.29870330928195504,28.375378599332237,9.204660460438028 +0.1519486862786064,0.2964492703427155,29.40040297348795,9.470413145100792 +0.15096984781695383,0.3066981002729265,27.794548747130033,9.873484674115735 +0.14815836226332718,0.3020412709598494,36.44843381296452,12.141803337984978 +0.14901335266864252,0.2999422615775993,21.525930812500363,7.123437089067459 +0.14964911712336768,0.301500781903965,27.172112230189168,9.077134439339417 +0.15061051202783746,0.3048268168580336,27.382302345159804,9.544537776855663 +0.15176942442792843,0.30510592179048796,26.635070380175822,9.418732892004543 +0.15227249128672962,0.30396980515928684,28.38857123194456,9.919870064890972 +0.15011881303242472,0.29990114607598917,27.8027601396428,9.219411415688066 +0.1512252696397605,0.2952274540763439,33.94983036643821,10.811975300237595 +0.15103648165824599,0.30789477670773896,27.710084872849862,9.984248412520055 +0.15042667502564433,0.29567445090479927,33.23914355159552,10.553429498355431 +0.15017856107546237,0.291681520612389,28.520210710035713,8.664674771915104 +0.15054314336123717,0.30594481918340294,28.403206854575814,9.973989709510807 +0.14944327224935602,0.29614289759884416,35.82809891323813,11.472036938984436 +0.1484591602306376,0.29771080454721294,26.655212638244556,8.516895464293466 +0.14994721692123086,0.29552754287333044,30.21560314753735,9.612310726574407 +0.1493668523878611,0.3036418836140332,24.97707102583834,8.51880188936206 +0.149210353301041,0.30800640417231917,29.83783963368145,10.627566890035528 +0.14996728809387924,0.2975571564732516,29.17612223261116,9.373676969563046 +0.14877899796430535,0.299929082966661,29.07788717532433,9.498049116667882 +0.14799387370611425,0.2935819792846831,33.75733247549169,10.301231267757412 +0.1498505214745692,0.29092385930173936,29.496233651550853,8.94693905740981 +0.14974634325964614,0.2940875136680478,22.750094165821398,7.093363357913476 +0.15081598425579698,0.2992396821728906,29.502769388839102,9.689364141884381 +0.15100464436947988,0.30185457508717567,24.599831633547975,8.32797414829455 +0.14985305560398912,0.2985181317684791,31.77206444982856,10.322136980726848 +0.14829067244054475,0.294248246771512,27.88263283764035,8.618357118568104 +0.14887914294047042,0.2943785417943244,38.3994861386073,11.943192027472662 +0.14904484552842884,0.3050595157863739,32.71662846050488,11.293570677158414 +0.1505876956753349,0.2935675195778064,27.638203870176067,8.644179325625398 +0.1504201840757617,0.29959377696586564,27.86863985435561,9.206248534853477 +0.14813191091782518,0.30565840805654765,26.863375132452585,9.269975645242349 +0.15056439033036756,0.2961674128096989,26.97119020262887,8.683458289714183 +0.1496443451504504,0.30409368745167437,23.400304950165896,8.04435172738503 +0.1503990171345256,0.2949885165212474,26.497437749947363,8.34104036707168 +0.15082656430484606,0.3076853564676946,25.88454898531704,9.270214323597884 +0.1515173951281202,0.30138361162197425,33.93984646226362,11.523601100231332 +0.15025726538451953,0.2944559436102272,29.422116095816637,9.181820685644512 +0.14974081932425565,0.3013555587129272,26.250902213175365,8.79701644147418 +0.15079086472072467,0.30208223106466264,29.27490552890737,9.90352437094126 +0.15004845752920462,0.30215029752649675,26.432519374485707,8.961462916516817 +0.14955973555394345,0.29848978813772276,32.530393632817486,10.546819077718354 +0.14913117609236892,0.30070228596270304,31.088930291763507,10.311215796749677 +0.15031698678454228,0.30047981554946773,29.827697000181743,9.95458553337318 +0.15131829798752122,0.3030736497725929,33.00012859866436,11.323141587279578 +0.15025644739461036,0.3014924649963853,27.557602736831036,9.329963855544898 +0.1486481918587114,0.29861095163811713,32.23132642070543,10.458346625443648 +0.1507831692948567,0.3042430380574915,30.043686803875264,10.441349151779857 +0.1495066646468747,0.2975090988134588,31.795866662867713,10.25810165447931 +0.1500964455626395,0.30409174689365087,28.23955087659364,9.769229843088242 +0.15121456012232437,0.30238945340379036,30.356684176052063,10.354822900198457 +0.14962327630413702,0.2960723790194963,24.74679062067522,7.869590294250776 +0.15087686798051697,0.30479072340252233,32.55227708882578,11.375660209630892 +0.14955358954344525,0.3051704927149343,34.489160507100934,12.041367205337245 +0.15069197240010881,0.3040389115565127,25.940464025484243,9.023619616085128 +0.15189528840059877,0.30385297127993105,29.621159291356275,10.371863549695489 +0.1493159607288507,0.29656974918272205,28.966629116763215,9.229274520089744 +0.1515002682194467,0.2987030942477214,28.61273909978265,9.422943105620979 +0.15030388496780656,0.3081635991918897,24.833209659769878,8.860082659629592 +0.15280140194394928,0.3005201535401504,26.575046095105932,9.014920811259044 +0.14791115286961112,0.2968613009031673,31.85408167477797,10.09451622572442 +0.15190509135379723,0.3010676244364285,30.17214883452839,10.211436388228146 +0.14885502464178196,0.3043998810664289,24.509625456371616,8.426868362826555 +0.1498596267174399,0.30336434871415147,28.73819969183472,9.84023172384028 +0.14932707486481142,0.2926652388359681,31.242696204741513,9.543317229519069 +0.1493393858153243,0.2987869148684968,28.651787287600474,9.315085350799475 +0.15099745036163667,0.29977071719631043,37.4050401877667,12.45120883001505 +0.1488418381147123,0.3026596855413209,42.59882215266009,14.386584795757706 +0.15063650249999375,0.29419481288069693,28.516172927012345,8.90915561425285 +0.15069119417305382,0.2982169053772128,30.96976041813503,10.232778456778851 +0.152056374749353,0.29752231417496616,28.916657520783,9.487978660452132 +0.14824250837712677,0.30176054813705266,27.745890849911284,9.294188181249169 +0.14873451016092865,0.3047790496063774,27.885351242125708,9.604953688054325 +0.15081679369703693,0.29758854103461974,30.581122246376886,9.968364395289598 +0.15150756190414705,0.2943604212380749,32.54538953716241,10.319436951483336 +0.14903660266400687,0.3028423278861127,21.276470081412093,7.187508178420005 +0.1496626775881661,0.29870817155686535,30.511630229898426,9.96627475328159 +0.1506732184952405,0.2947038571920508,28.758969676121758,9.086331464560272 +0.15062948162625067,0.29690645717199626,30.70014268953594,9.925012085549103 +0.15151573416965533,0.3036745219291603,30.92756816248668,10.740750745325714 +0.15072701504528252,0.30808276169644905,31.447010135883513,11.337112294145143 +0.15043333332142783,0.30302826347005024,35.29427478860694,12.035500234064267 +0.14796175849488954,0.3020567570820356,28.815101208258547,9.631760880593152 +0.1513400430043863,0.3076281735992787,29.77291347747532,10.73418877143884 +0.1494993065490059,0.297668120838553,30.07005786251861,9.711174925165354 +0.14856096107400027,0.29153614762712277,34.915980974326985,10.539045118434398 +0.15037946377243347,0.2955069659821628,30.657723867577307,9.744096319839903 +0.14854160111256157,0.2963864691016436,32.89592679235993,10.412864309559142 +0.15042599338683654,0.3029734823023102,24.987765480242363,8.586218121065816 +0.15021562533111377,0.3032159931292589,33.66703858225691,11.48900597622827 +0.14881058478687018,0.30895293791906847,30.55108481654164,10.93832670224577 +0.14887862160876264,0.29293248293516827,33.066172325341824,10.11942977013656 +0.1505194414684429,0.2990052335143073,29.48253111801957,9.732912575853602 +0.15035718916160726,0.3022417341367291,28.567237588230533,9.689909659345533 +0.14970782120008713,0.2981900043044635,32.30276495609103,10.494453290381088 +0.15065067079719835,0.30305076801313735,28.05348172577606,9.659162602177085 +0.15010640224938784,0.29954321366637976,33.07278116121323,10.911123313564257 +0.1513780759433102,0.2933529765014724,24.863163734229083,7.79542530007503 +0.1485025802354504,0.2889561975765875,33.12404286647056,9.641095407828344 +0.148617980812029,0.30220871572676977,28.044282595340192,9.395006328245783 +0.15026218240862932,0.29359956155811845,33.992159730091295,10.60338924099093 +0.15000746619165947,0.29951452169333237,34.78046716834855,11.446516080988198 +0.14735464504874934,0.3020071001085679,29.974756878342962,9.94887352474156 +0.1489462015123405,0.3014231302177988,28.942130891156815,9.671886272716655 +0.15109221766934,0.30116865003203064,26.492630291160495,8.984764389562315 +0.14990607372801418,0.30903928738158565,26.939505903552536,9.729430120606647 +0.14905837851256684,0.3051426384726208,25.673552397923636,8.833788877606993 +0.1513891621680919,0.30290477934116955,24.391017342327338,8.35369064943788 +0.14789909058675638,0.2970894460353389,26.381353770069122,8.411129401766395 +0.15254560358486308,0.29645230584511,31.353383868520964,10.202200961537606 +0.1488904267263674,0.29530382624705465,37.83556017160271,11.912258827540295 +0.15140879043548014,0.3054891849757798,29.911101487108457,10.518217676343962 +0.14862298999967535,0.29331065458643363,28.887379413464174,8.830967619589696 +0.14962246089278627,0.2956538836422225,32.67797429568475,10.308838456314307 +0.1521307751457236,0.30188350583000534,22.719545844540868,7.7678538025006 +0.15049891535654303,0.2967385385518372,28.45081790951352,9.10818910606717 +0.14897410954073512,0.3002299685864089,31.815986693981817,10.421228707294583 +0.1494912115138194,0.29124243201836814,27.794214948095238,8.365145410311552 +0.14943883006566677,0.2975645983526866,26.586472000897174,8.587964441361477 +0.14899893945695014,0.29667462887188845,32.92250023885788,10.474033715922342 +0.14947747249227583,0.29635377044254657,28.60013094033234,9.123292076925118 +0.14997226444901463,0.2947625854186301,31.037801096619727,9.770253207878708 +0.15246488673462943,0.3021736807755437,30.648198405846475,10.481947403181147 +0.14824531672427677,0.2994292432301637,34.37180956283645,11.250197449138518 +0.14865770507028667,0.30132572409142006,37.51046135359798,12.439531915756536 +0.15035181486755173,0.28941820576670013,32.21432934807907,9.603175567663637 +0.14929396627779182,0.30020717231648014,36.106663579366696,11.97131460901144 +0.15103542194235361,0.3069167523843013,27.131839745223253,9.659835555411176 +0.15136773830648148,0.2986100535172269,25.57658382661763,8.425075152288189 +0.14943806011517735,0.29202707629072766,30.913831975060624,9.405096187122044 +0.14907297100519426,0.2922491326678277,35.16351529113215,10.686186674390004 +0.14969864237559743,0.2927590191045011,34.72509779386152,10.655325684311508 +0.1497313383171787,0.3047354160287112,31.819867534114376,10.990007966958355 +0.15186542869060218,0.29600383766372257,29.368372533172288,9.434149370911298 +0.15112123392353846,0.30437258285404006,27.068927374219776,9.379897056589204 +0.1508516700890937,0.30109521603089207,33.400996711349876,11.198274029555446 +0.15068949343267324,0.2942418088646415,29.372602234871,9.266902327087687 +0.15102577176475696,0.2997107061696577,28.1719087195424,9.387062530444409 +0.1504485627500814,0.2976272135729436,34.737108477785235,11.237030287306142 +0.14830089682360362,0.2961224325448165,29.134770092504777,9.142657898438621 +0.15132367115796574,0.3043506884586855,30.56693362728469,10.672935086885879 +0.1502265142393036,0.2926597354277678,31.310233389420013,9.607198020201164 +0.15084480360592287,0.30021170237433986,27.79690125603611,9.31925817206537 +0.15095041560138905,0.3006780835414468,23.91329428189747,8.023045911503072 +0.15020810245431784,0.3048874532769495,37.340642666530016,13.016013995018469 +0.14848684961360598,0.29978391724523995,31.123688697752538,10.206180900471018 +0.15067508446354327,0.30352155659933355,32.956394834204104,11.389353290280566 +0.14954027762946218,0.30039358358375917,35.04366538131222,11.634510135282273 +0.15037838505393444,0.3055381475600791,32.737411256220774,11.447152342519269 +0.14866323480476623,0.3012210584816714,29.637635939304193,9.837704880727571 +0.14827188914199638,0.29367161192487085,26.2698744648677,8.084857638614839 +0.15177835111378607,0.30039706778481,26.824855880194566,9.017337011565477 +0.14833435066201958,0.30257181607538025,34.42705286173292,11.535401459287252 +0.15060316221460077,0.30212586278922193,31.624855689878796,10.7320473475806 +0.14908307533219473,0.2935353604253471,37.10457517818951,11.408904478375941 +0.14870631449029914,0.29932021953678384,34.43784612758388,11.267240761816762 +0.1485201473554818,0.30102184552838845,31.732314832055422,10.539435884702897 +0.14948946561955073,0.29636052121567247,30.002111204000876,9.512414772360371 +0.14921252502903107,0.2971400729624772,31.499371376912332,10.07272907696372 +0.15180221421211734,0.30434460820791004,33.280813542989186,11.579149689204927 +0.15010939461781456,0.30134029575213417,32.204936717504715,10.851668656357907 +0.14953906772613068,0.2978298873443882,26.542767272941774,8.542149330144447 +0.1507394642148946,0.30400926577767534,29.71079738022095,10.200095120393822 +0.14799749176002927,0.312869983790329,26.463430966566104,9.809436127348643 +0.14854114843857952,0.2990479426931967,32.827999727906544,10.716030161348108 +0.14978052646974108,0.2995558776012969,28.155833915044095,9.293798455456168 +0.15014942047149393,0.30421334224983326,30.98380707350468,10.67406981485291 +0.14825063430551946,0.30020784748827994,29.60448936924272,9.687722607921188 +0.15016135649974457,0.30108827851317294,28.43309157795463,9.512905823693828 +0.15206481736168875,0.29496344762338333,32.89688383443344,10.442621078391005 +0.14961393820487712,0.299569089233074,26.738589171594395,8.746953395867845 +0.15023527367418746,0.3047444215850807,29.38703666715634,10.269709058670607 +0.15053004669463044,0.3003759320126394,38.21593850787973,12.749458522494162 +0.14702435955123497,0.30374565359790173,25.724637559617882,8.67554918211246 +0.14838398534065744,0.3045591245561123,24.887606359574992,8.494434819382256 +0.15146818323500197,0.3056103983124078,27.820375691849772,9.850403925176295 +0.1495000523007236,0.2992260784871481,36.38009177383761,11.851935998884331 +0.15140971938397185,0.3032298015513754,32.739484606635706,11.335907507328574 +0.1488271716271208,0.3031409961730739,29.09002263453478,9.87134649614667 +0.15197682556210312,0.29570213225627057,34.22638111512736,11.001198088677128 +0.15036034426592493,0.2924390502431486,38.516196081749584,11.846381633759574 +0.15013245279650164,0.3015751239066393,25.20266327902171,8.49507437103592 +0.15043160940227787,0.3056629474381446,33.55719133883869,11.837530521083183 +0.15057948928659837,0.30075618383939,37.15248144321009,12.441116134088613 +0.14961259473477834,0.298566103398207,32.71511346269855,10.645462335809999 +0.1480617648334331,0.29373608103479454,28.551739055781596,8.768378336339058 +0.14984702711159298,0.3016832686885607,32.11442414947639,10.827205269950252 +0.15095118818533287,0.3020289032555212,29.37781873948084,9.977214865971488 +0.15226940511809825,0.3023391256598035,30.681752334544527,10.573787268929967 +0.15014751802294166,0.30530170403736884,28.55255993636637,9.986581477813894 +0.15045999650742806,0.29680956456131574,26.002749700286806,8.377904820595237 +0.1498166807826996,0.30044329233124956,27.897594008021464,9.306996252313214 +0.15137608027843172,0.2997704842351296,36.11904285095457,12.09955623535999 +0.14932630106671235,0.3031496527451896,31.480360819561433,10.686550129299967 +0.14777251897529387,0.3015865666843013,34.703860125744,11.585688721671593 +0.14864780320086327,0.3027697463286341,31.20361532833983,10.547997276089935 +0.14904518444718204,0.3088662234470121,20.621495666721188,7.394529786091176 +0.15168767069747616,0.30183692214731606,31.699337250620093,10.809657567887475 +0.1502154232903429,0.30082998511963027,26.729417207940628,8.95131064440568 +0.1502816517624262,0.29562353113247597,33.40996762657556,10.661524720689957 +0.14990150047736905,0.2952763133063949,28.684299798747684,9.075167708758684 +0.15109878672360738,0.3017908635442332,28.15947624040362,9.576848033514212 +0.14966113743997192,0.2978890924405407,29.89054894957842,9.68440891342258 +0.1523440791901335,0.2991610313548832,28.606736122590952,9.548593589665304 +0.15188182758920707,0.2896411648152917,34.560299859328566,10.415967684428193 +0.1500739797467171,0.3005551278450767,31.108258079846312,10.324178166194624 +0.14966290501315066,0.3050704851299481,30.54229099469924,10.59810448706134 +0.150117220412984,0.2987633719435091,32.109617051356615,10.49735182722204 +0.14999700224795112,0.300894024162922,32.34488398845356,10.85836038909554 +0.14852273278117456,0.30681293971398166,32.03293610355612,11.305356497539709 +0.14981061853669592,0.2975322410076269,36.895664952401816,11.915639730428335 +0.14836067525898564,0.2999712023404381,26.418067837304594,8.677048213106008 +0.15051615024583717,0.3007433232544039,32.69987523779992,10.925551142969109 +0.14908703362225473,0.30434776230674154,34.28802799493467,11.842314450581972 +0.1505287553182353,0.2950362682177472,33.581819114094166,10.573156775847217 +0.15048564191763408,0.29810089696847875,34.55986452781451,11.281720117724017 +0.1510401797183199,0.30373805718889013,25.545443281943733,8.80616355512323 +0.14911938925416693,0.3076847786096034,27.691425144674056,9.797648571839932 +0.1496509161656514,0.3003708299469825,32.19100573844747,10.698035382879109 +0.1494529074978864,0.29763998269006314,29.008166282029237,9.359190689540705 +0.15015535414002032,0.3028874834519318,31.738964238627034,10.84226870362939 +0.14980862417787866,0.3025504932725788,34.12748458215554,11.560088950221997 +0.14869895041216769,0.29786796090327583,31.344704906797304,10.060117345258254 +0.1500464412623499,0.30496487743726286,31.968772371261693,11.045334582401685 +0.1514897736187552,0.2994585644275404,35.0906534138814,11.77342813384168 +0.15027535846222037,0.30524534024379807,32.29585354737274,11.277178658638825 +0.1491280776532678,0.29385254058544924,27.577891541263465,8.479062792925316 +0.1494859117446408,0.30944891861670565,29.152826628066464,10.569902298405088 +0.1493015397422585,0.29747934053674613,33.61905901260987,10.854406800692015 +0.1499255365093614,0.3011383710100658,25.57933503402411,8.570368096445911 +0.15085552402738706,0.2951822905839919,33.10771304998813,10.465696099103116 +0.1498655560839994,0.3048579479788069,32.472556088798754,11.25680857071457 +0.14901241180556443,0.29193982782152406,28.833055954384356,8.730405400776146 +0.14805696856048636,0.29966431409083555,24.756456811611404,8.10782091232095 +0.1492961095354459,0.29303034081792395,32.90013412462343,10.04844058828422 +0.15102939503865526,0.30242649314956377,26.553129109203383,9.079238632518909 +0.14910317009658672,0.3010415199833536,31.269410134030696,10.351955880218027 +0.15033687017352396,0.30132087384907574,27.793891873699913,9.413476267951497 +0.1497411515929939,0.3024566332015011,29.938452215415257,10.16056077193686 +0.15011493518789243,0.29706436042421946,28.22507065292436,9.092947774677222 +0.1522352846223091,0.303171415944236,22.25513583563076,7.692358719951711 +0.15006260996974202,0.3034246280696961,29.781559131903816,10.14044053303566 +0.14860670748870447,0.30399389430941903,26.283195265410903,8.943981352584952 +0.14912327176131135,0.2972173955354641,25.891187856194513,8.356968537234174 +0.14989889774676396,0.2986839955122055,32.30942722171709,10.59126063918395 +0.1494283775266292,0.2972453168812659,27.902408501779583,8.967974602019655 +0.1499333314537789,0.308567785743977,28.170102082844583,10.166602364228671 +0.15104536867750967,0.302148443772199,32.380816992806054,11.085347160219317 +0.14927187306947262,0.2960677099389736,34.06056957879332,10.78939647688732 +0.15147049321730152,0.3023394499746647,28.821047415273707,9.909594480546575 +0.14947198972239484,0.3011104833864904,30.40200671261128,10.16495920550631 +0.1485928599924232,0.30065274351695087,36.857322404574106,12.181878147397649 +0.14788677659117797,0.3014934108711243,33.684847394998926,11.182213696892944 +0.1534450955405402,0.29164945737725545,27.547020850463838,8.631200052724218 +0.14970223468303828,0.2962741450194531,23.57887987194736,7.553885482754489 +0.15005571803635154,0.30207705467014256,32.04384375789667,10.864960341752953 +0.15129064893057087,0.3024499208051496,35.528603954076836,12.214324044287103 +0.1465487423566503,0.298522157161681,24.833782143618812,7.90340734245203 +0.14905969372158398,0.30290695354624636,31.398765608724442,10.687594326555972 +0.15069448310580943,0.29651549968841096,30.340475347170333,9.773573483221156 +0.1503850449170778,0.29738938021208405,37.05371860164672,11.942025646425002 +0.15109464468925787,0.3058060848246122,28.376192479321986,10.030465224674131 +0.15092026978481918,0.30165547582873664,33.62551618104959,11.42170161383231 +0.15219612317402734,0.30941308524379824,28.255545906388182,10.405068037444318 +0.1502526850953579,0.30715345172804187,27.579466395650538,9.812116235797857 +0.14926894006855657,0.30044447103806055,24.724248903221955,8.17340271437005 +0.14827295038916702,0.3015139718887347,32.98376882644049,10.954790235308602 +0.14948834938608707,0.2984763002764802,26.703873590945438,8.697522258475837 +0.14920052994182254,0.3007602881528303,29.395944075338203,9.782117970214184 +0.14889528503040264,0.2909872996198546,37.49724028539502,11.254635462682575 +0.1526339208382566,0.2965342885069346,29.53001339247526,9.630592954595246 +0.15073555713512418,0.304831718129562,36.35748343338501,12.64444505272867 +0.1518608169778252,0.3047871391714829,23.513047664432236,8.236457378676949 +0.14996173832801762,0.307889181065468,29.64620660857909,10.593001040303488 +0.14876993672651284,0.30137569059980474,29.222946470931976,9.808569636247842 +0.14831698231468565,0.3090350217247938,32.94886262081787,11.84908585367105 +0.14922916240985257,0.30367907930970056,33.423168480748124,11.384824680410453 +0.14986845679461588,0.2989213409134879,27.06223561508166,8.827600986802167 +0.15024404872277405,0.301918515370348,31.77707339629321,10.682278853661293 +0.14938430977263206,0.3011509217102101,28.414422031043664,9.469284994657531 +0.1509499781033675,0.3022101309851175,32.88142400863307,11.110441908383848 +0.1507888503621036,0.296918931384189,25.582584363916112,8.253921281203368 +0.14894686001643886,0.30336337122284296,35.05678398313572,11.776661359979537 +0.15075415908753562,0.29403609481463133,28.15956218009198,8.847847959124518 +0.1487923772514489,0.3071790801833122,26.200664895081065,9.271040237627192 +0.15107002534773875,0.2950562071288171,34.96498761834912,11.046759183020216 +0.14988044029556732,0.31067720624280387,28.268991469140595,10.333312151510395 +0.15086750357367804,0.2934697612698689,26.751213005907324,8.364472794881905 +0.14885455717661109,0.30167510303048406,34.73100822539255,11.561228342351926 +0.1502541500449367,0.3031764977364861,29.816153569693878,10.209462668964548 +0.1503528360755281,0.30646308775558595,33.248669916170016,11.817149153369378 +0.15091774123042762,0.2901652349815411,35.17873521447297,10.547555735497365 +0.1495877173943139,0.2940223532781928,36.53360025977236,11.402314911228187 +0.15002257435210956,0.2947256698208151,30.90490726031993,9.699326698231832 +0.1519549058520446,0.29992409412345383,25.733870311051447,8.608871746396925 +0.15000211106029943,0.29471578772441265,31.6301514270727,9.845369551716582 +0.1489180567170011,0.2947507553251591,31.925144971068626,10.000493310630022 +0.14971059480000662,0.28988442502402495,33.795701993172,10.148910497686016 +0.15109356095862123,0.2969819921447525,31.306806646278783,10.120043224294855 +0.15198264220534038,0.304148894905014,27.483058629707383,9.61050647769376 +0.14897506862611645,0.29848599815535387,26.55579794295399,8.611612934212031 +0.15094964225346486,0.29550456245959383,30.337149502676944,9.634014184994209 +0.1494934582733417,0.294688995336541,31.436887522177226,9.84827084717634 +0.1513460882606624,0.3039522565981036,36.81068221816568,12.761237796387192 +0.14961159228275622,0.3075540757328494,27.729881230162828,9.859738438340095 +0.14904821060179504,0.3022214134123605,26.231863666208277,8.783562953794359 +0.15092536717519364,0.29048061037102024,26.570770026138426,8.08118916542722 +0.14997307458668188,0.3003204709074739,33.937665336028836,11.293134548622719 +0.1507379341674516,0.29771805021479814,27.24705703761347,8.836606922975344 +0.15069751389170552,0.304910509168307,25.651003207644138,8.952736151857765 +0.15192588820169364,0.30357719884366297,37.291391651642286,13.041536493999775 +0.14926661140244188,0.29914640686968624,38.6896026998953,12.667427663210246 +0.14867923868783592,0.3024091754438188,29.608991606465246,9.922620132013492 +0.15023055023452545,0.29522525162099744,33.10039732488627,10.48120791342317 +0.15005674450729864,0.2973327972026254,29.12398153162336,9.378592793622097 +0.14860231337978883,0.30526405618629127,34.15811440584288,11.79832423603548 +0.15063917442891148,0.2961681081232702,27.03122331875921,8.65065291660294 +0.1507794980345681,0.3044005089842395,28.920214700039754,9.997297650100334 +0.14969647245056217,0.2949170860834301,25.442222140669255,7.979398735359632 +0.1499364585256781,0.303731504858062,30.45917463345155,10.436651341363108 +0.14933179242065167,0.3017697152854228,31.421884684545105,10.582523966678865 +0.14890239606114092,0.3014754324546571,33.075336726605045,11.096719370441585 +0.14903699398636183,0.2966914690434083,25.46332963525938,8.127613506530858 +0.15019932349464388,0.3012439829248921,34.89887994161067,11.716463236742038 +0.1513546877921181,0.29528728516440056,36.2146324243392,11.498234482846144 +0.15001868941609428,0.30503672752671357,32.134543910383066,11.242015650973794 +0.151249720336153,0.2974595376618949,31.476501757241376,10.226516806565694 +0.14964099274873477,0.30902497554482167,31.287773027969088,11.312391907096606 +0.15126217046083892,0.29916032632769624,28.984274049023853,9.635435687264673 +0.1497821079999026,0.296815107908888,34.93741855972432,11.147102367427705 +0.15099872782302493,0.29622232316795405,24.72793662723326,7.969926097638872 +0.14813448603770774,0.29817423942352095,29.358431700961614,9.42017318438075 +0.15014534296993506,0.298666684137654,23.759845313360163,7.806113911938393 +0.15145504676205232,0.302830588500263,28.367106168001598,9.678751950038567 +0.14846861017124688,0.3055880429449785,32.4523568284763,11.281842842727114 +0.15105586892568001,0.3007656935422262,24.195492485674503,8.096330557185862 +0.148319430215602,0.30184185686371523,30.35619167529384,10.038249489220105 +0.14790869157292738,0.3013889225119847,33.29212571309671,10.980495133512086 +0.14992797029618493,0.2985458221960667,28.465090127518515,9.258350737998345 +0.15139042434189637,0.3080865611920626,27.123095627916314,9.821726008597887 +0.14853037414207285,0.3018217384497203,29.37304809625043,9.846609036455389 +0.15105307195557519,0.298047350982027,34.48556932002956,11.316443023021991 +0.14959842917846974,0.3019691734891241,27.591577968767115,9.269141395772568 +0.1493937208482183,0.30140470089916505,30.431032784853503,10.168539386477361 +0.1495122995268323,0.2985099040635329,31.730210905183917,10.285892283056292 +0.15034963921120673,0.30464752548532453,33.26205234186775,11.56507447635402 +0.14988711156120407,0.29971813325130897,26.299294227021893,8.71993811984543 +0.15170918938180084,0.3021648960917383,28.001030365228118,9.549338663473081 +0.14873455839735883,0.2953097338186062,30.976014616628948,9.727657006065758 +0.1482526294873665,0.2939687581601697,31.01641054391824,9.54685361604032 +0.14978834552647866,0.3035929370923891,22.85158145823892,7.854512110889571 +0.15064534357747447,0.29789532851811695,30.176549723443927,9.847280064415953 +0.1499353294298719,0.30214993796382983,27.801573658579606,9.430783415303049 +0.1508015667616332,0.295945246549652,30.817836313350774,9.807732270404276 +0.15119573930207986,0.3029512307649275,28.873206503399185,9.957238618867455 +0.1513343675066051,0.30323865051553595,25.86418591858291,8.934865588297727 +0.15102395343458125,0.2985337015093916,31.389621037245742,10.348530899458288 +0.14909935657614576,0.30150730327119424,27.744378344633184,9.321525363953352 +0.14799883654732868,0.29767847218769755,29.893882008354968,9.569892633358771 +0.15011830875101023,0.30491850217079497,35.78934919167952,12.490383370264542 +0.15036872420816705,0.3011543293618798,21.094531303016034,7.114836782941664 +0.14919508757361002,0.2974975525422714,29.01344616729451,9.348211204227884 +0.15045985120209265,0.30655280040476574,24.735846894397316,8.736340322571591 +0.15041882113366625,0.30374813801100814,28.616751866594097,9.843928472718217 +0.15038618106089033,0.30373284430420855,27.944221781204686,9.629999296666975 +0.15024740511423207,0.29996932997606574,29.593343089564843,9.84068807077319 +0.15058812941131425,0.30273651725799045,25.23530118615858,8.61100377122666 +0.1491852140120376,0.30020353774738756,32.29292094353527,10.634007524510153 +0.15055205305303637,0.296051018661512,31.93800930584642,10.160357681160134 +0.15218479630266712,0.2982949607819614,29.971809077698108,9.907797520622855 +0.1511738422813631,0.30285061158479437,29.000360073039403,9.890843427806097 +0.14898502676481884,0.3003609857685698,30.76287184959528,10.134151616260668 +0.1492396885005696,0.3129014897025312,23.355609958695464,8.703475850297787 +0.15068954056924036,0.29995452377227644,27.121918716032788,9.024102312186214 +0.1507193145356798,0.30278014745891574,35.59357881226246,12.152839289383953 +0.150177677631047,0.30511608999874107,31.566935426586223,11.022630571887593 +0.15011029301926526,0.2963720663850639,30.311736631464964,9.67237331042449 +0.14956646868907353,0.3004292489549872,27.66734872442327,9.14843010753461 +0.1501764198816447,0.2971921821852169,28.411789008120525,9.13535444925497 +0.1492675846839113,0.30384110553014265,33.728642160264414,11.521214151125157 +0.1503890913442549,0.2989649137423486,28.242903769900597,9.295181418102398 +0.14960555952363722,0.293553399403261,37.67793676897928,11.665375312183281 +0.14923607342729084,0.2915876610197609,31.834189496829204,9.640339761258684 +0.15099895342196842,0.29735154818652115,34.68469994281711,11.225876704501749 +0.1492827961276359,0.30124835697004815,34.484560252242304,11.469182395128254 +0.1492082967198867,0.3066600147515532,21.763527165537987,7.660706528670348 +0.14958476575920931,0.29942199481592974,26.921301094569905,8.881571950254422 +0.1506170764470775,0.29850584179353995,31.50486206284666,10.326942358209852 +0.15066294330778884,0.29475166303611866,30.735251397302076,9.711031403177827 +0.15039960373806469,0.29954917423541405,31.871453513816324,10.506725096610086 +0.15038360651891883,0.30411495802183575,33.26839520643552,11.577601241918899 +0.1492926676191027,0.3051310236502594,25.153593482107887,8.81757472533746 +0.15014933242000017,0.2989386644363175,34.85654342933141,11.408159297309084 +0.14956983781023406,0.2984828686931834,38.59989520644059,12.557841048532621 +0.15029669082979438,0.29331654060769496,40.72087411938509,12.646674697306084 +0.15023816923574768,0.29884688804984266,36.29063056354882,11.832952337682643 +0.14895810851794447,0.2996367895458192,25.62607699798423,8.417207112018616 +0.1488229926662229,0.2931306845847303,31.55811453592786,9.683485319239631 +0.1502748830994016,0.301770028414485,30.941466540406875,10.454513736091233 +0.1508183994939936,0.29918292101924415,34.01787246782353,11.286134659568411 +0.1514334614877137,0.29988294228244283,34.64206461325075,11.561536513701439 +0.15033309990750587,0.29396369704077635,26.300653658882407,8.201538236375109 +0.15094790279978304,0.3060515324844584,26.730576716823098,9.43164559618192 +0.1503674619335804,0.3025815567833557,27.262460287968377,9.31417153784119 +0.14684094116674157,0.30192363271123435,27.70143106974904,9.157390012175188 +0.14975083901151065,0.29790376733011875,27.803517043271256,8.976639705138691 +0.15044620884782595,0.29930461804864894,27.156790697383784,8.997593963729885 +0.1497411878489146,0.29777805027618176,31.604816642515875,10.223777170729724 +0.15083253984836467,0.29808375848817104,32.3134871578629,10.586429678713277 +0.15152855995812176,0.3090632737764064,28.47696369625653,10.393508968594054 +0.15101457761939477,0.3032977344742639,27.945593617016996,9.625998452445055 +0.15084310819275346,0.29349565382900866,33.27676958626664,10.345389243771228 +0.15085491554265365,0.3021933198630372,27.261326767905178,9.265981532123753 +0.1515868072944303,0.3018349219664475,29.64395409537417,10.07895309002416 +0.14838051888977336,0.29645714146121155,34.66521388793286,10.99298187546579 +0.14872113936317696,0.2941752177513343,27.781412503624622,8.620205033640095 +0.1502716106006808,0.30378168186319754,25.87233968068197,8.905886652306144 +0.1494606526771229,0.3020408078275209,27.30000410744591,9.186713583169913 +0.14805998331115525,0.2975410512595198,36.70432634026305,11.796432676541592 +0.14939314291672123,0.29986858004746597,27.077631190859677,8.993470264235327 +0.15075588720167263,0.300851483012567,36.19917270759613,12.13263943846799 +0.1509326389534458,0.2949754078922568,34.714724827496674,11.054291212413816 +0.15138858382758066,0.3026131209002586,30.872036145440124,10.57373967140795 +0.14914178436387637,0.299862319809515,26.01755515227816,8.580735530277664 +0.15056881562648386,0.29989240234088904,31.724061970127636,10.560745395334024 +0.14932912910274593,0.3119926784972076,29.57576466418941,10.990776728060661 +0.14849213766759733,0.3021364196609171,26.74580161668225,8.946538982356994 +0.1489334197655789,0.29629806538814013,35.86520034650329,11.350002670987365 +0.15021677976924774,0.30884280321231333,32.09587365314105,11.648530821805952 +0.15059299335220533,0.30375425050143195,28.968119275752816,9.968512642098972 +0.14998996156300157,0.296154015826597,29.276427907885285,9.344756810961114 +0.15172035565235537,0.3007442121371496,37.867350920028564,12.83717119189501 +0.14922456403041703,0.30081981687462594,32.65276024835169,10.826367218164261 +0.14946741916897519,0.3003101914027999,33.34297461980381,11.053973528829186 +0.15025543263372534,0.3021579851506451,30.439583502185545,10.29373220196607 +0.15003875660122135,0.30137417587092735,32.03929910258014,10.776538113346524 +0.15018023203048453,0.3071920023937107,27.78105138876704,9.93264274322018 +0.15001859654708857,0.3065685034975503,25.7854819832491,9.16053134037225 +0.15128749381711218,0.30167273334308414,31.59540513858968,10.664974133439017 +0.14991605630840996,0.30490508912724984,30.770290161367342,10.726798199225577 +0.14966519845196866,0.29733707229006023,32.699495539775356,10.45925635131811 +0.1496623004039936,0.29854373731845285,32.000981333811616,10.47013988798992 +0.15099125429728752,0.3014235424295824,32.10478019388745,10.84083825400878 +0.15064815314581614,0.3013209615661064,27.466591156527,9.229790125419798 +0.14945301106507863,0.300933377550713,25.149835842268544,8.334603512835368 +0.1499615756808566,0.2976613455549162,27.470437040736073,8.896065969535172 +0.15193734316447108,0.30055628284606034,25.486926591736097,8.558631151434192 +0.1501480262652061,0.3033407324860105,32.29919319780624,10.981026935595676 +0.15027217644863589,0.30125412783275807,31.93838404739987,10.63735841178267 +0.14962706740198267,0.30330944144611965,36.501956901450455,12.48136982678313 +0.15051835166125535,0.30061714886699126,36.15859907808126,12.08208306644241 +0.15105173234262076,0.29651328318625236,30.532276263999833,9.84484153064835 +0.14927044761532215,0.30301188555432196,23.41575012114615,7.885288830626537 +0.14970159891164067,0.2989857399528463,27.527391313482664,9.000159347592957 +0.15076835996938107,0.3035918943696703,31.51159632084542,10.881764143778913 +0.14742774186063176,0.2964464146682,30.618276499884217,9.594209276427293 +0.14951862628074358,0.30433446958978405,33.87006542192904,11.762052428429033 +0.15157279267562157,0.3017088544534536,22.635261502301322,7.6924489815960975 +0.15029126933672765,0.30097597348049193,35.09474330854233,11.720130278117585 +0.15013517563372422,0.30206146571327014,30.873859477451543,10.429549112415577 +0.15150136733667993,0.29278887499200396,28.486946950352777,8.908175577480772 +0.15108611992470827,0.2929763473045553,33.23617001638077,10.362973147352905 +0.14889635849214522,0.30532178221377543,24.005144179498075,8.309769374931872 +0.150937685638516,0.29593633189772023,31.881305074622567,10.188644452330943 +0.14998654077364318,0.2931192437911638,25.91754274596232,8.007533983466832 +0.15001372525248866,0.30246740777850173,28.583944117863012,9.721550051528311 +0.1508059402373685,0.3033347795517856,30.388657534307782,10.444991035255544 +0.14918613954106863,0.2998074160659683,27.33758190080939,8.962927060864109 +0.1510236003438804,0.289987662392049,31.6555682613191,9.472140840876072 +0.14950143644270464,0.2997811181288079,23.073341875991286,7.56832995873447 +0.14995499538363685,0.2945212898066783,33.76754668725887,10.592191115076549 +0.15107291062233838,0.30028824095241424,31.604892867334573,10.539783860010711 +0.14897744160366866,0.3085046054170418,26.45831618482862,9.420444506685868 +0.15141283023521593,0.3015041341878187,30.136922764413423,10.185229746053519 +0.14762666649594935,0.2993637662029128,27.291392295213935,8.873284770562869 +0.15006423875398403,0.29989562891229926,32.41392338278956,10.75243625106582 +0.1489512208018944,0.29637795881969037,34.88342010337186,11.067613438171369 +0.14852318123230684,0.30419513252641256,35.9896688877274,12.331662807356187 +0.15041761172546658,0.30094156366002434,33.29561415398657,11.20710952724135 +0.14936673570650297,0.29934612429443463,35.63410509301917,11.596052507269599 +0.14999615201392985,0.29716737188817866,27.245571049802972,8.742134763668354 +0.14901868450845251,0.29432479924205845,27.04880734044346,8.369919414820473 +0.15071597819450855,0.29992889311433496,34.181118301890436,11.300229727379396 +0.15018866456604216,0.3008217376428249,33.44091945765427,11.220056409410645 +0.14794387604954953,0.299945474345407,29.198011113527915,9.514176261026051 +0.15088968154762258,0.3022619673657594,28.771051319827812,9.76649300418183 +0.14914889985130467,0.2978580941484519,35.70690459936236,11.522204684134268 +0.15025996788273904,0.2978002544553836,30.214609929955195,9.816563407186466 +0.15026618887022195,0.29870525029477446,31.80347751078522,10.43956326575468 +0.1500137539124828,0.29708434099728376,33.063176596445494,10.686008637865871 +0.14953949754577628,0.2916234793561537,36.32707234013692,11.004653642711645 +0.1503129480106543,0.2988898825982795,35.19959801916428,11.56929031067122 +0.15170443049506974,0.2996211150114338,34.447648197249144,11.432129182682546 +0.1501752195272987,0.2927535344724037,31.804551205309274,9.825265260870875 +0.14838358741597696,0.3004080293425511,31.093975537133975,10.183096364258576 +0.1496067981768419,0.30211837611273085,27.63191929961708,9.32010694088763 +0.1476939995857755,0.294806881413546,33.96506422008545,10.46960718282136 +0.1510533905869901,0.29829219621223013,33.406410205237215,10.957776374901826 +0.1512242049490659,0.3032870134995776,33.80445147157506,11.670589657708819 +0.14916744963982242,0.3061261883443064,29.407473356573654,10.303071677091312 +0.1501204022371424,0.30217714612460683,32.71552216260066,11.097094010430462 +0.15080888615692886,0.294735017358906,31.456994421047533,9.933285342533209 +0.14978579080645862,0.3026652664402885,30.19299026386127,10.253523750369805 +0.14823173193558636,0.30018954236847534,26.97234864159212,8.862328648479297 +0.1508816361315773,0.2957853667688422,37.42465495206485,11.96280147088533 +0.15033343762128457,0.300561720799264,31.721720170211864,10.59817170291047 +0.14939919409839245,0.302508523376945,30.305380707156544,10.233033207692523 +0.15006763693664407,0.2981711107285202,35.855512776273734,11.619723193631305 +0.15002520749919218,0.3026130516136215,34.593621498129615,11.770056402184327 +0.15062667677313957,0.2969836196710375,36.20042937635599,11.695876578225128 +0.14956622090726757,0.2982735185074939,30.680841265240353,9.94572882688327 +0.1501291804880908,0.3004859160830332,25.736741820372078,8.580036312323314 +0.14957997111358565,0.29607779323199995,25.897047668044394,8.240589033330718 +0.14990880397586995,0.29745501312143396,29.39660497745309,9.507115420622418 +0.14810116189704758,0.295115683198499,29.54458089848283,9.18348460222281 +0.14913530822175125,0.30270925072468485,30.485640208739824,10.309818619860062 +0.1510290807570725,0.3020427974475401,31.853770023353228,10.867387555148479 +0.14869509840329742,0.29926660885657236,26.51632463548105,8.672069524224176 +0.15072078078182774,0.3017304271744159,33.361510264567436,11.242310713831738 +0.1509367605754511,0.2963234152522311,27.68947073760433,8.896595134724901 +0.1506830469350529,0.29694822946232674,26.434389760897645,8.579453983659022 +0.1504977494317284,0.29889582470758785,31.24640089011988,10.254247797759087 +0.14906374205329614,0.2989539374740569,31.910509296208765,10.386106879165496 +0.15043294783217107,0.3022923578103525,30.479594507469496,10.385825502885126 +0.15103033376788386,0.306558769330646,29.114676009900517,10.375406011182175 +0.14813800100510763,0.2985758406645905,25.983801171498932,8.375189142157899 +0.1498239478978008,0.30395755867524604,32.049911180077785,11.021361371939852 +0.14830487926303187,0.3034081430133935,32.5471203996736,11.06495093536526 +0.15053478252873861,0.30453961152271075,35.59144116307631,12.352695862727236 +0.1515203393270186,0.3079747960900987,37.123394827212344,13.498755986199946 +0.15100960549879305,0.3007039491224379,29.256633260245682,9.837151677984464 +0.1476158617298777,0.30236277449305604,27.234355514259505,9.070490729137697 +0.15072330919523244,0.30253145915006197,27.59895360141533,9.46514951290072 +0.15144397693259856,0.3025853020045724,24.047993818909195,8.25354725186766 +0.14976916870570445,0.2999385961403044,30.719932933637097,10.065942738556982 +0.14945411194360014,0.2945401631480439,34.96909307431436,10.920156468596382 +0.14856798008792343,0.2927448735811818,25.072014310215835,7.636178913210427 +0.15020901157943053,0.29956654801610744,34.99302487141387,11.583192757805296 +0.14863197041458337,0.29797735622241217,34.783059379367934,11.161632465566225 +0.15110530025835425,0.29921596374742093,28.251532981484026,9.31401755151908 +0.15048452882289368,0.30011501010920477,27.967516910313158,9.352098923992132 +0.15243895483406758,0.2975008420199631,21.650865789222493,7.107085211072656 +0.15067138335718613,0.2970915417518866,29.99061812260256,9.721014478828373 +0.1515247804056468,0.30317031349612356,33.059729283195736,11.361672418892676 +0.14953099259110703,0.2921683087911748,28.431904907272767,8.670840393366774 +0.14957457977824412,0.2914517733387389,25.781854344021617,7.801649019914036 +0.1498902377627716,0.29626303964398026,25.097552230910587,7.981953616048438 +0.1498006955516171,0.3095514188456642,32.96534165555802,11.937590414783557 +0.14992211996844215,0.2956438729616089,27.499617964178434,8.690186643323932 +0.15056435963681028,0.3047674293501293,30.56532167665073,10.669978065969064 +0.1495138894325046,0.2880664905932088,21.883329271507712,6.417950263282249 +0.15020964920694496,0.2988724279659941,29.283225588971106,9.6107859898356 +0.15082697546186735,0.30065932155023306,32.85995724210435,10.991574391161471 +0.1504118438320323,0.2993437012961043,27.91229244476032,9.215587839641776 +0.15237753531682657,0.29977232642238977,36.54926100909067,12.257913980499692 +0.14916746084735927,0.30571841346496953,31.318280451474283,10.906867446401455 +0.14980871251157968,0.29196342457094177,31.089335366468816,9.432312685067243 +0.15052803513510668,0.29683738691145545,31.968677448488375,10.281480808269658 +0.1479024251901781,0.295846705780382,30.941350264546113,9.691274285405807 +0.14897218005543578,0.30015655339358105,32.85721050937354,10.823515432651437 +0.15114125169489967,0.30204159106289247,34.08228645353533,11.584930382793006 +0.15052720153998558,0.30171089751491736,27.75606936023637,9.3793462284118 +0.1490189532116427,0.31339213590916637,29.282629468392027,11.020600640177715 +0.14931858255736838,0.3045059111676515,25.364211422566452,8.737833109831781 +0.15020911549698143,0.2996736504595719,30.93095963370729,10.246001443613583 +0.1512471836611624,0.2977910292707081,30.089065165671336,9.803992129689632 +0.15189530899743495,0.2986461604770501,28.20517986604195,9.351932241057213 +0.1508691292370478,0.3051062150010043,30.058256235097634,10.495639055747139 +0.1499322836335957,0.3043476505734612,37.46630126977707,12.920569432220635 +0.150527559254552,0.2964948641735151,26.746121279229676,8.594892458484802 +0.15054727252357028,0.29966143130475625,28.27589033133696,9.364626273409906 +0.1495166882833843,0.3025465284559638,31.6187293525856,10.743421113529362 +0.1496149122080071,0.2988446072305597,32.14063234538184,10.527418153830086 +0.14822810549607887,0.29855471406750284,40.50216035830114,13.045942907881523 +0.14958110380085657,0.29622429559008806,30.042987888871412,9.613133930636812 +0.15009866425000715,0.3048230748560001,28.841776676405694,9.989615941981587 +0.14918783620076195,0.29829332209061327,26.090096135423217,8.430721543889055 +0.15089008483345806,0.29462508197623516,34.78567159799842,10.971799138270168 +0.15031324270911942,0.29584364657253964,27.360308007465825,8.700360249968233 +0.1490067256156974,0.30586547270079606,33.96027395289742,11.86044751949246 +0.14994735727886896,0.29999057568664284,30.24169409691199,10.021821587565075 +0.14986122000819457,0.29660596655518484,32.17193130267108,10.326364992280173 +0.1514659648717259,0.3008358517144191,30.51487565645458,10.247957704262044 +0.14934166676786056,0.2988898854693365,37.05438062622995,12.101372536950185 +0.1514357648599,0.29436326811462066,33.527773857055976,10.607357023246358 +0.14935547119016884,0.2962995151275229,29.8841395530142,9.446401141681639 +0.15039603376297547,0.3058240216010291,28.068024960179443,9.848597907580814 +0.14996729653090501,0.29975602550900576,32.67036288114924,10.756640194378935 +0.1488991565664524,0.30566500198673685,28.105002025050656,9.848045414433072 +0.14864280712223094,0.29771316528132863,33.78668686487765,10.843820787728273 +0.14887351854828854,0.2951575289930031,29.093557734549307,9.082114271091546 +0.14938027195051046,0.3042836205209738,29.29201755246359,10.110029547405741 +0.14891354401303153,0.29509796621764844,36.33896817961727,11.39053179135551 +0.15113669043137987,0.3023279715822817,28.639375334428042,9.81310299978404 +0.15052272848766524,0.2999170936947808,34.913787003027835,11.543948571053724 +0.1500252556185344,0.30435383123377585,31.414343797073936,10.828464232926 +0.15068956020418137,0.29643931527458756,32.2446765564611,10.393210941184396 +0.14858706217324727,0.29791320239282176,34.30211782006229,11.060143320312433 +0.1502274209983394,0.30129035948968425,27.916171561600315,9.363678586290343 +0.1502265069004289,0.2970912447943692,33.76873550401297,10.858090756806757 +0.14988050973352157,0.2965877609370473,27.545067302340406,8.839018737190695 +0.14848026919664828,0.2995691535953948,29.607332868993275,9.625359862745617 +0.1505813509878999,0.30088642359710344,29.55176898364864,9.925190573280528 +0.1509229185814729,0.2997843622412984,29.9712161995814,10.00939843856159 +0.15107011097115747,0.300000621920198,30.81194368297223,10.258691685885609 +0.1492170096696856,0.30070771529744617,37.506390657732695,12.475251818368552 +0.15000423669964397,0.307713162439284,32.38927368627511,11.597845364038426 +0.1498798536213614,0.3064370633147597,29.704236775236442,10.525736870788263 +0.1504176478965641,0.30117906931284427,32.637321267897384,10.970785593132737 +0.15194528249256337,0.3049053065387763,30.245800043204603,10.649854805371916 +0.15085633435763687,0.29695610675817086,28.52881167630997,9.228645262844987 +0.1512214384406079,0.289955649363796,33.39641694979857,10.082530387363066 +0.14876669386805672,0.3084198096622454,35.38609048143071,12.61738068526331 +0.1492980527876731,0.2916488087442748,29.07169849936675,8.847135360170599 +0.1508140668907221,0.29391335449230316,39.503654374452886,12.366217229207333 +0.14965989468233906,0.300212058617775,35.551514648235305,11.777463542519078 +0.15230251647049375,0.30499636388842855,24.892018318160332,8.789224160734591 +0.14948378829391232,0.2896675413672151,32.910640350527125,9.812529234935022 +0.14891461207732828,0.3048768140604178,29.44658371926898,10.130587051305382 +0.15037065525049279,0.300307910281548,31.359361773172278,10.455096844860542 +0.15198094096467527,0.3028770800716521,37.35490171463296,12.88725329435983 +0.15007239552825205,0.3022284718225873,29.784375187623425,10.142038499756614 +0.15050842902699438,0.29564889145887113,38.11425141742676,12.139267826207918 +0.1496908433526373,0.3001025493340731,29.172366850873175,9.647477218564111 +0.14896322030323522,0.30203656932377193,29.37823289361273,9.792395477861124 +0.14993481677988327,0.30169299876207045,31.548994585398223,10.627899187689952 +0.14724446318997697,0.29961403920452073,30.746484693573542,9.980440979504785 +0.14840156152653608,0.29850862010238655,34.58554484358456,11.151374621223978 +0.14970014472678264,0.2978662446870938,34.93739547047796,11.324639201111518 +0.15008693225266287,0.31120615852848216,22.785055005035783,8.445986831804309 +0.1510068729769792,0.2975969834002878,33.364789040028946,10.842024137827318 +0.14986308082535857,0.30394543157449244,30.36708525477716,10.46064206170533 +0.14999417816297356,0.298699524938535,23.35615347859842,7.624812148029841 +0.14917786476179606,0.2896892900632804,33.60566948833966,9.962832075369574 +0.1496564852955943,0.3023315201934147,29.910749115122886,10.13532608098323 +0.14989096029553303,0.3015594005074382,29.962681107061627,10.07448710361358 +0.15099152743702818,0.2980664045686478,25.864971662339094,8.455933057439545 +0.15000195991331366,0.29022719203342534,37.15389419105281,11.124104230330971 +0.14732159894226532,0.2944248097371885,28.9442618085757,8.902662571367227 +0.15060641865651012,0.3029626505486804,28.832894045907757,9.88253862130696 +0.15175533707065642,0.3024543550754417,25.967765633133283,8.926422475105827 +0.14922166228034395,0.2996031594590853,24.072895206766074,7.874507522159357 +0.1495974524561277,0.30149968194178745,30.08102670913384,10.15752359771379 +0.15030369232994675,0.2977802392533552,28.929508941792353,9.385589435460103 +0.15047145784126828,0.3091227961115721,33.453919277423395,12.23423492550545 +0.14979968222080933,0.30869684968815564,29.1240331719265,10.515182765634954 +0.15175202020452652,0.29978662983013693,24.6182210519918,8.230811076383706 +0.15111664367414696,0.2929350094907366,33.8070186665512,10.493042771003543 +0.14773141658685507,0.30607896668907947,38.98967597357519,13.544809983048282 +0.15048592577426922,0.29878713049232064,26.437012745649692,8.678134751206814 +0.14860420096978091,0.30230835995059174,27.72777258834572,9.300707687431101 +0.15033857813973972,0.29898312387821013,30.242799146657802,9.968959689094193 +0.1501744352338197,0.2972616334358997,34.0690912287057,10.994471489005111 +0.15077366270278045,0.3070321211120317,31.577679594850753,11.245284211837168 +0.1493241753644689,0.28674473066892975,29.456352127605292,8.51200181832041 +0.1478064272661276,0.30505432656709514,33.835177705221355,11.590950243971786 +0.1505774285902777,0.294560162915343,34.22712842613574,10.72403014862635 +0.14926900797162154,0.29895090526510254,28.007679866037286,9.170429441547109 +0.15100579517590748,0.29166961934724706,37.613694721406496,11.483456086165248 +0.14778256094339723,0.3044204794036007,28.276269757243725,9.64385619069253 +0.15048855839513084,0.2902302281460755,33.02458259298037,9.955742388369185 +0.14916755359347547,0.30574124040546263,30.335564879439982,10.518654547919645 +0.14856133614992226,0.2981573998111574,31.13901131765107,9.974524641155586 +0.14886770353586712,0.3026241367369392,39.0054792454266,13.206429102868348 +0.15123834622570734,0.3024339978455535,30.37779539160693,10.34128559347785 +0.14896924427864364,0.2985398389688477,27.69811415336275,8.975303452126942 +0.14989465091262683,0.3028398121113737,26.691848022855588,9.067952102646695 +0.14900125815311938,0.29427807199618483,34.69372234963657,10.763265927519457 +0.15012800941965512,0.29896757939988955,32.52707625302109,10.72483526325635 +0.14896763672399874,0.2956297048716726,29.105496923372485,9.139690009810595 +0.1510095734377822,0.30157313627069643,28.041499549481767,9.492583904282302 +0.15002612834017148,0.2991004427329808,32.66359320975826,10.684455039595068 +0.14935291167696893,0.29188246346721447,35.82420320821113,10.865994594070365 +0.148930753573382,0.29170717525589995,30.651700834110077,9.216494694636975 +0.1491201210648723,0.30743677326365626,28.9237296966962,10.242124792689873 +0.1488128520083098,0.30422749241349867,27.570868774851107,9.38837645971629 +0.14936186508401317,0.29609047874087924,36.737616308451706,11.704560750742143 +0.1503536399264487,0.2988513317709341,32.07128281234893,10.467220668550107 +0.14968514564629695,0.3033158747234857,31.195580302653866,10.63128252851007 +0.14940747341388372,0.3063282989236877,33.10768514992995,11.538294337126352 +0.14935097113494486,0.2982184420631594,37.799352996109505,12.237690897707221 +0.14948755911539913,0.299896697619842,31.080531093369164,10.227364067411656 +0.15108574145137174,0.29556980989193826,32.52853372346906,10.3807612010461 +0.14923022771449942,0.30398469955910423,32.23819002851473,11.03872272932681 +0.15077514643881865,0.30066407404864104,30.904446062744473,10.369327423043895 +0.15164312556257578,0.2990816996631193,28.57204817108694,9.463817672084044 +0.15034817272081039,0.29429165616988623,31.96820599336816,9.996467156689155 +0.15008002057169414,0.3085144442166189,33.50378237681346,12.068551749304376 +0.15168152183315847,0.2984382555973805,33.171127352305824,10.960291375605097 +0.14763798205510104,0.302755150993925,33.3675500554672,11.188347029656578 +0.14967276125566992,0.2964768111929752,31.179787092686556,9.987883627481677 +0.14995052511842089,0.30270949910514416,35.879603289500636,12.171853657803279 +0.1476496015440522,0.30731891581191495,26.608187235868897,9.253813084500436 +0.14979747703184182,0.29914297820385344,31.6992151657291,10.436932794737087 +0.15036996130707483,0.2996290087383762,29.36445062956181,9.700214374704615 +0.14951088846188748,0.2991240739592116,37.302322599505175,12.173233430849326 +0.14990952257728607,0.30498428997612653,27.575936816078787,9.645056387359476 +0.1506024417954991,0.2982149870435256,33.84410044419234,11.039655582056586 +0.14941565610824922,0.30269401376813276,27.673236226362214,9.38072767472633 +0.14935653419745867,0.2972316726355529,26.459513695576813,8.519889907212963 +0.15034619453873455,0.29826118688405157,30.018066383633442,9.803343078629663 +0.14824270056919864,0.29953624994742994,32.29152288145788,10.46195414009125 +0.14829486237895032,0.2952601939462196,32.041579676760584,10.045994770127374 +0.1495483176865841,0.3028689123938377,31.905102481804825,10.86627170737425 +0.15060847348222262,0.2946587973050093,32.331126670766274,10.165927890397915 +0.14877148654725128,0.2973654914017494,27.589606473519304,8.87423677170513 +0.15093853085285633,0.30356885576257364,24.29356600897471,8.433810667069713 +0.1484150564116612,0.2996020609305658,29.013486390589364,9.471226968349903 +0.14974728380113397,0.2991960724669115,38.479467441650534,12.672399043975279 +0.15041623134378926,0.2958220142843137,34.250376901748446,10.912395141046838 +0.15039723001587324,0.2958192900763976,27.438832154094058,8.758253472855051 +0.1496213497245857,0.3031862780052477,27.145335742023097,9.240787777012562 +0.1507335733456856,0.29489015007701436,21.996937643645015,6.911074855230369 +0.14994837458031549,0.30480959012181186,28.880256929370557,9.994587168667703 +0.14892955227798266,0.2998049260297808,29.50286362880089,9.698570973924685 +0.15079364029295547,0.2973367608647315,29.25986697952863,9.472131824358128 +0.1489897882812155,0.2940538659978483,32.207631663257025,9.988222890392136 +0.15132294426315115,0.29209846362898856,27.445562364428323,8.452489802895817 +0.14968012303706404,0.2986486427303969,31.736089274152295,10.38522811136267 +0.14982222204296783,0.2979044931141044,37.59949579750225,12.188160566568948 +0.15049154835354348,0.29850158128242715,25.212214052189623,8.283537090356171 +0.150369326272289,0.3030893953700662,36.88173728819048,12.650215702585939 +0.15043402036582945,0.29643084963385224,30.24736283844757,9.623714537608368 +0.15053893678008143,0.2997600127654389,31.9112660326813,10.609302279229807 +0.15070298055060644,0.29885549411288603,27.720022152370458,9.111265911311907 +0.15020619370799074,0.3083728671632446,31.28111048427418,11.271043379770273 +0.14850278419933452,0.30109403328217715,29.955173643419986,9.935081287319292 +0.1495685853286746,0.2912853366038912,35.68645900127483,10.788105521393948 +0.14941037729604192,0.29560090126079264,31.209077027714027,9.873645671689829 +0.15237487638363023,0.3012558753540944,36.1396464222715,12.36605948618309 +0.1509183350045229,0.29949213597654406,33.67983039587432,11.214600355945327 +0.1512639339746326,0.3020244101506172,27.176593211766242,9.210257975869581 +0.1513060218981293,0.3011194432541889,28.378362883644794,9.597806323294545 +0.14916548853416908,0.3053376445264287,36.54292541370676,12.72790195657198 +0.15019903172890167,0.29653904927699953,29.763313915514285,9.588910323945578 +0.14803633986788978,0.2987713764794884,33.704847985443536,10.885475350338126 +0.14992693798238738,0.3001308785761139,32.10155798303616,10.59817180458969 +0.14945607801578312,0.3066097991369827,20.677754947807667,7.31458741730987 +0.14936149526160059,0.2946531826269788,29.353966883727157,9.136693437230443 +0.14842637049092258,0.30231390710500855,30.726673694174274,10.333354488079568 +0.15036454875251018,0.3009337262583554,27.94601562241559,9.392342121726884 +0.1507433864127477,0.3039369530372789,33.210124784592225,11.54931938463243 +0.14882338343393606,0.2999167307326857,31.300513203363273,10.28573097907366 +0.14936511958533982,0.2978899374360118,27.13762066452605,8.745230845042599 +0.15004509760551735,0.3121747037511047,27.223813910959553,10.183258932000975 +0.14962144162065646,0.29513392715019315,27.811170986424617,8.734631310124895 +0.1493703297245617,0.2955040696642449,40.72075313303382,12.899352917078122 +0.14912284142533444,0.2968354987710728,30.80534377662007,9.793629925502563 +0.1486433832010338,0.3034305311241754,30.501747914534892,10.41818975063858 +0.15156955389972887,0.3010023840286287,28.18771443914046,9.539312332094283 +0.15070284893189362,0.296821484652287,31.75290882594675,10.233887091153015 +0.14820328187416673,0.2939635857091676,36.15611783209857,11.123441184379374 +0.14961524202391252,0.30540549333451034,25.773909295932828,8.967461665919046 +0.14852123994275365,0.303345854564181,29.44445425976391,9.995818427934164 +0.1500279996522272,0.29451913232840315,27.675272128031548,8.67069598594607 +0.15016583888284507,0.29478329329794967,31.667412427686205,9.969842445194951 +0.15074326491673992,0.3049079976968613,30.188924100931313,10.523473364286552 +0.15116874788587056,0.2942452573600888,36.97549864905807,11.6144951136105 +0.14887704950754382,0.3027640987203028,32.056288989286486,10.799629232097987 +0.14827447429757984,0.29930106936574313,28.921863541258748,9.394477697303614 +0.15025084700925903,0.30261570109488956,31.349164529526462,10.653555033654058 +0.1470584218607265,0.2980859657694158,36.15444618178909,11.490333563813492 +0.14712976211860232,0.3038254235157501,23.554965312381228,8.01005674988358 +0.14929371441248226,0.3030347010851166,28.752313936268823,9.812561075021252 +0.14942245946941152,0.3105450516623863,28.147393911978742,10.289569727346931 +0.14994124751057558,0.30434247841766576,36.41564690658018,12.615297581157886 +0.15041600295970586,0.30047935067582504,33.92848887642686,11.345858051340354 +0.1492297463926909,0.3012417812051819,29.879038420923518,9.935954092260474 +0.15028486685580042,0.30419080195448983,33.435666862621325,11.564221402161284 +0.14975741766409373,0.29703805385374604,29.48314915825477,9.409584395117703 +0.14984177362601503,0.30297871902610113,32.37642612150913,11.076635876617612 +0.15074703016309415,0.2990666471043573,33.80923313328867,11.203894278995381 +0.15077836293640656,0.30243859962630965,31.27161841445128,10.68402937925728 +0.1494111276449715,0.30247723090918416,33.48409641232628,11.371689680811881 +0.15037795862091485,0.2962450680675679,32.94272495124692,10.50452289039227 +0.15046923736910248,0.30007952297787427,33.145595494331346,11.02405563501966 +0.1498322992142315,0.29616666278973197,26.749294423184747,8.527147905492836 +0.1516247019771861,0.29793915939891547,32.96158384035529,10.802201849679731 +0.14800760080521488,0.3047344725920896,28.550689194643244,9.747183359410737 +0.14882830919817405,0.2991130949982938,36.46571990497994,11.888958028540173 +0.1523989870137238,0.30729643713866445,29.706522990827544,10.685276944601641 +0.15029716627657774,0.29186405607044985,32.197226290434244,9.83325582396172 +0.14794680396580245,0.3078230610617153,29.697071949608137,10.434151719027476 +0.15092498034035182,0.3012773320414277,32.94348755068926,11.054685585687508 +0.1496979857414595,0.29757610711075627,28.37094100768026,9.141916905449506 +0.15168385126874626,0.29742510710855197,32.40317375033911,10.632726633963207 +0.15163851489104488,0.297780393297562,29.42314170999978,9.624565942021144 +0.14878670244962217,0.30363815463550076,24.90808548247289,8.427820472035355 +0.15120976349572732,0.3023990500813756,34.587735784909,11.829221768025379 +0.15240187593429178,0.3010293301943819,29.88097596783993,10.179007781059518 +0.15008276957758526,0.30279579787618577,31.19844246639446,10.612251681382192 +0.14790564940273407,0.28899923723894383,27.570864044735767,8.107963837249777 +0.14825065131910714,0.30114020134000974,26.549245923165934,8.800865789642893 +0.15128351939828763,0.30302175609109744,25.74601759927487,8.8649513110186 +0.15130931660459537,0.2936985971781909,34.40277947700914,10.779466319929336 +0.15079520564085203,0.29308300510306007,34.267179148397936,10.535502056871117 +0.1492951504653158,0.3033000858483651,25.544685889766985,8.702974658355021 +0.15090966749230297,0.3096888418980245,29.769388536754242,10.850189572400199 +0.1518557909996164,0.3026499074940581,29.135972765306267,10.04110706017011 +0.14952884549219642,0.2986342740238656,33.08918355717275,10.772624710301033 +0.15124842402942196,0.2955763158282231,24.026945916890895,7.69070709195597 +0.14999945715726432,0.2984295126585671,31.939564223482673,10.40604290756835 +0.14889464205216732,0.3035987065561859,29.188950042678833,9.919934951005317 +0.15026522100028816,0.3020283085466606,24.54099314348005,8.288251140018547 +0.14954314385688236,0.2939754309900081,33.173059040732205,10.312777422785024 +0.14970272507408455,0.29768306363394675,34.897162561709905,11.314770639942527 +0.15271868726180066,0.2912164128602422,31.16995964701568,9.657639548182411 +0.14977714505328044,0.29986746268268055,30.085977468286522,9.932647808008072 +0.1520524037885954,0.30352647144754735,33.14252911750455,11.584009463634427 +0.14828174056077514,0.2957845862002923,33.12813917444116,10.366751102333607 +0.14795614979041186,0.3032703107459883,34.24879225027465,11.575281231606544 +0.14866576498716522,0.295413276153987,35.440284037607725,11.061192585400065 +0.14945219747636365,0.3012790017269356,31.763652459883694,10.584150615116968 +0.14961294100393924,0.2996612121180742,32.298921448438506,10.628765140384235 +0.15059856685343245,0.2993103550307022,34.97592145975992,11.549777934718719 +0.15016441525784224,0.30040589898810693,34.38882429370533,11.532882830762391 +0.1502092166934864,0.2928309886976596,21.74295443448976,6.716755416958289 +0.15149816829228197,0.2961328605831056,32.31212403224867,10.40604234261362 +0.14897342687786946,0.3043279717656695,31.05911280927118,10.652602868343063 +0.15004558120298933,0.2953834037819675,28.802156360268015,9.16165794096953 +0.15024836794486515,0.30196202845059894,27.733877787833464,9.361259958269066 +0.1491221471391855,0.3031948696231033,27.63056204199924,9.362207861509567 +0.15008306821062553,0.29821859474455054,35.0967350304914,11.403112669910563 +0.15086129091799794,0.3066732719027212,32.15202566300617,11.35965219840607 +0.14997149625870432,0.30222762143505594,35.57154229735635,12.060745787776181 +0.1498781177721117,0.30300363403917147,27.668469244843724,9.421557147855316 +0.14965442989082026,0.3046840678501446,31.771531704697583,10.984653319392388 +0.14818107329777067,0.2971358134378948,26.604002829897734,8.431666456547042 +0.15046157458971735,0.2949292742527998,31.13496143828097,9.849437832752928 +0.1491152647866057,0.30114746285366645,24.268049838363435,8.12308585219697 +0.1510252942825907,0.3014785347273398,28.572798873678842,9.652889640930008 +0.15154254827038044,0.29489463674504185,34.891319536744795,11.111084380152667 +0.14989411751424553,0.29908908551194613,41.102404554948535,13.526415950112074 +0.14915756425025528,0.2998371798520187,31.64358574399457,10.426353436039792 +0.1486523670723883,0.29515085815352726,27.082596490558004,8.47676414591574 +0.15187153168580672,0.30521730846071643,28.038370134126875,9.989687081454052 +0.14717237928272345,0.296081068507249,26.504348524287046,8.298868371718122 +0.1522029007652614,0.3026590389912453,30.830524112005154,10.661550683308748 +0.15055689370541295,0.29699106967254185,25.313458753359015,8.149554847064563 +0.14722658640453307,0.2865305586520426,30.228897639850373,8.570984548807846 +0.15185234142220128,0.2968654363240554,24.011376566580388,7.77230523539533 +0.15117814254505815,0.3017747945622344,31.839586948785765,10.809910471309694 +0.15022314796230954,0.2957943151470525,32.67168628523149,10.348763742779333 +0.1504513867080999,0.3007201992713968,35.98269219271867,11.93211911862384 +0.15250416911581083,0.30065490478182916,29.537868572143097,10.068624228648677 +0.15285204484693823,0.30381370375040645,31.795101355636437,11.174161646612594 +0.150799659342597,0.2973340933396511,24.2700873528348,7.8488609347304825 +0.14947730948203178,0.29930807618546384,24.775072540357144,8.14446558216435 +0.1507747972002694,0.2992691913201169,27.463779813309372,9.074210418940561 +0.15043193672748797,0.30115158547515747,28.87964246496451,9.695187360630133 +0.1486439458121444,0.2961820023461523,29.933515026673515,9.40036158238847 +0.15051204576183067,0.3034771342403714,34.352491474717,11.843500345816077 +0.1488150459774939,0.2972042546522167,31.341047120734263,10.063117184251048 +0.1497015670823031,0.2992103632636857,28.980071552568404,9.499415355543498 +0.1485285781479657,0.29716281023163005,29.802452665339892,9.438410624672446 +0.14983694909204961,0.29749695877494603,25.15737825775932,8.138752526428837 +0.1500378881401528,0.29375534103806206,34.326776056191,10.615535834328954 +0.1490298874020154,0.30343188912389535,30.5767041995004,10.436821575606762 +0.1506656300754701,0.2991386211099758,30.670444671275778,10.194419709138508 +0.1495463689533794,0.2998957979418523,32.81753221578038,10.791768508348191 +0.1497766094076069,0.30534304733170453,30.981210891778304,10.796664980840802 +0.14900863874111983,0.29938121331999,29.413743224901673,9.579141065797973 +0.15224021884529318,0.30142331884620693,29.04782875821011,9.912115835803585 +0.15129947198437194,0.3078269985228101,26.89827119637988,9.691824153143124 +0.14826080806521522,0.3014072254295658,23.619337335316466,7.862061418807246 +0.15184917985875127,0.2996028351286746,25.51432283204836,8.566124637325471 +0.14999905628228674,0.3006656020227518,34.301096559621755,11.41883231719507 +0.15019228229692283,0.3022706219239683,32.210089792779726,10.907458415246467 +0.14908439848117278,0.30916393163699346,30.825092027015735,11.129838528304402 +0.150836557366633,0.30176658939568995,24.421409487907493,8.231826223901782 +0.1486063538906154,0.30296737338167384,27.486751369095856,9.346583102649928 +0.14797986077799483,0.3002458728058413,37.327920115602396,12.227058429483957 +0.15072768124054528,0.3029592165826463,34.1285443385658,11.749986581343354 +0.14890687018064147,0.2989810285276185,29.977829491747944,9.775222191907552 +0.15068743512738056,0.29539047258074735,31.30285771817441,9.962720928128768 +0.14944384205949157,0.29773551203563325,35.441240817056475,11.426474015138549 +0.15108929523505413,0.3088737311630149,24.506237777585085,8.933677377863795 +0.15143827657017672,0.297599614053814,30.19531725443829,9.930029302703419 +0.14915975647706403,0.2950783672704274,38.94819927042723,12.223090538014613 +0.1501014860727677,0.29942015544059103,24.023528480249688,7.9557441223497385 +0.15028540174785118,0.3046045758931146,31.083999713157993,10.808873810697703 +0.1491665774245523,0.3011479272639561,27.751822782893395,9.247282471607782 +0.14955779181019413,0.29401690593270385,31.382984532731253,9.792928519189395 +0.15012901157724032,0.2964096651107698,33.18119282511111,10.609855777469527 +0.15141739284643638,0.30320256224289543,26.059715401801334,9.043881611164247 +0.15048432881933616,0.3001110660893503,26.35947396604435,8.787272250911114 +0.14978751036976373,0.30436048668597276,33.57905974614406,11.536622001144199 +0.14940893312683448,0.3042421553707964,29.123298221357057,10.025330974660562 +0.15066549458284567,0.2934892792480278,25.240453226007936,7.883124385720567 +0.148639054723853,0.2998163426711326,27.860241871551516,9.150468323489577 +0.14908231998852303,0.2962545678312695,24.528586547251972,7.7427674249576555 +0.14909810441637353,0.3044294970781771,26.94944282281854,9.281956981151525 +0.14941428927852252,0.29946221424307257,22.17795299237561,7.279230262860078 +0.14937363277595173,0.3057574857198953,34.44401703718449,12.061714717333512 +0.15113695684658485,0.30351633535405875,28.789693096659523,9.940269430082827 +0.1490267271079294,0.2951467852501461,32.73336641163018,10.284394603520202 +0.15152923334965354,0.3016052783177185,31.337062751974685,10.709436690941715 +0.1512570901742366,0.29757265945692263,38.27162608370882,12.462552549579769 +0.15063884409396996,0.29861159914769797,30.551863480748775,10.03753123578051 +0.1499119278743356,0.3011174553987141,30.182168833483743,10.097177886349368 +0.15191302014569985,0.30112609185195294,32.88449028631618,11.105558071934354 +0.14994828349347578,0.295920614076779,36.019905549940695,11.380818651676677 +0.14928409092327896,0.29720822529776936,31.2002536942577,10.019422340583901 +0.14935111884498675,0.2931186562885259,33.37515068536127,10.26429514642783 +0.15024273104523303,0.30867223252817794,34.70996285888496,12.569416778065255 +0.14706236099162628,0.29984196033581867,28.888690549253727,9.35105296261869 +0.1480976320768652,0.30228186632718895,32.21477833038945,10.754052491574704 +0.14991639344151628,0.2989965511877896,29.82375974290315,9.78919035154897 +0.14856708938901259,0.29292598939613906,30.405693258467434,9.342820593778514 +0.15249026782718075,0.2955275627749801,29.460663497514094,9.503476488100269 +0.1512441561408844,0.3042575544229997,35.662384445431776,12.40665663380423 +0.1513044196544343,0.3022562439684038,28.81138659122557,9.81878959630101 +0.14894457493897215,0.2920560745713303,29.217651394351247,8.868408419165155 +0.14916094658326678,0.30499010263398674,30.724076624310026,10.678098424396806 +0.14940818254721758,0.3013228893439938,26.470960891930904,8.899949132600215 +0.15179643574898577,0.299930107843136,25.848228475271245,8.68823162876136 +0.15049941315067564,0.3000341787519676,32.895711603207964,10.910223375862326 +0.1481658161669803,0.296532977867018,27.81886386752761,8.763025554774172 +0.15181865579795076,0.2958862387672113,26.53539202665052,8.628085602302269 +0.15073750526295426,0.30597375909987107,28.127415811682205,9.95871771933104 +0.1490652861346166,0.29669884314119105,33.960869006703554,10.850851088884006 +0.14998629213826295,0.295302570534676,34.64806249198976,10.923482048135305 +0.15029533161994796,0.30158482729332814,26.40454511864855,8.870686147519876 +0.14974857263327326,0.2986613933379147,28.333234772233336,9.186212315515668 +0.14968965627299946,0.30174521311530944,27.18910806472239,9.144861850834735 +0.14795155214737638,0.2946653371682274,29.924012958099283,9.291098032670853 +0.14922507486158787,0.3016890099365056,33.095286243717545,11.118300457492415 +0.148021144398743,0.301292854429391,31.816663124369033,10.49324879585377 +0.1486534533003364,0.3008990938111918,31.286938421174334,10.33984791293095 +0.1469475706671714,0.3023484324029646,35.53152264321541,11.795115020853292 +0.15178920781473065,0.30155361339710735,31.31536265363243,10.655280332410461 +0.15072056491624622,0.29647317568425424,30.995155393347158,9.930448585779278 +0.14854232123378763,0.2968054929060531,35.91784802391071,11.399836922916275 +0.14924202036554815,0.29849096481671555,33.84539006179409,10.943744878949214 +0.15034298481234673,0.3009670441178653,29.51152589529176,9.898916159846058 +0.1501163203311695,0.2960598700815152,32.27558126253294,10.274146331553037 +0.1518829198484428,0.3013864355466777,31.88395481889839,10.85885664399941 +0.15022208150097036,0.3045651172055795,22.254778943468875,7.768409882108543 +0.15023278840743035,0.2980026151803848,34.70690383554117,11.290021742032184 +0.15193624298929623,0.29512925423050035,32.21662814889485,10.307678732338392 +0.14981018178662486,0.30549390620299594,29.54059380070454,10.365877107297848 +0.1489599556817976,0.2954561071394947,22.574428423261743,7.050521312636185 +0.15234615812927063,0.2947490079267672,27.314098304336305,8.707496511222491 +0.14966759933183155,0.29577391524638624,22.864444464511937,7.212366915492233 +0.15054659734581263,0.3011330657391337,32.97534424613733,11.018320612837865 +0.15010361517323487,0.30430363474135197,35.37313844987407,12.235227373343129 +0.15039519619592187,0.2958432431164147,34.01618926144468,10.7999635413438 +0.15036698928169265,0.29798828864119625,36.015130571978546,11.750677137321418 +0.14953134313970884,0.29801375226420673,35.52135111652815,11.490332831988605 +0.14992300057951277,0.302298323935611,27.367598860266604,9.312536726490121 +0.15099039589687105,0.30419580351678016,29.73544158009539,10.3094474956076 +0.14734207717363776,0.30292791840054106,28.053752547889793,9.351756619982751 +0.14934610868208578,0.3018718846252582,28.367442197550186,9.529800918828192 +0.14988102301916797,0.2997815328428469,28.745100284872333,9.47965631209071 +0.15101812536903775,0.2942536957575838,26.538621991728085,8.329156053576513 +0.1542977259546782,0.30239397990189903,32.04439545882984,11.18785660939395 +0.14899797092505307,0.30009541928536826,27.265256850502183,9.006247951708957 +0.1504699937050365,0.302040853636646,31.6915824562699,10.756361685404014 +0.15099149579377966,0.30553837767713815,35.31843737521924,12.471835613549066 +0.14953258413343912,0.2969398152898945,29.978798021746,9.578510672266418 +0.1516085837626562,0.3020864695487571,28.60564932711777,9.783511282627003 +0.15007872607951725,0.2944438049480725,34.6947669576105,10.883355771748391 +0.147454451575264,0.3041283870524879,33.45459331508136,11.347096306781685 +0.1512207292406704,0.2942293227501555,29.92183288923934,9.417193974103512 +0.14912434377340802,0.29745127506763575,32.408188728551515,10.38315218561443 +0.1487316364311185,0.31003631877768284,33.24179060643001,12.010757714364058 +0.14869274517078818,0.29327451077643096,33.777906791916976,10.410663766616949 +0.15026164735836353,0.30010639816225776,24.901807163844758,8.295580133428208 +0.14997610381021376,0.2957364800583772,34.74129818571201,11.007588295986638 +0.15051326951347796,0.29781385503924607,29.038599548732492,9.442441131383713 +0.14991581717988492,0.3036823955557383,33.7735103665097,11.587219742204974 +0.15019854258277696,0.2979464315024034,31.998208448078127,10.388489415490174 +0.15045950340344708,0.30259697445595,38.37439023140611,13.095655658294346 +0.149697633689417,0.30351588029257676,29.85932851337762,10.296195914164743 +0.15048208024374526,0.3059570923726008,30.637052307364268,10.764706405159654 +0.14997033223789602,0.3020435603699073,30.98678426699514,10.460911117614831 +0.1495357877851856,0.29830313548285303,33.67303180637947,10.913470416684358 +0.1507145822167922,0.2870859868841147,34.758248235128775,10.13564586214739 +0.14969576049285008,0.3008135926302299,29.96489061269328,9.972156669511824 +0.15033993254092562,0.3045769029277473,27.588412198533284,9.603257473593528 +0.15035769319879244,0.3005213909692996,38.00094210390058,12.670909998915139 +0.1505929622883625,0.303096124082179,28.234468041783703,9.697300486987391 +0.1498703148716866,0.3049082367213551,28.0118704483275,9.811894697339866 +0.15056529447156763,0.2975616793114516,34.39092248319009,11.194912267844815 +0.14901148653588198,0.29937223488775355,31.240930482031512,10.275277131946025 +0.14920116188489602,0.3044075166494896,31.569364887660818,10.849692127627772 +0.15097921181309348,0.30447832822016907,27.767857088338573,9.6608829177008 +0.14961974458668678,0.29251825691831174,30.03747735927649,9.227513746769016 +0.1512230144896541,0.29693313648681424,30.915526916916914,10.039894526260523 +0.15056220277070828,0.3016910946995463,31.550438480881596,10.677322373554853 +0.14974701660646178,0.3021308147905168,32.248123830037166,10.881934370295447 +0.14758352038436331,0.2941550975666623,27.46967344882966,8.490806564137657 +0.1505745421600971,0.2957514120816745,31.73499438084291,10.069401437645014 +0.15013342809196428,0.30264896588421675,33.035609220670814,11.201482246987222 +0.14952491657495828,0.2890725856443675,27.837978379864055,8.254198110493313 +0.1493953765105691,0.30004301470033135,30.144582679942793,9.946384299168574 +0.15181686549391563,0.29659503646392377,25.072149735968747,8.079509612982806 +0.1521507201940413,0.3055210984972169,30.478992597719373,10.853374191476826 +0.15005297658692504,0.29410642811380916,32.264588868914814,10.063297970922322 +0.14990234989800952,0.3048190855278523,32.96191810870839,11.427818615453548 +0.14951692288604412,0.30014646600666345,28.47863030253805,9.428243892218742 +0.14947667566623477,0.3040518037880625,27.565821563768132,9.469295442153994 +0.14935817641263474,0.29440700350877375,29.332051160584566,9.139153324358887 +0.14985933753391265,0.3027952077277238,29.811284379769134,10.095885761295856 +0.14965838812182639,0.2999554120881189,31.20842670900739,10.335682715501923 +0.1494690857460436,0.3019092379234986,34.70172492857435,11.641479389142313 +0.1494537401637109,0.2958470574634553,28.48591941559183,9.003404500402578 +0.15101086951404322,0.2981655497494426,36.75022422208407,12.01254565859684 +0.14903458240996964,0.29910278190338063,32.613651408623966,10.602575091536899 +0.14853404816596275,0.3012244621133848,28.45043417599989,9.45127053290686 +0.1509804697152294,0.29726452947526705,28.12115855461133,9.134980837245008 +0.15210881704125884,0.30246518199100114,23.666492516841245,8.163752398018547 +0.15009154551109663,0.3015837485929191,34.45475891564947,11.613579616440829 +0.15039182857081396,0.3004071757065047,33.39230737404556,11.128527889823776 +0.15060438825197517,0.3003817995847454,31.14089739103776,10.43712049224753 +0.1507742810738182,0.2982325711722114,29.15696833267372,9.521703186391573 +0.14850989014761115,0.3017628974969934,34.00785897494529,11.217602874181853 +0.15098833654739977,0.29646224638174146,28.534139649826244,9.146597251602495 +0.15160504453155607,0.30679893437893324,32.27025152923241,11.521359443745007 +0.14997592259440032,0.29668646200541393,26.992048773623388,8.678785815832995 +0.15093133594479025,0.3034505865376927,31.062000029319584,10.688246109289402 +0.15070643993270236,0.3028116612751269,30.741867441193854,10.56864513144559 +0.1485208506221559,0.29719832302133803,29.491064629466266,9.38890425710288 +0.14954223360954574,0.3017810726837369,31.824315570944275,10.681407939125206 +0.14977684642493458,0.310841238083303,31.000665172626157,11.427550916794594 +0.1483751055452602,0.3033775358381169,21.6742283553193,7.345477363335229 +0.15085547817486294,0.30488127291024686,27.961904940560263,9.736854523903865 +0.14998855193250907,0.2949151772734072,29.820022872164582,9.387260750975237 +0.1501935660552114,0.29737435440373056,33.19559549505197,10.683541572678283 +0.1509082558937118,0.29874883150453296,36.73976956089476,12.1260629648676 +0.14896041189384288,0.29519964974947566,32.048863984231204,10.02292416289313 +0.1496311611852509,0.3011614430213373,28.85929653789033,9.663344262127241 +0.1498982971341209,0.3024146023487233,22.077920935322155,7.4431134224339175 +0.15023983841205155,0.3047797182819962,32.377612193920264,11.273604626116443 +0.15120407829922186,0.3017220207324411,32.139042247704566,10.914869836008997 +0.14896836443029812,0.30416174496339,31.17485608417208,10.701200667996927 +0.1513106181041353,0.3002265720797879,27.525735231227696,9.189753051391067 +0.15017062641485016,0.29542325835442845,27.695231770798962,8.751120777142164 +0.14897483580186202,0.3096440766339139,32.535308755992524,11.74519728060254 +0.14907165805920639,0.2967042396459767,30.681445971499095,9.739789654658656 +0.14919817052370132,0.2980471299647953,37.05813051067359,11.959069111569795 +0.14894808185056307,0.3030666789816048,36.50489397327337,12.403597933967253 +0.14911619702837497,0.3019857881647587,24.423911870068665,8.202485593872485 +0.1486320719366379,0.3005405687549569,25.06160342515638,8.29630344220285 +0.14877646515201273,0.2968052978892778,34.06918640451484,10.84200774236898 +0.15034583386644804,0.2922195560469238,29.083785302403378,8.927270361303675 +0.15004356192167267,0.2990523291365325,33.13152588574674,10.891318911757944 +0.14939983640451954,0.29769782386820426,33.72425034082211,10.856549674355591 +0.14876205637510803,0.2940081200640076,21.08158006977957,6.4910922003086 +0.15106525367289794,0.30008102529153646,29.82410323302063,9.977423864021274 +0.15049029641303371,0.3019006336828716,28.240400061194155,9.558339969431563 +0.14893844009279678,0.3033799866971777,33.505959960726805,11.311633882741457 +0.1492574384719436,0.30468782691380497,32.59902106149704,11.235333069301568 +0.1492872985035771,0.2958571504805146,27.167139860054462,8.566686954926933 +0.15104575143224824,0.29446104188877115,31.46827193350436,9.921845745689087 +0.14905875435534435,0.29864081277185134,30.7872952789074,10.025578350811642 +0.14904671847527154,0.29341401096286157,19.256800157532425,5.935231637388169 +0.14991184778426642,0.29132180383371487,31.37302389558821,9.488554836644735 +0.15059482550360526,0.2931936472170608,31.48587754441544,9.71383353552105 +0.1512382316914387,0.2921169649534023,35.33224545333346,10.935561925455934 +0.1495448013995574,0.30069435068749234,30.052603060305838,9.956257102464027 +0.15018376313101886,0.29121345673840116,35.72432370903973,10.844025582853197 +0.15097508128435816,0.3024892664456214,24.142206530000145,8.270500649595485 +0.14868480996165098,0.29889663230754965,29.498090942060028,9.567991115290484 +0.15006072840348558,0.29590850417207626,31.407208754429732,9.981251331130823 +0.1485336526877529,0.29275561413480533,25.971375057914493,7.923397584679459 +0.15083081901508658,0.30170624357807024,32.74478822279597,11.115095128583638 +0.14999465770130932,0.29171082508038776,29.79692025200401,9.03533047923699 +0.14818403703298402,0.2959481674760528,29.296263149774944,9.237281098622946 +0.15045375750830617,0.29907385712185347,31.383844388058286,10.3790390684005 +0.14987834798816482,0.30114509064591055,31.969426061675872,10.696504519272944 +0.15107384542968083,0.3066554432347324,29.531126419455255,10.524678552452551 +0.14808350684908447,0.29771562050019135,32.0880389308299,10.289592601951972 +0.14998303431734303,0.2943447882209162,28.095036012869215,8.776501797398971 +0.14781261539528318,0.30942179419900456,33.46596967020843,12.073426397880356 +0.15105116661165982,0.298286393186438,34.5266230462814,11.305300238574393 +0.14908695445554504,0.29536077868254557,34.273378231696924,10.765632948393165 +0.15098283332609405,0.30024988690015125,28.082197821502668,9.371059944232735 +0.14842557334024312,0.29905830127550703,32.438701832004725,10.58693904563232 +0.1488187585807128,0.29400097088334326,29.377996523288388,9.051308357848125 +0.1492773452023682,0.3002679660159002,29.307054501866702,9.680075485115486 +0.14922482959319153,0.302452662322166,34.622487771019756,11.736944650981005 +0.14912944923162857,0.2904014323948326,32.24684589153352,9.694467445767499 +0.15222575452965917,0.29178060051938104,38.082721336193956,11.728157720391417 +0.1505687616121568,0.2977595143371976,30.305785088394,9.908643692745638 +0.15128744513908593,0.2943498331443096,33.468349711210465,10.548132416476752 +0.15092825991578426,0.3033520753420487,34.20068063114669,11.68593282432623 +0.15192949893807386,0.304138410325739,29.45725344285228,10.273581795006743 +0.14894659827188872,0.29985927063863205,29.27085390642178,9.621254652552093 +0.1495131604992782,0.30481544367279717,36.748692285987545,12.718504032436346 +0.15134199550084199,0.3023347365224781,23.90600894658675,8.176311593168997 +0.14933139478178714,0.3004929358911997,31.40582642313447,10.416526817477157 +0.14895863393224915,0.30325023409227614,31.27127649935541,10.66720934519102 +0.15044838329852264,0.2956799385508049,31.735077594166803,10.087713057340759 +0.15002863698867852,0.2969633843276273,31.180162084674055,10.0204524487767 +0.14941592248994662,0.3026226154262668,32.532862428639355,11.052136441992266 +0.14923057824901106,0.3002930789587638,24.02021835933481,7.88080163139588 +0.14993637167902857,0.2973247572619883,32.797970170439065,10.558325147253994 +0.150427507675164,0.3065739526712268,27.992738879817882,9.95015806508557 +0.1500351138583956,0.29580086839268316,33.930036994120044,10.79337623863258 +0.15058650313869099,0.30006340096509504,26.730185947657986,8.930932317597076 +0.14944393028634065,0.2989752809022004,31.152664987920453,10.137325615329818 +0.14994686849274413,0.3019951696172883,34.9585369906738,11.738951421965123 +0.14842662348046234,0.3003056751577144,32.64267271676609,10.735823750630887 +0.14859670352124357,0.30018052211066787,28.880610259198136,9.478615569791447 +0.14836200578061046,0.30215479523925143,30.319802675015175,10.16515832866473 +0.15057973567723992,0.3001588346190782,20.64792691053741,6.8732791470349985 +0.15139220528609856,0.29708803149821067,31.999703237326106,10.460410689395717 +0.15018201701181763,0.2892807320969717,33.530096039335945,9.93051892868961 +0.1509762801809613,0.3034151270127956,23.064729940984222,7.9435940026176795 +0.14870535067251722,0.298356146302538,33.69644066416409,10.911616720863204 +0.15081697081238907,0.2987881988002808,25.8677900481857,8.515817674012736 +0.14993408317691514,0.30006292979166604,29.396460440704647,9.721456834475095 +0.1484461797240552,0.29862654517241577,35.85058875090493,11.496333007805577 +0.1507236841962306,0.30083625432274813,24.110448563353238,8.100756937411633 +0.14959052703433418,0.30451175574105016,32.539844582686406,11.258578016756552 +0.14990297970672206,0.29607676632618246,30.63598051414949,9.724823539957638 +0.1496571473157076,0.3019161978295728,25.472404803943697,8.561906448726068 +0.14889695107657216,0.303264215636668,32.12242849175659,10.830346862064069 +0.14969424592246455,0.3027376804635408,29.610209069869022,10.045663328572646 +0.15015708367841898,0.2996409348284474,30.183355424777098,10.006410268042096 +0.1508873292731702,0.29614895531208163,32.19556571565813,10.32665076729002 +0.15007770754918012,0.29764104849933876,31.185105048009532,10.136560443494748 +0.14968205639863114,0.29559165665367826,31.350934881343225,9.956540385153398 +0.1500066735229222,0.30286699876248624,30.901633811698556,10.561927628982309 +0.15000136513565637,0.2973350592277371,35.65172635787433,11.540676785179759 +0.14869394829003105,0.29408983023486773,29.48304494818623,9.164698452201064 +0.1513098916069711,0.30959952196119295,25.60637510356099,9.402925156700062 +0.15075716960396413,0.29721922670536066,26.012056235220495,8.386261345483152 +0.15058816925547444,0.3012366162598834,29.38906810156734,9.854878874309932 +0.1494347481079723,0.3043831626365798,26.31989062453836,9.057744427175502 +0.1499562149541483,0.30432974187267775,30.31937288956581,10.468993342611126 +0.1498814601432157,0.3073587783815908,28.86685780066414,10.349627544170376 +0.149764128767413,0.30174994998581645,34.25226686755304,11.510412623932597 +0.15051644875441925,0.3006445096255513,31.90629895406775,10.688806450553447 +0.14960371041951662,0.3014467041035283,27.433020891314012,9.20631523339963 +0.14913469408316016,0.3058987784498792,31.079915069288525,10.810946155886736 +0.14952743489817327,0.29874865128571176,29.019369467639425,9.449088610740558 +0.15112731143765903,0.2938923632296102,30.743109661922862,9.642157161920588 +0.15075886695102883,0.29875682975655565,33.15445598377537,10.95525409398866 +0.14945676851547454,0.29823387344076074,31.37293637532068,10.121525420492498 +0.14916020799471555,0.3070007077695401,29.056266427618596,10.307045663074513 +0.15156158090664945,0.29687337740908776,27.676250844578302,8.9820462358796 +0.15034760504050634,0.3016948637125913,35.06497682052266,11.784224075504046 +0.15077776848695496,0.30341420632808186,32.5283345228566,11.178311565738685 +0.14896328831428673,0.3048678538205391,28.638098498967583,9.873992779893683 +0.14950971848446604,0.30226444389085466,32.53790101882153,10.998825357057648 +0.1498128827459202,0.30210024594747636,26.928617181662446,9.069281592248139 +0.14928420346523227,0.2965651450762306,34.65976509824766,10.978472281002066 +0.1515454193587206,0.30884789873424673,25.51434065815729,9.332723949000655 +0.14980889447748827,0.30086693200560183,31.815938296251108,10.609261446956577 +0.1476180874269917,0.29516460074875994,29.378472479316596,9.163421755656742 +0.14892691811033595,0.2949007289892754,30.02683323279956,9.357533803852414 +0.14983842382776902,0.30085606168864404,32.60935103653713,10.957039547661378 +0.15089331332102357,0.3018297277287705,28.878571183439107,9.857099804009248 +0.14896467655458664,0.30332962814958103,28.340503590866412,9.669412209737484 +0.14994031425655818,0.29600900913239775,28.35098184388226,9.018442706699759 +0.14978366961816394,0.3036558165903757,25.754038616205847,8.803349232440063 +0.1500240332727593,0.29995119761768835,31.667332925634653,10.499923764595108 +0.1495470000269736,0.30647637826404794,25.948072903246697,9.107181973153569 +0.15217003848477512,0.3033367081987749,26.64746565393097,9.297330818850952 +0.15133506900401808,0.29408316694025377,22.790003418140007,7.186426600049563 +0.14991840257972186,0.3037222345289988,32.99959597533918,11.275840258630119 +0.1525053389480852,0.3062868404038934,27.147186723845838,9.662480812672447 +0.14985921710689934,0.30719981905042565,30.346981962627908,10.779143936169993 +0.14954956679256712,0.3038425514899261,31.811931137396574,10.935959841022498 +0.15029342291062622,0.28837470641391955,27.349552392877534,8.045819509875129 +0.14803546401969883,0.2971658308920223,32.943380397351795,10.51829273078949 +0.1494853687386452,0.296919961620455,28.028685151987247,8.9532214524174 +0.14945903115883294,0.3026598752244181,24.328650368874115,8.233744480429197 +0.14910646943503414,0.30810287268678793,26.734840977480207,9.54854231073999 +0.15047728834474075,0.301807104277891,31.335866995585885,10.577220072036571 +0.14990123386769413,0.2990455418856575,33.04566595734408,10.843374962396808 +0.15115255033271224,0.2980369700248842,23.36192552452994,7.640801014648934 +0.1499087253968656,0.302014551717269,36.106718141389905,12.164931037905474 +0.15221084930217602,0.29586431528223744,23.30302906316268,7.490257800982626 +0.1507290298951174,0.30044418629024944,27.98181713584829,9.37794595896077 +0.1529366940834884,0.3042285255319826,31.056314081427224,10.96595311068201 +0.14959351101132579,0.299525774605121,29.903207082766034,9.844541777990818 +0.14853225586884122,0.30744015592629936,26.577057985074404,9.352948891789707 +0.15263227058241904,0.3030669470065711,29.563479228631955,10.259584433961408 +0.15160411605171106,0.30080700685394424,28.445406198748405,9.617942227060484 +0.14983080036319463,0.3064227438408191,25.492639782741012,8.977814077482803 +0.14983093987517393,0.30576112662894966,28.664790660084304,9.960068571335254 +0.1486088436218202,0.2969351215888953,35.597152139470424,11.27680155229831 +0.14731062090026809,0.29818924977237715,33.019285131032284,10.52740386461114 +0.1480165092364799,0.2970227799199571,31.111010714422665,9.866977171042208 +0.14995044774963148,0.2982612690468014,32.66210034464846,10.627328178027799 +0.1504881468291324,0.2975372114335078,32.033011249531434,10.398728307342584 +0.15043342740739804,0.3002561117549777,23.400131541296687,7.810964000438065 +0.15159127832408267,0.3076753035951774,39.24564327033253,14.187831823685514 +0.1486501633999267,0.2965847286512209,25.316716163973293,8.048053499796566 +0.1504333726074961,0.29316604984262074,29.6887167263886,9.227208006276097 +0.14960717972685791,0.30523818378584955,28.546520595190763,9.926983665062336 +0.1497397517939679,0.30055325935499677,30.782475642600176,10.245109463495751 +0.14978636526893563,0.2963782170592973,33.16147415933163,10.570379978023094 +0.1475778777047773,0.3044201693418481,26.92446717930526,9.111618481564674 +0.15001659487482374,0.3082945238325685,31.100668244875756,11.217294553275435 +0.14959308176248182,0.29138010837934225,30.993530929504075,9.389705658442345 +0.15148666698076896,0.2972275182262461,29.549545769101744,9.63385017232459 +0.14983627447640446,0.2962607947049991,32.49173172484234,10.352961334780813 +0.15099590874527144,0.2978532144512811,27.150968894786654,8.865498285252901 +0.1499554244735638,0.2941840076340816,30.628089616784354,9.594905642980319 +0.15146775170455967,0.3005815431568562,30.35828809474738,10.217042263086814 +0.14836414602696432,0.29895861543000385,27.590033133054465,8.856905229669154 +0.1497183438565241,0.3054774825466784,34.179880234789955,12.038609498204025 +0.15202630766027184,0.299159978175001,23.346030337939325,7.75252874381246 +0.14967289055939853,0.29790028600357293,35.08248682042099,11.339435640838392 +0.1513869478309922,0.2995887705966414,32.67250342697791,10.90693833395386 +0.15063878081282941,0.3035930374371902,29.93444825506481,10.349385777612877 +0.15014676767589707,0.2961482182129236,25.565863251087215,8.147892838166467 +0.1506136172276517,0.29652042671332957,32.89231911077783,10.559405661526892 +0.1493411874214138,0.30424845836592534,32.10998638200302,11.073164601704741 +0.15026149835616007,0.2998615313684902,29.686096897542075,9.84723842968751 +0.14788530664316513,0.30329188570395643,30.785745136434066,10.371418256794982 +0.14982672191071314,0.29909410155548916,29.694309674915605,9.68259685752224 +0.14979205206904186,0.2952219349273094,27.89102079483739,8.816931094899674 +0.14988122289467964,0.30193178219970607,34.1414267467148,11.554714061394577 +0.15041428100174042,0.29785600964035097,29.85062026015003,9.749359283270115 +0.14951348092557393,0.30008823944488944,30.699472963389297,10.067845400238902 +0.148798951381552,0.30829100960620626,26.40367682644755,9.423260664359834 +0.15125759334784966,0.29943515908229473,33.5903250626845,11.167466707794555 +0.1512701222038634,0.30708329588977074,30.24256463807737,10.829412610324901 +0.1495307000044656,0.30397829719708774,29.489822950807962,10.1045725514041 +0.15066841025289532,0.29695713240728955,27.40569668016376,8.839676264628746 +0.14863650312369817,0.2971206018804786,37.60003178831362,12.009894913964096 +0.14994912168395083,0.2949035665484288,29.566092505345758,9.269605322077018 +0.1501239299282718,0.2973234181183464,30.437567632513332,9.843147990869134 +0.15174470159948047,0.30082063832613004,31.964140647808744,10.773579088815302 +0.15045369271665135,0.3121252863585684,32.71543494281805,12.193122725087953 +0.15039752639717224,0.30477065736191555,32.587520455245084,11.25269423201941 +0.1505843239502679,0.2962183666822753,26.54342757879293,8.502422183562903 +0.15148533011024073,0.3021135293795748,30.447642990500597,10.383878911122503 +0.15253453012826276,0.30140872777384825,30.263621641050246,10.355998225912737 +0.1511157342623842,0.29171294788151525,38.03999207764575,11.699190589592796 +0.15012497492637364,0.3015099490986685,34.14280736764534,11.507649958731188 +0.14895166798694456,0.30069771042640514,19.670146508061404,6.542967693619584 +0.15109225511910132,0.298129717508938,29.42318876661203,9.672578295908897 +0.14981569639464673,0.30035484529441336,28.459706277340196,9.450561482658166 +0.15046774156969203,0.2943845194397833,28.48458865501022,8.917651622765494 +0.14954892475350443,0.3054637054476831,26.093191368489368,9.096744705267318 +0.1507257794533966,0.30473727715204835,23.708956455117175,8.297601185788071 +0.14879578850901265,0.29586835116048654,29.004619721437365,9.13972880083094 +0.14956158414060658,0.29974854590169664,30.443303245115942,10.059193607243436 +0.14889799768585293,0.29645603372090906,32.4082385338077,10.320484632001913 +0.15110915613971898,0.3017299989441016,36.841400981492775,12.503867584439961 +0.14897358658420723,0.3002674501979019,31.95223395224903,10.541595814498384 +0.15048300023696504,0.2951591525615801,25.280578429466328,7.953956671685814 +0.14959975868456374,0.30013632345162544,34.972134039136336,11.558679552657745 +0.14890689309752544,0.304275314906415,36.064652722831916,12.33771704507854 +0.15257730337223702,0.3037993715883448,28.599341681391977,10.01018709800475 +0.15035767818156637,0.29662228611376323,36.95503552318381,11.828437343399939 +0.14826597638129074,0.3043430993971256,30.77420741210853,10.49470952567831 +0.149346502985431,0.2985283139499167,38.340665256292425,12.506746482074602 +0.150329022266965,0.28937452030780125,27.995959817436653,8.31859502633476 +0.15101444616760587,0.2892626612299043,30.28846112345243,9.091224748077453 +0.14913216195995638,0.2960866423372752,32.04618417626457,10.157515574456802 +0.15048944444077927,0.29268559100563585,25.675409207633713,7.925934427077915 +0.15017614407986668,0.2994734698167665,32.595423144432544,10.740626596641494 +0.14906802232532793,0.30249895296772555,25.627628356908936,8.663706172203243 +0.15003355207018987,0.30674113068815423,28.43869010222964,10.045585100387674 +0.14797265726093028,0.29667877436773726,31.48479175630847,9.938625383615797 +0.15044538673888136,0.29199654057999436,32.087624755244995,9.80303647242612 +0.15212284004800222,0.3011764910650829,28.60913524755909,9.76870118003036 +0.1506814416115766,0.2963780784386757,30.347677031961908,9.757595760266643 +0.14938588199652283,0.3004047564785126,33.431574198190184,11.070835679580188 +0.14790026085225924,0.29499166158223133,38.40316012965475,11.963383108722663 +0.15006553502793377,0.2949281911832335,36.11641154210594,11.321394058243344 +0.14931135374072152,0.295561465651261,42.36109300300054,13.32542693690433 +0.15129066592164142,0.29332980505176914,35.633352744486025,11.061776932156722 +0.14962919544712,0.29977986927540184,28.283971246862905,9.368260185264056 +0.15061961592272952,0.29091506276528273,34.89335369323134,10.550863371553826 +0.15145733272248194,0.3088124541446748,29.124428400866762,10.591662211999099 +0.15094449701963963,0.30103740128359463,32.81770947408988,11.129224211064512 +0.14992343187763466,0.30026072497587225,28.3614391113596,9.426048439287362 +0.1497870598406392,0.30651787249097834,36.79094643422057,13.024187746911117 +0.14805308063350386,0.2994992373242809,31.124075630318153,10.115122552843811 +0.14978308404395188,0.300395081831642,27.389701890396946,9.082213380813663 +0.14906815147161132,0.3070071817911079,30.04709274854667,10.620307362206882 +0.14883710408836526,0.301401290038396,29.899812624146985,9.972667394123079 +0.14915846868046254,0.2958630564905186,31.675917877246274,10.045075458323986 +0.15049040979075487,0.30698419256000714,33.61480174376229,11.913981172340346 +0.14892694770010514,0.30071616057673817,36.68939253723057,12.171753146094197 +0.1496353742180097,0.29803614512388776,34.781456818632584,11.306073972176133 +0.14914143789843404,0.30338587419840385,29.86134955498283,10.181335900138032 +0.15024641099436495,0.30670945650854414,27.283192717329783,9.69792447312552 +0.15133850577187158,0.2967295531413715,37.01410040592599,11.954560162880131 +0.15042857188425382,0.3043091288202729,29.78534729059886,10.28663321076271 +0.1488967774939424,0.29723769605209954,35.636896389241954,11.419506338939467 +0.15220479544906398,0.2937289405563386,31.367913470590295,9.885377988612836 +0.15127480497356902,0.29374147091170905,31.009155774909335,9.737756344955013 +0.1479974772530674,0.30929992280650825,28.600717072383997,10.293364661140561 +0.1523327486382037,0.30417379843931835,25.115747688058093,8.820320207944677 +0.14917597518136785,0.29846114543519325,30.257037513823978,9.778029120913152 +0.14783356932179464,0.30440959011465346,29.612993440725553,10.092942224343217 +0.14913382173391065,0.3022123557313745,33.9112010883691,11.469390261595231 +0.14881853316381302,0.3018136986798845,25.615835154467394,8.669264063869425 +0.15089169726058063,0.2957692040439849,30.038739590497862,9.594081713142737 +0.1514234889976493,0.2974530051373558,35.69324448731246,11.555527054364925 +0.1495459717719115,0.3030769256535009,37.02203108965668,12.619178048848001 +0.15058925893551914,0.30140935469338503,26.882144698426828,9.033792907337759 +0.15137468533266682,0.299803893360839,27.02076786310501,9.014341097544637 +0.15091713521823027,0.2998890310841218,27.793548416568687,9.227401826512631 +0.15087107764422555,0.3043910586030842,33.60653564696173,11.678819124935186 +0.15243131542025085,0.3042141245692451,28.900616679546093,10.118414254155766 +0.15084466556159776,0.3000940746543921,28.325470841013477,9.454135135329054 +0.1501407348541056,0.3020966785872883,36.32303435913135,12.27506603020689 +0.1505501720196525,0.2899148972881428,27.337257932122995,8.220290205677124 +0.14898209392216605,0.30201381199882876,32.25285007556397,10.830024542993996 +0.15270024647873315,0.29251035191076663,31.073666467727726,9.739052979835487 +0.14998672589406434,0.3101108998052885,30.01811558110647,11.041396784563018 +0.14950399985675855,0.30336400725902807,28.648787474754556,9.723013790545325 +0.149689729204885,0.29724950665597805,27.27453235364825,8.734876778752753 +0.1506629258281453,0.3026971274887935,27.283720976523224,9.282629325379165 +0.14912474889250615,0.3019784073806436,24.88072888547948,8.32979784805743 +0.14875156157401642,0.3058748319369839,25.791544284241688,8.972652172681656 +0.14962660151727522,0.3022863757625716,28.334722332817314,9.588677591072738 +0.15070669928882033,0.30122821801749716,30.14087873659318,10.14933042616492 +0.1502877496787177,0.29525073082630854,35.41897984941226,11.194779705876861 +0.14978468371311554,0.2950184088065213,31.36860357469211,9.885729930557304 +0.15162987345044118,0.2986162687679427,31.971436534943983,10.680013262035855 +0.15301633822798022,0.29714408927408636,30.263841932364272,9.945377650409728 +0.15034198317719685,0.30405282055654165,25.398337463543665,8.760132395696143 +0.15177161293600305,0.30290483738074725,29.656422453427172,10.181433951436823 +0.15089106613819966,0.29827005815560304,37.81966700177672,12.353339613987043 +0.14841135226308794,0.3031765393326314,34.96363789953589,11.832091608258624 +0.14887252264948544,0.297082831955259,29.55852917598055,9.47241069960547 +0.15034379689103194,0.3065740469804901,29.070123109073922,10.257369106062384 +0.15079027730776898,0.3021335853000164,27.381653420623376,9.322873773999271 +0.14940564771276005,0.2996730529775207,33.066519741387225,10.887290896225128 +0.15066983746576393,0.29558223512292864,29.019288808972853,9.264055554319972 +0.1499600567750619,0.30973477749179196,29.506323373072544,10.70887932460226 +0.1503202601276637,0.3030461720211249,35.63577936508666,12.194713933024705 +0.14862323220073143,0.2982667492937712,32.910393100202135,10.588843217585975 +0.14909196816101208,0.30196400409871743,31.01330165577094,10.404844125878546 +0.14900679967217573,0.30257344042923706,20.294813072419373,6.796197267001893 +0.1485380440875694,0.29426387161855,30.53123938024618,9.498981414199896 +0.15196675690973668,0.3101078086368599,28.408160354489297,10.517037683246434 +0.15155627523058182,0.3000489164144444,30.170870602979303,10.077290536980582 +0.14726885125660974,0.3058908696280905,36.183303951274866,12.519174424899905 +0.14933408194611683,0.2973125211355466,37.433870178815226,12.008406435743547 +0.14979775274752377,0.30090427961632077,30.77006433821478,10.238135865386178 +0.15012611730942602,0.2972228914720939,27.91591540875384,8.981228047441931 +0.15018285628062392,0.30406069337392644,25.90796175885795,8.968930621681409 +0.14973500771258122,0.30013641551743747,28.608409740433515,9.511448738170238 +0.14988219442179687,0.29813986804671216,30.80834002494342,10.012162533228679 +0.1490370840057152,0.3047052393835798,34.294345571090716,11.748937308215856 +0.14963712070781332,0.297016696839099,35.54266844904742,11.432182475872784 +0.15186431856882104,0.29028256338333847,30.309764620394628,9.206888729232135 +0.14982463129826584,0.30398987152804596,33.44090003597259,11.484377788573449 +0.14845266954592928,0.2958627340983931,27.637615847832812,8.650706611607154 +0.14993502324180633,0.30126651460050785,29.547666402162008,9.918545430495259 +0.14807962864546692,0.3042693043277761,24.77673490124716,8.421636838237653 +0.15027282879953618,0.29737808693217427,33.05248051464212,10.731937748268276 +0.14901807957585542,0.2925757702713154,30.75682828216575,9.39943541369618 +0.15087243723429675,0.2959424107024868,29.831273819406086,9.524129930568147 +0.15014046033668924,0.302432948207494,26.640185732164998,9.016012521254641 +0.14885864812206728,0.30312633448330234,29.73857562489604,10.035869822395506 +0.15059681177566422,0.30960401895410966,32.279361223755664,11.834440619547658 +0.14813291578259397,0.30426812521798313,27.209216986440907,9.220789342754266 +0.1485568153128137,0.2979032144356516,29.324059554392967,9.429175753916327 +0.15067446957796823,0.295856229170445,27.732695088037957,8.849384616679716 +0.15160702414839639,0.3015187996336067,21.593342129943856,7.300711729998763 +0.15058994713204388,0.2927756797552162,32.162077132612644,9.987735589093925 +0.14873705439467735,0.3026539839372458,35.31172745747046,11.929606670124983 +0.14902953079925987,0.29700294944629474,28.757445170338386,9.197191241613993 +0.15091968877220485,0.3053735432026582,29.15978584937136,10.218361528867472 +0.14970712196069655,0.30843915943519323,36.95240493456866,13.265922971327255 +0.15072733957922313,0.2999837479330044,33.74298262859775,11.237601039199639 +0.1491600190498714,0.298610299400593,26.99459233220837,8.748424345220954 +0.1506939863061937,0.3025518011416921,29.877666659767332,10.268239794325792 +0.14849125819620554,0.3026995323863267,26.13533873412915,8.797572545285648 +0.14952292197464515,0.3095596075909492,32.388370570898324,11.798416337468208 +0.14954583375856284,0.2983585540907181,27.0237797631759,8.79572714114451 +0.15030187362034728,0.30433838978893635,28.867885614025116,9.96232489625766 +0.14949825968665093,0.30231164699320223,33.26975512421812,11.28824978451811 +0.1502642177641268,0.3027893526508239,28.146794232160538,9.658656306862342 +0.14895923166618935,0.3049784907031482,30.526969888176193,10.490183256941712 +0.14932546283925127,0.2963419893725216,27.730759571512923,8.824622257900744 +0.14998465918616777,0.29791264315243166,38.10535180496843,12.337748344753736 +0.14875489231808534,0.30392801765489774,30.211649865691545,10.307524358196096 +0.150348153467411,0.30261229974128057,32.88622959890314,11.254985865938599 +0.14981595708492382,0.30172758622129936,28.41511142243779,9.512712231182556 +0.15044335986645277,0.2982564723586002,30.73053449230192,10.0283012358876 +0.15024336881588038,0.2973603434543813,30.30529195517483,9.823257611290982 +0.14992455323590728,0.29462071817856067,29.96745522658081,9.376694605613913 +0.14812418864676666,0.29601761731950565,32.098360643844984,10.073204444416678 +0.15036161232272272,0.30024369145781854,32.21882992277146,10.699882386558311 +0.14857103537032249,0.2942214424021992,27.449202968454806,8.522029309984624 +0.14884585096446337,0.30392063629151983,29.895716311745673,10.208216451960286 +0.14912394433430476,0.30164783252642624,31.146039031349854,10.474976676462283 +0.14932365104773776,0.29750616911244193,30.853822839145224,9.94811251137191 +0.15139988085649375,0.295073162304386,30.704190124030863,9.785144311155488 +0.15039008248506613,0.30127211089320866,25.300566612158345,8.524695777664553 +0.14966534011142557,0.2976921071106637,30.290255954708744,9.763517702393354 +0.15059577504215022,0.29884870896694427,34.34090574715547,11.224824741695421 +0.15025285464189597,0.29942830131697407,27.226108002711157,9.023468884985558 +0.14994708850547617,0.30455171623901117,33.150019304155705,11.464675257414799 +0.15330055767886494,0.30611201322151366,35.129580515653146,12.56430698465474 +0.14880739576623295,0.29476278324158994,30.922158433150457,9.606316687703096 +0.14895306589162713,0.29939663534078736,33.28112922235441,10.91215737867772 +0.15028537673187473,0.3078337342596627,35.47897813231867,12.780271042940335 +0.1509447348982303,0.29731044549330937,27.426891752985632,8.943121913800187 +0.14896887461921282,0.2903639641821149,34.657429529421506,10.347649280423324 +0.14910276306601247,0.30543158193845504,32.91496325367645,11.403037244665983 +0.15060319525843122,0.29952310315353126,28.592246970975108,9.452275538595543 +0.14960114559175736,0.2892881034305204,31.55285925499768,9.327744075766233 +0.15159911660125133,0.2950070275675495,35.698306443044686,11.404397661673258 +0.15242447984123036,0.3006029250367233,30.446736347530045,10.340538305235658 +0.1513084301469129,0.2939775572263108,33.38986000664089,10.451222647934177 +0.1492286331363385,0.30509165939805377,30.469659320002208,10.609410962352806 +0.14852153380958502,0.3050214553897647,31.62801695412589,10.84388859284403 +0.14961737870139738,0.2965157163127063,36.724246047974844,11.718981562802156 +0.14999110046324415,0.30728493292829323,32.435519125355796,11.537346315158524 +0.1469232929693161,0.29399451637699725,32.182460062826934,9.865611479139625 +0.15108343855845818,0.3086931307207892,31.57418923449266,11.528955966520448 +0.14745359769559274,0.29871645912394584,31.601261430331817,10.13948048161434 +0.14970476878786962,0.297329110651904,27.58232296160176,8.876185691253317 +0.1492642711522131,0.2926302904247786,33.85491615639427,10.313070366274749 +0.1481489078366517,0.29368126141700585,38.90883058894111,12.018144829836395 +0.14934342745600654,0.3030445759355111,28.861789179119462,9.85443271151325 +0.15096419878728715,0.2990910030426432,28.549644247528274,9.408940736329425 +0.14871137714627083,0.3055505117803512,28.93178579496648,9.997506313311153 +0.15055148396613305,0.2902800808065348,23.34177416263119,7.015141226801424 +0.15000893362069853,0.2934824069201333,29.031872843056913,8.961002760545547 +0.15013040772187697,0.2948758735689979,29.77865225288852,9.349297937058711 +0.1524160352073255,0.2986973643623877,25.411496063857356,8.433251546711542 +0.15029067041614602,0.3007237501737402,27.80413946434738,9.285279928677221 +0.15160777331586242,0.30220360575663807,37.1674882063486,12.718798235795665 +0.152038447288642,0.3061827356272248,25.671258491490004,9.200144551002353 +0.14953823584870787,0.30607963413378164,34.4393999348103,12.014652550049453 +0.15034527315020205,0.3069076201601502,30.750227894932635,10.902737420872954 +0.1504323631961632,0.29696062674966817,31.124520526623996,10.018933424396902 +0.1493195443388536,0.30084925945174995,29.06995817505204,9.698803702342078 +0.1507462016762587,0.30319183439382263,34.505403134299456,11.870065655436722 +0.1490080152400608,0.30745412639002795,26.3890868719593,9.32154494823567 +0.1495930779134718,0.302062597397883,28.92073078233601,9.723328452061082 +0.14941133567726372,0.2939023213677018,30.604931881401594,9.488872332567002 +0.15102151266921807,0.300836335403934,30.865387784401953,10.459236799647849 +0.1487095495495878,0.2962513271433802,27.94392385655112,8.808188750760094 +0.15023971137371867,0.301163308319806,31.757558800755664,10.712986545844743 +0.15048635240777133,0.3091139883897978,36.94566250587359,13.443753633325288 +0.1503046142553627,0.2934773838938724,33.64845978722138,10.440033438144964 +0.1512951202233895,0.2987181154982495,35.011466607983316,11.561351513198527 +0.15100649558463833,0.30370272247345015,30.3044819410838,10.484357142372676 +0.1505790031776242,0.2977288169794257,32.48497090798989,10.587070515995716 +0.1511995826287247,0.29660193145074815,26.34262373231169,8.513807548247184 +0.15057093031595906,0.2969920015961771,36.62267984408259,11.785942265429927 +0.14968158255729935,0.2987610910688213,30.21409605935066,9.87743861070166 +0.1507582654334865,0.3027903677876011,29.35298059861528,10.030972813450225 +0.15022685844945027,0.3008796443526829,36.00150132031319,12.037497286543624 +0.15062802667419714,0.31089551469947113,24.713236624311087,9.148040505417445 +0.14915131680787616,0.29422801550490524,19.408480699302324,5.993968332279883 +0.15117107415359618,0.2995500763167286,28.225624364149905,9.37402784293218 +0.15154416983979377,0.30728288680973365,34.57509051440547,12.496657060864353 +0.14866226809838162,0.30086775918766157,35.26580574387141,11.70235511886849 +0.15151657904897364,0.30775151621743285,33.279428111892784,12.000753645224346 +0.1498128827417418,0.3011562646597917,24.990045981895925,8.379208843208337 +0.15034509626771062,0.3021302155302349,26.751801976867654,9.095482246385776 +0.14874601373770033,0.300528504168351,26.902131119136204,8.873465044124405 +0.14814879999931446,0.29458936451879797,33.03189535820808,10.26528110748503 +0.14903229147880506,0.30446836811935,26.35097149976043,9.069695703512181 +0.15149259237704565,0.29231044777260984,35.05965975369023,10.846072737567685 +0.15149310243302821,0.30193402450360457,31.43474148545587,10.727561003312559 +0.14790794834103327,0.29422730342373843,29.793708479415788,9.136541233214635 +0.1471510527780385,0.3026114176970686,30.588164609235005,10.275061268783974 +0.15076252268580473,0.2934613245921129,30.256816897290648,9.456358512408219 +0.14890941766519045,0.2947633991788063,30.180937106877998,9.434297691180287 +0.1493459971247042,0.3022908055527914,26.120339822331765,8.78154598261759 +0.15021086795303792,0.29687267571778,28.214777098615173,9.102268591786169 +0.15057817007333987,0.3069888195108598,30.132820205448635,10.768021314980604 +0.15097230917064985,0.2919172131577889,32.80014727701795,10.143262373847682 +0.1510606526077132,0.3044791908004799,28.24578103165277,9.87006755985953 +0.1518832609600934,0.3085446387794113,27.744338608138992,10.11339753628359 +0.14987221480297153,0.30148195303224884,36.03079506961075,12.072921311250052 +0.15132169728605316,0.3025769760856489,28.48878720513068,9.764239648108243 +0.15043460822903207,0.2962315478372809,32.01215207841719,10.194678845073382 +0.15121890413756106,0.2957711340091951,27.73626828771082,8.867996430313138 +0.1495610507621615,0.3010700403202734,29.230307444660692,9.765653961140352 +0.1506859961139968,0.29228985090453735,33.71425011489931,10.394119968716463 +0.1476688031822984,0.300185348629255,30.632505233474877,10.005269327168074 +0.15179730683341242,0.2997641320567405,31.442999698576955,10.53843118945548 +0.14989521770670144,0.2963688187174632,32.92310390812726,10.523198563250023 +0.14999509465965177,0.29287343066557275,34.338768947623954,10.712257019059956 +0.15103744040105455,0.2928559452246967,31.64622324311485,9.78560986176677 +0.15184867032793947,0.29636692609705095,34.58076507587146,11.142639462669226 +0.14992433155587293,0.29730671161399885,31.603342708692868,10.205036051537007 +0.14933033412651492,0.3020121420519806,30.972995535955352,10.451764713300546 +0.1502991273556835,0.29991525562219445,26.803375739250075,8.882596026842238 +0.15059780679529378,0.2943915075617714,29.41196634973738,9.27039415320671 +0.15004697010001242,0.30482192788745854,33.4214678489096,11.63875343973865 +0.1510431269123195,0.3004793461188385,34.70771847579585,11.656824794516526 +0.14772461052238522,0.3023568072861861,33.3103272234157,11.123439000791167 +0.15043008108249503,0.3001295202598569,34.03912496374996,11.234817701816562 +0.14985959336157248,0.2962931671856666,28.154755686664384,8.950468074589018 +0.1507742601229193,0.30845392455592824,25.835804576564307,9.336681200473839 +0.14938313517539226,0.29575539720999566,33.05414518037676,10.489563610332752 +0.14947015525848073,0.29845079245173367,26.330301438933127,8.533428700185981 +0.150774806898448,0.29019833587605326,27.443901903085067,8.27354223247691 +0.1494669749644858,0.3029944896216185,28.430325825833865,9.668443390928937 +0.15118076921442858,0.2987656972855362,27.329464778021244,8.966596705953567 +0.14816867561362324,0.29823129475185384,28.94173004822847,9.322726607983055 +0.15070944583997414,0.30027256256443285,33.941978316136215,11.36853286714588 +0.1484134321573814,0.29232311463446836,30.50202846146171,9.274639341579933 +0.1515086211812547,0.308248374587825,29.775253852747127,10.698355376065066 +0.14971496295241773,0.3026732726909654,37.457763647637904,12.672436691571253 +0.1471304997197766,0.29896410888104147,31.716784322696583,10.101004963425526 +0.14977170923700583,0.2965580583527487,32.695891231616784,10.461885876620938 +0.14992922621184415,0.29864043957917885,30.75367318813268,10.149722727131676 +0.1510957775434675,0.3029882287535858,34.83765705970965,11.978883179374785 +0.15044803665897313,0.29611475172949303,28.291481472269794,8.982107661702308 +0.15067351682279603,0.3066201561519702,26.24525377321423,9.343680343891819 +0.14931070169633295,0.2999911029107765,25.315530572857025,8.327186572942342 +0.15059988950140266,0.2960924993396853,36.00550186517108,11.59136418689494 +0.14788637305403607,0.29564551285727136,34.378470356035066,10.74696323672083 +0.1498810075932557,0.3018473184633435,30.789453751795364,10.427651637042832 +0.1501154019045179,0.29977754810307744,24.938045196976105,8.211883065426845 +0.15068880462259532,0.2992580110375749,28.668489134145617,9.499049334530719 +0.151220005324676,0.2983966424086536,31.07440513697433,10.237310359130918 +0.14927715273671294,0.29086555780458323,29.873202109632647,8.974239740296051 +0.15009968108229363,0.3014850004917324,31.132930379354395,10.433359763661288 +0.15236208927424358,0.29349281842811364,27.54446476247883,8.65215263159151 +0.15049607626813713,0.2934455806171751,31.400564826551953,9.717559003334333 +0.14901844191821087,0.2907298570758176,27.941982095762178,8.39152707653335 +0.1492003437242695,0.30371493911770786,31.263435945358722,10.69239139052768 +0.15094926899408365,0.300980036507261,28.332863353038434,9.555820720839751 +0.15194627306986813,0.3000830175470388,29.59353119612059,10.023241702596954 +0.15089000041168668,0.3045939547671543,31.34401394448892,10.916105412678291 +0.15068162323786294,0.3020121453664716,26.275435971732783,8.948663920870983 +0.1500711029013748,0.29888015910811444,30.69281283995926,10.15271152537821 +0.14948754930045327,0.2938563061474292,29.325267226266764,9.026333686119075 +0.15054754876346574,0.29953768821541915,32.41712957483046,10.77082335700364 +0.14881953089447714,0.3008640465547994,31.53767786571031,10.473319993468483 +0.14999149768807246,0.3018055328613127,24.226290790323986,8.212888943403158 +0.1519213682818353,0.2957139933369865,29.674938028852104,9.48321722263086 +0.14819904468267045,0.30103407688267597,28.175320713172912,9.330949298704128 +0.14932424326465504,0.31240380774565585,19.613020707406456,7.3022173414286655 +0.15057313555797566,0.29126837005250705,32.971681387271985,10.028646554044508 +0.15103374958032303,0.2927180664468213,28.677380459247473,8.851312830356253 +0.14976544763567418,0.30379067520573644,32.19911807871424,10.970022366899382 +0.15108440236489834,0.29814359722246536,29.67576196224293,9.653463618006931 +0.15137181643451889,0.29965713584620485,35.81270265070755,11.910630034991147 +0.15019279577820796,0.2987734815228041,31.567437287195744,10.36565623150825 +0.15045964610925727,0.29460080339939854,29.316874894091594,9.21150970568529 +0.14924145461496635,0.2981768509320001,31.88105576862833,10.342949016028339 +0.15041407556195457,0.2904569958685075,26.268544063632447,7.887997275079579 +0.1492020088427761,0.30226647862670486,30.69778356108123,10.326627318715483 +0.15002326884940428,0.2986838608789926,30.763844859144136,10.033108128473808 +0.15151918391890365,0.30010107480420906,30.955906982671898,10.415449738174305 +0.15035301088470232,0.2965467071410002,35.646003145994555,11.396635648245196 +0.15065487139220515,0.295506106004831,33.051450754638495,10.538313490778059 +0.1502669285542142,0.29888736458630016,31.818577966717747,10.433809351236025 +0.14976653035508358,0.2968343215505765,29.833310953527413,9.556100135913958 +0.1511991229082891,0.30395582144024,33.52930692603067,11.713886132768485 +0.1510369791760681,0.29685055435152147,28.4981228139477,9.178791649541965 +0.14910296596590117,0.2996417013002109,31.578908334443998,10.328219516503372 +0.149528155854134,0.29909337679672554,33.78649739925598,11.102375894597317 +0.14878991791885998,0.29940949485763535,33.797924396901465,10.998126904283982 +0.14926764714811191,0.29983045438090256,32.43006695134997,10.699485746638668 +0.15088681737170662,0.2945029197329137,32.78573928813811,10.315829837334435 +0.14998418830527643,0.302355294791954,28.713218117383413,9.804992915095479 +0.15041074739287738,0.29914360894122627,35.47461208391715,11.607229654750878 +0.149888408771864,0.302836978069785,32.06760975882903,10.887587376684353 +0.14777977560744437,0.2940614551567987,33.92299258054551,10.42685167902315 +0.15055446945947182,0.30768670156344313,23.490979967770624,8.472447015845093 +0.148263509366539,0.29779323493162446,39.035926800091424,12.500774796539984 +0.15086074638623673,0.29621976094924074,28.648313712092243,9.154688188735916 +0.1492925575657649,0.29093658701161246,34.34329099826759,10.323630980736443 +0.14887218395584953,0.30726702229429986,30.58472318644466,10.821063887743318 +0.1510446501368456,0.29224341972526424,33.10438980987141,10.181711438547364 +0.1507400168091013,0.29317815755345716,37.240253616840384,11.523783137010437 +0.15121593800070457,0.30263478468534516,33.63169092637875,11.584530842944561 +0.15117766065255528,0.2976016974457809,31.907158883094947,10.389993180195345 +0.15089574769031902,0.30320318299689847,28.080754215930416,9.65655400737332 +0.15050589037748854,0.3010436753737675,27.99207784014738,9.401914974327115 +0.1520065549257504,0.2988261388884181,34.98933285226727,11.626504975910443 +0.14914959610075376,0.3075858053886476,27.06004976656196,9.614366676097507 +0.1504780599276882,0.29409591887933456,30.821441368246404,9.580612312652418 +0.14980065178164695,0.2965829234196055,33.304331535933144,10.659862424334516 +0.15026182888229653,0.2969626703271358,24.36593755615013,7.861151151410196 +0.14740622536256273,0.30482724143420115,30.8320652222042,10.485218519736595 +0.15004107553082352,0.3037232118263087,31.170806612494992,10.751511218277209 +0.14830044816336907,0.30895526598090534,30.2705608784917,10.860898357156753 +0.15270958549914032,0.2975787699172909,27.455770949429485,9.034566536232912 +0.15106391815551964,0.30341811349685305,31.6331790302197,11.024792988011173 +0.15167386187382995,0.3018258188667581,27.534662536379514,9.448623066105016 +0.1496977540300201,0.30028777197343387,33.74322952656242,11.136740462617162 +0.148701041833549,0.2932289880059655,28.78973272752735,8.854022058610695 +0.14912428104951425,0.3122610152444428,35.39079321192779,13.127925284304178 +0.15033960842865823,0.3029784684336279,28.478844429894536,9.699320876638332 +0.1502161383326461,0.3038731963508528,31.71721101355701,10.89028989067416 +0.14968673120767084,0.2982943734778103,28.44655006217986,9.221234957623127 +0.1530863015986719,0.29903575931841825,35.19079765665449,11.80766352423933 +0.15067607426364735,0.2985207959393135,36.751093305390455,12.072579881625707 +0.14956758124860062,0.3035390712094153,31.819180584663457,10.878812522467957 +0.14947137930874885,0.3024709591986557,26.934387911937634,9.129269128070385 +0.15024181998807667,0.300408770363316,28.81232073821449,9.59159629507517 +0.14918652519283482,0.30074110267546805,33.742301219295534,11.178718430858224 +0.15018888583554643,0.29880777561645266,26.33521557937092,8.637022518048255 +0.14918119003122648,0.2949886745954398,30.349600067280985,9.484178868991917 +0.1500609424969694,0.29945640496878273,32.586820472698605,10.769049424132366 +0.1507930456705503,0.2977578023900573,37.97660672598229,12.408063745495358 +0.1499483875710816,0.3015060352583475,34.70208597655041,11.65744568329264 +0.15002510311239348,0.30598378984462055,26.575215710798958,9.294056691560405 +0.15058553243646697,0.29674539347061435,31.19757417957157,10.019551262858315 +0.14860707857955005,0.3074614676208342,30.35356963236896,10.741797504629394 +0.15063485854581035,0.2958916958603231,31.16232944031297,9.943465958093533 +0.15023543687792787,0.2977655817475944,30.2976514566363,9.810146855391272 +0.14733343495181112,0.3007964467767419,30.42955020754591,9.985837229051368 +0.14862878363405777,0.2974833489865996,33.13930559382762,10.634163067096425 +0.15254406574655036,0.2911122291381535,33.55764185385508,10.368089386492462 +0.14788914002739084,0.2968503290340743,26.916352958850005,8.484270381797899 +0.14893006043991475,0.30296924288550475,26.876907629745954,9.095578164788611 +0.14954490295484538,0.28938656920399924,33.357076720602294,9.865071894993102 +0.14927245458388458,0.30887779257831766,31.24155308539835,11.23364547146142 +0.15031638908735806,0.3019413241719382,37.395881000548094,12.657532820776128 +0.1505363462699479,0.2997831065109857,31.98692920684378,10.613077583981081 +0.14757181606651643,0.290578507966435,27.960739075481015,8.244341919000489 +0.14907816749669353,0.2975942128445508,33.27186659506231,10.662485086242034 +0.1503166101807711,0.2932889649159534,30.312760941182482,9.409491659704175 +0.14991646260878996,0.30199124815161443,24.64443744467545,8.32963856404686 +0.15042780594455243,0.303355031939687,36.49088220965446,12.64427782225258 +0.15035458569994473,0.2979835566289129,28.379381134625913,9.212661785966164 +0.15029183964603152,0.30278520157295025,34.24909377638521,11.657630489943035 +0.1488816458110228,0.29899077477230523,31.30461239076017,10.169906491465271 +0.14947736822905427,0.29890919497037377,30.819045278213853,10.093633072002945 +0.1495774472714237,0.2932235282394989,34.985618140693866,10.8663189491922 +0.1502093669834713,0.29745861278691543,29.534961774571208,9.589313249245327 +0.150288884708207,0.29947931535727773,28.91600978582943,9.552694433632679 +0.15001109404790114,0.29832858786679806,32.34203887139163,10.54768853588139 +0.1499275881703455,0.30369984731247784,33.355445254633224,11.44559014574646 +0.1513014283331823,0.2999003881029739,28.75475568127949,9.604974847741019 +0.15060958081846865,0.302111568381731,26.86255351249752,9.120166063391329 +0.14913580783721297,0.2966410934007188,31.356425182097237,10.000698578913134 +0.15123594992738035,0.3029999655506147,34.07614779142296,11.690871048085878 +0.14980419441133716,0.29861985740736313,21.65418110160892,7.064653320354372 +0.14755325684455525,0.29577129135351,31.45560802140075,9.827939088298221 +0.15111200084379992,0.300375275430702,27.05759584451394,9.034597729719238 +0.1503672167472082,0.2993168419837496,27.347544059747865,8.946689591520146 +0.1508797987486247,0.2979985140837423,32.06983708343784,10.478289775242146 +0.14995192817629743,0.3013063131257225,37.73383129226039,12.62558671033307 +0.15051167272389304,0.3060378456987253,26.850201674371398,9.417138479994184 +0.14916640621633792,0.29443221355127186,25.432660645925623,7.974422911438147 +0.14839627634881533,0.2993851880613422,31.06103690755286,10.09232340700511 +0.1505187950544749,0.29928413615784355,29.329808338819102,9.667827121752978 +0.1500336105632486,0.30091377533319713,27.526275162872775,9.19412672915242 +0.14998065575639447,0.303902857790533,25.864135841626535,8.931738313954337 +0.15080109470597072,0.2936403269697337,28.629353068901278,8.926897165344975 +0.1489656387429419,0.3037636393567041,28.771783541266856,9.83967347268145 +0.15232530060664726,0.29903331404514233,28.405855264011635,9.519114586680374 +0.14747276128914413,0.3013777354963375,28.956363811635274,9.580493355681625 +0.1493956953299319,0.30106346805155215,37.40349273714969,12.478300315646056 +0.15174041100787,0.2965009731225903,28.712680987431202,9.265596090069748 +0.14937580314256566,0.3000786633078995,27.8185524525386,9.183714396705252 +0.14902703275600226,0.2999401035064703,34.583929263271564,11.388814495241258 +0.151190233430722,0.3030337509472216,33.61057203177463,11.57407203703368 +0.15159802254517157,0.29762008463623274,32.12843088682959,10.512306451877096 +0.14948650520637904,0.3015657010973747,22.75852252412735,7.682099955334691 +0.1496642365530021,0.3062310731433325,31.117341917312427,10.955113383448342 +0.14893460894165575,0.3040635550213462,28.326104799733514,9.680153389838946 +0.14981368956256017,0.29634706966985264,24.515147232835627,7.786792643612841 +0.14837738591834368,0.3025612668295916,28.2041636522841,9.478565880134783 +0.15058507328943255,0.307767172018818,24.026217257158677,8.634950671301269 +0.15071512161665104,0.2974263079378452,24.120250712282466,7.838928033439598 +0.14986745802251702,0.3017673577509257,30.98884997428999,10.403769980576635 +0.15061419178847887,0.3024523962816918,26.010232885198878,8.887554610748081 +0.15076773708787708,0.30177464425281686,31.42341309373993,10.64327820582826 +0.15077198551307922,0.29535256317577085,29.1405112687025,9.316532115621941 +0.1509171891624966,0.3015552153980775,26.637589469515056,9.069028802168285 +0.15025449929797186,0.3027407799030195,40.90901754176369,14.007678158247998 +0.15133899708750123,0.29731909805997886,22.917810875216013,7.47403302710069 +0.15096592039757228,0.2977481951673454,32.12315843276999,10.451092681124747 +0.1501180132460969,0.3042766688516099,31.75417422762076,11.037991497898384 +0.14951245686781525,0.2947501304710391,38.55733969260438,12.185092683137514 +0.15120327633638617,0.30676173139415336,30.02003359626483,10.743516196501087 +0.14842085694901078,0.3023849564197311,34.184970207572704,11.425962110772922 +0.15156945357188584,0.3018084210773706,35.91328806842829,12.291936187626469 +0.14834020547374457,0.2901269982497304,28.802247484511142,8.55069405087363 +0.14979524218870371,0.29786927065667135,28.656686992844932,9.367135983224506 +0.15045868672132423,0.3049435641177502,33.05307129489781,11.480228336407132 +0.1483942329696348,0.29962957421272235,27.26291740266668,8.933976901590235 +0.1491995057834843,0.30710004597732055,27.83361017691259,9.84249380735658 +0.1484485181204472,0.30454111321959804,21.516988974191953,7.325137234735966 +0.14976585224782815,0.2983773673446415,33.78232967925452,11.003285398330037 +0.15109298644400412,0.2978244126301829,28.12407870160748,9.128148339936741 +0.14925901981686115,0.29954782840251426,30.865478522725645,10.127005451739775 +0.15001861381841472,0.3036047515518665,30.2535749106866,10.350989183524003 +0.1509664425290446,0.29965141764442393,27.038615442670476,8.96087818049083 +0.14883004450813458,0.30052277040826314,29.33661606299958,9.685695245902734 +0.14856572494398707,0.29976026924651344,35.37448013951501,11.531540048230147 +0.14876709526083517,0.2985619195066997,34.403528065249866,11.160824306219265 +0.1519374995494205,0.3018883468886618,33.2753532354352,11.343168375683367 +0.1506559243433495,0.2977189104939703,37.183921138987365,12.102308015548106 +0.1495068789546399,0.30139826185093505,26.493090639649804,8.81646838131137 +0.14799889156802182,0.298398125735086,34.373375761707294,11.094654528647894 +0.1488554167531753,0.29565195627176066,34.50759284980067,10.861420592122949 +0.15104901291048523,0.30356906946381806,32.86819628867165,11.370904189985886 +0.15030188127232255,0.2977156218739811,36.97153014847191,11.956853369813441 +0.15067934514853276,0.3052041412930608,29.97295514367326,10.51916310380066 +0.15089506253561888,0.299085612373873,30.222565735219636,9.903578595845705 +0.15015417916661541,0.3060428252301413,30.648040413980187,10.789680114805424 +0.14930833628841975,0.2972488491427643,39.31956537560325,12.60460982014103 +0.1500939954835521,0.30206108904455536,29.846907404132438,10.053253326378725 +0.15064559389868318,0.29444978264230093,32.012410829257455,10.12335512275027 +0.14903369309058892,0.2886664472374679,41.86523974514648,12.281069557358745 +0.14940455414047613,0.29425767885210363,29.076064703523944,9.03887866809193 +0.1478846709131926,0.30134157394046684,28.205762233193845,9.369917606315253 +0.15078310154914792,0.30419282285707216,26.974500802757333,9.48534854077749 +0.15012739922854448,0.2996634272667118,29.043598931937762,9.61506608427027 +0.1506704927168307,0.3040273447535611,28.03333102471922,9.720804495472434 +0.14840646908447533,0.2984653977788898,30.19440904560796,9.743713135484583 +0.15076792476451653,0.295841427108785,30.02747214294451,9.63423754014812 +0.14996191496353556,0.30302343913316443,24.42479866778968,8.367892156172406 +0.15059303334359786,0.29708669256218473,24.36637794798471,7.837883664130253 +0.14932176288251797,0.3025862569044024,36.120460693202155,12.21717668732971 +0.15114377690224862,0.3012623097260764,27.568088705529593,9.350293008089363 +0.15139868708209775,0.2994404511999676,30.89046308499769,10.286731279281053 +0.1494914905381328,0.3043462488197178,29.528923992427814,10.17291709717721 +0.1513631835619302,0.3019751716445081,24.913257849395073,8.520317197516897 +0.15086352814518159,0.29735696824386887,32.89385798250291,10.703261951038595 +0.15294431894325225,0.29600077419338156,33.390329698404095,10.819937433259417 +0.14961938826186996,0.2969337656316086,41.60391331355774,13.315599426170293 +0.14958780325107568,0.29800700049364104,30.980564829307696,10.02136954992727 +0.14868556251864165,0.3004343505308605,31.65574551417104,10.449871879558987 +0.15045138409166842,0.30652681260511305,35.768878124634426,12.654930207986212 +0.14924784639126135,0.29400071279425644,32.096217002234866,9.959733116217834 +0.14993371021225804,0.2965532742826185,26.087130161882097,8.316644750798135 +0.15029780316677474,0.3046031214138099,27.3274974525436,9.486191133972929 +0.1516064765431956,0.30179270681234455,31.35472126219318,10.651689604359023 +0.1493558758743699,0.29519051417565834,29.779535788589367,9.343204622779442 +0.1525703625926854,0.29464016300082174,28.656690363781134,9.097111280629534 +0.1507865219169648,0.2927518727426689,34.30725392565914,10.643567221950576 +0.14990576108632325,0.3071638497860718,26.041991870711463,9.231525643353597 +0.1509701340730554,0.2938017014450783,35.41327471286722,11.097048199129084 +0.15206275718509027,0.29930325960030907,35.86589770793475,11.967911233976473 +0.14964386284521097,0.2976650411628569,34.36410563481566,11.117661464227005 +0.14925922414411005,0.2930284250877264,26.751762769801708,8.234830670249135 +0.14883913559172476,0.3009645329309352,32.37105692462787,10.702426208202489 +0.15043752215647896,0.30231484850584117,26.66005812989897,9.116584825704194 +0.1514478640689323,0.2980819265059424,36.07398971181157,11.877759085742284 +0.1512851063130228,0.30178835926275227,29.647354059508793,10.097067526523238 +0.15079868309713954,0.29740237673305037,33.40995542454431,10.805866502171604 +0.149662560010074,0.303604675733528,31.472608944103026,10.807342948217384 +0.1506762125088467,0.3084932692702251,27.918431751073662,10.071743543247528 +0.14782419543131053,0.3023506050850495,29.416612881734483,9.83877681503561 +0.15046478619120485,0.3093496541516581,29.329825945799783,10.635884604419395 +0.15179271441217693,0.2944958468580398,27.934052544840014,8.8858209178518 +0.1512002232089866,0.29653521642643194,21.743940783814363,7.027605920072059 +0.15060844664235318,0.29678401277819083,31.766620468926046,10.272843202269941 +0.15002726569425265,0.29745531038049206,36.47376895388054,11.805868828564899 +0.15075242929204055,0.3009343270203643,27.287057800111853,9.183440144516883 +0.1484453650861081,0.29952744388358765,33.187870844583664,10.865601683529729 +0.14837304071291316,0.30100993971986384,35.844345203333894,11.83045083568649 +0.15050618145951317,0.3028850322225646,29.673298259012007,10.118391419431811 +0.15029785875999183,0.2919472473495795,34.65804212105855,10.604291367652767 +0.14859128207774175,0.30028356250509647,33.43570092258685,11.053662464597139 +0.14926490565642783,0.2974614497826881,25.290674934968514,8.182411078925668 +0.1496825134901875,0.2948095576809765,32.81299060401424,10.31009479789265 +0.15044226228066837,0.2948654006972061,37.668118785536265,11.845821014235648 +0.15268540998779342,0.29937374411697865,25.994114804085385,8.712242335019372 +0.14858861216720107,0.2974894023640524,34.10702758813251,10.887277339937047 +0.1518635466679473,0.2985271903941027,22.196781680856997,7.344883204310118 +0.1497536947134575,0.2977046877583109,29.64126564582211,9.613096844422211 +0.14943785354981234,0.29922856753485255,37.90341403591808,12.433923761296008 +0.1503166713622611,0.3043172520426554,32.3661963461317,11.22711146933555 +0.15078710919310742,0.29803933531631943,32.89411509820583,10.75817903701078 +0.1498462257059411,0.29394545414788037,30.038123804429713,9.344910297943104 +0.15178025321190733,0.308059464988682,32.43842613683945,11.83780291767408 +0.15055498074624993,0.3053690614243249,29.332671122638228,10.332356053415863 +0.15203580092835575,0.30181203010056945,27.684861842136456,9.45385105101417 +0.1500111399875533,0.3030077959156818,30.69067834317036,10.524794548047643 +0.14833781205159577,0.2982966216177999,30.118904273312506,9.68933762676507 +0.1486827549305727,0.2932752637565865,31.31827242655602,9.559841210339005 +0.15048801567206602,0.29367949397890286,34.3714149449578,10.726497578548218 +0.15046997850298868,0.30627115418879364,27.522331244808488,9.716677422029955 +0.14893705952775874,0.30038848810185376,35.41807228497105,11.687757313918095 +0.1499727911597267,0.2996889919954292,35.124151199939675,11.558593794917503 +0.14786225504452571,0.2982375441204221,33.0052503134442,10.589025058666365 +0.15131376222526624,0.30782145879767614,32.540813110276446,11.77523395213765 +0.1516430037873756,0.30207987821487986,34.355402329339775,11.801933386505732 +0.15098007242011552,0.2950849413479891,37.10516579401164,11.737719622488587 +0.1520703797749854,0.3068270463276858,28.573921898456106,10.267344854871046 +0.1490084767659443,0.30737616761521047,34.973224952217485,12.477947950400424 +0.15109793939918886,0.30346697154674557,32.814825817867614,11.334765195332846 +0.14916932882595496,0.2997578491015143,28.529918067730033,9.373951982067886 +0.14925465247216566,0.3035437011678686,36.69045648801905,12.568504926337088 +0.1504007251539926,0.2989149812474215,25.712485991295193,8.46577011459349 +0.15067367911590415,0.29543544976639347,28.221997741590023,8.970829407892522 +0.15006186380694703,0.30103741318622407,26.4439171865534,8.884665515140524 +0.150458602512474,0.29992379409443903,33.0149161054601,10.928122526682312 +0.15009318332513552,0.29334759620661766,29.40316717877247,9.074141647034734 +0.14998094998334777,0.2955356905084732,30.22436574789431,9.54524479612075 +0.1499024226887319,0.2977483730160399,34.28606258304423,11.199252723038182 +0.1493339392474207,0.3017042399087699,29.319380880418514,9.856125544718987 +0.15011265282128067,0.307712054359878,24.472678539547932,8.793160469341734 +0.14962079392127406,0.30312604831730633,28.760271493442033,9.74783063503945 +0.15160264526390219,0.3012357717896196,27.978854793827313,9.510738147642947 +0.1517835729905002,0.298901463237264,26.73451378914395,8.869973544846678 +0.14977907206909624,0.3053728171437475,38.44583677625377,13.414837709503171 +0.15172958607107817,0.30462397517290885,26.182559924621252,9.183515735388715 +0.1503056474595276,0.29308744377324986,36.150191051617696,11.193363634599772 +0.15165046027251256,0.300568271870888,25.734348685190028,8.673804420637332 +0.15058360625962472,0.29752395064539633,33.74599534665227,10.954061194688098 +0.1502136465338399,0.30841594778004905,33.72834938912091,12.203067222864608 +0.1494447310905674,0.3056617103739779,31.625896638837926,10.970614976179696 +0.14901669566095727,0.304278539486677,32.805176798947464,11.356159813747162 +0.14974510920245884,0.3100525679538434,28.12351864954404,10.257872138623558 +0.14989477410624058,0.30222117173486174,28.902852589409303,9.771566899608903 +0.1519380124932902,0.3035371492351673,28.511645846344607,9.869875560889344 +0.15049135121630877,0.30576780341006576,31.573171032310363,11.092190708611657 +0.15000121538841918,0.29248220379363565,26.283968993226676,8.073477080514785 +0.15113143245379496,0.3035866006018007,35.758922943198996,12.385039268493864 +0.14920379009815882,0.2905500488537573,29.186761964271646,8.785607625015592 +0.1505182316508701,0.30561366309689536,25.11715409477581,8.824960381218203 +0.1504111246086181,0.28971564963212043,27.679152679067904,8.264833318180205 +0.1517653126627752,0.2990648616856187,30.563759062048867,10.134209820184717 +0.14711830500830458,0.3039216677131862,29.981307104015904,10.192592991135728 +0.15244821527059224,0.29720624366247356,32.393755277079755,10.654645420316823 +0.15091815716259357,0.29830882485821547,30.568265096482754,9.986659616437745 +0.15135654444640625,0.3022739113468509,29.200623919011,9.977744266470019 +0.14936179389544246,0.30043635162215615,32.427402959303734,10.737224011721548 +0.1501135977559615,0.29614124177416307,33.69551125834044,10.779407787037705 +0.15057437908678659,0.2999563796725782,32.20108130724556,10.720940691730906 +0.15195396274157577,0.3051676508483932,30.892294460746903,10.856726738714121 +0.15316698469541248,0.3031570121557386,32.08647816226913,11.179681328403003 +0.14840413681230077,0.2956900063397883,30.7564095160484,9.617808642340874 +0.14853336583848084,0.3052431719288173,30.51018098137511,10.554134686279033 +0.14978978969625084,0.29950798528816946,25.73759698252809,8.504128867005564 +0.14989138689466233,0.3027347162337493,28.46159515168385,9.6936173045858 +0.14962773750211597,0.294796012753617,25.570170623840113,7.990075517146106 +0.1490959310679919,0.30089989286114743,25.078544952577296,8.308677378198935 +0.15061688127928843,0.3023311170584441,34.63977259626869,11.797043221415642 +0.1506412473412563,0.29999769371254753,35.45640751649038,11.763116077335656 +0.14984560888327514,0.30427414212978976,33.51611710598689,11.513729534654649 +0.15147885917332754,0.30397189796552815,29.34167875338313,10.15776889327649 +0.14952841605327724,0.2968051561276766,31.974405378603798,10.246467333401519 +0.14897975528899043,0.30578039816342417,32.614761068198796,11.342460854128117 +0.1516189178307404,0.3009002899142972,27.387357219553113,9.282891850732574 +0.14991349958260705,0.30642640211005423,31.5038713133312,11.083777150565602 +0.14968809381274562,0.2992576409896357,31.233932754255008,10.28397362046969 +0.14784261107828545,0.30021726221830675,27.28281039231393,8.975500453473808 +0.1498179143072107,0.2966764701044324,31.610927524030114,10.151748757277831 +0.15041559694197038,0.29916741041488054,35.648235754394065,11.76219640264478 +0.15114842004101242,0.30175178675148095,34.61477001145648,11.71393474579716 +0.14992963441145607,0.29819348781943456,28.058300601571993,9.132709725246523 +0.14970269873044656,0.302012804456584,31.376996189138346,10.627310990173388 +0.15103445365916993,0.3011267857925183,28.557473458909094,9.615854342746147 +0.14983286659984904,0.30147985245893505,24.254769547203054,8.166707099317279 +0.15105151504097133,0.2962741915788476,29.024659474320103,9.337742948891357 +0.15174644657474176,0.2982332536215918,32.169106398154184,10.576570702629374 +0.14758083770801989,0.2963723147685643,32.48533962386824,10.193326606874107 +0.15124963628039348,0.3034722324881955,32.67851288298868,11.31839403176165 +0.15059599455666153,0.30187845357756543,32.61667355037423,11.082360697911204 +0.15068931058393414,0.30636598448309904,29.883576778470292,10.5489199236166 +0.15034562597514187,0.30454874421088474,27.064811468697886,9.34741607295157 +0.15013435694275057,0.2977993546068196,33.17177305553215,10.71729113585237 +0.15231048765051944,0.30632905742261296,32.15670847463518,11.48366107794676 +0.15013561033314135,0.2953382592876757,34.88124663083172,11.032722809752773 +0.14954007543665873,0.2987652378741349,24.00627042876532,7.799959333470975 +0.1491219530689186,0.2962949125552235,29.297952156464824,9.314092067683916 +0.14938251031483513,0.30120122632563157,26.107009995782256,8.722244745913583 +0.1495295716595131,0.2990552595936066,28.911798711898488,9.442975991645431 +0.15084112580545736,0.2986681601618449,35.545953544669985,11.753604523942538 +0.15251595841701968,0.3052407358803844,27.278573451843773,9.673833139157749 +0.149258620959451,0.2975906340906592,36.51840344715672,11.762365549776417 +0.15072158376348704,0.3011072141923236,31.080905568967722,10.477529867939111 +0.14966491138160476,0.3033288096755311,22.87802387103197,7.819043528537824 +0.14955245835078781,0.2987905709795551,33.73499384214836,11.023106231668152 +0.14786897400232282,0.3000781133651611,22.92650773745782,7.519749886552095 +0.15057948027630677,0.30803837943829565,29.043048867379408,10.485087231740868 +0.15086523042852037,0.2926523689319778,32.20186634868834,10.032616894970294 +0.15099745740073592,0.3056137345617117,32.34825754516426,11.466172644604573 +0.15002548999890755,0.29797201753311814,29.84987594837209,9.67257754144264 +0.1498995407954346,0.3081939909701393,26.442551898606954,9.492682467877826 +0.14918714578329784,0.2998108385743562,37.09315909413145,12.265553327747655 +0.14975588351327826,0.3039525526331161,29.310812464385826,10.135825425630223 +0.1490657005296821,0.29414362922187326,32.03094092785737,9.94541569389565 +0.15023042569571937,0.30387449924746973,33.3742555004203,11.439189492275565 +0.1495943388088155,0.2947419019308138,33.82153258378142,10.584963155492646 +0.1490807275341675,0.29660932303501464,33.68689130913752,10.688403096270378 +0.1477470430339939,0.29314722802700044,28.827097280086587,8.764213099371382 +0.1504130822123104,0.29994732367885496,36.510029240594065,12.118068141369603 +0.15052669742688332,0.3067723426558577,35.07565167992693,12.414967279986215 +0.15089941984932592,0.30071577212644535,35.110212811776854,11.7184538687149 +0.15061005798919339,0.3023926764435178,28.84140182531002,9.83534219739323 +0.14940956736778638,0.30574335945493997,26.490032852842322,9.267008088411059 +0.15305457869656253,0.30543488340556807,23.780304427831624,8.491670954493214 +0.14998693807024996,0.2988567673227526,32.727043669982855,10.722515241454591 +0.14900611277349946,0.31140915520781925,28.122281723961933,10.361782091553442 +0.14830231140898287,0.3024337623969262,29.00748558998098,9.7306341100213 +0.1509743586931614,0.3031434588054985,30.012083825849274,10.26935429417903 +0.14754947250299014,0.3039426890423583,31.17306250102355,10.546845169452272 +0.14905553122380977,0.29853867348906155,29.562281976840552,9.59859880331741 +0.15226789875201893,0.30510106470968784,30.05668817841987,10.682286375729477 +0.15043913988422614,0.2975169977271814,37.16012280920702,12.042169444367296 +0.15210190438374066,0.29735276786859505,31.782311777782265,10.43422561072627 +0.14945104843600143,0.30052868636457475,33.20622713581717,11.05218520053436 +0.14843056757411224,0.29635574874613363,36.21697138908513,11.535312524339854 +0.15228936479768446,0.29762026567665545,31.514266564677893,10.404642694959948 +0.1490486339479674,0.29537651179645424,35.04635822501938,11.012229323098925 +0.14891396774968568,0.2979667193486029,27.810476315827668,8.93655263359963 +0.14995241474544962,0.29056922452948275,30.07825326155587,9.029857178054897 +0.14961210847164694,0.29551559381699316,32.701847765933096,10.333342134113154 +0.1494078496561292,0.3034747107222194,29.521094197012797,10.080924548093238 +0.1513561996536015,0.304487450402533,27.23849028229049,9.51214173740032 +0.15030256602132055,0.29160478811027457,32.12973866307207,9.78809063765503 +0.1519451866855394,0.3025884024411119,24.753422376902037,8.534614711835841 +0.14984265593643567,0.2989964182460706,35.158661478401356,11.521506826632164 +0.14871622503097046,0.3010293237406419,24.97010013693717,8.307663321972719 +0.14987765194375208,0.3013977537463907,25.917529274620087,8.702603774682617 +0.14930997294470263,0.3100266650186661,30.974907085746427,11.213006263540422 +0.15193451096617464,0.2972551190725762,30.805847402842232,10.078103698950489 +0.14995383698964435,0.2977347862416087,27.295020347744554,8.845510856834007 +0.15115454307489748,0.3059078355377124,35.34122831120001,12.410137345021255 +0.14897212700025705,0.29917425285254395,31.20605508722129,10.21244988552118 +0.1505905944832905,0.30321193138253116,26.088206368038435,9.007940066265393 +0.15089134821943764,0.2995488236399267,31.70561433315827,10.519349789135736 +0.15024343199249532,0.2963381457137584,33.3425478542958,10.618379556387588 +0.15082491025335795,0.2997803381553344,33.53938382104793,11.102324162725868 +0.1502447814794903,0.29544657452389633,33.426058722942805,10.603599032267855 +0.15101602308826914,0.3006422059371935,30.265343936345197,10.169090248052852 +0.15083676344899152,0.2979844083093604,22.8038691623805,7.429778636201351 +0.14938027506107074,0.30749558610018224,34.263783101755976,12.233317627149912 +0.1501226453030666,0.2988524964950044,39.16820591318921,12.792168433106848 +0.1481255803919269,0.296817633017544,23.466404253924694,7.431987096698485 +0.14952660596477851,0.30287918111546064,28.512354293644684,9.733570577178368 +0.14951195086926022,0.3009515154556572,26.00158434823065,8.68371213925973 +0.14911658052828103,0.29885415100845014,32.62153665828278,10.643167264142406 +0.1524121528611297,0.29812224263979437,36.307984716040416,12.064975498203285 +0.1490226130797118,0.30053282724023306,24.195760062833237,7.965568330510173 +0.14998994459969056,0.29493641665694126,29.25616035486067,9.213952849185521 +0.15081610602905168,0.29853924749116695,28.10247848217867,9.202412706131799 +0.15210339271192266,0.30574175045272844,29.454865174630257,10.441639388133552 +0.15090286867020183,0.29947437272485483,32.457623503790764,10.794158832709602 +0.1512236528389253,0.3006095676750337,31.234683201982673,10.504287476498773 +0.14987316219003224,0.2994848902947294,28.830359197392017,9.485381132329348 +0.1494375886475715,0.29164037344391397,31.769971936508668,9.595961030051873 +0.15006652015649422,0.3022988211320481,32.237238930721105,10.91002601805552 +0.15019961866380072,0.3042564408909161,32.68928116098304,11.312482208803827 +0.14716259830276776,0.2982304260744898,33.50653062020291,10.701389055216678 +0.1489370737937158,0.29430041205836976,31.742641050978904,9.878417901800866 +0.1510591852055156,0.30053563549955614,32.314009817925935,10.815930560172609 +0.1500683996864978,0.29319048078649584,25.747266111945915,7.955372701493358 +0.1527351091031644,0.3011973730775738,25.599758837292306,8.701822751705699 +0.14847541765062802,0.2977367874232298,28.392836081200187,9.042832674475374 +0.15103121812304204,0.30125709714974247,27.674250699279497,9.359124456855472 +0.15020930345774838,0.29536177654193313,31.493506610090346,9.985869477952585 +0.14878010848653755,0.3020758740794454,30.469929937362124,10.27736919971336 +0.15015387740268826,0.2990193500874404,31.716325851296496,10.43924965236406 +0.1517159429551546,0.29800062017413753,29.270218851364454,9.584808663739084 +0.1492346238589625,0.3016926611834917,33.46886705843642,11.271266256764422 +0.14838644787747177,0.29839857780008394,36.90683034835058,11.883387600713034 +0.14693957152142495,0.2972634795177829,31.85528718981324,10.106821184323744 +0.14933658254798657,0.29801684951741825,32.79728936807681,10.561361707779355 +0.1492980088942162,0.2947797023444563,30.382262409702765,9.506621347202737 +0.1518251009931771,0.29856166720568506,33.54815058142583,11.078488495290063 +0.15040270525503105,0.2963788839947866,27.614640908625493,8.88218884939443 +0.14961445042414867,0.29464386660592556,29.938352374244822,9.38364209148678 +0.14778180649538492,0.30426672549711586,36.84025826069673,12.584813559446197 +0.14980708082466976,0.3007079069978591,26.252597252246296,8.696058367554393 +0.15274009527219806,0.29999704885990014,33.96727977191954,11.467948083594058 +0.14783977157912478,0.29830624203298106,27.636716968120528,8.870691007422955 +0.1489908891394261,0.3000118769843524,37.84579296793654,12.385013070531814 +0.1518887726862126,0.30501399595746015,32.36591354593466,11.351776981518608 +0.15083728138559363,0.29635252022640823,28.74158917654963,9.197663615606723 +0.14995335072451974,0.29637324071318355,31.68519841956116,10.130306854602999 +0.14993709507753533,0.3037310139209619,37.49994697570696,12.848582257181244 +0.1496377096318426,0.29602110694728667,30.42776691501946,9.710816946620291 +0.1499653198160402,0.2935947245941898,27.351594626547936,8.478986883760882 +0.15032523743454446,0.2981972409625269,35.104035725524916,11.441815417290368 +0.1493399411215471,0.30047033080057445,30.880549926522377,10.227859310193463 +0.14904533706235404,0.3053246237107596,38.817137466357366,13.403397896317326 +0.14869221475507743,0.2987795225241276,30.11741034496078,9.771682317190635 +0.15164199201300382,0.29370244890514924,32.05757070250891,10.055400771438196 +0.14986838720373896,0.3055103733476672,31.491852333594146,10.997081006484967 +0.14966268042376135,0.30154870020743796,32.73708023177034,10.99178327152146 +0.150839487116341,0.29426569444436373,33.44941663331996,10.474217827431886 +0.14810958341244596,0.29845045129940084,31.649616444697596,10.133592060622028 +0.15026941732361762,0.3003411317221501,30.19572926848951,10.021011000695832 +0.15128912127141886,0.29512482110944976,32.3364019911512,10.327089511597165 +0.14923094988843985,0.2993964432909584,26.139239247869998,8.553340611866796 +0.15108863520372692,0.30380747318905627,34.15411764873236,11.889175659331901 +0.15046900596186674,0.3002769642122158,26.198219159765195,8.707152253984102 +0.14847904392165065,0.29470341491446755,31.16174561453548,9.663021863281708 +0.14933903033014262,0.29331610605785424,29.912519291486976,9.194048523394503 +0.15014635738296211,0.2986267144105876,33.009806899845785,10.749820773810367 +0.14926219576422167,0.2991287988370639,27.929898696449698,9.105389174960711 +0.15096232595354986,0.29840640013220276,27.782995112474808,9.148721243105586 +0.15089407912224595,0.29643947435892637,33.958793029606475,10.951831320787717 +0.15139743383288354,0.29676849774214664,32.87733729590383,10.600394325841869 +0.15039077530192352,0.3022892770052792,31.75503987368839,10.779433638871273 +0.14833167063277777,0.29799967019331997,30.631219284891884,9.79974429232994 +0.14886988799974363,0.29968794473882676,35.529083250796646,11.653881356555667 +0.15035230292395393,0.3005821008350977,25.807946187569538,8.689659371445895 +0.15103130484957158,0.2972166618776366,32.0424363608141,10.462623554480091 +0.1484086589860006,0.29844322472835266,33.12803176772427,10.714730325404517 +0.14992245489410874,0.3054023845737445,28.41836447799476,9.895467055983302 +0.14921457724707535,0.2981549205933556,36.76981125047101,11.947194938973292 +0.1487459644599827,0.3030774994877274,26.507618907835738,9.01073109209503 +0.15184982184315324,0.29951190342510253,30.989753800222807,10.366041550774131 +0.1491219136369299,0.291150129295906,38.201999009881966,11.44459886626592 +0.1489544269308193,0.29770653855804136,31.614882415551243,10.125848202879423 +0.15060473123291554,0.2955567662703229,27.81338650034433,8.834854128392067 +0.14936622070804226,0.30565199493672607,30.370794019464746,10.58451785453938 +0.14950628919376313,0.30257710159273543,31.243471278006112,10.611550863184362 +0.14902621766942925,0.29814445313841725,31.09250653049076,10.0634718130787 +0.15146902838990248,0.307951564376593,27.50025977459792,9.931061762408214 +0.15110142272108204,0.30700486794300114,32.06683596307355,11.5741838280249 +0.1515002520709796,0.3032457344287544,36.47759185482699,12.60762154814187 +0.14990644566615946,0.29505767765984187,36.31849042634872,11.45548021190611 +0.15126437388424174,0.3006426006255089,30.95830401748985,10.361369140602264 +0.14856448509382764,0.3023734458839488,24.08396550094241,8.104159511238723 +0.14963467037663988,0.3031807102868111,28.225801476612354,9.670323526919002 +0.15060049721480442,0.30093070793819493,31.492500215498875,10.60098227694071 +0.1512573581542411,0.3041905410073968,29.533604643262905,10.198890557708493 +0.14895422253849394,0.3005169534465003,26.39145255138857,8.681659908628605 +0.14868303557816728,0.3044207469398809,21.848444485717636,7.482759210652104 +0.15089161126319037,0.29586469552301553,32.72457907514438,10.461582193388043 +0.14886507893298825,0.3065206271755803,30.79396386783072,10.774713125245556 +0.15141815657822552,0.2972479456435866,35.639278034834916,11.586746533026202 +0.14927464752957295,0.31163986579615754,25.604549714788323,9.462206945936085 +0.14992581275306963,0.301735924218969,29.335315132442123,9.878306035613424 +0.14939381212662842,0.3000809316233396,36.56674448168843,12.056639512166953 +0.14965191596873734,0.306598500231194,29.625736046083055,10.4630865485185 +0.15013855252018993,0.29374708021665413,34.34137996784177,10.672567598415654 +0.1495905686683194,0.2985619476393674,30.174658880378633,9.829925211106545 +0.14912681335220787,0.29623939308566305,30.284526184817942,9.588267975791927 +0.1502215779341742,0.29150075779298934,37.95121920946127,11.54219236415367 +0.14877067014602763,0.29397198118439627,38.4984019568799,11.949104276397877 +0.15069946841390192,0.30377028003851303,29.602983332278356,10.26588731374153 +0.15002775746741706,0.3060098225389147,32.19458696765707,11.299655729550311 +0.1498389212075861,0.30005143805133544,36.54225154588567,12.081632911313623 +0.1484778092124284,0.3052412132486323,31.51168683605781,10.8973028468805 +0.15061642915702497,0.2937732891367114,36.010277314450086,11.205584057188343 +0.15011628595152215,0.30000993973604134,32.721538327348604,10.822664685939005 +0.15089612167471125,0.30148958753311533,33.780540052020754,11.36103239692745 +0.1497913438746319,0.3020479774812572,37.365943309407044,12.57495678966826 +0.14763957798961055,0.3037769157238261,31.022819642257968,10.502445512938955 +0.14858497983219726,0.29504706442459816,33.65458454776302,10.466324293657898 +0.15068090017356048,0.3002314756160755,35.639545385998126,11.897474091856733 +0.14950458667762778,0.30159308410360397,29.81615605575868,10.028295097258457 +0.15062268938817033,0.29978859148400344,32.01317139886879,10.621052442642569 +0.14849882374732837,0.3031603120177008,29.176934501070992,9.894852809154793 +0.14882818364846326,0.29613832806253826,33.44694234128975,10.616104821289754 +0.1502231044193082,0.294041608680571,39.047636608674765,12.176846653549289 +0.14988806726302834,0.29898821800746217,33.432973110694896,10.954949023725364 +0.15123725164636534,0.30325317546144176,35.43255406710468,12.269003391027587 +0.15137645316363108,0.29576612395478674,30.057553920143526,9.591851729689292 +0.14866128109377624,0.29218335626311315,35.337503665731454,10.74562509102911 +0.1507114449932803,0.29796117097869496,26.42457098351239,8.591653272747486 +0.1474751062146439,0.29683322434024006,32.21729166515678,10.229360651866937 +0.14997323284514189,0.29400548519494085,31.028625387628402,9.700390726942683 +0.1496900175302749,0.3059097007702383,25.21440896633716,8.862649067593082 +0.15017558018779706,0.29672910386518175,32.49455659297476,10.448426544499789 +0.15010804254471166,0.3035593522606751,32.036439888198494,11.045251876298195 +0.15100636584165858,0.29482553698695163,32.118853941286936,10.126401354981654 +0.14807374672102622,0.2924985405397616,30.185351133406126,9.15536108464795 +0.15155937152560933,0.3055164957380218,34.49286277661478,12.190846196722582 +0.14949480600293408,0.295669898909957,30.234182398405217,9.565293384184526 +0.14970491101308225,0.30953116803028285,29.90160110287066,10.852929024672601 +0.1495553403826854,0.3081594853830914,23.939082842244474,8.537768869033577 +0.15114208210183006,0.2992021767245965,33.32716343155302,11.027983060576592 +0.15021687902110062,0.29914359396486145,35.206971175349565,11.526536443542952 +0.15117053191602267,0.3012979610811482,31.367845135534385,10.536431975917193 +0.14988736546992903,0.29926186450782244,31.34656310779805,10.25782416838898 +0.14649013485454598,0.3013520839329527,32.252266088385184,10.581122894291868 +0.1505025665002184,0.3036716701663051,27.796798384631874,9.578633070356108 +0.14852356873650588,0.29683324015738977,25.4189173721337,8.103860066353349 +0.14987759599057784,0.29320326318849127,29.293377047461902,9.05406081776733 +0.15156213376389835,0.3007078379397594,31.18197955028341,10.548439045177062 +0.14812026260256936,0.2972989773059099,33.32751342322278,10.629660553386117 +0.14957647395751075,0.3078099645478263,30.53110293600416,10.926504896738393 +0.1491706990790362,0.30131938423650034,29.074257130672173,9.7328546074034 +0.15056427884327897,0.2969813627242164,25.69424451876189,8.282885423700213 +0.15103247254229404,0.30311041883575657,21.52341976644704,7.431996904371315 +0.14927094757420395,0.29946277169431956,28.555406857833354,9.381069537972484 +0.14978823689411042,0.2982154115695771,36.672749889455574,11.950371968594675 +0.14882592083702945,0.2890596463264531,28.49853231643561,8.386617002939099 +0.1469139289569334,0.30228321835315514,35.371956160619945,11.707798672037525 +0.15014680145066303,0.30181286844138033,27.81434385899134,9.30380644506705 +0.15126085250718646,0.30791897108575067,25.07524547959044,9.065262679269331 +0.14962382841485092,0.2924279977495159,35.03461019738396,10.70976407959776 +0.14828431111980422,0.3002062755141525,28.713589005365495,9.42451393368351 +0.15154922464304812,0.29355448917322297,28.90779943327512,9.07426243887716 +0.1491352785279899,0.30537508642016997,32.8076154896629,11.383593178716817 +0.1487577784668054,0.3002962270250212,29.590969142651733,9.762971240751618 +0.14855671379267388,0.30156423999261867,27.237000034239536,9.127677675447506 +0.15093144785180032,0.2974273809606362,37.219462991783516,11.991494404483154 +0.14885365520571447,0.29885742185938263,29.785140220443882,9.635829567754453 +0.15162965916562124,0.29819363444319597,35.13605439097562,11.55869255437926 +0.14959633481128848,0.29879115705651127,25.873800023799177,8.496709424425736 +0.150020769255686,0.3043194544985938,27.770478594257206,9.610388269535086 +0.14988460676762314,0.2955340599732605,28.84515848258835,9.15175178967659 +0.15000606723801962,0.29469639947946585,24.49700624565225,7.70524253458591 +0.14860461440326472,0.29969782181655985,31.034573252956804,10.131024433302773 +0.15244963838098305,0.30104934808696066,24.914063455184852,8.49840954027161 +0.15027882146888796,0.2937660751602545,26.819496364758518,8.335939011279795 +0.1505674899764466,0.29656207185701045,31.426817636998646,10.083588621581784 +0.15009570710893236,0.3022823633068904,30.92747933841131,10.500239182011153 +0.1503885711639228,0.30772156410027257,28.822604416482218,10.355608214824244 +0.14974219536266675,0.3008762457514425,27.304992269733024,9.084429876112695 +0.14966899392227298,0.2948042227391801,28.341662354602718,8.883020569044762 +0.148605592982625,0.3034936095122714,29.416909398230867,9.980348202350386 +0.15021097777014877,0.30200072136860806,24.616772124749247,8.354562823138645 +0.14842656025365275,0.29445189621797996,27.543132947150276,8.546997006004013 +0.14911755670143723,0.306095437314028,30.303504635363012,10.6675484166124 +0.14791265811654392,0.3023076646444922,25.878255384075434,8.639450750076977 +0.14843212950915002,0.30375563866357086,30.716405215350697,10.455832808594332 +0.15200961928341977,0.299753157006115,31.614102237277113,10.572900659191344 +0.14909050479336555,0.30564899632021036,30.19679529761848,10.572990130119898 +0.148868496129533,0.29835826267750243,24.4515186845967,7.924400539911656 +0.15030580026594378,0.29534900463460656,29.610269965703953,9.427924206573984 +0.14921836472101915,0.3009452047293238,26.349960950912504,8.810483734495609 +0.14968926734555765,0.296241047815268,30.007982663559044,9.556363654695378 +0.1507675672646331,0.305739838324496,26.087109861740526,9.23240860842218 +0.14879517708972972,0.30215990188289066,33.89536819761618,11.338513123383844 +0.1478123407284101,0.2986666247494249,31.157151975644734,9.996265534920148 +0.14902906441344843,0.30230729837306397,24.93539816040477,8.400421843680864 +0.14867776414829853,0.305537011681018,35.11607927788973,12.229601663604871 +0.1494305258332063,0.3038172513523241,30.686047954754752,10.46959547300332 +0.1500489521181132,0.29309649847663083,36.02437948722979,11.096177340253437 +0.15069499728781496,0.2975194168080365,34.06136306494189,11.088937843998927 +0.15260229966347652,0.2932659732715001,32.06200167721216,10.115223038065627 +0.1494073366504768,0.30010300073828977,31.92246502589612,10.488934967213895 +0.15046802303305096,0.2957556079607044,27.49009460457592,8.730630336992428 +0.15291166070287115,0.3018946002929562,31.025346248016735,10.684114737087299 +0.1487076269774488,0.30197105801465624,28.41661696865332,9.532123119876324 +0.15251140053023307,0.29896383036992064,36.53441081824461,12.211228961754339 +0.1505109802268618,0.3014625728942782,32.16237895032973,10.888616588372015 +0.15103285834230312,0.3085536322060762,30.10173690564958,10.931819168505093 +0.149872408085312,0.30592679312053184,30.73041855354044,10.786819045874195 +0.1486821656801985,0.2986732180789458,30.989747686818134,10.073815924299225 +0.14786341740220535,0.3057606593504986,25.297296004136385,8.752806122965623 +0.15010489847325237,0.30242935563788886,32.276113177663234,10.999279466724218 +0.15101937104139346,0.30998376300743374,30.762215837296022,11.308582839646334 +0.1514161551848098,0.2984641278064703,28.818678438862893,9.470514568809133 +0.1490441905931958,0.29399622172168965,30.02618967268817,9.363011767234834 +0.14992942209828453,0.3005407941295903,27.650130122110852,9.198475270565162 +0.14982641688975623,0.29926684017169075,28.53317574233274,9.38569993666657 +0.14938570996097728,0.30335754294917483,33.1658968873097,11.325253222121354 +0.1496986001106675,0.29876540120595557,31.946254741325387,10.405253979064065 +0.1510276693606119,0.30320067088147923,28.35142953491283,9.787071471758606 +0.14919412508629618,0.3064032409435371,25.57273352570982,8.9696252943287 +0.1514789325020476,0.3048511662372515,25.909448997960006,9.105933974383907 +0.14948320292410688,0.30405204432844607,31.444143108423614,10.806822513968285 +0.14917813842391844,0.3066944636520636,35.44527349372798,12.568174839744394 +0.15065447271772733,0.30095319680736204,35.61615156234291,11.949281050445403 +0.1509673692587444,0.3049763224754768,32.999572831790516,11.571716625466292 +0.15008105665036223,0.30767540421063566,30.532122628791257,10.86679405709687 +0.14950938635409844,0.3013159557709386,24.03010542228435,8.033029617135888 +0.1504280170475523,0.3054477867349794,32.791526180370354,11.543137661972022 +0.14846126574152557,0.30068176593343465,28.459584686747796,9.437499830042292 +0.14796115172561078,0.3060840434692183,33.22074033220536,11.540629524830095 +0.14927911160036905,0.30433498869533826,26.85910965664198,9.286526933584817 +0.14893758757364656,0.3007390208786864,28.88869795792514,9.566180099200295 +0.1498978140577355,0.29314893918999024,29.61133148985972,9.127002101645992 +0.1494991657653962,0.2998303341650729,37.070026824191366,12.162348961792834 +0.1497298030300417,0.29811390807737426,27.713647863995853,8.967268042247913 +0.15114875998113123,0.2951321865081292,34.552410663435005,10.97135547546592 +0.15011639886326394,0.29931793188114253,24.674893975387693,8.1162810059456 +0.14874739517590924,0.2948674686452789,28.564048156218657,8.9634082365805 +0.14892853518896398,0.30300184038134126,35.13920256997946,11.95816264791777 +0.14995186508107547,0.2990244752499473,27.830330174561624,9.099283939777116 +0.15055823824223144,0.29969659415613065,33.77558379220329,11.19402052982699 +0.15002547432505042,0.299179712092461,33.204984778386084,10.85470617974718 +0.14832491355571084,0.3017527099461995,32.285458726157394,10.717559094643153 +0.14888729273097226,0.2941482233899941,31.668249000893802,9.75661622298298 +0.15046155190714058,0.2969145138623272,34.278932047079195,11.065813329989794 +0.14984338438844044,0.3030931962534722,32.52048570586843,11.057153563413248 +0.15194084337824185,0.2936991883652056,33.73633464063362,10.624582759149352 +0.15030523384615338,0.3073522583315362,29.58745860079518,10.60983888785151 +0.14826844346969115,0.2965634923448856,23.895162157121856,7.539000408928343 +0.15044771428359907,0.2994932699996416,31.138022924827947,10.265472109781472 +0.14950073878519377,0.3037071343394339,29.775158248223182,10.226149932946829 +0.1498650540106989,0.3017214697642521,33.92631414440393,11.408168536660014 +0.15060510396706925,0.30286649490633294,29.697552224609584,10.14875535539261 +0.14974310972177488,0.2973391312475893,29.237291905865217,9.390918464265924 +0.15122710057409924,0.3013683183886862,28.58132087145672,9.708695459343533 +0.14998038752543294,0.3035197230196378,32.24938997319818,11.075161954623502 +0.14971608015807278,0.30786780218757165,27.84515991949288,9.95060866505608 +0.15055483112434073,0.2952670041451316,31.736832503507127,10.086214909825037 +0.14769071170798742,0.3013162858511099,26.360012075567358,8.697920656874363 +0.14967265886417971,0.2958008051133539,27.48757647487058,8.649877369662464 +0.15148116098535558,0.29715005413424694,33.0205612247871,10.763216301265501 +0.14993637692746628,0.2944501856022593,28.577597267214173,8.95317492650386 +0.1511591822634846,0.3021444058375381,19.609850881116017,6.7212373384969055 +0.14794990366114247,0.3068826406935906,26.57370089822467,9.208509265466269 +0.1498875463838598,0.2956339845170752,29.353800816263114,9.268648469953742 +0.15122947388717894,0.29544324089669083,30.260363626659654,9.718999382323489 +0.15007859674063448,0.29730291071566906,30.976807516305186,9.975143215207684 +0.1508372170410046,0.2979035237474478,31.63107983094313,10.326686683884137 +0.14904740744149753,0.3001619614392624,32.57757914938888,10.716182806874896 +0.1506968695964704,0.28854515889279375,38.522575537015655,11.416516356525829 +0.14932437615884464,0.2996993110612438,27.330179051935307,9.006158857078347 +0.14927923718545064,0.2968329209620745,30.926440389741217,9.87135831780085 +0.1491396266977126,0.29353194988779197,29.72106199162324,9.178845335096277 +0.14934728796948946,0.309092548201297,26.80931298653697,9.717745065070183 +0.14969938107063713,0.3028992053230298,30.41170592392228,10.323579803430782 +0.1498826432031402,0.2985682804511687,29.587491079447,9.644701620347591 +0.151256129955294,0.3007136015387298,36.55179100017127,12.265833913689864 +0.15001181907100905,0.30459417815705575,28.912490131791476,10.02323230289265 +0.15109474699836734,0.30153197141701155,31.584732333269304,10.648805715524588 +0.15002024388613014,0.3060945110114892,25.550090936111527,8.959324901047399 +0.15038421787366277,0.29709146268545134,25.778867013029085,8.312071016390878 +0.15045920784005531,0.2941411551371066,36.427805865021355,11.442820136205759 +0.1504351085506781,0.29409858889697266,33.570220666851256,10.495867587133915 +0.14902706325450654,0.2980172301977332,22.404495018472524,7.246662419349878 +0.1482527766003429,0.30146189528456896,29.898305700059208,9.93431134739947 +0.149999797531062,0.30307436003164573,22.798970535690508,7.726056121080916 +0.15124368910527586,0.30123161594910747,32.69657604438874,11.06045288896375 +0.1502745824536864,0.2979965487107304,26.26211345448015,8.53669948166061 +0.1505955163417204,0.2982619356796979,34.39253880018118,11.202222560451322 +0.15059516148042215,0.3038771232965374,32.28236446810889,11.1908469549184 +0.1498899795384696,0.30822770541865674,34.27793721375125,12.236335921961881 +0.14896247563429846,0.3002682096134269,33.6427313884217,11.127101209586062 +0.15057349782362117,0.2922365923993413,31.858723252552018,9.799332288432197 +0.1521089256759632,0.3069751040483736,26.02604629770635,9.35376542139134 +0.14942300973009875,0.297234025769301,23.415427883202966,7.522962176458976 +0.14946274757057035,0.3017132692781655,29.68535584084162,9.942103570670639 +0.15056916894651493,0.29302228250183204,35.32113814565237,10.898960416331898 +0.14899579085771153,0.29726477112674016,35.45882200404859,11.363986468486127 +0.14986150334751416,0.29180390594953287,31.52343109272824,9.5705680395365 +0.14998292721091064,0.2985628475334373,28.51509364942571,9.351971178910725 +0.14876815600871804,0.30506312056612966,29.466665333994563,10.185953484560681 +0.14964944807373565,0.3022722755294284,33.16263659215154,11.226011352997277 +0.1512921159373944,0.29535846788993214,30.06815055747296,9.602795884714594 +0.15187630307645697,0.3015169389957715,31.94542920178098,10.870037405547558 +0.1509599433121367,0.3011392665231418,30.227826321337766,10.201964446539751 +0.15052120581687453,0.29940413235900315,34.01705651531714,11.264588917245652 +0.1491275748581561,0.2970646868662652,34.53329131647802,11.03305497698238 +0.149652155885294,0.2984228180821763,32.24609969709865,10.533444488250435 +0.14949172491288537,0.30836578794425906,28.235043072115317,10.159140684505122 +0.14690290791864186,0.29136639672083164,29.609733739907085,8.81396746911685 +0.14840514958231685,0.3004488920467771,33.71761010167078,11.11770427388945 +0.14967548612963147,0.2973380126093687,32.27470807579881,10.371030659863461 +0.14987255052138454,0.3015071507167964,27.365056492858542,9.243647503061803 +0.15011960678607203,0.28881497945177254,27.72722165477243,8.191092806841556 +0.1505898572207173,0.3035992634212374,32.65592974637135,11.280744803662618 +0.15199182463909536,0.29465506219971543,37.01846630073175,11.806011112123304 +0.1483525434846565,0.3006264238034318,28.411390722906408,9.327075833968134 +0.14798962999791496,0.2961073973690325,36.1075661430053,11.316368417556644 +0.14851294074294602,0.2984148203204947,25.196911216071076,8.14843027794436 +0.1513202806740523,0.29121455303698157,27.54499236402919,8.385082370490027 +0.1495748675694851,0.2966968031071554,35.38861268785101,11.249389408325996 +0.14868618543404513,0.29625593972376163,32.52465608807319,10.31711154506508 +0.14867940241876484,0.3076733966169209,31.89972393001516,11.26506508090484 +0.15017544974554442,0.30781992405258357,34.532357987073,12.345496380838124 +0.14981906307612894,0.30214278472501,30.36734813883662,10.271257449003341 +0.14760633901480427,0.3001461509069223,29.705354723879527,9.730450725031693 +0.14991595492919102,0.2984052133027884,22.427461878447083,7.307213111049208 +0.15010364658656386,0.3015330608394626,31.832306388667234,10.75728775168154 +0.1476998762419366,0.293772038417253,30.550795535732,9.361262345552683 +0.1486356102969105,0.30276629959023127,32.17717569626349,10.841495529713212 +0.14964491775920513,0.3002376168819587,31.28315866690355,10.376928720821732 +0.14926433552645604,0.3023194191650926,33.090143048768326,11.133046524923657 +0.1497521060262597,0.2941748923516563,27.96302277648373,8.740771357122512 +0.15120206245477083,0.30220826858172767,23.99406961041793,8.12774375281102 +0.14866790266649954,0.2988816971524031,30.769108737873843,9.995779732767193 +0.15231090146045898,0.29421598495503576,36.21682517152425,11.486969271914324 +0.14956779101831866,0.30862051458776796,26.139623152724027,9.427331824533974 +0.1492680766680745,0.3065317319035186,31.507877767630795,11.10954905887245 +0.14896887176694149,0.29302274547240686,33.69573056662001,10.341027787639755 +0.1511570837003466,0.29952074461906925,27.162764924980713,9.028781243713098 +0.1508905222394315,0.2961684539788763,27.56747246567262,8.774106155860837 +0.14796351253080037,0.30151527311916415,29.522034221927957,9.85020258077898 +0.14820822036322653,0.2868816488208629,34.58546502056767,9.902384850909206 +0.15222254485441236,0.31008248588673043,32.08049521414072,11.885854769059055 +0.15002169940636137,0.2945027630642081,33.29377887592012,10.423822805812815 +0.15014865392200202,0.3020486003536902,29.711005022138472,10.083106970587208 +0.14926341877387186,0.2990890939695514,32.78645723759185,10.712630306388725 +0.1490156054607856,0.3008200888649332,27.961460928249576,9.305435281767753 +0.1489283710622661,0.29770155569290213,28.509867777757176,9.168609427570857 +0.15015529736543312,0.29592997443162194,30.57710552590698,9.7420756713131 +0.1488157895998444,0.30776752330328366,36.95199305763871,13.110432855027154 +0.15092684368917436,0.2979349750075548,35.71631287917044,11.624905530896106 +0.15082540122171076,0.2953110015697303,30.921035004907782,9.826204515182667 +0.1501814956988744,0.28784192941841136,29.42492537768089,8.60960935109231 +0.15047271379792218,0.30392230182354457,27.718182222924813,9.655522186024093 +0.15128469168228462,0.2940610883994778,29.054043918428704,9.093265362778238 +0.15033152485418397,0.3038678096316422,24.6445722417661,8.510817685444275 +0.15094813757780276,0.29978069094392923,28.57645512630378,9.551089840464389 +0.15137927599462123,0.3006707879206192,34.89066079846014,11.812133544266292 +0.14807366948395467,0.30355125490979756,31.379793245948637,10.584699116476834 +0.15067075681151818,0.29297064293248604,30.380266171695954,9.411579424854203 +0.14948720685628894,0.3098718363150751,29.872096010906986,10.907423162323004 +0.14934755165682476,0.29950827930477886,33.3551817166329,10.908534079688636 +0.14824409966298438,0.2957396952193832,33.38886648899569,10.468072166486525 +0.1483305253735885,0.2950766640650365,38.631078228392724,11.990444235736213 +0.15020574851441773,0.2994192280628607,35.344757765811664,11.564145269414938 +0.15047681196108184,0.30454978544058325,24.48356829819246,8.493503962300439 +0.14863078088004653,0.29658923949796323,31.34907519206892,9.899472250135085 +0.147939721699655,0.3014808580777932,37.023111600233,12.287026710050018 +0.15081052979099716,0.2974786543879697,31.641295920104696,10.24502030274979 +0.14993771103059056,0.28739279798332773,35.56041645881522,10.358016638779802 +0.14886757148588764,0.3006925033333732,30.76630212519725,10.171674620081209 +0.1501138058850867,0.2940744641510798,29.194309623577865,9.128353272118193 +0.14985358185001596,0.3024551126315369,33.624244377061224,11.389727761955088 +0.1507371133981216,0.2975673031922062,26.448427832412758,8.55233417306252 +0.15032891026685283,0.3022787731880768,23.144514195900737,7.854529723853721 +0.14977211827336934,0.29771671191772703,31.12865088874681,10.090009677310386 +0.14965740472387368,0.2927722726652706,22.150066629782675,6.814084356479826 +0.1513260416002775,0.30252088867811594,29.623413782500187,10.193554364799468 +0.14797847044639953,0.30303949984859885,29.086409210280863,9.854205117721301 +0.15052056091013863,0.30014102729013825,32.42018905583195,10.79442110666853 +0.15114570990299359,0.29653936201104264,34.35984769301421,11.025948946665153 +0.15134160937052382,0.294199459129098,30.240090612220293,9.503677861179177 +0.1497750102349008,0.29882731986890065,32.18207479457769,10.525098283160602 +0.1510526287680108,0.309492087178215,32.32948174342018,11.818541553816054 +0.15023897583540516,0.3000358089088164,33.27946674866395,11.011641346647675 +0.14857436423288853,0.29659238763368156,34.63923904778641,10.976324209576884 +0.15005115613934308,0.29205086926061957,31.43249048926533,9.610103267584302 +0.1499750718392601,0.299276700664247,27.921044747177067,9.208595116815196 +0.1502054853552482,0.3039582367855805,29.98705769961588,10.346851800856971 +0.15099084691820877,0.30487951451208856,31.261619789794064,10.91944775312138 +0.15039945461587736,0.30613664669714774,29.802916474717023,10.513813163399892 +0.15050088557815675,0.2997002517860517,33.33776757747649,11.101550889116968 +0.14645586796458512,0.3025991410715975,26.810149515506108,8.902963939658877 +0.15181569898867173,0.2969935703100777,32.11844502876672,10.467582221269959 +0.15096468258227727,0.29490743416407833,33.00180993969867,10.448591687138393 +0.15161716121049162,0.29787106960149684,34.23414807915989,11.231126790462543 +0.1495378964889124,0.30738021625273765,25.547080434596687,9.066613618071425 +0.15147395987498682,0.2996482729627248,33.98303649397673,11.387055573979115 +0.15013367780401835,0.3016628768851793,26.45488877584498,8.891419389475725 +0.14788972756006655,0.31083044625616557,27.625246595891614,10.047210414496151 +0.14875503528065992,0.30209230479122384,32.16079853583899,10.792382813246666 +0.15215431999176726,0.29794301700840214,33.54402347760463,11.050176078693875 +0.14950936998075295,0.29068274656536347,30.490612020705033,9.191696911858706 +0.14989791510337147,0.2985927652832632,33.65144766558314,11.019352835694683 +0.14929809238786226,0.29785821278826125,30.3366342930611,9.790674644776237 +0.1486613379389852,0.29663249145812864,32.85705517416077,10.443606614067056 +0.14924698416621202,0.3003992056868047,30.898118964305574,10.212706254418578 +0.14873209511372762,0.29273485554001094,35.525787551017,10.863365959017413 +0.1489677032869497,0.2958519804244177,31.121836601774465,9.856044020758514 +0.1490133642817165,0.30318896367802056,29.072364828033056,9.912569299648062 +0.1503037793328231,0.3001477150513311,27.49953834308739,9.164212076247955 +0.14970901643046783,0.3026607947653859,36.29012769841112,12.335353434310651 +0.15125678827685787,0.291104210167792,36.28240369234204,11.054212874375724 +0.15048415136234156,0.3024117876267578,28.35460985946546,9.583091188920209 +0.14884809806260227,0.28872594855812656,33.14009542695273,9.696535469741468 +0.1520694573096359,0.29552531873895327,31.903443178962547,10.260290079614954 +0.15069490879242028,0.30043068456727995,32.54702130355865,10.836860354313544 +0.14999323819321814,0.30302479013506406,28.278277109852734,9.70364736931498 +0.15113114019189516,0.3057374959103277,36.735132256675875,12.962230594486503 +0.14857480290495506,0.29689320636590083,31.27706072785381,9.96023853709986 +0.14923429488116718,0.30651638061720715,32.2983966201665,11.445551115574599 +0.14907315783728978,0.2954324453113937,30.934899308471444,9.744902644638703 +0.1498193377290417,0.29870153031820057,33.3722447582064,10.87859171446133 +0.15002437160459928,0.2897008194000884,31.30456276322422,9.359849828875303 +0.1504846749910417,0.3024792524887086,30.443275599023046,10.400141902550603 +0.1502395954421454,0.2966506271926968,32.22797697358163,10.353494036615837 +0.15021099510193636,0.2980282344161049,26.581462991049,8.598221528856408 +0.1477925543222577,0.2969374079627099,25.529140377476473,8.129704229336431 +0.14953101510800917,0.2991014003277289,28.139138601766298,9.188141523213606 +0.14931153245448342,0.3020998244573696,38.21450464080064,12.756426257211537 +0.15176920756902143,0.3076481903134066,23.37093054235926,8.418612349674078 +0.14982276413619044,0.29805396970263126,26.4028142038635,8.607216865138613 +0.15099199729725604,0.30606382923326814,27.116321902321296,9.625942756395787 +0.14960064647034052,0.3016206833472833,29.249022008429264,9.844585348564236 +0.14946068210733846,0.2916964761473818,20.22793703494355,6.128474155182738 +0.1492574491615284,0.30671121417825115,29.56249321986638,10.35356749719643 +0.14979858865106568,0.2945194249179175,34.25609061280836,10.755577255533172 +0.1504414736356829,0.30249285938138004,30.973992675834705,10.556891103420735 +0.14924102843429962,0.297683332084331,31.328747454399856,10.049411612337751 +0.14913238313607072,0.29497604153456175,29.831367461063916,9.356303666100452 +0.15150140532341758,0.2989084227564561,30.37753657288228,10.040326355235774 +0.14947825764732398,0.29835882179263035,26.541066006112942,8.619780893929207 +0.14862273878055124,0.2935164045643788,35.20845978184,10.88275979713503 +0.1489607529999297,0.2969544442904765,27.73926286164283,8.846257171941161 +0.151169407483031,0.30252952171913144,34.49377486215751,11.808129940560164 +0.1499503207817476,0.3016343591712529,31.89886834918161,10.705606705734196 +0.1485862776274546,0.3003087658449724,28.855166175043273,9.490756513846442 +0.1512960983143978,0.29538797236144215,30.276103554415567,9.646282094244397 +0.14819164620410477,0.2999970267617919,34.84284761231417,11.325718725112747 +0.14940827855299696,0.29663435127174886,25.614546839803364,8.20115261354438 +0.14871767851110285,0.30744405170239364,30.807819514251065,10.884618538898266 +0.14920108145430983,0.30361950370535273,28.497665088933566,9.763695004325948 +0.15139735434464266,0.3035901005776587,29.571485762952452,10.244193134101973 +0.15012181087255863,0.29629184782548823,37.26241642865198,11.935364945086148 +0.1526058280972359,0.2996941884611459,23.330565594694566,7.832109922451526 +0.14939401425547894,0.30229836352029077,32.33574388954975,10.88002501007811 +0.15005453546588723,0.2989713568288707,32.27764601492652,10.547079493675835 +0.15017822558894336,0.2999289760448921,30.471932651372473,10.133583656654858 +0.14871499412922679,0.2977195585800254,30.679688139454225,9.892219278690515 +0.14856527617137907,0.30773488090935464,30.607319800701287,10.91796056725689 +0.14999894269420577,0.295574119779408,39.99920009209341,12.686691102999905 +0.14999449929090464,0.301579592334226,27.683878927883235,9.234572753522386 +0.14993449672388623,0.3015269803780047,28.480080543877932,9.579783258529272 +0.15128804455277114,0.29741193722560055,34.71100860185982,11.292616605532658 +0.14957011679778118,0.3066668673796131,34.260611774647316,12.064115833968636 +0.14799292477898493,0.3030520741567467,25.652221853589353,8.617525236158489 +0.1506538145336844,0.3017145994208696,36.98973439390947,12.592922618281245 +0.1484941993403921,0.3016196320409745,37.45156878576095,12.504825457251558 +0.15035111169147297,0.29537678446931454,30.348668141002868,9.604726361028108 +0.15028801537083977,0.301249299935818,29.764713235780583,10.02217092982409 +0.15087609239424163,0.2989574358526387,33.19310065784189,10.927052207714913 +0.15006416003270873,0.30715163454621597,34.18359749183143,12.165376658787231 +0.1500375567119525,0.29555898577544526,34.04900762928355,10.837860195694997 +0.15123715386073686,0.30264491076595607,30.417198060547836,10.492488747817966 +0.1524887711727224,0.2950338348574098,32.62697042628214,10.457867984966835 +0.15021125472432753,0.3061710874880104,36.33272586649872,12.797485825796656 +0.14862769940121426,0.29562399481725765,27.20463135580855,8.52658413837377 +0.1494495299953155,0.2904695369533957,29.28558481279983,8.79380739353955 +0.14868752295376772,0.2946106126703555,34.08832216253303,10.590925544718061 +0.15255127064510454,0.3059363901167279,28.275416083508265,10.11941138318144 +0.15098732324695074,0.30349123651478455,37.140115798423025,12.84736015807844 +0.1483441164519105,0.29999899714071065,28.53198127407743,9.329726319947607 +0.1508976107992546,0.2917475696583048,37.60362757925471,11.48490266232347 +0.15068288332237578,0.29266699425470544,30.547537778940317,9.405017106386248 +0.1492856216526658,0.2966020152486308,34.81553763219232,11.075600770943502 +0.15103879762551195,0.3026128695676911,40.179411243359986,13.801277934194665 +0.15076605584059574,0.30090647819056354,32.749164059454564,10.987450065122395 +0.14952092447284052,0.3016615638784237,27.932403115994664,9.380393258020973 +0.14981989828136766,0.2953944444753555,37.5410835070026,11.857769967899396 +0.1477135090049562,0.30303885508728867,22.367107318002933,7.531063580446716 +0.14955916641120268,0.3035013663573492,32.477756836496404,11.11677739722257 +0.15050774669158662,0.30625653239252915,28.677321242400627,10.063718570647945 +0.15147601862870108,0.30009022979027,32.469722223948345,10.904852954892924 +0.14878987061438503,0.30310021405411575,27.454728336835636,9.33833837789966 +0.1512930703914391,0.29765698346303654,29.065467802249763,9.403484921552431 +0.1505541802497736,0.29276420167320544,31.123058247320664,9.629502773658247 +0.14793713976626582,0.2941527124435379,37.43058324022697,11.471089212712302 +0.1502697503544137,0.29672793855479956,32.44282865694396,10.393166146409477 +0.14998910921529854,0.30118934907276357,33.087885177766005,11.137541692975535 +0.150616173605318,0.30396562871906907,29.276235831643856,10.148786832018336 +0.15138665333943124,0.29435721976875284,33.11203094387905,10.484862816803044 +0.15049278972360355,0.28930582951448935,26.673790468960025,7.961473961280664 +0.14858593609315945,0.2990753952606713,35.708861160444044,11.619804641382817 +0.1493894778152282,0.2983762200528547,25.60399447580653,8.303018844670245 +0.14867163614194442,0.3021707885395499,29.400435942763778,9.847848237450902 +0.14963832321053275,0.29533778350753503,28.692800248610805,9.055743547286841 +0.14866176323255706,0.29745346115244414,31.99093811619319,10.24603475435079 +0.15137209695641934,0.30250082260839556,30.30541414062356,10.393166573148184 +0.14724325473987518,0.29667388481304524,28.439915447952586,8.949758521424279 +0.14922108218764352,0.3087859263879597,29.674139682053983,10.656634235460869 +0.14983785337394684,0.29214247991098746,37.23113282125903,11.399086481716507 +0.15153558537157175,0.3019834967142261,33.2572436179282,11.391921366859949 +0.14907266546711995,0.29255146105313135,30.362316586428353,9.281652111014886 +0.15219871357347833,0.29764606930278903,25.087937725230574,8.249008476431849 +0.15062548748476162,0.29638846516246,39.089263577601415,12.511309130793633 +0.15116900350568807,0.29458856675260303,34.33076619202574,10.870236705301936 +0.14988833429905324,0.30447137472216484,26.751042784098193,9.261954270438467 +0.14904480781917956,0.29350398680648787,28.397726738012263,8.791249187284674 +0.14876632486771404,0.3040187045185498,31.93851367666077,10.871499808231736 +0.1496081498711914,0.2913254301909701,28.681204168688357,8.70781434806039 +0.1495656481028336,0.29471285578849415,25.004773392592355,7.80950499785046 +0.14932413579102016,0.29712064884545597,31.23647339574155,10.04708449052797 +0.14872617817286654,0.2991559815841991,33.73029098102711,10.991301011624863 +0.14975156834932038,0.3012648177692105,34.133624515349375,11.394661584877626 +0.15021063206276283,0.30045014480302684,28.480769200083138,9.489828408477326 +0.1492128305592765,0.2966913896015689,26.385980545669614,8.407652461814827 +0.14894565732117263,0.30051379691791796,31.144722174994904,10.322902790643466 +0.14950896435219965,0.2946816033446604,27.611680001147953,8.667353410110513 +0.14961311881746991,0.30711174773834643,29.305313186618775,10.394442696226413 +0.1520663535107025,0.29926737823726723,27.133654212636333,9.054538378866983 +0.14955288625925298,0.30077494423906553,33.116899491139804,11.02869790974976 +0.15095699169029458,0.29382087368017357,28.840744237228343,9.022353667737528 +0.15134083281358066,0.3057471261886158,28.12823248516208,9.903981180286666 +0.1494497586070562,0.2944861837156314,30.12540751296775,9.35611919711405 +0.15010104461102933,0.3015734652668515,30.68432571340977,10.3197160959342 +0.15079594539713118,0.306013293783361,27.797471673656847,9.850559173770474 +0.14933119142918191,0.30339328523670733,29.259969466081987,9.995205013518987 +0.15085185975460735,0.29800548605870214,29.0620086959259,9.550174271877522 +0.15132789270657926,0.3014671259196212,27.722591010472986,9.402956037440154 +0.15036556120735342,0.29707660349397746,35.602207035567005,11.424574220460304 +0.1488528795829192,0.29900885055838433,30.315095822258332,9.874839807625724 +0.1493792432638709,0.2940546319700472,32.03383007480709,9.901042504372647 +0.1519839709675911,0.2947217020819583,25.692519102382043,8.190521303835695 +0.14920766458817827,0.3032813964214038,27.02123213046217,9.179801855917635 +0.15034117845487602,0.29898244335967117,31.033436099323783,10.16881935063563 +0.14765779653476932,0.2922180834680862,23.40794243194452,7.030110563814025 +0.15064926969942344,0.3046312404162434,30.47156703891164,10.623390073726759 +0.1499578674251292,0.2998244980593416,29.650948123126636,9.839409139415078 +0.15039095632849084,0.2934371881884244,30.052090485670213,9.28905684443697 +0.15115433439069237,0.29557220183371213,36.40669495248344,11.602408942685434 +0.15230463535928118,0.30097895446168244,26.877816697591324,9.11814166829997 +0.1488384833386981,0.3039354109385887,32.33438477869721,11.115023864169835 +0.1511764007009291,0.2978777886360229,29.2282147736894,9.536420744842086 +0.150653729604558,0.2983684559594173,32.58250195202131,10.691117210931829 +0.15034831028183657,0.30156960444696795,24.53659358808907,8.300184223895048 +0.1499069158081259,0.3051829330620302,25.05523214263512,8.798804250088713 +0.15020995838908335,0.2933526340494089,33.122720943401575,10.242189137246289 +0.14789795748937695,0.29714314541283404,24.015180317701745,7.629136494945911 +0.1497490255614566,0.2942401879846339,37.11894631556975,11.639167005956033 +0.14886633552128506,0.3030341551200493,29.591222189444988,10.024774043175361 +0.14933658153342824,0.3045162294525463,31.073429785486365,10.771386628029983 +0.14920264709700098,0.29225579053370493,30.459711721498177,9.24904385489372 +0.1482446649734762,0.2928670391176107,33.38848329781785,10.1521030698736 +0.15135438685869412,0.2969229977413132,30.42098022765133,9.932298619030039 +0.15014277672443208,0.3000196861884131,37.459940378455656,12.413770785108312 +0.1493298329631623,0.2979177662874133,25.912503979045702,8.333310270388866 +0.14855165735839745,0.29979013952537475,28.10669409284742,9.21518381839141 +0.14842805846243698,0.3043056770128097,31.40496622721553,10.745750313701324 +0.15072681642846839,0.29771655790625146,32.94956258372149,10.731819700850084 +0.15024667587370405,0.302566643315993,29.680824966097852,10.06816731065838 +0.14908924385888678,0.29757736999835044,28.339363857333595,9.121066945039175 +0.1517744741184002,0.29673053705403485,31.375578925495883,10.170048220676103 +0.14842002212696775,0.30060406751079877,34.247559162911216,11.284088034839845 +0.14900337357647908,0.3014189929994734,34.71736394751464,11.56164518270468 +0.1496211063002685,0.29439314197360267,31.085324038483478,9.71712874696822 +0.1494740039213615,0.3044642789050865,31.466918413399554,10.869470762059363 +0.15055313670523002,0.30317067997947944,29.85530237840948,10.277416596584299 +0.1487859970985092,0.3016126088750556,27.82783177432842,9.236857484705734 +0.14865243974388032,0.3026989406539749,33.626533978086755,11.368874992986296 +0.15019731609967235,0.29522161706102534,28.445131764591224,8.98189677883556 +0.14956924451364673,0.30206887692356604,30.949665534830896,10.468452686473045 +0.14836796313145892,0.30049819811884504,32.38861910411385,10.635274558884177 +0.15035178553180187,0.2932534346826723,24.79609275663509,7.669131304754092 +0.14984902868719416,0.29435333946454245,33.965604545111496,10.682517217139205 +0.1499524657469356,0.2984460996070768,27.667050417580764,8.98813735973988 +0.14908510535194372,0.29704099372200415,24.320825965764605,7.7258098321356545 +0.14982234256488167,0.2974484722306304,37.42880519805877,12.103752534928198 +0.1484458597086347,0.2978486814221021,30.350575828480498,9.711388612612947 +0.14989752083867666,0.29910403900479327,25.9700194262035,8.520982556367255 +0.15108036985036605,0.29606678796754016,26.720025456547518,8.575942193359118 +0.14870933884231602,0.29592743504497454,34.19449804232284,10.740054875175353 +0.14814516776684403,0.2981260931836523,33.31975172683718,10.681666718307918 +0.1499466825507866,0.30337355132633653,30.455337430373994,10.382902863852202 +0.1490454449982624,0.3017904951955264,30.912286340577257,10.321304992227322 +0.1497017566448227,0.2919410159502931,31.59855928412209,9.646140783126874 +0.15017053520338244,0.29637698761299264,33.081574395118274,10.641578624298639 +0.1499404753383808,0.29615417064942967,35.21874809757844,11.266719754044953 +0.1492295631723333,0.29192066306717207,29.37835407921179,8.902607144071771 +0.15096991515529465,0.30629875830664705,30.371716903092697,10.84802144225713 +0.14852857751670775,0.29978581624540834,29.39371016558173,9.630326521634116 +0.1502603910804987,0.3027457545304455,25.62263613621338,8.721479452445674 +0.14921070334706618,0.30156799952864866,28.219475037024115,9.448223592182838 +0.15037400864649794,0.29953261641158657,34.19280412033338,11.297265167659226 +0.14968578226200424,0.2940107235667621,29.841462651217675,9.316080598035045 +0.15009826661294642,0.29184035730028157,32.167137408940896,9.788086877294296 +0.14737402606234798,0.3044961194528802,30.48859345283718,10.366157773697994 +0.14939479473064646,0.3087994491660741,28.35872190672944,10.224643020995622 +0.14949017878483578,0.2961674205276579,31.026282214256135,9.855236676899592 +0.15041796766603474,0.29638604277892155,27.077255478202883,8.672116333996538 +0.14935501246803068,0.29427920334743446,26.3457070192256,8.176585285918648 +0.14995614927077464,0.30060121540520446,27.631901526308265,9.224758158241785 +0.14784172021468828,0.2941542711547484,32.81735604963042,10.149024574712012 +0.14920859736664008,0.3036925192952972,26.174328060601667,8.931638855355299 +0.1495743122913789,0.3035037195170273,27.332531315917766,9.399583240203311 +0.1500942992637808,0.3077690158433898,29.924660469581163,10.654892996427252 +0.1502854080726727,0.30130253824596387,33.31958086047155,11.234172674127995 +0.15043310448174962,0.29626056723482114,28.71496003999646,9.215509745910987 +0.14976631528288586,0.30349499674192776,29.780594807306446,10.153503926343516 +0.1477311517198725,0.2899975632174251,32.45463769552771,9.565954930826294 +0.14839862461960018,0.30201043419554224,27.405098265616207,9.114587082720192 +0.14988687207411927,0.3063525509392931,31.607618555728962,11.174284443705846 +0.14860026277715496,0.2921306359434917,30.664154138642047,9.310010813128748 +0.1492577357745439,0.30651099646336893,28.266863448602724,9.892024493061953 +0.15102842831308774,0.3091317525866396,31.83195068734497,11.646940346455905 +0.15138783006106968,0.29855496016923166,33.41878996815118,11.008649109673758 +0.14825064053598463,0.29919579074581826,34.96522842456004,11.320059507576829 +0.15016872202201303,0.3078414952837485,33.778179257372976,12.068014278267185 +0.14861139065025047,0.2981333867410804,35.25272488959999,11.326117506018935 +0.14801192562670992,0.2919287677768186,32.919132810511144,9.947062533683114 +0.14946465318469385,0.2992616424669362,25.904047502247188,8.531294514461806 +0.1491328543750145,0.30198722402428063,30.909061728371487,10.348459104862874 +0.1516555115233963,0.2949977069871955,32.392631408079026,10.28769050190307 +0.15082930771253064,0.2992986431095184,31.07955044340652,10.321294559194119 +0.14949008234689393,0.3006743681382189,29.14827525657818,9.696110058207728 +0.14975770275042077,0.30381420451715097,25.471139143741716,8.734261711841862 +0.1480198740560158,0.2989804866067878,29.62300034335842,9.613663798118438 +0.1503484029490885,0.2955841852585785,31.10030960929874,9.891722978111142 +0.1497500048159324,0.30421813654626345,27.47437400891313,9.49925682235692 +0.1490437606354778,0.293739718011721,34.050432952125064,10.519080007489698 +0.1520745484174731,0.30680132819429606,34.021255738880335,12.16245720256891 +0.1489356403705011,0.3000243023328318,18.669924274827522,6.154977829928493 +0.1485472833570378,0.30624545381821994,33.68706208178396,11.754206912449384 +0.14800748818065967,0.30127888121440183,32.33301824115385,10.674038488981582 +0.14981286956435289,0.2992762111063801,32.089699287167214,10.466302709604163 +0.15073442164293052,0.3016481531980852,32.54174409390011,11.013633578973714 +0.1510567349493497,0.30255489435504257,29.79339627584716,10.188281204876874 +0.14973880588267158,0.30413552385728193,30.58549991496495,10.536777734583989 +0.14960706256577835,0.3022498444699225,29.78172138087522,10.134687449699587 +0.14909432226954286,0.29651940627546586,31.376240044433082,9.972539441943908 +0.1501622243091739,0.3091285178848296,30.304412366688787,11.03092820089743 +0.14939515464805536,0.2952976936462183,29.25126619445309,9.186627145773603 +0.15132246700683033,0.30081608248025016,34.53457578296701,11.62780274822593 +0.1503091747641655,0.30203437940971983,31.344947911719842,10.665318783655458 +0.15137016503222664,0.30094429892742064,25.90660377826598,8.773694801364993 +0.15179818882427043,0.3011352330452675,28.932319531014066,9.830334151648294 +0.15046081259367824,0.30094039943436884,31.92012616577994,10.725407353867492 +0.15083967146596589,0.2948976202644054,35.520841568873415,11.27578750495999 +0.15041601327739001,0.2954863736852537,29.207248792660696,9.221902387935785 +0.1500401227787799,0.308384125449839,33.04548403249105,11.917283742541551 +0.14822975964839888,0.3023966895359634,29.713086050735743,10.006340478363473 +0.15016974903527308,0.30404580115183316,27.174857414239817,9.371206396014665 +0.14918160616652698,0.2964901238404795,31.502075108251642,10.033616147539568 +0.1481346961275278,0.2971270007759488,30.80241107175193,9.815827635240696 +0.1515743056852208,0.30031696175794426,30.484788703241083,10.314051752358239 +0.14907361047809017,0.2981645426522144,40.04689079431709,12.928410893676572 +0.1481913342592643,0.29884484333383476,24.227380272832313,7.83586742468237 +0.14977107902684916,0.30406933736696223,29.241116109863654,10.049993431635595 +0.15127447533402522,0.30750751266025944,29.457563756971048,10.547165976662475 +0.149109103672673,0.2985798821852634,25.95082350353434,8.43415829175974 +0.1500052180066964,0.2981352791288554,30.93882886908194,10.008775778394677 +0.152354230163436,0.2919583941917942,32.937696390581564,10.191738492107747 +0.15008190978310482,0.30256849110388956,30.230721544853598,10.32552114258786 +0.1504872137433576,0.3002427495081483,29.91853867961132,9.940137073578613 +0.1516572059055469,0.3000238696199626,26.8223698199233,9.01802873332646 +0.1512470457073407,0.29331158220684017,26.8652980815075,8.386090787777544 +0.14942920862705247,0.2947469289414168,31.607982587908005,9.926246223244236 +0.15005950123754794,0.296038865063365,25.370099366194324,8.113216347643426 +0.15059588861189768,0.2989162011247787,32.02719941589581,10.5226705335392 +0.14949674363200358,0.2977780663981329,30.66842430340807,9.885801455056344 +0.14863041793181656,0.29847846135490685,32.94676338254714,10.653764957402162 +0.1486087429225583,0.3008020663795074,35.10461540045329,11.677522946602645 +0.150758226127179,0.30748034696327586,33.03496477266876,11.897921127619467 +0.14973620880815455,0.30320327816931997,27.447579810030344,9.392407230874236 +0.14913385144760163,0.2930159313034078,30.44552067440856,9.392738381735198 +0.15004064670655606,0.30313654243491955,31.21650811154401,10.652163341200263 +0.14941974500856597,0.30743434170091505,32.43461830812643,11.518254589133251 +0.14869836583638749,0.30458288930009586,31.090008587329663,10.73761006814985 +0.1504478316413525,0.2968151705984984,33.48226807500696,10.768088896103029 +0.15080580179569966,0.2953336232244747,30.52785575915304,9.725614218256421 +0.14948955555533,0.29842625401706996,32.492833816786295,10.513788630457611 +0.14941641136507766,0.30495588898298076,25.954184614957946,8.990485501083473 +0.15199683069998346,0.2997435593913502,34.039266964101145,11.432318398253765 +0.15224822601553545,0.29802311664568043,33.30495217366891,10.935399174931687 +0.15077054599774878,0.30155602783667285,33.49953368216873,11.303194919888423 +0.15087927693268152,0.30115890173944476,29.97050655306997,10.091072606914702 +0.14936530397103656,0.2962291233043873,28.140543871010337,8.887986527314228 +0.14960695395476345,0.29893421618976135,31.269241642402008,10.18257831225109 +0.1517059848093937,0.30180797940885234,28.306464200761642,9.677874879566797 +0.15138883202137635,0.3014226774393414,29.991053060833334,10.188053593780248 +0.14976707105702788,0.2941709060564584,29.09757077782726,9.06248816684724 +0.15118934934540657,0.2959254332323661,24.48732722024753,7.802420352259426 +0.15077917902788368,0.30868866855059235,28.89059481172245,10.483961697335953 +0.14907276279293427,0.30370938168126566,26.03689976665551,8.85870678884724 +0.15013196261508524,0.3040536580464752,30.59002292868816,10.602686488235804 +0.1493926006906491,0.29815340544594,31.80395096590623,10.321827761325519 +0.14930541810251666,0.30410248847269905,27.789085656557923,9.498036874869632 +0.14990568736909052,0.2992143945472167,31.804761180219412,10.428356808058645 +0.14855498290235547,0.3028474776936483,27.792475996815217,9.373956041411443 +0.15003531415814222,0.30256536173482534,31.71621948078119,10.719834585503794 +0.15186806136960865,0.2962196093187158,33.23490864268922,10.756331226147884 +0.14974691851021218,0.2991913443091309,26.71160560382483,8.715272306797946 +0.1514421747581074,0.30455529490065997,32.421648925840074,11.329456432084601 +0.15191406617636996,0.3002103609286297,33.06295285095912,11.213431079973269 +0.14969194522363813,0.3004612643666757,33.27553707073521,11.021632285308678 +0.14945934516993015,0.29648025822890733,29.413848980581058,9.334514461184511 +0.14997904536628814,0.29851634963749124,30.38987261429582,9.918582522365556 +0.15187477173183844,0.3083010275099292,24.851545838239282,9.031602176491255 +0.15068552106451608,0.3021616559881324,32.820967440810186,11.174712248561631 +0.1505412093991277,0.29644968865538074,32.72755839723797,10.514594483445999 +0.15084033666193333,0.2888174857985579,24.896186749913678,7.422344930560398 +0.1497928336301585,0.3065319513053497,36.362106263175264,12.769160517809167 +0.14904011194245978,0.30027544003191947,32.129561736067885,10.561795640207123 +0.15080192787017302,0.29663754901140627,35.72444513495367,11.492153975113343 +0.15019347028359592,0.30283168364351515,28.673880623362063,9.760585993330068 +0.1523287050362359,0.29829041527459677,27.231637116894962,9.050933130394744 +0.15069802340999086,0.29551809897368997,31.428002069016337,10.03649326172372 +0.14851986601822706,0.3012251381661157,32.585498231519566,10.800288973461065 +0.14968016506727438,0.303321220583436,30.026499016911426,10.28835074886064 +0.15160233890180602,0.3009062979010729,36.30082395433563,12.208546111237206 +0.14812242092386677,0.3003925122536717,23.873204334927422,7.865096166632972 +0.1487214605669303,0.3025192647532891,27.891226309009912,9.39846018906425 +0.15187390700263156,0.3034566827564279,31.181713669054282,10.839446905289394 +0.14987187762483922,0.2965116108166391,24.086954149504688,7.7230121694792695 +0.14993042713215274,0.29687167990378116,24.838571184936143,7.994683234338886 +0.14968797980321843,0.3050089818347094,30.309063962309903,10.510822236917415 +0.15000386423747916,0.2924824083169497,35.46323227495485,10.887632097109615 +0.14975299606780448,0.2976972444698824,32.33181118844643,10.451712669981788 +0.14905566421987113,0.2930696517370505,29.325430901239795,9.006489365214296 +0.14936081892301833,0.3046413176350899,30.953109768477667,10.750506181213838 +0.15020608217161213,0.29698297091812853,39.89057765926289,12.792379334196454 +0.1489398212171489,0.30096054324320226,28.69750896002852,9.541029047098144 +0.1502367406999258,0.30483006778544747,31.608301914016636,10.992591238279495 +0.1498863953375269,0.29946680141881404,30.067833967312545,9.869653910666653 +0.14995874770395146,0.3067949955144337,38.13342201927412,13.521707634835813 +0.15141061958943894,0.29683416438766386,33.052977270373084,10.719516165779542 +0.1510815109532038,0.30212633940163347,31.71925030443675,10.858781289575333 +0.15072766963575016,0.29396474750220364,33.476999527707044,10.516308263497132 +0.14972961735317802,0.3023469322869604,33.98048141843153,11.44088670880714 +0.15067616527960637,0.3025016168771485,32.781952985688235,11.149267552514027 +0.15069765161784923,0.2986159496375919,31.47139915113055,10.306757824641947 +0.1507489578141288,0.2931693367728534,33.90183188914584,10.55193760919378 +0.15065197338780262,0.3105237919889188,29.67454190997589,10.970097286914655 +0.15057715666617702,0.3066599223783641,33.10773254399766,11.806078223385624 +0.15010962352733837,0.30142418274355137,31.178465062011103,10.501458918465815 +0.14955002542314652,0.3069636747252206,26.608670672594876,9.385678119912605 +0.14880874445883888,0.29491212658388444,31.11695618718649,9.690236247007395 +0.1502715775141707,0.3046295490652119,32.40697252817482,11.305994690959123 +0.15079436610174962,0.2962610539507452,30.499895463886578,9.7693536902944 +0.15075696800214014,0.3026730101751817,28.63407026565214,9.808688122983465 +0.15097370967711785,0.30073789476906426,31.307864202660298,10.51155495210636 +0.15078985272900608,0.30760517009623056,28.854616107954836,10.344583682796843 +0.14882191977122053,0.2969559110693046,33.960581457170576,10.830203257439626 +0.1502220834037896,0.2972447306833727,30.298885875108724,9.747014567258324 +0.1472027773793738,0.30397418851765745,29.779437964179426,10.062838904830029 +0.14995334423757045,0.303441341202552,32.67994854608827,11.20811958357367 +0.1527670994536614,0.30000237685706355,26.616511784372406,9.00651640038054 +0.1487475707380604,0.3005622054252957,27.16177254451676,8.946824085973887 +0.15032522255025163,0.3008562752590758,33.046391695537295,11.079152473234817 +0.15080721076707845,0.2955135649308298,27.795577876351448,8.859412648133938 +0.14930860113410793,0.3026531626286513,29.611935924863037,9.999902503914228 +0.1497944431557947,0.3043979766583116,36.06588748433671,12.485792100861987 +0.1508845886756924,0.2987230701239053,31.89152176589562,10.474513570906241 +0.15204338753418015,0.30085451183678036,29.694607770203742,10.080794296559041 +0.1508360625288325,0.2964205011319248,33.38799720975172,10.77716542796697 +0.14931773969525197,0.29337095951701325,30.89844628903715,9.538479717213031 +0.14945537919573137,0.3052573372814481,27.058592089193194,9.442379666341068 +0.1504357013971954,0.3023319198348644,29.128241505810564,9.894514702590353 +0.14854688339528863,0.3041349951423451,31.290409247370008,10.712076115863551 +0.1513105104259164,0.2967438244680712,33.385445988212645,10.77910944152698 +0.1496026799130961,0.29516435601163044,33.56754347301672,10.571498943306835 +0.15114704641894508,0.3057538395034736,33.79686433692095,11.95973389740671 +0.15071592932351077,0.2970341318988117,26.76324654246937,8.65486156377754 +0.15152197972150733,0.2995277387334031,30.342395134448076,10.113647986793167 +0.15036421526970417,0.3017045266364655,29.53081786068933,9.98960664733626 +0.15046383333102722,0.29232757616338473,28.712850083450004,8.826941785721182 +0.1509655795625167,0.30013326882249786,33.21640962285784,11.038170704216343 +0.15073078964278194,0.298512226117998,38.87406978670754,12.667699015806317 +0.15173344962620824,0.2992726522160836,31.77875409603203,10.497415535328063 +0.1502808781068652,0.3045390781465455,29.9666162291207,10.42285982752639 +0.14932367052978535,0.30524678834807195,29.368265329214143,10.157829564377053 +0.14927901009135286,0.2981533022103994,29.469522361544687,9.549534806300898 +0.15037320317757633,0.30140603716143133,35.26562885849645,11.919002149240804 +0.14999985729993287,0.2963197466537008,34.76717474230222,11.068448637624064 +0.14888148555488526,0.3014331902947741,33.08083313461529,11.003634367117744 +0.1494007565566521,0.301065055475783,28.52157033311379,9.546270307059151 +0.14959775241999207,0.2979009059404781,28.12254296751511,9.072070388673344 +0.1492180141733341,0.29376379385836016,29.859852532414997,9.243316469465576 +0.15194036406928266,0.30684370207110623,27.946086026146595,10.00268642225216 +0.14998477878158945,0.30006929891941453,32.79766388448502,10.821560496579876 +0.1490138409813838,0.30341470774757956,31.709715397521627,10.78705829559199 +0.15049780840455165,0.2990262855428169,39.4016506311597,12.927402760826936 +0.15091500531147842,0.3003835079194184,33.5058141172669,11.237692985666934 +0.15008736050359933,0.2933965207331989,26.678454115675983,8.270491944313722 +0.1474308332754758,0.29780890217872014,31.245893152955514,9.956461062123358 +0.1526969268051385,0.30400552746151027,28.67817422073331,10.081099811044943 +0.14984431441129095,0.2999354012821707,26.171946770547457,8.666705036514104 +0.15049958289486254,0.30132488386535106,33.078351859798794,11.18450155189797 +0.15220867183884765,0.2968029341151998,33.12299255548963,10.74639020036753 +0.14920125201050682,0.29940640248002864,34.270793778315266,11.217884261892223 +0.1497466180986925,0.30162753706979234,33.42409775699059,11.234607438058239 +0.14867875290509838,0.2882641010595247,33.240770800727475,9.730202681900646 +0.14927963370516795,0.29244584844515314,34.65836562995973,10.636866485042491 +0.1497554478916365,0.30360459121291283,31.29922151429405,10.723046134545028 +0.15125157489179983,0.30230814676836437,31.888980881236897,10.914069317724302 +0.14864372960282007,0.3026184550948954,24.68731206719738,8.265289553748579 +0.1493032164687627,0.2968825155860467,29.490569388615196,9.399574826256723 +0.14994623912423888,0.31024120870835714,28.071019980768984,10.244456216190526 +0.15006706684492727,0.3006454637244262,33.05868543777737,11.016768361424038 +0.1506224830700678,0.29939463613952344,31.34593157761961,10.343712719539697 +0.1502462713060135,0.30668299738701515,28.7289391069407,10.212404227913613 +0.15159085356295673,0.29457175833614485,29.69717146682835,9.394478799094331 +0.1499844017200477,0.29471659493667446,35.679901872384384,11.15875402297158 +0.15158993132306456,0.2983337762650887,31.172322567145017,10.32850586178081 +0.15046306668741416,0.29613860714434986,29.25642749473277,9.315778440315842 +0.1489698586804745,0.2984757703398498,27.728244975938633,9.045047823154563 +0.15168186424454014,0.2946837204983158,31.529683152156288,10.020714555418829 +0.14971508588846336,0.2896671888855328,30.38723245635816,9.050478942968764 +0.15183601311247422,0.3005830302644944,28.409727330127897,9.545614268503403 +0.1521553948068235,0.2947438103987859,32.66246359838032,10.398921684347599 +0.15079480027239772,0.29355347929825576,30.67618329669741,9.538535578231993 +0.14951905797091156,0.2995081955654008,26.276484066718606,8.623546364028718 +0.15123283684526295,0.30377231701673685,30.74241332204473,10.715897902484917 +0.14870387310069935,0.3034603305019377,29.726467581903176,10.124754894432925 +0.1497109403288454,0.294025462078789,30.126137450355863,9.36972950785382 +0.15061968993239297,0.3008716673405388,29.154360138652947,9.804269839658408 +0.1505344665905559,0.3007339928614618,28.053628856339536,9.3690290595295 +0.15095843320894775,0.3040272371872766,24.88092720023686,8.648622726091965 +0.15006978672791496,0.296265880674527,29.021242776596516,9.286657604489406 +0.14952997229262924,0.2982279938485511,33.83289095939914,10.940715614218892 +0.15152639754539454,0.2999386257483888,22.371974869567588,7.490660754475877 +0.14825865011847922,0.29649131515894434,29.634996874090856,9.355375829797756 +0.15002855158867914,0.30607144915129897,27.210365578522815,9.545951340680615 +0.148466259929669,0.3070457806115962,31.640009261734342,11.109071942478634 +0.14915918217215268,0.29844949384232794,33.60444686711569,10.941363657330157 +0.1502341592819998,0.29419938075548036,35.458890469601755,11.103711875053717 +0.15042621491397754,0.3072120701235366,31.725613846709514,11.2772730139953 +0.1504229720592804,0.29781788878922594,26.50445532406127,8.687976261753704 +0.15055299266432617,0.3009954101128926,33.48338335760052,11.274033417132973 +0.15114802899526095,0.3008172350236654,23.06645741795298,7.797329526914034 +0.1514829420760294,0.29902548599667006,31.11079756313551,10.35575651236677 +0.15048791508247808,0.2942266534582375,29.981445056039792,9.422479213201646 +0.14937600824050212,0.29323572694212235,32.38169121556348,10.042673799954978 +0.14973879208576485,0.30730928234815874,25.592523261447056,9.056090571196272 +0.1504578726046403,0.302279251938586,21.9901272546769,7.465971819244437 +0.1504641950638229,0.29455257036202653,24.618559306877874,7.748001178602279 +0.15128273080375812,0.30305467447868756,28.11888092916806,9.661132103747788 +0.15158392041776012,0.3019104024198162,28.115584594402243,9.561793846512629 +0.15037605453753677,0.30385708271534106,36.25476716889489,12.466440505755221 +0.15197926348001858,0.2915895494296114,31.356471158624363,9.672034160321084 +0.15051189069049203,0.29589631116438825,32.03475213270902,10.274858445265787 +0.1483498091262607,0.2966842723563442,33.10441659513931,10.444535260235417 +0.14994956386713443,0.3068922295621916,30.911747183507448,10.951746922409344 +0.1486570436745984,0.2988577036003469,32.96615503532279,10.628631378259533 +0.15030651069314943,0.297588848959711,29.235702983944506,9.498936550608287 +0.15191474698080243,0.30338501092546266,26.130151433546438,9.121090509324869 +0.14929983455198748,0.29647794536367783,28.214912680738195,8.97423087485924 +0.15141147924930615,0.2931972462407378,25.315958179081328,7.925432838646991 +0.14991586749136887,0.3058177202589954,26.044270364092522,9.112576727364925 +0.14767718645628675,0.2910148146089071,40.289061779511435,12.011983023398203 +0.15112921813862626,0.3029642355947397,35.62505981111805,12.308505253334385 +0.1504869471367079,0.2990959906699776,26.27836867508219,8.616237944988947 +0.15195633890608237,0.3005714478588066,29.28291008275983,9.934423047846133 +0.15028753209698664,0.301144138101138,29.975373944011164,10.058560622602238 +0.1506195930190322,0.3000438501009137,33.32678709780535,11.081594402233753 +0.1508272489820335,0.30661714363689896,35.775909040895755,12.725505705667086 +0.14868103411612757,0.3030837027099698,28.612208457503527,9.75745752321023 +0.15003557779518098,0.30335650179537704,28.17093687454318,9.621504179229728 +0.15103763337471945,0.30255731282695614,33.86615386692645,11.584948939543866 +0.14932435406598107,0.30074806103284507,31.95063884492903,10.63227481271124 +0.14931315625960795,0.3040295758031785,29.40624833982933,10.06380300012516 +0.1504650433283574,0.29409958990664326,27.168726086031427,8.515129468448166 +0.15061282739317755,0.3053014606340604,23.28820572194536,8.147903831827698 +0.1492119782970842,0.2997278889514853,37.71694418265116,12.329842520802298 +0.14998511885140048,0.29702846549255,33.73901245925508,10.85705519760846 +0.1508667098226756,0.29992932184442084,27.851559286819743,9.235368970995923 +0.14920102850078143,0.3030252668356909,33.01996889966566,11.28875696673719 +0.1507210749658682,0.3063064663876098,30.23955918385737,10.683480485744928 +0.1492873727618258,0.2960493858467969,25.64112484114324,8.10342974662121 +0.15097037898794394,0.303449676761166,28.79473569746567,9.93405053961764 +0.14846707199509213,0.3002570732049601,26.453272868430883,8.705670904183815 +0.15078695736168934,0.2974668044886989,31.876957854641496,10.282830539942806 +0.14848900868513468,0.3083387385284128,33.98677737199045,12.09208002663876 +0.1488408838607492,0.2996104272312263,26.035069646698037,8.508334175152296 +0.14883275705840793,0.3102731527051896,30.107443604196416,11.009899730136926 +0.15010913808313814,0.29908912810442956,28.154562557107557,9.273402832432918 +0.1490655639954912,0.3010119668416879,25.359574030855455,8.391844801836603 +0.148558081060578,0.29747509014451545,26.875108313699997,8.560954577476684 +0.1510498532456531,0.298928316158837,29.714747397833616,9.825387439292449 +0.1509891328655058,0.3027539712709605,36.442026054639385,12.471381560361195 +0.14934545468586863,0.3011992168898658,38.844544677385684,12.937631950229802 +0.14817802603662444,0.30148610311764956,29.71032382178374,9.884767270813759 +0.14862514808091665,0.29314426869359006,33.04335421790559,10.101151696524523 +0.14956192066911345,0.2953331466913765,35.79463931302081,11.237391956678191 +0.14882819851081278,0.2925284229608988,27.7049644868336,8.462174726929774 +0.150194578332161,0.30092498170424703,34.64105438601209,11.556561099625988 +0.14805297157197594,0.2981085652542085,33.69928674466049,10.814121744209455 +0.1488304440548724,0.29575087110575515,32.53835987761112,10.253095990772321 +0.14751063183396998,0.2977300978951996,26.586185718579582,8.492737260230047 +0.14998229528725218,0.30746961125029093,27.50700790187116,9.843225593523275 diff --git a/examples/beam/test_beam.py b/tests/test_model/example_beam.py similarity index 100% rename from examples/beam/test_beam.py rename to tests/test_model/example_beam.py diff --git a/tests/test_model/myBeam9points b/tests/test_model/myBeam9points new file mode 100644 index 0000000000000000000000000000000000000000..a3665cde7ade283f93e530021b82207535cda6f9 Binary files /dev/null and b/tests/test_model/myBeam9points differ diff --git a/tests/test_model/read_Beam_Deflection.py b/tests/test_model/read_Beam_Deflection.py new file mode 100644 index 0000000000000000000000000000000000000000..cd7a5e26ee498496abd6b49fed201e1506e14823 --- /dev/null +++ b/tests/test_model/read_Beam_Deflection.py @@ -0,0 +1,25 @@ +#!/usr/bin/env python2 +# -*- coding: utf-8 -*- +""" +Created on Fri Jul 19 16:48:59 2019 + +@author: farid +""" +import pandas as pd +import numpy as np + + +def read_Beam_Deflection(FileNames): + + df_Mean = pd.read_csv(FileNames[0], header=None, delimiter=' ') + x_values = np.linspace(0, 1, 11) + deflection = df_Mean[df_Mean.columns[0]] + + deflection_zero = np.zeros((1)) + deflection_mid = np.append(deflection_zero, deflection) + deflection_final = np.append(deflection_mid, deflection_zero) + + # Prepare output dict using standard bayesvalidrox format + output = {'x_values': x_values, 'Deflection [m]': deflection_final} + + return output diff --git a/tests/test_polyconst.py b/tests/test_polyconst.py new file mode 100644 index 0000000000000000000000000000000000000000..f831cd5a1b922e2865ca744f89d6cd068fe26b91 --- /dev/null +++ b/tests/test_polyconst.py @@ -0,0 +1,69 @@ +# -*- coding: utf-8 -*- +""" +Test the various classes and functions provided for constructing the polynomials. +Tests are available for the following functions: + apoly_construction - x + glexindex + cross_truncate + +""" +import sys +sys.path.append("src/") +sys.path.append('../src/') +import pytest +import numpy as np + +from bayesvalidrox.surrogate_models.apoly_construction import apoly_construction +from bayesvalidrox.surrogate_models.glexindex import glexindex, cross_truncate + +#%% Test apoly_construction + +def test_apoly_construction_dimerr() -> None: + """ + Cannot construct with wrong dim of data + """ + data = np.random.uniform(0,1,(3,1000)) + with pytest.raises(AttributeError) as excinfo: + apoly_construction(data, 3) + assert str(excinfo.value) == 'Data should be a 1D array' + +def test_apoly_construction() -> None: + """ + Construct poly for aPC + """ + data = np.random.uniform(0,1,1000) + apoly_construction(data, 3) + +def test_apoly_construction_deg0() -> None: + """ + Construct poly for aPC for degree 0 + """ + data = np.random.uniform(0,1,1000) + apoly_construction(data, 0) + +def test_apoly_construction_negdeg() -> None: + """ + Construct poly for aPC for negative degree -- this works?? + """ + data = np.random.uniform(0,1,1000) + apoly_construction(data, -2) + +#%% Test glexindex + +def test_glexindex() -> None: + """ + Create monomial exponent dict + """ + glexindex(0) + +#%% Test cross_truncate + +def test_cross_truncate()-> None: + """ + Truncate indices via Lp norm + """ + #cross_truncate(np.array([0,1,2]), 2, 1) + None + +if __name__ == '__main__': + None diff --git a/tests/test_pylink.py b/tests/test_pylink.py new file mode 100644 index 0000000000000000000000000000000000000000..47cc27081339a71d53963bb77cc44ad2da4b934a --- /dev/null +++ b/tests/test_pylink.py @@ -0,0 +1,240 @@ +# -*- coding: utf-8 -*- +""" +Test the PyLinkForwardModel class in bayesvalidrox. +Tests are available for the following functions + within_range *not used again in here - x +PyLinkForwardModel: + read_observation *not used again in here - x + read_mc_reference *not used again in here - x + read_output *used only once + update_input_params *used only once + run_command *used only once + run_forwardmodel + run_model_parallel + _store_simulations *used only once + zip_subdirs *used in metamodel again +OutputData: + constructor only + +""" +import sys +sys.path.append("src/") +import pandas as pd +import pytest + +from bayesvalidrox.pylink.pylink import PyLinkForwardModel as PL +from bayesvalidrox.pylink.pylink import within_range + +#%% Test constructor + +def test_PL() -> None: + """ + Build PyLinkForwardModel without inputs + """ + PL() + + +#%% Test PyLink.within_range + +def test_within_range_noarray() -> None: + """ + Value not an array + """ + with pytest.raises(AttributeError) as excinfo: + within_range(1,2,3) + assert str(excinfo.value) == 'The given values should be a 1D array, but are not' + +def test_within_range_2d() -> None: + """ + Value not an array + """ + with pytest.raises(AttributeError) as excinfo: + within_range([[1],[2]],2,3) + assert str(excinfo.value) == 'The given values should be a 1D array, but are not' + +def test_within_range_err() -> None: + """ + Value not in range + """ + assert within_range([1],2,3) == False + +def test_within_range_switchbounds() -> None: + """ + Switched min and max + """ + with pytest.raises(ValueError) as excinfo: + within_range([1],4,3) + assert str(excinfo.value) == 'The lower and upper bounds do not form a valid range, they might be switched' + +def test_within_range() -> None: + """ + Value in range + """ + assert within_range([1],0,3) == True + +#%% Test PyLink.read_observation +# TODO: check that the shape,... of what is read in matches wha is in the files +def test_read_observation_none() -> None: + """ + Read observation - 'calib' without anything + """ + pl = PL() + with pytest.raises(Exception) as excinfo: + pl.read_observation() + assert str(excinfo.value) == "Please provide the observation data as a dictionary via observations attribute or pass the csv-file path to MeasurementFile attribute" + +def test_read_observation() -> None: + """ + Read observation - 'calib' from file + """ + pl = PL() + pl.meas_file = 'tests/MeasuredData.csv' + pl.read_observation() + +def test_read_observation_datadict() -> None: + """ + Read observation - 'calib' with given observation as dict + """ + pl = PL() + pl.observations = {'Z':[0.1]} + pl.read_observation() + +def test_read_observation_dataframe() -> None: + """ + Read observation - 'calib' with given observation as dict + """ + pl = PL() + pl.observations = pd.DataFrame({'Z':[0.1]}, columns = ['Z']) + pl.read_observation() + +def test_read_observation_validnone() -> None: + """ + Read observation - 'valid' without anything + """ + pl = PL() + with pytest.raises(Exception) as excinfo: + pl.read_observation(case = 'valid') + assert str(excinfo.value) == "Please provide the observation data as a dictionary via observations attribute or pass the csv-file path to MeasurementFile attribute" + +def test_read_observation_valid() -> None: + """ + Read observation - 'valid' from file + """ + pl = PL() + pl.meas_file_valid = 'tests/MeasuredData_Valid.csv' + pl.read_observation(case = 'valid') + +def test_read_observation_validdatadict() -> None: + """ + Read observation - 'valid' with given observation as dict + """ + pl = PL() + pl.observations_valid = {'Z':[0.1]} + pl.read_observation(case = 'valid') + +def test_read_observation_validdataframe() -> None: + """ + Read observation - 'valid' with given observation as dict + """ + pl = PL() + pl.observations_valid = pd.DataFrame({'Z':[0.1]}, columns = ['Z']) + pl.read_observation(case = 'valid') + + +def test_read_observation_mc() -> None: + """ + Read mc ref from file + """ + pl = PL() + pl.mc_ref_file = 'tests/MCrefs_MeanStd.csv' + pl.read_observation(case = 'mc_ref') + + +def test_read_observation_mcdatadict() -> None: + """ + Read mc ref from fict + """ + pl = PL() + pl.mc_reference = {'Mean':[0.1],'Std':[0.1]} + pl.read_observation(case = 'mc_ref') + +def test_read_observation_mcdataframe() -> None: + """ + Read mc ref from dataframe + """ + pl = PL() + pl.observations_valid = pd.DataFrame({'Mean':[0.1],'Std':[0.1]}, columns = ['Mean', 'Std']) + pl.read_observation(case = 'mc_ref') + +def test_read_observation_mcnone() -> None: + """ + Read mc ref with nothing + """ + pl = PL() + pl.read_observation(case = 'mc_ref') + +#%% Test PyLink.read_output + +def test_read_output() -> None: + """ + Reads model run output + """ + pl = PL() + #pl.read_output() + # TODO: create parser first to be able to test this + +#%% Test PyLink.update_input_params + +def test_update_input_params() -> None: + """ + Updates parameters in file + """ + pl = PL() + # TODO: better understand what this is meant to do + +#%% Test PyLink.run_command + +def test_run_command() -> None: + """ + Runs command and reads results + """ + pl = PL() + # TODO: Find command to run to then read in file + +#%% Test PyLink.zip_subdirs +def test_zip_subdirs() -> None: + """ + Zips specified subdirs + """ + pl = PL() + pl.zip_subdirs('tests\Outputs_SeqPosteriorComparison', 'Z') + +#%% Test PyLink._store_simulations +def test_store_simulations() -> None: + """ + Stores simulation results + """ + pl = PL() + + +#%% Test PyLink.run_model_parallel +if 0: + def test_run_model_parallel() -> None: + """ + Runs model in parallel + """ + pl = PL() + pl.link_type = 'PyLink' + pl.name = 'Beam9points' + pl.input_file = "tests\test_model\SSBeam_Deflection.inp" + pl.input_template = "tests\test_model\SSBeam_Deflection.tpl.inp" + + pl.shell_command = "tests\test_model\myBeam9points SSBeam_Deflection.inp" + pl.Output.parser = 'tests\test_model\read_Beam_Deflection' + pl.Output.names = ['Deflection [m]'] + pl.Output.file_names = ["SSBeam_Deflection.out"] + pl.run_model_parallel([[0.1,0.25,30000e+6,1e4]]) + + +if __name__ == '__main__': + None